@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
@@ -0,0 +1,250 @@
1
+ import React from 'react';
2
+ import { type TableLabels } from './labels';
3
+ export interface TableColumn<T> {
4
+ /** Identifica a coluna (ordenação, filtros, agrupamento, ordem). Única na tabela. */
5
+ key: string;
6
+ /** Título no cabeçalho. */
7
+ label: string;
8
+ /** O que a célula mostra. */
9
+ render: (row: T) => React.ReactNode;
10
+ /**
11
+ * O valor por trás da célula: é por ele que se ordena, filtra e agrupa. Sem
12
+ * ele a coluna não ordena, não filtra e não agrupa.
13
+ */
14
+ value?: (row: T) => string | number | null | undefined;
15
+ /** Por omissão `true` (quando há `value`). */
16
+ sortable?: boolean;
17
+ /** Por omissão `true` (quando há `value`). */
18
+ filterable?: boolean;
19
+ /**
20
+ * Como se filtra esta coluna:
21
+ * - `text` (omissão): lista de valores únicos com vistos
22
+ * - `date`: intervalo De/Até
23
+ * - `number`: intervalo Mín/Máx, ou a lista de valores
24
+ *
25
+ * Numa coluna de dinheiro ou de contagem, a lista de valores é inútil: são
26
+ * centenas de números distintos, e ninguém procura "10.04".
27
+ */
28
+ filterType?: 'text' | 'date' | 'number';
29
+ /** Agrupar é opt-in: só com `true`. Evita agrupar por valores contínuos (datas, decimais, €). */
30
+ groupable?: boolean;
31
+ /**
32
+ * Filtros extra no cabeçalho desta coluna, cada um com o seu funil.
33
+ *
34
+ * Para uma coluna que mostra mais do que um dado — um "Início e Fim" mostra
35
+ * as duas pontas de um período, e um só filtro dava a lista dos PARES
36
+ * ("2026-07-03 → 2026-09-12"), que não é por onde alguém procura.
37
+ *
38
+ * `filterType: 'date'` dá-lhe o intervalo De/Até em vez da lista de valores.
39
+ */
40
+ extraFilters?: {
41
+ key: string;
42
+ label: string;
43
+ value: (row: T) => string | number | null | undefined;
44
+ filterType?: 'text' | 'date' | 'number';
45
+ }[];
46
+ headerClassName?: string;
47
+ cellClassName?: string;
48
+ /** Conteúdo extra por baixo do título da coluna (ex: um total). Recebe as linhas já filtradas. */
49
+ headerExtra?: (rows: T[]) => React.ReactNode;
50
+ }
51
+ /**
52
+ * Ordenação e filtros do cabeçalho vivem dentro da tabela. Quem está por fora
53
+ * (ex: exportar para Excel) precisa deles para não exportar linhas que a pessoa
54
+ * filtrou fora: daí este handle, preenchido em `viewRef`.
55
+ */
56
+ export interface TableView<T> {
57
+ /** Aplica a ordenação e os filtros de coluna a qualquer lista (ex: o conjunto completo). */
58
+ apply: (rows: T[]) => T[];
59
+ /** O mesmo, com a ordenação e os filtros de `state` em vez dos do cabeçalho. */
60
+ applyWith: (rows: T[], state: TableState) => T[];
61
+ /** Linhas à vista, já ordenadas e filtradas (todas as páginas em modo cliente). */
62
+ rows: T[];
63
+ hasFilters: boolean;
64
+ /**
65
+ * Há filtros, ordenação ou agrupamento ativos no cabeçalho, todos do lado do
66
+ * cliente. Quem alimenta a tabela usa isto para não largar o conjunto
67
+ * completo: sem ele, filtrar só olha para a página.
68
+ */
69
+ needsAllData: boolean;
70
+ /** Estado guardável da vista: filtros, ordenação e agrupamento. */
71
+ getState: () => TableState;
72
+ /** Repõe um estado guardado (ex: ao aplicar uma vista que a pessoa guardou). */
73
+ restore: (state: TableState | undefined) => void;
74
+ }
75
+ /**
76
+ * O que uma vista guardada leva da tabela. Conjuntos viram arrays para se
77
+ * poder guardar em JSON.
78
+ */
79
+ export interface TableState {
80
+ columnFilters?: Record<string, string[]>;
81
+ dateFilters?: Record<string, {
82
+ from?: string;
83
+ to?: string;
84
+ }>;
85
+ /** Intervalos Mín/Máx. */
86
+ numFilters?: Record<string, {
87
+ min?: string;
88
+ max?: string;
89
+ }>;
90
+ sortCol?: string | null;
91
+ sortDir?: 'asc' | 'desc';
92
+ /** Colunas por que se agrupa, pela ordem dos níveis. */
93
+ groupBy?: string[];
94
+ }
95
+ export interface TableProps<T> {
96
+ columns: TableColumn<T>[];
97
+ /** As linhas a mostrar (a página atual, quando quem alimenta a tabela pagina). */
98
+ data: T[];
99
+ /**
100
+ * O conjunto completo, para ordenar, filtrar e agrupar do lado do cliente.
101
+ * Pode chegar mais tarde: a tabela pede-o com `onAllDataNeeded`.
102
+ */
103
+ allData?: T[];
104
+ /** Linhas por página quando a tabela se pagina a si mesma (modo cliente). */
105
+ pageSize?: number;
106
+ rowKey: (row: T) => string;
107
+ onRowClick?: (row: T) => void;
108
+ /** Duplo clique na linha: atalho para o detalhe, sem roubar o clique simples (seleção, edição). */
109
+ onRowDoubleClick?: (row: T) => void;
110
+ loading?: boolean;
111
+ /** O conjunto completo (`allData`) está a carregar: ordenar, filtrar e agrupar esperam por ele. */
112
+ allDataLoading?: boolean;
113
+ loadingLabel?: string;
114
+ /** Sem linhas. Por omissão `labels.empty`. */
115
+ emptyLabel?: string;
116
+ emptySubLabel?: string;
117
+ /** Guarda os filtros na sessão do browser (`sessionStorage`) com esta chave, e repõe-nos ao voltar. */
118
+ storageKey?: string;
119
+ /** Caixa de seleção em cada linha. */
120
+ selectable?: boolean;
121
+ onSelectionChange?: (selectedKeys: Set<string>) => void;
122
+ /** Mudar este número limpa a seleção. */
123
+ clearSelectionTrigger?: number;
124
+ /** Chamado quando a tabela precisa do conjunto completo (ordenar, filtrar ou agrupar sem `allData`). */
125
+ onAllDataNeeded?: () => void;
126
+ /** Modo cliente sempre (paginação, ordenação e filtros sobre `allData`), mesmo sem interação. */
127
+ alwaysClient?: boolean;
128
+ /** Ordenação inicial: a coluna. */
129
+ defaultSortColumn?: string;
130
+ defaultSortDirection?: 'asc' | 'desc';
131
+ /** Recebe o estado da vista (ordenação e filtros) para uso por fora. Ver `TableView`. */
132
+ viewRef?: React.MutableRefObject<TableView<T> | null>;
133
+ /**
134
+ * A tabela ocupa a ALTURA TODA que o pai lhe der, em vez de encolher com o
135
+ * número de linhas. O cabeçalho fica fixo e só as linhas rolam.
136
+ *
137
+ * Sem isto, filtrar até sobrar uma linha encolhia a tabela, com meio ecrã em
138
+ * branco por baixo e o rodapé a meio da página.
139
+ *
140
+ * Precisa de um pai com altura DEFINIDA (ex: `flex-1 min-h-0` dentro de uma
141
+ * coluna de altura fixa). Para uma tabela pequena dentro de uma caixa, que
142
+ * deve encolher com o conteúdo, deixar desligado.
143
+ */
144
+ fillHeight?: boolean;
145
+ /** Sem `fillHeight`: altura máxima da caixa (ex: `400` ou `'60vh'`), a partir da qual as linhas rolam. */
146
+ maxHeight?: number | string;
147
+ /**
148
+ * Quantas linhas a tabela está MESMO a mostrar, e se os filtros do cabeçalho
149
+ * contam para isso.
150
+ *
151
+ * Uma contagem por fora (ex: o total que o servidor devolveu) não sabe dos
152
+ * filtros de coluna, que são cá de dentro: filtrar até sobrar uma linha
153
+ * deixava "14 223 resultados" por cima de uma lista de uma.
154
+ *
155
+ * `filtered: false` quer dizer "não contes comigo": não há filtros de coluna,
156
+ * ou o conjunto completo ainda não chegou.
157
+ *
158
+ * `selfPaginated`: com o conjunto completo, a tabela ignora a página que lhe
159
+ * dão e pagina-se a si mesma. Quem a alimenta deve então esconder a SUA
160
+ * paginação, que deixa de ter efeito.
161
+ */
162
+ onVisibleChange?: (v: {
163
+ visible: number;
164
+ filtered: boolean;
165
+ selfPaginated: boolean;
166
+ }) => void;
167
+ /**
168
+ * Quantas colunas do início ficam congeladas no scroll horizontal. A caixa de
169
+ * seleção, quando existe, vai junto.
170
+ */
171
+ frozenColumns?: number;
172
+ /**
173
+ * Arrastar os cabeçalhos para mudar a ordem das colunas. Opt-in: a tabela só
174
+ * avisa que coluna foi largada antes de qual. A ordem é de quem a alimenta,
175
+ * que a guarda e muda `columns`.
176
+ *
177
+ * `beforeKey: null` = largada depois da última. Esc durante o arrasto desfaz.
178
+ */
179
+ onMoveColumn?: (key: string, beforeKey: string | null) => void;
180
+ /**
181
+ * Com `fillHeight`: cada coluna fica com a largura do valor MAIS LARGO de
182
+ * todo o `allData` (ou do título, se for maior), e não com a da página à
183
+ * vista. Mudar de página ou filtrar não mexe nas larguras.
184
+ *
185
+ * Para conjuntos que já vêm inteiros: mede um exemplar de cada valor
186
+ * distinto de cada coluna.
187
+ */
188
+ measureAllData?: boolean;
189
+ /**
190
+ * Com `fillHeight`: barras de scroll desenhadas por cima das linhas, em vez
191
+ * das do browser. A vertical do browser obrigava o cabeçalho a reservar-lhe
192
+ * espaço; a horizontal punha uma faixa grossa por baixo das linhas.
193
+ */
194
+ overlayScrollbars?: boolean;
195
+ /** Classes da faixa dos títulos (com `onMoveColumn`). Por omissão `bg-slate-50`. */
196
+ headerRowClassName?: string;
197
+ /**
198
+ * Com `overlayScrollbars`: a barra horizontal centrada na aresta de baixo
199
+ * (meio por cima do que vem a seguir). Desligar quando a tabela vive numa
200
+ * caixa com `overflow-hidden`, senão a barra aparece cortada ao meio.
201
+ */
202
+ scrollbarOnEdge?: boolean;
203
+ /**
204
+ * Com `overlayScrollbars`: a barra horizontal numa faixa própria POR BAIXO
205
+ * das linhas (12px), em vez de por cima da última linha à vista.
206
+ */
207
+ horizontalScrollbarBelow?: boolean;
208
+ /**
209
+ * A carregar: linhas-esqueleto nas colunas verdadeiras em vez do spinner ao
210
+ * centro. O `loadingLabel` fica só para leitores de ecrã.
211
+ */
212
+ skeleton?: boolean;
213
+ /**
214
+ * Com mais colunas à direita do que cabem, a aresta direita esbate-se em vez
215
+ * de cortar as colunas a seco. Some ao chegar à última coluna.
216
+ */
217
+ fadeRight?: boolean;
218
+ /** Classes extra por linha (ex: uma cor por grupo de linhas). */
219
+ rowClassName?: (row: T) => string | undefined;
220
+ /** Textos da tabela e dos filtros. Por omissão em português. */
221
+ labels?: Partial<TableLabels>;
222
+ }
223
+ /**
224
+ * A barra de paginação em cima da tabela (a do `PaginatedTable`), em vez da
225
+ * troca de páginas no fundo. Interna: a app escolhe o `PaginatedTable`, não
226
+ * liga isto na `Table`.
227
+ */
228
+ export interface PaginacaoNoTopo {
229
+ /** Total de linhas no servidor, quando é ele que pagina. */
230
+ total?: number;
231
+ /** Página atual do servidor (a contar de 1). Com `onPageChange`, é o servidor que pagina. */
232
+ page?: number;
233
+ onPageChange?: (page: number) => void;
234
+ /** Tamanhos de página à escolha. Sem isto não há escolha. */
235
+ pageSizeOptions?: number[];
236
+ onPageSizeChange?: (pageSize: number) => void;
237
+ }
238
+ /** A tabela, com tudo. A `Table` e o `PaginatedTable` são predefinições dela. */
239
+ export declare function TableBase<T>({ paginacaoNoTopo, columns: colunasBase, data, allData, pageSize, rowKey, onRowClick, onRowDoubleClick, loading: isLoading, allDataLoading: isAllDataLoading, loadingLabel, emptyLabel, emptySubLabel, storageKey, selectable, onSelectionChange, clearSelectionTrigger, onAllDataNeeded: onDataNeeded, alwaysClient, defaultSortColumn: defaultSortCol, defaultSortDirection: defaultSortDir, viewRef, fillHeight: preencheAltura, onVisibleChange: onVista, frozenColumns: colunasFixas, onMoveColumn: onMoverColuna, measureAllData: larguraPeloConjunto, overlayScrollbars: barraSobreposta, headerRowClassName: classeCabecalho, scrollbarOnEdge: barraNaBorda, horizontalScrollbarBelow: barraHorizontalFora, skeleton: esqueletoAoCarregar, fadeRight: esbaterDireita, rowClassName, maxHeight, labels, }: TableProps<T> & {
240
+ paginacaoNoTopo?: PaginacaoNoTopo;
241
+ }): React.JSX.Element;
242
+ /**
243
+ * Tabela com ordenação, filtros por coluna, agrupamento, seleção e colunas que
244
+ * se arrastam para mudar a ordem. Com o conjunto completo (`allData`) pagina-se
245
+ * a si mesma, com a troca de páginas no fundo.
246
+ *
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 `PaginatedTable`.
249
+ */
250
+ export default function Table<T>(props: TableProps<T>): React.JSX.Element;
@@ -0,0 +1,54 @@
1
+ /** Os textos da tabela e dos filtros. Por omissão em português; a app troca os que quiser (ex: noutra língua). */
2
+ export interface TableLabels {
3
+ /** Sem linhas para mostrar (quando não há `emptyLabel`). */
4
+ empty: string;
5
+ page: string;
6
+ /** Nome acessível da navegação entre páginas. */
7
+ pagination: string;
8
+ /** O nome das linhas na contagem (`PaginatedTable`), ex: "linhas", "ordens". */
9
+ rowsNoun: (count: number) => string;
10
+ /** Na contagem filtrada (`PaginatedTable`): "1 de 120 ordens". */
11
+ of: string;
12
+ /** Cada opção do tamanho de página (`PaginatedTable`). */
13
+ perPage: (size: number) => string;
14
+ /** Nome acessível da escolha do tamanho de página. */
15
+ pageSize: string;
16
+ prev: string;
17
+ next: string;
18
+ apply: string;
19
+ cancel: string;
20
+ search: string;
21
+ noResults: string;
22
+ clearFilter: string;
23
+ clearAll: string;
24
+ clearGroups: string;
25
+ /** O "+N" dos chips que não cabem na barra (`PaginatedTable`), para leitores de ecrã. */
26
+ moreChips: (count: number) => string;
27
+ /** O × de um chip de filtro ou agrupamento. */
28
+ removeChip: (chip: string) => string;
29
+ /** O rótulo do chip de um agrupamento, antes do nome da coluna. */
30
+ groupedBy: string;
31
+ selectAll: string;
32
+ selectAllFound: (count: number) => string;
33
+ /** Num chip de filtro com mais de dois valores escolhidos. */
34
+ selectedCount: (count: number) => string;
35
+ loadingOptions: string;
36
+ filterBy: (column: string) => string;
37
+ groupBy: (column: string) => string;
38
+ ungroupBy: (column: string) => string;
39
+ sortAsc: string;
40
+ sortDesc: string;
41
+ sortDateAsc: string;
42
+ sortDateDesc: string;
43
+ sortNumAsc: string;
44
+ sortNumDesc: string;
45
+ dateFrom: string;
46
+ dateTo: string;
47
+ min: string;
48
+ max: string;
49
+ /** Numa coluna de números: passar do intervalo para a lista de valores. */
50
+ showList: string;
51
+ /** Numa coluna de números: passar da lista de valores para o intervalo. */
52
+ showRange: string;
53
+ }
54
+ export declare const DEFAULT_TABLE_LABELS: TableLabels;
@@ -8,6 +8,8 @@ export interface IconProps {
8
8
  /** Lado em px. */
9
9
  size?: number;
10
10
  className?: string;
11
+ /** Espessura do traço. Por omissão 1,8; mais grosso em ícones muito pequenos (ex: o visto de uma caixa). */
12
+ strokeWidth?: number;
11
13
  }
