@nextelco/common-ui 2.1.103 → 2.1.105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/esm/assets/imagem-6ee08a37d9.png +0 -0
  2. package/dist/esm/assets/imagem-6fcae1b87b.png +0 -0
  3. package/dist/esm/index.js +142 -119
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/legacy/components/layout/Header/Header.css +1 -1
  6. package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js +9 -4
  7. package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js.map +1 -1
  8. package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.css +1 -1
  9. package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js +14 -3
  10. package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js.map +1 -1
  11. package/dist/esm/legacy/pages/Error/ErrorPage.css +1 -1
  12. package/dist/esm/legacy/pages/Loading/Loading.css +2 -2
  13. package/dist/esm/legacy/pages/NotFound/NotFound.css +1 -1
  14. package/dist/esm/v1/components/lists/ListFinder/ListFinder.js +214 -0
  15. package/dist/esm/v1/components/lists/ListFinder/ListFinder.js.map +1 -0
  16. package/dist/esm/v1/components/lists/ListFinder/labels.js +18 -0
  17. package/dist/esm/v1/components/lists/ListFinder/labels.js.map +1 -0
  18. package/dist/esm/v1/components/tables/PaginatedTable/PaginatedTable.js +50 -0
  19. package/dist/esm/v1/components/tables/PaginatedTable/PaginatedTable.js.map +1 -0
  20. package/dist/esm/v1/components/tables/Table/ColumnFilter.js +292 -0
  21. package/dist/esm/v1/components/tables/Table/ColumnFilter.js.map +1 -0
  22. package/dist/esm/v1/components/tables/Table/OverlayScrollbar.js +129 -0
  23. package/dist/esm/v1/components/tables/Table/OverlayScrollbar.js.map +1 -0
  24. package/dist/esm/v1/components/tables/Table/Table.js +1410 -0
  25. package/dist/esm/v1/components/tables/Table/Table.js.map +1 -0
  26. package/dist/esm/v1/components/tables/Table/labels.js +44 -0
  27. package/dist/esm/v1/components/tables/Table/labels.js.map +1 -0
  28. package/dist/esm/v1/foundations/icons/icons.js +45 -2
  29. package/dist/esm/v1/foundations/icons/icons.js.map +1 -1
  30. package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js +32 -0
  31. package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js.map +1 -0
  32. package/dist/esm/v1/primitives/lists/ListItem/ListCheckbox.js +28 -0
  33. package/dist/esm/v1/primitives/lists/ListItem/ListCheckbox.js.map +1 -0
  34. package/dist/esm/v1/primitives/lists/ListItem/ListItem.js +39 -0
  35. package/dist/esm/v1/primitives/lists/ListItem/ListItem.js.map +1 -0
  36. package/dist/style.components.css +1 -1
  37. package/dist/style.css +1 -1
  38. package/dist/style.layered.css +1 -1
  39. package/dist/theme.css +256 -0
  40. package/dist/types/legacy/components/molecules/PhotoAvatar/PhotoAvatar.d.ts +2 -0
  41. package/dist/types/v1/components/lists/ListFinder/ListFinder.d.ts +60 -0
  42. package/dist/types/v1/components/lists/ListFinder/labels.d.ts +24 -0
  43. package/dist/types/v1/components/tables/PaginatedTable/PaginatedTable.d.ts +41 -0
  44. package/dist/types/v1/components/tables/Table/ColumnFilter.d.ts +48 -0
  45. package/dist/types/v1/components/tables/Table/OverlayScrollbar.d.ts +34 -0
  46. package/dist/types/v1/components/tables/Table/Table.d.ts +250 -0
  47. package/dist/types/v1/components/tables/Table/labels.d.ts +54 -0
  48. package/dist/types/v1/foundations/icons/icons.d.ts +17 -0
  49. package/dist/types/v1/index.d.ts +15 -1
  50. package/dist/types/v1/primitives/forms/Checkbox/Checkbox.d.ts +18 -0
  51. package/dist/types/v1/primitives/lists/ListItem/ListCheckbox.d.ts +14 -0
  52. package/dist/types/v1/primitives/lists/ListItem/ListItem.d.ts +35 -0
  53. package/package.json +2 -2