12
14
  /** Lido de um QR code. */
13
15
  export declare function QrCodeIcon(props: IconProps): React.JSX.Element;
@@ -22,3 +24,18 @@ export declare function InfoIcon(props: IconProps): React.JSX.Element;
22
24
  export declare function SearchIcon(props: IconProps): React.JSX.Element;
23
25
  export declare function CheckIcon(props: IconProps): React.JSX.Element;
24
26
  export declare function ChevronDownIcon(props: IconProps): React.JSX.Element;
27
+ export declare function ChevronUpIcon(props: IconProps): React.JSX.Element;
28
+ export declare function ChevronLeftIcon(props: IconProps): React.JSX.Element;
29
+ export declare function ChevronRightIcon(props: IconProps): React.JSX.Element;
30
+ /** Ordenável: ainda sem ordem escolhida. */
31
+ export declare function ChevronsUpDownIcon(props: IconProps): React.JSX.Element;
32
+ /** Filtro (funil). */
33
+ export declare function FilterIcon(props: IconProps): React.JSX.Element;
34
+ /** Fechar, remover (×). */
35
+ export declare function CloseIcon(props: IconProps): React.JSX.Element;
36
+ /** Agrupar (camadas). */
37
+ export declare function LayersIcon(props: IconProps): React.JSX.Element;
38
+ /** Lista de valores. */
39
+ export declare function ListIcon(props: IconProps): React.JSX.Element;
40
+ /** Intervalo (mínimo e máximo). */
41
+ export declare function SlidersIcon(props: IconProps): React.JSX.Element;
@@ -5,7 +5,7 @@ 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 { QrCodeIcon, SparklesIcon, PrefilledIcon, LockIcon, InfoIcon, SearchIcon, CheckIcon, ChevronDownIcon } from './foundations/icons/icons';
8
+ export { QrCodeIcon, SparklesIcon, PrefilledIcon, LockIcon, InfoIcon, SearchIcon, CheckIcon, ChevronDownIcon, ChevronUpIcon, ChevronLeftIcon, ChevronRightIcon, ChevronsUpDownIcon, FilterIcon, CloseIcon, LayersIcon, ListIcon, SlidersIcon, } from './foundations/icons/icons';
9
9
  export type { IconProps } from './foundations/icons/icons';
10
10
  export { default as TextInput } from './primitives/forms/TextInput/TextInput';
11
11
  export type { TextInputProps } from './primitives/forms/TextInput/TextInput';
@@ -13,6 +13,8 @@ export { default as SelectInput } from './primitives/forms/SelectInput/SelectInp
13
13
  export type { SelectInputProps } from './primitives/forms/SelectInput/SelectInput';
14
14
  export { default as TextArea } from './primitives/forms/TextArea/TextArea';
15
15
  export type { TextAreaProps } from './primitives/forms/TextArea/TextArea';
16
+ export { default as Checkbox } from './primitives/forms/Checkbox/Checkbox';
17
+ export type { CheckboxProps } from './primitives/forms/Checkbox/Checkbox';
16
18
  export { default as LookupInput } from './primitives/forms/LookupInput/LookupInput';
17
19
  export type { LookupInputProps } from './primitives/forms/LookupInput/LookupInput';
18
20
  export { default as FormGrid, FormDivider } from './components/forms/FormGrid/FormGrid';
@@ -23,3 +25,15 @@ export { default as Button } from './primitives/buttons/Button/Button';
23
25
  export type { ButtonProps } from './primitives/buttons/Button/Button';
24
26
  export { default as Dialog, useDialogContainer } from './components/overlays/Dialog/Dialog';