package/dist/theme.css ADDED
@@ -0,0 +1,256 @@
1
+ /* Tokens do V1: tamanhos, tipos de letra, sombras e cores partilhados pelos
2
+ * componentes. Mudar um valor aqui muda-o em todos os componentes que o usam.
3
+ *
4
+ * Cada token gera as classes do Tailwind com o seu nome (ex: --spacing-control
5
+ * → h-control, w-control; --text-control → text-control; --shadow-card →
6
+ * shadow-card). Uma app pode sobrepor qualquer um no seu próprio CSS
7
+ * (ex: `:root { --spacing-control: 38px }`).
8
+ *
9
+ * `static`: os tokens vão sempre para o CSS, mesmo os que só são usados
10
+ * dentro de outros valores (ex: a largura das etiquetas no FormGrid).
11
+ * Importado por tailwind.css e tailwind.layered.css. */
12
+ @theme static {
13
+ /* Cores */
14
+ --color-primary-strong: #00124a; /* navy mais escuro, para gradientes */
15
+ --color-scrollbar: #c1c1c1;
16
+ --color-scrollbar-hover: #a8a8a8;
17
+
18
+ /* Tipos de letra */
19
+ --text-title: 15px; /* títulos de caixas e janelas */
20
+ --text-control: 13px; /* texto dos campos e botões */
21
+ --text-caption: 11px; /* contadores, avisos, tamanhos de ficheiro */
22
+ --text-micro: 10px; /* dicas por baixo das etiquetas */
23
+
24
+ /* Tamanhos */
25
+ --spacing-control: 34px; /* altura dos campos e dos botões quadrados ao lado deles */
26
+ --spacing-form-label: 172px; /* coluna das etiquetas no FormGrid */
27
+ --spacing-form-label-narrow: 112px; /* a mesma coluna, em sítios estreitos */
28
+
29
+ /* Larguras a partir das quais o FormGrid muda (container queries: @max-form-md, @max-form-sm) */
30
+ --container-form-md: 680px; /* etiquetas mais estreitas */
31
+ --container-form-sm: 500px; /* etiquetas por cima dos campos */
32
+
33
+ /* Larguras máximas das janelas (Dialog): max-w-dialog-sm, -md, -lg */
34
+ --container-dialog-sm: 480px;
35
+ --container-dialog-md: 720px;
36
+ --container-dialog-lg: 1000px;
37
+ /* Espaço mínimo entre a janela e as bordas do ecrã */
38
+ --spacing-dialog-margin: 24px;
39
+
40
+ /* Animações de entrada das janelas */
41
+ --animate-dialog-in: dialog-in 0.2s cubic-bezier(0.2, 0.9, 0.3, 1.1) both;
42
+ --animate-backdrop-in: backdrop-in 0.2s ease-out both;
43
+
44
+ @keyframes dialog-in {
45
+ from { opacity: 0; transform: translateY(10px) scale(0.97); }
46
+ }
47
+ @keyframes backdrop-in {
48
+ from { opacity: 0; }
49
+ }
50
+
51
+ /* Sombras (na cor primária, para seguirem a paleta) */
52
+ --shadow-card: 0 10px 30px color-mix(in srgb, var(--color-primary) 8%, transparent);
53
+ --shadow-card-hover: 0 14px 36px color-mix(in srgb, var(--color-primary) 12%, transparent);
54
+ --shadow-card-active: 0 16px 40px color-mix(in srgb, var(--color-primary) 16%, transparent);
55
+ --shadow-popover: 0 6px 18px color-mix(in srgb, var(--color-primary) 12%, transparent);
56
+ --shadow-tile: 0 10px 24px color-mix(in srgb, var(--color-primary) 18%, transparent);
57
+ --shadow-page: 0 1px 5px color-mix(in srgb, var(--color-primary) 10%, transparent);
58
+ --shadow-modal: 0 24px 60px color-mix(in srgb, var(--color-primary) 25%, transparent);
59
+ }
60
+
61
+ /* Fundo do corpo das janelas: um brilho navy que desce do cabeçalho e
62
+ desvanece para branco. Na cor primária, para seguir a paleta. */
63
+ @utility bg-canvas {
64
+ background-image:
65
+ radial-gradient(125% 70% at 50% -12%, color-mix(in srgb, var(--color-primary) 7%, transparent) 0%, transparent 55%),
66
+ linear-gradient(180deg, color-mix(in srgb, var(--color-primary) 5%, white) 0%, color-mix(in srgb, var(--color-primary) 2%, white) 55%, white 100%);
67
+ }
68
+
69
+ /* Esconde a barra de scroll do browser, mantendo o scroll (ex: quando há uma
70
+ barra desenhada por cima, como nas tabelas com `overlayScrollbars`). */
71
+ @utility scrollbar-none {
72
+ scrollbar-width: none;
73
+ &::-webkit-scrollbar {
74
+ display: none;
75
+ }
76
+ }
77
+
78
+ /* Sem o aspeto do browser dentro de `v1-reset` (ex: a Table): botões sem fundo,
79
+ borda nem margens, e com a letra de quem os rodeia; tabelas sem espaço entre
80
+ células. A biblioteca não traz o preflight do Tailwind, para não mexer nas
81
+ páginas da app; isto só toca no que está dentro da classe.
82
+ Em `@layer base` e com especificidade zero (`:where`): qualquer classe do
83
+ componente ganha-lhe. */
84
+ @layer base {
85
+ :where(.v1-reset) :where(button) {
86
+ appearance: none;
87
+ background: none;
88
+ border: 0;
89
+ padding: 0;
90
+ margin: 0;
91
+ font: inherit;
92
+ color: inherit;
93
+ letter-spacing: inherit;
94
+ text-transform: inherit;
95
+ cursor: pointer;
96
+ }
97
+ :where(.v1-reset) :where(button:disabled) {
98
+ cursor: default;
99
+ }
100
+ :where(.v1-reset) :where(input, select) {
101
+ font: inherit;
102
+ color: inherit;
103
+ margin: 0;
104
+ }
105
+ :where(.v1-reset) :where(table) {
106
+ border-collapse: collapse;
107
+ }
108
+ :where(.v1-reset) :where(th) {
109
+ font-weight: inherit;
110
+ text-align: inherit;
111
+ }
112
+ }
113
+
114
+ /* Tema do common-ui: tokens de cor (claro e escuro), raios, estados e a variante `dark:`.
115
+ *
116
+ * Fonte única. É importado por tailwind.css e tailwind.layered.css (o CSS compilado da
117
+ * biblioteca) e, junto com tokens.css, é publicado como `dist/theme.css` para as apps
118
+ * com Tailwind próprio: importado uma vez, o Tailwind da app passa a gerar, sob pedido,
119
+ * todas as classes dos tokens (border-foreground, bg-primary/80, ring-primary, ...),
120
+ * sem depender das que a biblioteca por acaso usa. */
121
+ /* `dark:` passa a reagir a classe `.dark` no <html> (o que o useTheme aplica),
122
+ e nao ao prefers-color-scheme (default do Tailwind v4). */
123
+ @custom-variant dark (&:where(.dark, .dark *));
124
+
125
+ /* Design system proef (fonte de verdade: Tickets/frontend/src/index.css).
126
+ Os --color-* do @theme geram as utilities (bg-card, text-muted-foreground,
127
+ border-border, bg-primary, ...). Os que referenciam hsl(var(--x)) buscam o
128
+ valor ao :where(:root) abaixo (ou ao :root do consumidor, que ganha). */
129
+ @theme {
130
+ --font-sans: "Montserrat", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
131
+
132
+ --color-background: hsl(var(--background));
133
+ --color-foreground: hsl(var(--foreground));
134
+
135
+ --color-proef-navy: #001b63;
136
+ --color-proef-turquoise: #00d28d;
137
+ --color-proef-blue: #0076ce;
138
+
139
+ --color-card: hsl(var(--card));
140
+ --color-card-foreground: hsl(var(--card-foreground));
141
+
142
+ --color-popover: hsl(var(--popover));
143
+ --color-popover-foreground: hsl(var(--popover-foreground));
144
+
145
+ --color-primary: #001b63;
146
+ --color-primary-foreground: #ffffff;
147
+
148
+ --color-secondary: #00d28d;
149
+ --color-secondary-foreground: #001b63;
150
+
151
+ --color-muted: hsl(var(--muted));
152
+ --color-muted-foreground: hsl(var(--muted-foreground));
153
+
154
+ --color-accent: hsl(var(--accent));
155
+ --color-accent-foreground: hsl(var(--accent-foreground));
156
+
157
+ --color-destructive: hsl(var(--destructive));
158
+ --color-destructive-foreground: hsl(var(--destructive-foreground));
159
+
160
+ --color-border: hsl(var(--border));
161
+ --color-input: hsl(var(--input));
162
+ --color-ring: #0076ce;
163
+
164
+ /* Status semânticos (universais) — geram bg-ok/text-ok/bg-ok-bg, etc. */
165
+ --color-ok: #1f8a55;
166
+ --color-ok-bg: #e5f6ec;
167
+ --color-risco: #b96e00;
168
+ --color-risco-bg: #fcf0dc;
169
+ --color-incumprido: #c23b34;
170
+ --color-incumprido-bg: #fbeae9;
171
+ --color-neutral: #767c88;
172
+ --color-neutral-bg: #eeeff2;
173
+
174
+ /* Base do espacamento das utilities (calc com var(--spacing)). Explicito
175
+ aqui p/ garantir que resolve no consumidor (senao spacing fica a 0). */
176
+ --spacing: 0.25rem;
177
+
178
+ /* Cantos arredondados em todos os portais (decisao 15/10/2026): botoes,
179
+ campos e itens de menu 8px. Cartoes (rounded-xl), pop-ups (rounded-2xl) e
180
+ etiquetas (rounded-full) nao dependem destes tokens. */
181
+ --radius-lg: 0.5rem;
182
+ --radius-md: 0.375rem;
183
+ --radius-sm: 0.25rem;
184
+ }
185
+
186
+ /* Valores default dos tokens (light). `:where(:root)` = specificity 0 → o
187
+ :root do consumidor (RC/Landing/...) sobrepoe sem esforco; apps novos usam
188
+ estes. Valores canonicos do Tickets. */
189
+ :where(:root) {
190
+ --background: 0 0% 100%;
191
+ --foreground: 222.2 84% 4.9%;
192
+ --card: 0 0% 100%;
193
+ --card-foreground: 222.2 84% 4.9%;
194
+ --popover: 0 0% 100%;
195
+ --popover-foreground: 222.2 84% 4.9%;
196
+ --primary: 221.2 83.2% 53.3%;
197
+ --primary-foreground: 210 40% 98%;
198
+ --secondary: 210 40% 96.1%;
199
+ --secondary-foreground: 222.2 47.4% 11.2%;
200
+ --muted: 210 40% 96.1%;
201
+ --muted-foreground: 215.4 16.3% 46.9%;
202
+ --accent: 210 40% 96.1%;
203
+ --accent-foreground: 222.2 47.4% 11.2%;
204
+ --destructive: 0 84.2% 60.2%;
205
+ --destructive-foreground: 210 40% 98%;
206
+ --border: 214.3 31.8% 91.4%;
207
+ --input: 214.3 31.8% 91.4%;
208
+ --ring: 221.2 83.2% 53.3%;
209
+ --radius: 0.5rem;
210
+ }
211
+
212
+ /* Cantos quadrados, so para um portal que ainda precise deles durante a
213
+ transicao: data-cantos="quadrados" no <html>. Unlayered e com atributo:
214
+ ganha ao @theme (layer). */
215
+ :root[data-cantos="quadrados"] {
216
+ --radius-sm: 0px;
217
+ --radius-md: 0px;
218
+ --radius-lg: 0px;
219
+ --radius: 0px;
220
+ }
221
+
222
+ /* Tema escuro (classe .dark no <html>). Valores do portal de Tickets: superfícies slate e estados com fundo
223
+ translúcido (500/15) e texto claro (300). Os tokens de estado mudam aqui, por isso Badge, Kpi com tom e tudo o
224
+ que use text-ok/bg-ok-bg (etc.) acompanha o tema sem classes dark: em cada componente. */
225
+ :where(.dark) {
226
+ --background: 222.2 84% 4.9%;
227
+ --foreground: 210 40% 98%;
228
+ --card: 222.2 84% 4.9%;
229
+ --card-foreground: 210 40% 98%;
230
+ --popover: 222.2 84% 4.9%;
231
+ --popover-foreground: 210 40% 98%;
232
+ --primary: 217.2 91.2% 59.8%;
233
+ --primary-foreground: 222.2 47.4% 11.2%;
234
+ --secondary: 217.2 32.6% 17.5%;
235
+ --secondary-foreground: 210 40% 98%;
236
+ --muted: 217.2 32.6% 17.5%;
237
+ --muted-foreground: 215 20.2% 65.1%;
238
+ --accent: 217.2 32.6% 17.5%;
239
+ --accent-foreground: 210 40% 98%;
240
+ --destructive: 0 62.8% 30.6%;
241
+ --destructive-foreground: 210 40% 98%;
242
+ --border: 217.2 32.6% 17.5%;
243
+ --input: 217.2 32.6% 17.5%;
244
+ --ring: 224.3 76.3% 48%;
245
+ }
246
+
247
+ .dark {
248
+ --color-ok: #6ee7b7;
249
+ --color-ok-bg: rgb(16 185 129 / 0.15);
250
+ --color-risco: #fcd34d;
251
+ --color-risco-bg: rgb(245 158 11 / 0.15);
252
+ --color-incumprido: #fca5a5;
253
+ --color-incumprido-bg: rgb(239 68 68 / 0.15);
254
+ --color-neutral: #cbd5e1;
255
+ --color-neutral-bg: rgb(148 163 184 / 0.15);
256
+ }
@@ -1,4 +1,6 @@
1
1
  import React from 'react';