25
27
  export type { DialogProps } from './components/overlays/Dialog/Dialog';
28
+ export { default as Table } from './components/tables/Table/Table';
29
+ export type { TableProps, TableColumn, TableView, TableState } from './components/tables/Table/Table';
30
+ export { default as PaginatedTable } from './components/tables/PaginatedTable/PaginatedTable';
31
+ export type { PaginatedTableProps } from './components/tables/PaginatedTable/PaginatedTable';
32
+ export { DEFAULT_TABLE_LABELS } from './components/tables/Table/labels';
33
+ export type { TableLabels } from './components/tables/Table/labels';
34
+ export { default as ListItem } from './primitives/lists/ListItem/ListItem';
35
+ export type { ListItemProps, ListItemContent } from './primitives/lists/ListItem/ListItem';
36
+ export { default as ListFinder } from './components/lists/ListFinder/ListFinder';
37
+ export type { ListFinderProps } from './components/lists/ListFinder/ListFinder';
38
+ export { DEFAULT_LIST_FINDER_LABELS } from './components/lists/ListFinder/labels';
39
+ export type { ListFinderLabels } from './components/lists/ListFinder/labels';
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ export interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {
3
+ /** Marca a caixa a vermelho (ex: aceitar os termos, por marcar ao submeter). */
4
+ invalid?: boolean;
5
+ }
6
+ /**
7
+ * Caixa de marcar.
8
+ *
9
+ * Dentro de um [FormField](?path=/docs/v1-components-forms-formfield--docs) fica
10
+ * ligada à etiqueta automaticamente. Fora dele, dar-lhe um `aria-label` ou
11
+ * envolvê-la num `<label>`: sozinha não tem nome para os leitores de ecrã.
12
+ *
13
+ * **Aceita os atributos HTML do [&lt;input type="checkbox"&gt;](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/checkbox)**, com o mesmo comportamento: `checked`/`defaultChecked`, `onChange`, `required`, `disabled`, `name`, `value`, `ref`, ...
14
+ * Só os próprios do V1 aparecem na tabela abaixo.
15
+ * Diferenças: o `className` aplica-se à caixa à volta; o `type` é sempre `checkbox`.
16
+ */
17
+ declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;
18
+ export default Checkbox;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ /**
3
+ * A caixa de marcar das listas (ListItem e o "selecionar todos" do ListFinder),
4
+ * com o aspeto das caixas da Table. É um `<input type="checkbox">` a sério, para
5
+ * o teclado e os leitores de ecrã; o desenho é só por cima.
6
+ */
7
+ export declare function ListCheckbox({ checked, indeterminate, onChange, label, className }: {
8
+ checked: boolean;
9
+ /** Algumas marcadas, não todas: a caixa fica a cinzento. */
10
+ indeterminate?: boolean;
11
+ onChange: (checked: boolean) => void;
12
+ label: string;
13
+ className?: string;
14
+ }): React.JSX.Element;
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ /** O que se mostra num ListItem: o resto (ativo, marcado) é estado. */
3
+ export interface ListItemContent {
4
+ /** A linha principal (ex: a descrição). Numa linha só, cortada com "…" se não couber. */
5
+ title: React.ReactNode;
6
+ /** Por cima do título, pequeno e em letra de máquina (ex: o número ou código). */
7
+ code?: React.ReactNode;
8
+ /** A primeira linha: etiquetas e avisos (ex: a categoria). */
9
+ badges?: React.ReactNode;
10
+ /** Por baixo do título: o resto do que se quer ver de relance (local, data, indicadores). */
11
+ meta?: React.ReactNode;
12
+ }
13
+ export interface ListItemProps extends ListItemContent {
14
+ /** O que está aberto ao lado (fica realçado). */
15
+ active?: boolean;
16
+ /** Ao clicar (ou Enter/Espaço com o foco nele): normalmente, abri-lo. */
17
+ onClick?: () => void;
18
+ /** Marcado. Só há caixa de marcar se vier com `onCheckedChange`. */
19
+ checked?: boolean;
20
+ onCheckedChange?: (checked: boolean) => void;
21
+ /** O nome da caixa de marcar, para leitores de ecrã (ex: "Marcar P-020000"). */
22
+ checkboxLabel?: string;
23
+ className?: string;
24
+ }
25
+ /**
26
+ * Uma linha de uma lista para escolher: o cartão das listas do
27
+ * [ListFinder](?path=/docs/v1-components-lists-listfinder--docs).
28
+ *
29
+ * Não sabe o que mostra: a app dá as partes (etiquetas, código, título,
30
+ * detalhes) e o ListItem arruma-as sempre da mesma forma. Com
31
+ * `onCheckedChange` leva uma caixa à esquerda, para marcar vários.
32
+ *
33
+ * É um `<li>`: vai dentro de um `<ul>`.
34
+ */
35
+ export default function ListItem({ title, code, badges, meta, active, onClick, checked, onCheckedChange, checkboxLabel, className, }: ListItemProps): React.JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextelco/common-ui",
3
- "version": "2.1.103",
3
+ "version": "2.1.105",
4
4
  "description": "",
5
5
  "main": "dist/esm/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -22,7 +22,7 @@
22
22
  ],
23
23
  "scripts": {
24
24
  "prebuild": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
25
- "build": "vite build --config vite.lib.config.ts && tsc -p tsconfig.build.json && tailwindcss -i src/styles/tailwind.css -o dist/style.css --minify && tailwindcss -i src/styles/tailwind.layered.css -o dist/style.layered.css --minify && node scripts/css-components-layer.mjs",
25
+ "build": "vite build --config vite.lib.config.ts && tsc -p tsconfig.build.json && tailwindcss -i src/styles/tailwind.css -o dist/style.css --minify && tailwindcss -i src/styles/tailwind.layered.css -o dist/style.layered.css --minify && node scripts/css-components-layer.mjs && node scripts/extrair-imagens-css.mjs && node scripts/gerar-tema.mjs",
26
26
  "storybook": "storybook dev -p 6006",
27
27
  "build-storybook": "storybook build",
28
28
  "pub": "git add . && git commit -m \"update\" && git push && npm test && npm version patch && npm run build && npm publish",