2
+ export declare const SCOPE_PROPRIO: string[];
3
+ export declare const SCOPE_OUTROS: string[];
2
4
  export interface GraphProfile {
3
5
  name?: string | null;
4
6
  email?: string | null;
@@ -0,0 +1,60 @@
1
+ import React from 'react';
2
+ import { type ListItemContent } from '../../../primitives/lists/ListItem/ListItem';
3
+ import { type ListFinderLabels } from './labels';
4
+ export interface ListFinderProps<T> {
5
+ /** As linhas: todas, ou só a página atual quando o servidor pagina (com `total`). */
6
+ items: T[];
7
+ /** Uma chave única por linha (ex: o id). */
8
+ itemKey: (item: T) => string;
9
+ /** O que cada linha mostra: as partes do [ListItem](?path=/docs/v1-primitives-lists-listitem--docs). */
10
+ itemContent: (item: T) => ListItemContent;
11
+ /** A linha aberta (fica realçada). */
12
+ activeKey?: string | null;
13
+ /** Ao clicar numa linha: normalmente, abri-la ao lado. */
14
+ onItemClick?: (item: T) => void;
15
+ /** As marcadas. Só há caixas de marcar com `onSelectionChange`. */
16
+ selectedKeys?: ReadonlySet<string>;
17
+ onSelectionChange?: (keys: Set<string>) => void;
18
+ /** Filtros ao lado do voltar, por cima da pesquisa (ex: um ou dois SelectInput). */
19
+ filters?: React.ReactNode;
20
+ /** Com isto aparece um ‹ à esquerda, para fechar ou esconder a lista. */
21
+ onBack?: () => void;
22
+ /** O texto da pesquisa. Sem ele, a pesquisa guarda o seu. */
23
+ search?: string;
24
+ onSearchChange?: (search: string) => void;
25
+ /**
26
+ * O texto onde a pesquisa procura, em cada linha. Com isto, a lista filtra-se
27
+ * sozinha (sem acentos nem maiúsculas); sem isto, quem filtra é a app (ex: o
28
+ * servidor, com `onSearchChange`). Uma lista colada (uma por linha, ou
29
+ * separadas por vírgulas) mostra as que tiverem qualquer uma delas.
30
+ */
31
+ searchText?: (item: T) => string;
32
+ /** O servidor pagina: quantas linhas há lá ao todo. `items` é só a página atual. */
33
+ total?: number;
34
+ /** A página atual (1, 2, ...), quando o servidor pagina. */
35
+ page?: number;
36
+ onPageChange?: (page: number) => void;
37
+ /** Quantas linhas por página. Com o servidor a paginar, quantas ele manda. */
38
+ pageSize?: number;
39
+ /** A carregar: sem linhas ainda, mostra o esqueleto delas. */
40
+ loading?: boolean;
41
+ labels?: Partial<ListFinderLabels>;
42
+ className?: string;
43
+ }
44
+ /**
45
+ * Uma lista para encontrar e escolher: filtros e pesquisa em cima, as linhas
46
+ * ([ListItem](?path=/docs/v1-primitives-lists-listitem--docs)) a rolar no meio e
47
+ * as páginas em baixo. Pensada para a coluna ao lado do que se abre (a lista à
48
+ * esquerda, o detalhe da linha escolhida à direita).
49
+ *
50
+ * Enche a altura do pai. O topo, a barra de "selecionar todos" e o rodapé
51
+ * ficam sempre no sítio: só as linhas rolam.
52
+ *
53
+ * - **Pesquisa**: com `searchText` filtra sozinha; sem ele, a app filtra
54
+ * (`search`/`onSearchChange`).
55
+ * - **Páginas**: pagina sozinha (`pageSize`), ou é o servidor (`total`, `page`,
56
+ * `onPageChange`).
57
+ * - **Marcar vários**: com `onSelectionChange`. O "selecionar todos" só marca
58
+ * as linhas à vista, nunca as que não se veem.
59
+ */
60
+ export default function ListFinder<T>({ items, itemKey, itemContent, activeKey, onItemClick, selectedKeys, onSelectionChange, filters, onBack, search: pesquisaDeFora, onSearchChange, searchText, total, page, onPageChange, pageSize, loading, labels, className, }: ListFinderProps<T>): React.JSX.Element;
@@ -0,0 +1,24 @@
1
+ /** Os textos do ListFinder. A app troca os que quiser pela prop `labels`. */
2
+ export interface ListFinderLabels {
3
+ /** Dentro da caixa de pesquisa. */
4
+ searchPlaceholder: string;
5
+ /** O nome da caixa de pesquisa, para leitores de ecrã. */
6
+ search: string;
7
+ /** O botão de voltar (só com `onBack`). */
8
+ back: string;
9
+ /** O nome do que a lista tem, no singular ou plural (ex: "1 ordem", "20 ordens"). */
10
+ itemsNoun: (count: number) => string;
11
+ /** A caixa de cima, sem nenhuma marcada. */
12
+ selectVisible: (count: number) => string;
13
+ /** A caixa de cima, com algumas marcadas. */
14
+ selectedCount: (selected: number, visible: number) => string;
15
+ clearSelection: string;
16
+ /** A caixa de marcar de cada linha (ex: "Marcar P-020000"). */
17
+ checkItem: (key: string) => string;
18
+ /** Sem nada para mostrar. */
19
+ empty: string;
20
+ loading: string;
21
+ pagination: string;
22
+ page: string;
23
+ }
24
+ export declare const DEFAULT_LIST_FINDER_LABELS: ListFinderLabels;
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import { type TableProps } from '../Table/Table';
3
+ export interface PaginatedTableProps<T> extends TableProps<T> {
4
+ /**
5
+ * Total de linhas no servidor, quando é ele que pagina (`page` e
6
+ * `onPageChange`). É o número da contagem e dá o número de páginas.
7
+ */
8
+ total?: number;
9
+ /**
10
+ * Página atual (a contar de 1), quando é o servidor que pagina: a app pede a
11
+ * página e dá-a em `data`. Sem isto, a tabela pagina-se a si mesma com todas
12
+ * as linhas de `data`.
13
+ */
14
+ page?: number;
15
+ onPageChange?: (page: number) => void;
16
+ /** Tamanhos de página à escolha (ex: `[60, 120, 250, 500]`). Sem isto não há escolha. */
17
+ pageSizeOptions?: number[];
18
+ /**
19
+ * A pessoa escolheu outro tamanho de página. Quando é o servidor que pagina,
20
+ * a app volta à página 1 (ficar na 7.ª com 500 por página caía fora da lista).
21
+ * Sem isto, a tabela guarda a escolha ela própria.
22
+ */
23
+ onPageSizeChange?: (pageSize: number) => void;
24
+ }
25
+ /**
26
+ * A `Table` para listas de página inteira: a paginação fica EM CIMA, numa
27
+ * barra com a contagem de linhas, o tamanho de página e os números de página,
28
+ * em vez de no fundo.
29
+ *
30
+ * Funciona de duas maneiras:
31
+ * - **O servidor pagina** (`page`, `onPageChange`, `total`): `data` é a
32
+ * página atual. Com filtros, ordenação ou agrupamento no cabeçalho, a tabela
33
+ * passa a paginar o conjunto completo (`allData`) e a barra mostra as
34
+ * páginas dela.
35
+ * - **Todas as linhas de uma vez** (só `data`): a tabela pagina-se a si mesma.
36
+ *
37
+ * Por omissão ocupa a altura do pai (`fillHeight`), com as barras de scroll
38
+ * por cima das linhas, linhas-esqueleto a carregar e a aresta direita
39
+ * esbatida. Qualquer uma pode ser desligada.
40
+ */
41
+ export default function PaginatedTable<T>({ total, page, onPageChange, pageSizeOptions, onPageSizeChange, pageSize, data, allData, alwaysClient, fillHeight, overlayScrollbars, horizontalScrollbarBelow, skeleton, fadeRight, ...resto }: PaginatedTableProps<T>): React.JSX.Element;
@@ -0,0 +1,48 @@
1
+ import React from 'react';
2
+ import type { TableLabels } from './labels';
3
+ /**
4
+ * O filtro de uma coluna: ordenar, procurar, escolher valores, aplicar.
5
+ *
6
+ * Vive fora do `Table` de propósito. Lá dentro era uma função declarada no
7
+ * corpo do componente, logo uma função NOVA a cada render — e o React
8
+ * desmontava e remontava o popup a cada tecla escrita e a cada opção marcada.
9
+ * Era isso que devolvia a lista de valores ao topo a meio de uma escolha.
10
+ *
11
+ * Nada se aplica até ao "Aplicar". Com a aplicação imediata, cada visto refazia
12
+ * a tabela por baixo: mudava-lhe o tamanho e o conteúdo enquanto se escolhia, e
13
+ * a lista de onde se estava a escolher encolhia à medida que se escolhia.
14
+ *
15
+ * `position: fixed` no `<body>`: como filho da célula, o `overflow` da tabela
16
+ * cortava-o — e era por isso que a caixa da tabela tinha de perder o tecto de
17
+ * altura enquanto um filtro estivesse aberto, o que empurrava a página inteira.
18
+ */
19
+ export declare function ColumnFilter({ labels: L, label, canSort, tipo, valores, seleccionados, intervalo, numero, ordenadaPor, aCarregar, ancora, onOrdenar, onAplicar, onAplicarDatas, onAplicarNumeros, onLimpar, onFechar, }: {
20
+ labels: TableLabels;
21
+ label?: string;
22
+ canSort?: boolean;
23
+ /** `texto` = lista de valores; `data` = De/Até; `numero` = Mín/Máx, ou a lista (botão no topo). */
24
+ tipo: 'texto' | 'data' | 'numero';
25
+ /** Valores distintos da coluna, já contados com os outros filtros activos. */
26
+ valores: string[];
27
+ /** O que está aplicado neste momento — o ponto de partida do rascunho. */
28
+ seleccionados: Set<string>;
29
+ intervalo: {
30
+ from?: string;
31
+ to?: string;
32
+ };
33
+ /** Intervalo numérico aplicado, quando `tipo` é `numero`. */
34
+ numero?: {
35
+ min?: string;
36
+ max?: string;
37
+ };
38
+ ordenadaPor: 'asc' | 'desc' | null;
39
+ aCarregar: boolean;
40
+ /** Rect do botão que abriu isto. */
41
+ ancora: DOMRect;
42
+ onOrdenar?: (dir: 'asc' | 'desc') => void;
43
+ onAplicar: (vals: Set<string>) => void;
44
+ onAplicarDatas?: (de: string, ate: string) => void;
45
+ onAplicarNumeros?: (min: string, max: string) => void;
46
+ onLimpar: () => void;
47
+ onFechar: () => void;
48
+ }): React.ReactPortal;
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ export type Eixo = 'vertical' | 'horizontal';
3
+ /**
4
+ * Barra de scroll desenhada POR CIMA do conteúdo (a da Table com
5
+ * `overlayScrollbars`, nos dois eixos).
6
+ *
7
+ * A barra do browser ocupa espaço: numa grelha de colunas `1fr` nascia ao
8
+ * expandir uma secção e a grelha inteira reflowia de lado; na tabela obrigava
9
+ * o cabeçalho a reservar-lhe uma goteira, e a horizontal punha uma faixa
10
+ * cinzenta por baixo das linhas. Guardar-lhe o espaço de véspera
11
+ * (scrollbar-gutter) deixava uma faixa vazia. Por cima não ocupa nada, e não
12
+ * há nem salto nem faixa.
13
+ *
14
+ * A caixa que rola tem de estar num pai `relative`, e a barra do browser tem
15
+ * de estar escondida (classe `scrollbar-none`). Onde o browser não a souber
16
+ * esconder, fica também a dele — pior, mas não partido.
17
+ *
18
+ * Cinzento médio de propósito: passa por cima de linhas escuras e de linhas
19
+ * brancas, e tem de se ver nas duas.
20
+ */
21
+ export declare function OverlayScrollbar({ alvo, eixo, borda, canto, naBorda }: {
22
+ alvo: HTMLElement | null;
23
+ eixo?: Eixo;
24
+ /** Espessura da borda da caixa do lado onde a pista começa — o cursor começa depois dela. */
25
+ borda?: number;
26
+ /** A outra barra também é sobreposta: deixar-lhe o canto livre. */
27
+ canto?: boolean;
28
+ /**
29
+ * Horizontal: centrada na aresta de baixo da caixa em vez de 3px acima dela —
30
+ * meio por cima das linhas, meio por cima do que vem a seguir (ex: o rodapé da
31
+ * tabela). Tira menos altura visível às linhas.
32
+ */
33
+ naBorda?: boolean;
34
+ }): React.JSX.Element | null;