@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.
Files changed (199) hide show
  1. package/dist/esm/index.js +201 -145
  2. package/dist/esm/index.js.map +1 -1
  3. package/dist/esm/legacy/components/atoms/InputData/InputData.js +2 -13
  4. package/dist/esm/legacy/components/atoms/InputData/InputData.js.map +1 -1
  5. package/dist/esm/legacy/components/charts/Charts.js +147 -57
  6. package/dist/esm/legacy/components/charts/Charts.js.map +1 -1
  7. package/dist/esm/legacy/components/layout/Layout/Layout.js +21 -82
  8. package/dist/esm/legacy/components/layout/Layout/Layout.js.map +1 -1
  9. package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js +29 -218
  10. package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js.map +1 -1
  11. package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js +77 -10
  12. package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js.map +1 -1
  13. package/dist/esm/legacy/components/molecules/DataTable/DataTable.js +445 -337
  14. package/dist/esm/legacy/components/molecules/DataTable/DataTable.js.map +1 -1
  15. package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js +15 -97
  16. package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js.map +1 -1
  17. package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js +3 -3
  18. package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js.map +1 -1
  19. package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js +15 -3
  20. package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js.map +1 -1
  21. package/dist/esm/legacy/components/organisms/Selector/Selector.js +4 -4
  22. package/dist/esm/legacy/components/organisms/Selector/Selector.js.map +1 -1
  23. package/dist/esm/legacy/components/ui/Avisos.js +23 -76
  24. package/dist/esm/legacy/components/ui/Avisos.js.map +1 -1
  25. package/dist/esm/legacy/components/ui/CabecalhoPagina.js +14 -27
  26. package/dist/esm/legacy/components/ui/CabecalhoPagina.js.map +1 -1
  27. package/dist/esm/legacy/components/ui/CaixaPesquisa.js +3 -51
  28. package/dist/esm/legacy/components/ui/CaixaPesquisa.js.map +1 -1
  29. package/dist/esm/legacy/components/ui/Confirmacao.js +13 -31
  30. package/dist/esm/legacy/components/ui/Confirmacao.js.map +1 -1
  31. package/dist/esm/legacy/components/ui/Escolha.js +21 -137
  32. package/dist/esm/legacy/components/ui/Escolha.js.map +1 -1
  33. package/dist/esm/legacy/components/ui/FaixaAviso.js +13 -11
  34. package/dist/esm/legacy/components/ui/FaixaAviso.js.map +1 -1
  35. package/dist/esm/legacy/components/ui/Separadores.js +11 -46
  36. package/dist/esm/legacy/components/ui/Separadores.js.map +1 -1
  37. package/dist/esm/legacy/components/ui/Ui.js +18 -115
  38. package/dist/esm/legacy/components/ui/Ui.js.map +1 -1
  39. package/dist/esm/legacy/components/ui/painelFlutuante.js +5 -44
  40. package/dist/esm/legacy/components/ui/painelFlutuante.js.map +1 -1
  41. package/dist/esm/v1/capabilities/overlay/useFloatingPanel.js +52 -0
  42. package/dist/esm/v1/capabilities/overlay/useFloatingPanel.js.map +1 -0
  43. package/dist/esm/v1/capabilities/theme/useIsDark.js +15 -0
  44. package/dist/esm/v1/capabilities/theme/useIsDark.js.map +1 -0
  45. package/dist/esm/v1/capabilities/theme/useTheme.js +66 -0
  46. package/dist/esm/v1/capabilities/theme/useTheme.js.map +1 -0
  47. package/dist/esm/v1/components/data/Pagination/Pagination.js +66 -0
  48. package/dist/esm/v1/components/data/Pagination/Pagination.js.map +1 -0
  49. package/dist/esm/v1/components/feedback/Toast/Toast.js +105 -0
  50. package/dist/esm/v1/components/feedback/Toast/Toast.js.map +1 -0
  51. package/dist/esm/v1/components/forms/FormField/FormField.js.map +1 -1
  52. package/dist/esm/v1/components/forms/FormGrid/FormGrid.js.map +1 -1
  53. package/dist/esm/v1/components/layout/AppShell/AppShell.js +89 -0
  54. package/dist/esm/v1/components/layout/AppShell/AppShell.js.map +1 -0
  55. package/dist/esm/v1/components/layout/Page/Page.js +16 -0
  56. package/dist/esm/v1/components/layout/Page/Page.js.map +1 -0
  57. package/dist/esm/v1/components/layout/PageHeader/PageHeader.js +26 -0
  58. package/dist/esm/v1/components/layout/PageHeader/PageHeader.js.map +1 -0
  59. package/dist/esm/v1/components/layout/SideNav/SideNav.js +277 -0
  60. package/dist/esm/v1/components/layout/SideNav/SideNav.js.map +1 -0
  61. package/dist/esm/v1/components/layout/navTrail.js +19 -0
  62. package/dist/esm/v1/components/layout/navTrail.js.map +1 -0
  63. package/dist/esm/v1/components/lists/ListFinder/ListFinder.js +4 -4
  64. package/dist/esm/v1/components/lists/ListFinder/ListFinder.js.map +1 -1
  65. package/dist/esm/v1/components/overlays/ConfirmDialog/ConfirmDialog.js +95 -0
  66. package/dist/esm/v1/components/overlays/ConfirmDialog/ConfirmDialog.js.map +1 -0
  67. package/dist/esm/v1/components/overlays/Dialog/Dialog.js.map +1 -1
  68. package/dist/esm/v1/components/overlays/Tooltip/Tooltip.js +98 -0
  69. package/dist/esm/v1/components/overlays/Tooltip/Tooltip.js.map +1 -0
  70. package/dist/esm/v1/components/overlays/Tooltip/TooltipLayer.js +84 -0
  71. package/dist/esm/v1/components/overlays/Tooltip/TooltipLayer.js.map +1 -0
  72. package/dist/esm/v1/components/overlays/Tooltip/TooltipPanel.js +33 -0
  73. package/dist/esm/v1/components/overlays/Tooltip/TooltipPanel.js.map +1 -0
  74. package/dist/esm/v1/components/overlays/topLayer.js +28 -0
  75. package/dist/esm/v1/components/overlays/topLayer.js.map +1 -0
  76. package/dist/esm/v1/components/tables/PaginatedTable/PaginatedTable.js.map +1 -1
  77. package/dist/esm/v1/components/tables/Table/Table.js.map +1 -1
  78. package/dist/esm/v1/foundations/icons/icons.js +61 -2
  79. package/dist/esm/v1/foundations/icons/icons.js.map +1 -1
  80. package/dist/esm/v1/primitives/buttons/Button/Button.js +18 -4
  81. package/dist/esm/v1/primitives/buttons/Button/Button.js.map +1 -1
  82. package/dist/esm/v1/primitives/buttons/SegmentedControl/SegmentedControl.js +65 -0
  83. package/dist/esm/v1/primitives/buttons/SegmentedControl/SegmentedControl.js.map +1 -0
  84. package/dist/esm/v1/primitives/buttons/SegmentedControl/segmentedStyles.js +10 -0
  85. package/dist/esm/v1/primitives/buttons/SegmentedControl/segmentedStyles.js.map +1 -0
  86. package/dist/esm/v1/primitives/display/Avatar/Avatar.js +120 -0
  87. package/dist/esm/v1/primitives/display/Avatar/Avatar.js.map +1 -0
  88. package/dist/esm/v1/primitives/display/Badge/Badge.js +23 -0
  89. package/dist/esm/v1/primitives/display/Badge/Badge.js.map +1 -0
  90. package/dist/esm/v1/primitives/display/Card/Card.js +22 -0
  91. package/dist/esm/v1/primitives/display/Card/Card.js.map +1 -0
  92. package/dist/esm/v1/primitives/display/FilterChips/FilterChips.js +45 -0
  93. package/dist/esm/v1/primitives/display/FilterChips/FilterChips.js.map +1 -0
  94. package/dist/esm/v1/primitives/display/Kpi/Kpi.js +103 -0
  95. package/dist/esm/v1/primitives/display/Kpi/Kpi.js.map +1 -0
  96. package/dist/esm/v1/primitives/display/Notice/Notice.js +71 -0
  97. package/dist/esm/v1/primitives/display/Notice/Notice.js.map +1 -0
  98. package/dist/esm/v1/primitives/display/Person/Person.js +14 -0
  99. package/dist/esm/v1/primitives/display/Person/Person.js.map +1 -0
  100. package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js +10 -5
  101. package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js.map +1 -1
  102. package/dist/esm/v1/primitives/forms/DateInput/DateInput.js +150 -0
  103. package/dist/esm/v1/primitives/forms/DateInput/DateInput.js.map +1 -0
  104. package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js.map +1 -1
  105. package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js +43 -0
  106. package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js.map +1 -0
  107. package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js +190 -12
  108. package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js.map +1 -1
  109. package/dist/esm/v1/primitives/forms/TextArea/TextArea.js.map +1 -1
  110. package/dist/esm/v1/primitives/forms/field.js +4 -2
  111. package/dist/esm/v1/primitives/forms/field.js.map +1 -1
  112. package/dist/esm/v1/primitives/lists/ListItem/ListItem.js +2 -2
  113. package/dist/esm/v1/primitives/lists/ListItem/ListItem.js.map +1 -1
  114. package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js +96 -0
  115. package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js.map +1 -0
  116. package/dist/style.components.css +1 -1
  117. package/dist/style.css +1 -1
  118. package/dist/style.layered.css +1 -1
  119. package/dist/tailwind.css +24 -0
  120. package/dist/theme-boot.js +1 -0
  121. package/dist/theme.css +10 -3
  122. package/dist/tokens.css +119 -0
  123. package/dist/types/legacy/components/atoms/InputData/InputData.d.ts +4 -1
  124. package/dist/types/legacy/components/charts/Charts.d.ts +58 -5
  125. package/dist/types/legacy/components/layout/Layout/Layout.d.ts +7 -20
  126. package/dist/types/legacy/components/layout/Sidebar/Sidebar.d.ts +13 -26
  127. package/dist/types/legacy/components/molecules/ColumnPicker/ColumnPicker.d.ts +56 -3
  128. package/dist/types/legacy/components/molecules/DataTable/DataTable.d.ts +72 -7
  129. package/dist/types/legacy/components/molecules/UserAvatar/UserAvatar.d.ts +4 -5
  130. package/dist/types/legacy/components/ui/Avisos.d.ts +6 -16
  131. package/dist/types/legacy/components/ui/CabecalhoPagina.d.ts +6 -20
  132. package/dist/types/legacy/components/ui/CaixaPesquisa.d.ts +2 -4
  133. package/dist/types/legacy/components/ui/Confirmacao.d.ts +3 -10
  134. package/dist/types/legacy/components/ui/Escolha.d.ts +5 -15
  135. package/dist/types/legacy/components/ui/FaixaAviso.d.ts +2 -6
  136. package/dist/types/legacy/components/ui/Separadores.d.ts +3 -10
  137. package/dist/types/legacy/components/ui/Ui.d.ts +12 -54
  138. package/dist/types/legacy/components/ui/painelFlutuante.d.ts +6 -10
  139. package/dist/types/legacy/exports/atoms.d.ts +1 -1
  140. package/dist/types/legacy/exports/charts.d.ts +2 -2
  141. package/dist/types/legacy/exports/hooks.d.ts +2 -2
  142. package/dist/types/legacy/exports/molecules.d.ts +2 -2
  143. package/dist/types/v1/capabilities/overlay/useFloatingPanel.d.ts +20 -0
  144. package/dist/types/v1/capabilities/theme/useIsDark.d.ts +10 -0
  145. package/dist/types/v1/capabilities/theme/useTheme.d.ts +29 -0
  146. package/dist/types/v1/components/data/Pagination/Pagination.d.ts +33 -0
  147. package/dist/types/v1/components/feedback/Toast/Toast.d.ts +51 -0
  148. package/dist/types/v1/components/forms/FormField/FormField.d.ts +3 -3
  149. package/dist/types/v1/components/forms/FormGrid/FormGrid.d.ts +2 -0
  150. package/dist/types/v1/components/layout/AppShell/AppShell.d.ts +35 -0
  151. package/dist/types/v1/components/layout/Page/Page.d.ts +23 -0
  152. package/dist/types/v1/components/layout/PageHeader/PageHeader.d.ts +35 -0
  153. package/dist/types/v1/components/layout/SideNav/SideNav.d.ts +92 -0
  154. package/dist/types/v1/components/layout/navTrail.d.ts +15 -0
  155. package/dist/types/v1/components/lists/ListFinder/ListFinder.d.ts +1 -1
  156. package/dist/types/v1/components/overlays/ConfirmDialog/ConfirmDialog.d.ts +59 -0
  157. package/dist/types/v1/components/overlays/Dialog/Dialog.d.ts +6 -3
  158. package/dist/types/v1/components/overlays/Tooltip/Tooltip.d.ts +34 -0
  159. package/dist/types/v1/components/overlays/Tooltip/TooltipLayer.d.ts +18 -0
  160. package/dist/types/v1/components/overlays/Tooltip/TooltipPanel.d.ts +23 -0
  161. package/dist/types/v1/components/overlays/topLayer.d.ts +23 -0
  162. package/dist/types/v1/components/tables/PaginatedTable/PaginatedTable.d.ts +1 -1
  163. package/dist/types/v1/components/tables/Table/Table.d.ts +1 -1
  164. package/dist/types/v1/foundations/icons/icons.d.ts +20 -0
  165. package/dist/types/v1/index.d.ts +43 -1
  166. package/dist/types/v1/primitives/buttons/Button/Button.d.ts +22 -5
  167. package/dist/types/v1/primitives/buttons/SegmentedControl/SegmentedControl.d.ts +28 -0
  168. package/dist/types/v1/primitives/buttons/SegmentedControl/segmentedStyles.d.ts +16 -0
  169. package/dist/types/v1/primitives/display/Avatar/Avatar.d.ts +30 -0
  170. package/dist/types/v1/primitives/display/Badge/Badge.d.ts +25 -0
  171. package/dist/types/v1/primitives/display/Card/Card.d.ts +22 -0
  172. package/dist/types/v1/primitives/display/FilterChips/FilterChips.d.ts +33 -0
  173. package/dist/types/v1/primitives/display/Kpi/Kpi.d.ts +68 -0
  174. package/dist/types/v1/primitives/display/Notice/Notice.d.ts +29 -0
  175. package/dist/types/v1/primitives/display/Person/Person.d.ts +15 -0
  176. package/dist/types/v1/primitives/forms/Checkbox/Checkbox.d.ts +7 -0
  177. package/dist/types/v1/primitives/forms/DateInput/DateInput.d.ts +43 -0
  178. package/dist/types/v1/primitives/forms/LookupInput/LookupInput.d.ts +3 -0
  179. package/dist/types/v1/primitives/forms/SearchInput/SearchInput.d.ts +23 -0
  180. package/dist/types/v1/primitives/forms/SelectInput/SelectInput.d.ts +61 -10
  181. package/dist/types/v1/primitives/forms/TextArea/TextArea.d.ts +3 -0
  182. package/dist/types/v1/primitives/forms/field.d.ts +2 -0
  183. package/dist/types/v1/primitives/lists/ListItem/ListItem.d.ts +2 -1
  184. package/dist/types/v1/primitives/navigation/Tabs/Tabs.d.ts +58 -0
  185. package/package.json +3 -3
  186. package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.css +0 -17
  187. package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.js +0 -41
  188. package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.js.map +0 -1
  189. package/dist/esm/legacy/components/molecules/Search/Search.css +0 -18
  190. package/dist/esm/legacy/components/molecules/Search/Search.js +0 -30
  191. package/dist/esm/legacy/components/molecules/Search/Search.js.map +0 -1
  192. package/dist/esm/legacy/hooks/useTheme.js +0 -39
  193. package/dist/esm/legacy/hooks/useTheme.js.map +0 -1
  194. package/dist/esm/v1/primitives/lists/ListItem/ListCheckbox.js +0 -28
  195. package/dist/esm/v1/primitives/lists/ListItem/ListCheckbox.js.map +0 -1
  196. package/dist/types/legacy/components/atoms/Tooltip/Tooltip.d.ts +0 -13
  197. package/dist/types/legacy/components/molecules/Search/Search.d.ts +0 -7
  198. package/dist/types/legacy/hooks/useTheme.d.ts +0 -17
  199. package/dist/types/v1/primitives/lists/ListItem/ListCheckbox.d.ts +0 -14
@@ -0,0 +1,119 @@
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-page-title: 24px; /* título da página (PageHeader) — o mesmo em todos os portais e ecrãs */
20
+ --text-page-title--line-height: 2rem;
21
+ --text-title: 15px; /* títulos de caixas e janelas */
22
+ --text-control: 13px; /* texto dos campos e botões */
23
+ --text-caption: 11px; /* contadores, avisos, tamanhos de ficheiro */
24
+ --text-micro: 10px; /* dicas por baixo das etiquetas */
25
+
26
+ /* Tamanhos */
27
+ --spacing-control: 32px; /* altura de todos os controlos: botões, campos, pesquisa, seletores (iguais lado a lado) */
28
+ --spacing-form-label: 172px; /* coluna das etiquetas no FormGrid */
29
+ --spacing-form-label-narrow: 112px; /* a mesma coluna, em sítios estreitos */
30
+ --spacing-page-x: 48px; /* margem lateral da página (AppShell), a partir de 640px */
31
+ --spacing-page-x-narrow: 16px; /* a mesma margem em ecrãs estreitos */
32
+ --spacing-page-top: 32px; /* espaço por cima da página (AppShell), a partir de 1024px */
33
+ --spacing-page-top-narrow: 80px; /* o mesmo espaço abaixo de 1024px, com lugar para o botão do menu */
34
+
35
+ /* Larguras a partir das quais o FormGrid muda (container queries: @max-form-md, @max-form-sm) */
36
+ --container-form-md: 680px; /* etiquetas mais estreitas */
37
+ --container-form-sm: 500px; /* etiquetas por cima dos campos */
38
+
39
+ /* Larguras máximas das janelas (Dialog): max-w-dialog-sm, -md, -lg */
40
+ --container-dialog-sm: 480px;
41
+ --container-dialog-md: 720px;
42
+ --container-dialog-lg: 1000px;
43
+ /* Espaço mínimo entre a janela e as bordas do ecrã */
44
+ --spacing-dialog-margin: 24px;
45
+
46
+ /* Animações de entrada das janelas */
47
+ --animate-dialog-in: dialog-in 0.2s cubic-bezier(0.2, 0.9, 0.3, 1.1) both;
48
+ --animate-backdrop-in: backdrop-in 0.2s ease-out both;
49
+
50
+ @keyframes dialog-in {
51
+ from { opacity: 0; transform: translateY(10px) scale(0.97); }
52
+ }
53
+ @keyframes backdrop-in {
54
+ from { opacity: 0; }
55
+ }
56
+
57
+ /* Sombras (na cor primária, para seguirem a paleta) */
58
+ --shadow-card: 0 10px 30px color-mix(in srgb, var(--color-primary) 8%, transparent);
59
+ --shadow-card-hover: 0 14px 36px color-mix(in srgb, var(--color-primary) 12%, transparent);
60
+ --shadow-card-active: 0 16px 40px color-mix(in srgb, var(--color-primary) 16%, transparent);
61
+ --shadow-popover: 0 6px 18px color-mix(in srgb, var(--color-primary) 12%, transparent);
62
+ --shadow-tile: 0 10px 24px color-mix(in srgb, var(--color-primary) 18%, transparent);
63
+ --shadow-page: 0 1px 5px color-mix(in srgb, var(--color-primary) 10%, transparent);
64
+ --shadow-modal: 0 24px 60px color-mix(in srgb, var(--color-primary) 25%, transparent);
65
+ }
66
+
67
+ /* Fundo do corpo das janelas: um brilho navy que desce do cabeçalho e
68
+ desvanece para a cor do cartão (branco no tema claro, escuro no tema
69
+ escuro). Na cor primária, para seguir a paleta. */
70
+ @utility bg-canvas {
71
+ background-image:
72
+ radial-gradient(125% 70% at 50% -12%, color-mix(in srgb, var(--color-primary) 7%, transparent) 0%, transparent 55%),
73
+ linear-gradient(180deg, color-mix(in srgb, var(--color-primary) 5%, var(--color-card)) 0%, color-mix(in srgb, var(--color-primary) 2%, var(--color-card)) 55%, var(--color-card) 100%);
74
+ }
75
+
76
+ /* Esconde a barra de scroll do browser, mantendo o scroll (ex: quando há uma
77
+ barra desenhada por cima, como nas tabelas com `overlayScrollbars`). */
78
+ @utility scrollbar-none {
79
+ scrollbar-width: none;
80
+ &::-webkit-scrollbar {
81
+ display: none;
82
+ }
83
+ }
84
+
85
+ /* Sem o aspeto do browser dentro de `v1-reset` (ex: a Table): botões sem fundo,
86
+ borda nem margens, e com a letra de quem os rodeia; tabelas sem espaço entre
87
+ células. A biblioteca não traz o preflight do Tailwind, para não mexer nas
88
+ páginas da app; isto só toca no que está dentro da classe.
89
+ Em `@layer base` e com especificidade zero (`:where`): qualquer classe do
90
+ componente ganha-lhe. */
91
+ @layer base {
92
+ :where(.v1-reset) :where(button) {
93
+ appearance: none;
94
+ background: none;
95
+ border: 0;
96
+ padding: 0;
97
+ margin: 0;
98
+ font: inherit;
99
+ color: inherit;
100
+ letter-spacing: inherit;
101
+ text-transform: inherit;
102
+ cursor: pointer;
103
+ }
104
+ :where(.v1-reset) :where(button:disabled) {
105
+ cursor: default;
106
+ }
107
+ :where(.v1-reset) :where(input, select) {
108
+ font: inherit;
109
+ color: inherit;
110
+ margin: 0;
111
+ }
112
+ :where(.v1-reset) :where(table) {
113
+ border-collapse: collapse;
114
+ }
115
+ :where(.v1-reset) :where(th) {
116
+ font-weight: inherit;
117
+ text-align: inherit;
118
+ }
119
+ }
@@ -23,7 +23,10 @@ export interface InputDataProps extends PropsBase {
23
23
  min?: string;
24
24
  max?: string;
25
25
  }
26
- /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
26
+ /**
27
+ * Migrado para o V1: adaptador do `DateInput` (dd/mm/aaaa sempre, calendário pelo ícone).
28
+ * @deprecated Legacy — usar o `DateInput` do V1. Ver Storybook › Legacy.
29
+ */
27
30
  export declare function InputData({ value, onChange, disabled, id, min, max }: InputDataProps): React.JSX.Element;
28
31
  /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
29
32
  export interface InputHoraProps extends PropsBase {
@@ -18,6 +18,11 @@ export interface Distribuicao {
18
18
  labels: string[];
19
19
  valores: number[];
20
20
  }
21
+ /**
22
+ * Clique num elemento do gráfico: a etiqueta (ex: "Incidente"), a posição dela
23
+ * e o nome da série (quando há várias). Serve para filtrar ao clicar.
24
+ */
25
+ export type CliqueGrafico = (label: string, indice: number, serie?: string) => void;
21
26
  /**
22
27
  * Categorical palette. Stable order so the same dimension always maps to the same color.
23
28
  * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
@@ -25,37 +30,77 @@ export interface Distribuicao {
25
30
  export declare const PALETA: string[];
26
31
  /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
27
32
  export declare function cor(i: number): string;
33
+ export interface BarrasProps {
34
+ labels: string[];
35
+ /** Uma ou várias séries (ex: "Atribuídos" e "Resolvidos"), lado a lado ou empilhadas. */
36
+ series: {
37
+ nome: string;
38
+ valores: number[];
39
+ cor?: string;
40
+ }[];
41
+ /** Barras deitadas, com as etiquetas à esquerda (bom para nomes compridos e rankings). */
42
+ horizontal?: boolean;
43
+ /** Séries empilhadas em vez de lado a lado. */
44
+ empilhado?: boolean;
45
+ /** Altura em px. Nas horizontais, por omissão cresce com o número de barras. */
46
+ altura?: number;
47
+ /** Só as primeiras N (ex: top 10). */
48
+ limite?: number;
49
+ /** Cor de cada barra, quando há uma só série (ex: a cor de cada estado). */
50
+ cores?: string[];
51
+ /** Formato dos valores no tooltip, nas etiquetas e no eixo (ex: minutos → "7h30"). */
52
+ formatar?: (v: number) => string;
53
+ /** Mostra o valor na ponta de cada barra. */
54
+ valores?: boolean;
55
+ /** Junta a percentagem do total ao valor (ex: "12 (34%)"); só com uma série. */
56
+ percentagem?: boolean;
57
+ /** Legenda das séries. Por omissão, só quando há mais do que uma. */
58
+ legenda?: boolean;
59
+ /** Formato das etiquetas do eixo (ex: datas). Por omissão, datas ISO ficam curtas. */
60
+ formatarEtiqueta?: (label: string) => string;
61
+ /** Clique numa barra: devolve a etiqueta, a posição e a série. */
62
+ onClick?: CliqueGrafico;
63
+ }
64
+ /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
65
+ export declare function Barras({ labels: todas, series: todasSeries, horizontal, empilhado, altura, limite, cores, formatar, valores, percentagem, legenda, formatarEtiqueta, onClick, }: BarrasProps): React.JSX.Element;
28
66
  /**
29
67
  * Stacked bars for a dimension over time.
30
68
  * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
31
69
  */
32
- export declare function BarrasEmpilhadas({ serie, altura }: {
70
+ export declare function BarrasEmpilhadas({ serie, altura, onClick }: {
33
71
  serie: SerieEmpilhada;
34
72
  altura?: number;
73
+ onClick?: CliqueGrafico;
35
74
  }): React.JSX.Element;
36
75
  /**
37
76
  * Horizontal bars of a distribution (top N).
38
77
  * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
39
78
  */
40
- export declare function BarrasHorizontais({ dados, altura, limite }: {
79
+ export declare function BarrasHorizontais({ dados, altura, limite, onClick, }: {
41
80
  dados: Distribuicao;
42
81
  altura?: number;
43
82
  limite?: number;
83
+ onClick?: CliqueGrafico;
44
84
  }): React.JSX.Element;
45
85
  /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
46
- export declare function Anel({ dados, altura, cores }: {
86
+ export declare function Anel({ dados, altura, cores, formatar, onClick, }: {
47
87
  dados: Distribuicao;
48
88
  altura?: number;
49
89
  cores?: string[];
90
+ /** Formato dos valores no tooltip. */
91
+ formatar?: (v: number) => string;
92
+ /** Clique numa fatia: devolve a etiqueta e a posição. */
93
+ onClick?: CliqueGrafico;
50
94
  }): React.JSX.Element;
51
95
  /**
52
96
  * Simple line chart — optionally formats values as currency.
53
97
  * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
54
98
  */
55
- export declare function Linha({ dados, altura, euros: emEuros }: {
99
+ export declare function Linha({ dados, altura, euros: emEuros, onClick, }: {
56
100
  dados: Distribuicao;
57
101
  altura?: number;
58
102
  euros?: boolean;
103
+ onClick?: CliqueGrafico;
59
104
  }): React.JSX.Element;
60
105
  /**
61
106
  * Several lines over the same labels — NOT stacked.
@@ -65,10 +110,18 @@ export declare function Linha({ dados, altura, euros: emEuros }: {
65
110
  * stacking them would draw their sum, which means nothing.
66
111
  * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
67
112
  */
68
- export declare function Linhas({ serie, altura, area, }: {
113
+ export declare function Linhas({ serie, altura, area, cores, formatar, formatarEtiqueta, onClick, }: {
69
114
  serie: SerieEmpilhada;
70
115
  altura?: number;
71
116
  area?: boolean;
117
+ /** Cor de cada série, pela ordem. */
118
+ cores?: string[];
119
+ /** Formato dos valores no tooltip e no eixo. */
120
+ formatar?: (v: number) => string;
121
+ /** Formato das etiquetas do eixo (ex: datas). */
122
+ formatarEtiqueta?: (label: string) => string;
123
+ /** Clique num ponto: devolve a etiqueta (ex: o dia) e a série. */
124
+ onClick?: CliqueGrafico;
72
125
  }): React.JSX.Element;
73
126
  /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
74
127
  export interface PontoRisco {
@@ -1,13 +1,12 @@
1
1
  import React from 'react';
2
- import { SidebarMenuItem, SidebarLanguage, SidebarTheme } from '../Sidebar/Sidebar';
3
- /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
2
+ import { type SidebarMenuItem, type SidebarLanguage, type SidebarTheme } from '../Sidebar/Sidebar';
3
+ /** @deprecated Legacy — usar `AppShellProps` do V1. */
4
4
  export interface LayoutProps {
5
5
  children: React.ReactNode;
6
6
  menus: SidebarMenuItem[];
7
7
  groupLabels?: Record<string, string>;
8
8
  appTitle?: string;
9
- /** Barra superior opcional (título/alertas). Fica sticky acima do conteúdo,
10
- * alinhada à direita da sidebar. Traz o seu próprio fundo/padding. */
9
+ /** Barra superior opcional (título/alertas), sticky acima do conteúdo. */
11
10
  topBar?: React.ReactNode;
12
11
  avatar?: React.ReactNode;
13
12
  onLogout?: () => void;
@@ -23,26 +22,14 @@ export interface LayoutProps {
23
22
  dark?: string;
24
23
  system?: string;
25
24
  };
26
- /** Slot extra no rodapé da sidebar (ex: filtro global). Ver Sidebar.footer. */
27
25
  footer?: (isExpanded: boolean) => React.ReactNode;
28
- /** Quando este build foi feito, por baixo do logout. Ver Sidebar.deployedAt. */
29
26
  deployedAt?: string | number | Date;
30
27
  deployedAtLabel?: string;
31
- /**
32
- * Estado inicial da sidebar (aberta/fechada). Sem isto mantém-se o comportamento de
33
- * sempre: aberta no desktop, fechada em mobile. Passar isto serve para a app repor o
34
- * que a pessoa tinha antes de recarregar a página (ex.: lido do seu próprio
35
- * localStorage) — o Layout não persiste nada sozinho, tal como já acontece com `theme`.
36
- */
28
+ /** Estado inicial da sidebar (aberta/fechada). */
37
29
  sidebarOpen?: boolean;
38
- /**
39
- * Chamado sempre que a sidebar abre/fecha por uma ação da pessoa (o atalho da própria
40
- * Sidebar, ou o botão de expandir em mobile) — nunca pelo ajuste automático ao
41
- * redimensionar a janela, que não é uma escolha dela. Mesmo padrão de
42
- * `onThemeChange`: o Layout só avisa, quem usa decide se e como guardar.
43
- */
30
+ /** Chamado quando a pessoa abre/fecha a sidebar. */
44
31
  onSidebarOpenChange?: (open: boolean) => void;
45
32
  }
46
- /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
47
- declare const Layout: ({ children, menus, groupLabels, appTitle, topBar, avatar, onLogout, logoutLabel, languages, currentLang, onLanguageChange, theme, onThemeChange, themeLabels, footer, deployedAt, deployedAtLabel, sidebarOpen: sidebarOpenProp, onSidebarOpenChange, }: LayoutProps) => React.JSX.Element;
33
+ /** @deprecated Legacy — usar `AppShell` do V1. */
34
+ declare const Layout: ({ children, menus, currentLang, logoutLabel, themeLabels, deployedAtLabel, footer, sidebarOpen, onSidebarOpenChange, ...rest }: LayoutProps) => React.JSX.Element;
48
35
  export default Layout;
@@ -1,12 +1,13 @@
1
1
  import React from 'react';
2
- /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
2
+ import { type SideNavItem, type SideNavLabels } from '../../../../v1/components/layout/SideNav/SideNav';
3
+ /** @deprecated Legacy — usar `SideNavTheme` do V1. */
3
4
  export type SidebarTheme = 'light' | 'dark' | 'system';
4
- /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
5
+ /** @deprecated Legacy — usar `languages` do `SideNav` do V1. */
5
6
  export interface SidebarLanguage {
6
7
  code: string;
7
8
  label: string;
8
9
  }
9
- /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
10
+ /** @deprecated Legacy — usar `SideNavItem` do V1. */
10
11
  export interface SidebarMenuItem {
11
12
  to: string;
12
13
  icon: React.ComponentType<{
@@ -16,16 +17,12 @@ export interface SidebarMenuItem {
16
17
  label: string;
17
18
  group?: string;
18
19
  end?: boolean;
19
- /** Contador opcional (ex: aprovações pendentes). Igual ao badge do Sidebar dos Tickets. */
20
+ /** Contador opcional (ex: aprovações pendentes). */
20
21
  badge?: number;
21
- /**
22
- * Destino fora da aplicação (SharePoint, portal antigo, etc.): abre em
23
- * separador novo em vez de navegar pelo router. Sem isto, um URL absoluto
24
- * ia parar ao NavLink, que o trata como rota interna e dá página em branco.
25
- */
22
+ /** Destino fora da aplicação: abre em separador novo. */
26
23
  external?: boolean;
27
24
  }
28
- /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
25
+ /** @deprecated Legacy — usar `SideNavProps` do V1. */
29
26
  export interface SidebarProps {
30
27
  isOpen?: boolean;
31
28
  setIsOpen?: (isOpen: boolean) => void;
@@ -35,13 +32,9 @@ export interface SidebarProps {
35
32
  avatar?: React.ReactNode;
36
33
  onLogout?: () => void;
37
34
  logoutLabel?: string;
38
- /** Selector de idioma no rodapé da sidebar. Só aparece se `languages` vier. */
39
35
  languages?: SidebarLanguage[];
40
36
  currentLang?: string;
41
37
  onLanguageChange?: (code: string) => void;
42
- /** Selector de tema (light/dark/system) no rodapé. Só aparece se `onThemeChange` vier.
43
- * O common-ui só renderiza a UI + chama o callback — aplicar a classe `.dark`
44
- * no <html> é responsabilidade da app (o seu gestor de tema). */
45
38
  theme?: SidebarTheme;
46
39
  onThemeChange?: (theme: SidebarTheme) => void;
47
40
  themeLabels?: {
@@ -50,20 +43,14 @@ export interface SidebarProps {
50
43
  dark?: string;
51
44
  system?: string;
52
45
  };
53
- /** Slot extra no topo do rodapé (acima de tema/idioma/logout). Render-prop
54
- * com o estado expandido → ex: filtro global (AgendamentoEDP → AoFilterDropdown). */
55
46
  footer?: (isExpanded: boolean) => React.ReactNode;
56
- /**
57
- * Quando este build foi feito — aparece por baixo do logout.
58
- *
59
- * Serve para responder a "isto já tem a correcção?": diz a idade do código
60
- * que o browser está mesmo a correr, e não a que o servidor tem. A app é que
61
- * decide a QUEM o mostra (tipicamente só admins) — passar a prop é mostrá-la.
62
- */
63
47
  deployedAt?: string | number | Date;
64
- /** Tooltip do rodapé, para a app o traduzir. */
65
48
  deployedAtLabel?: string;
66
49
  }
67
- /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
68
- declare const Sidebar: ({ isOpen, setIsOpen, menus, groupLabels, appTitle, avatar, onLogout, logoutLabel, languages, currentLang, onLanguageChange, theme, onThemeChange, themeLabels, footer, deployedAt, deployedAtLabel, }: SidebarProps) => React.JSX.Element;
50
+ /** Itens do menu antigo no formato do V1 (`badge` → `badges`). */
51
+ export declare const menuV1: (menus: SidebarMenuItem[]) => SideNavItem[];
52
+ /** Os textos por omissão do menu antigo, para não mudarem nas apps que ainda o usam. */
53
+ export declare const labelsV1: (p: Pick<SidebarProps, "logoutLabel" | "themeLabels" | "deployedAtLabel">) => Partial<SideNavLabels>;
54
+ /** @deprecated Legacy — usar `SideNav` (ou `AppShell`) do V1. */
55
+ declare const Sidebar: ({ isOpen, setIsOpen, menus, currentLang, logoutLabel, themeLabels, deployedAtLabel, ...rest }: SidebarProps) => React.JSX.Element;
69
56
  export default Sidebar;
@@ -1,8 +1,11 @@
1
1
  import React from 'react';
2
+ import type { DataTableColumn } from '../DataTable/DataTable';
2
3
  /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
3
4
  export interface ColumnPickerItem {
4
5
  key: string;
5
6
  label: string;
7
+ /** Escondida por omissão — é assim que o "Repor" a deixa. */
8
+ defaultHidden?: boolean;
6
9
  }
7
10
  /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
8
11
  export interface ColumnPickerLabels {
@@ -10,11 +13,20 @@ export interface ColumnPickerLabels {
10
13
  title: string;
11
14
  all: string;
12
15
  none: string;
16
+ /** @deprecated O botão repõe ordem e visibilidade — usar `reset`. Continua a servir de texto quando `reset` não vem. */
13
17
  resetOrder: string;
18
+ /** Texto do botão que repõe ordem e colunas visíveis por omissão. */
19
+ reset?: string;
14
20
  moveUp: string;
15
21
  moveDown: string;
16
22
  }
17
- interface Props {
23
+ /** Layout de colunas guardável (ex.: numa API): chaves escondidas e ordem (vazia = ordem natural). */
24
+ export interface ColumnLayout {
25
+ hidden: string[];
26
+ order: string[];
27
+ }
28
+ /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
29
+ export interface ColumnPickerProps {
18
30
  /** Colunas pela ordem em que estão a ser desenhadas (já reordenadas). */
19
31
  columns: ColumnPickerItem[];
20
32
  hidden: Set<string>;
@@ -27,6 +39,13 @@ interface Props {
27
39
  * nenhumas não é utilizável. Default 1.
28
40
  */
29
41
  keepFirst?: number;
42
+ /** Chaves que ficam sempre à vista: a caixa aparece marcada e desativada, e "Nenhuma" não as esconde. */
43
+ alwaysVisible?: string[];
44
+ /**
45
+ * Substitui o "Repor". Por omissão chama `onOrderChange([])` e `onHiddenChange` com as `defaultHidden`;
46
+ * o `useColumnLayout` passa aqui o seu `reset`, para repor as duas coisas num só aviso.
47
+ */
48
+ onReset?: () => void;
30
49
  labels?: Partial<ColumnPickerLabels>;
31
50
  }
32
51
  /**
@@ -40,7 +59,7 @@ interface Props {
40
59
  * voltarem a aparecer.
41
60
  * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
42
61
  */
43
- export default function ColumnPicker({ columns, hidden, onHiddenChange, order, onOrderChange, keepFirst, labels, }: Props): React.JSX.Element;
62
+ export default function ColumnPicker({ columns, hidden, onHiddenChange, order, onOrderChange, keepFirst, alwaysVisible, onReset, labels, }: ColumnPickerProps): React.JSX.Element;
44
63
  /**
45
64
  * Reordena as colunas por `order`. Chaves fora de `order` ficam no fim, pela ordem natural —
46
65
  * assim uma ordem guardada antes de a tabela ganhar colunas novas continua a servir, em vez
@@ -60,4 +79,38 @@ export declare function orderColumns<C extends {
60
79
  export declare function applyColumnLayout<C extends {
61
80
  key: string;
62
81
  }>(columns: C[], order: string[], hidden: Set<string>): C[];
63
- export {};
82
+ /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
83
+ export interface UseColumnLayoutOptions {
84
+ /**
85
+ * Layout guardado (ex.: vindo de uma API). Pode chegar depois de montar: aplica-se quando deixa de ser
86
+ * `undefined` — a não ser que a pessoa já tenha mexido entretanto. Sem layout guardado não se passa
87
+ * (ficam as `defaultHidden`).
88
+ */
89
+ initial?: ColumnLayout;
90
+ /** Chamado a cada mudança feita pela pessoa (inclui o "Repor"). É aqui que a app guarda. */
91
+ onChange?: (layout: ColumnLayout) => void;
92
+ /** Chaves que nunca se escondem (ver `ColumnPicker.alwaysVisible`). */
93
+ alwaysVisible?: string[];
94
+ }
95
+ /** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
96
+ export interface UseColumnLayoutResult<C extends ColumnPickerItem> {
97
+ /** Colunas a passar à tabela: ordenadas e sem as escondidas. */
98
+ visibleColumns: C[];
99
+ layout: ColumnLayout;
100
+ /** Muda o layout (valor ou função do anterior) e avisa `onChange`. */
101
+ setLayout: (next: ColumnLayout | ((prev: ColumnLayout) => ColumnLayout)) => void;
102
+ /** Volta à ordem natural com as `defaultHidden` escondidas, e avisa `onChange`. */
103
+ reset: () => void;
104
+ /** Props prontas para `<ColumnPicker {...pickerProps} />`. */
105
+ pickerProps: Pick<ColumnPickerProps, 'hidden' | 'onHiddenChange' | 'order' | 'onOrderChange' | 'alwaysVisible' | 'onReset'> & {
106
+ columns: C[];
107
+ };
108
+ }
109
+ /**
110
+ * Estado do layout de colunas (visibilidade + ordem) para ligar ao `ColumnPicker` e à tabela.
111
+ *
112
+ * Não guarda nada: quem persiste (sessão, API do servidor…) é a app, com `initial` + `onChange`. Arranca com
113
+ * as `defaultHidden` escondidas e as `alwaysVisible` nunca saem.
114
+ * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
115
+ */
116
+ export declare function useColumnLayout<T, C extends ColumnPickerItem = DataTableColumn<T>>(columns: C[], { initial, onChange, alwaysVisible }?: UseColumnLayoutOptions): UseColumnLayoutResult<C>;
@@ -35,8 +35,9 @@ export interface DataTableColumn<T> {
35
35
  /** Chave usada só para ORDENAR os grupos (sobrepõe-se a `value` ao agrupar por esta coluna). */
36
36
  groupSortKey?: (row: T) => string | number | null | undefined;
37
37
  /**
38
- * Filtros extra desenhados como funis adicionais no cabeçalho desta coluna — para filtrar
39
- * por um campo que não tem coluna própria (ex: filtrar a coluna "Obra" por concelho).
38
+ * Filtros extra no cabeçalho desta coluna — para filtrar por um campo que não tem coluna
39
+ * própria (ex: filtrar a coluna "Obra" por concelho). Partilham o funil da coluna: o popup
40
+ * mostra no topo um seletor (coluna + cada filtro extra) para escolher a lista a filtrar.
40
41
  */
41
42
  extraFilters?: {
42
43
  key: string;
@@ -57,6 +58,17 @@ export interface DataTableColumn<T> {
57
58
  * valor escolhido ganha o seu chip, removível à parte.
58
59
  */
59
60
  valueChipColors?: Record<string, string>;
61
+ /**
62
+ * Vários valores de filtro por linha (ex.: um equipamento com várias aplicações). Alimenta a lista do funil,
63
+ * o filtro (a linha passa se QUALQUER um dos seus valores estiver escolhido) e os chips. Sem isto, um valor
64
+ * por linha (`value`). Ao agrupar, usa o `value` da linha (a combinação de valores, ex.: "Hardware, Rede").
65
+ */
66
+ filterValues?: (row: T) => ReadonlyArray<string | number | null | undefined>;
67
+ /**
68
+ * Escondida à partida no layout de colunas (`useColumnLayout` e o "Repor" do `ColumnPicker`). A tabela em
69
+ * si desenha as colunas que recebe.
70
+ */
71
+ defaultHidden?: boolean;
60
72
  }
61
73
  /**
62
74
  * Ordenação, filtros e agrupamento do cabeçalho vivem dentro da tabela. Quem está por fora
@@ -117,16 +129,25 @@ export interface DataTableLabels {
117
129
  moreOptions: string;
118
130
  /** Aviso no popup enquanto `allData` não chegou — as opções ainda são só as de `data`. */
119
131
  loadingOptions: string;
120
- /** Placeholders dos dois campos do filtro por intervalo (colunas numéricas e de datas). */
132
+ /** Placeholders dos dois campos do filtro por intervalo nas colunas numéricas. */
121
133
  min: string;
122
134
  max: string;
135
+ /** Rótulos dos dois campos do filtro por intervalo nas colunas de datas (default 'From'/'To'). */
136
+ from?: string;
137
+ to?: string;
123
138
  /** {page}/{pages} são substituídos. */
124
139
  page: string;
125
140
  prev: string;
126
141
  next: string;
127
- /** Ordenação a partir do popup de filtro. */
142
+ /** Ordenação a partir do popup de filtro, nas colunas de texto (A→Z / Z→A). */
128
143
  sortAsc: string;
129
144
  sortDesc: string;
145
+ /** Ordenação a partir do popup nas colunas de datas (default 'Oldest first'/'Newest first'). */
146
+ sortOldest?: string;
147
+ sortNewest?: string;
148
+ /** Ordenação a partir do popup nas colunas numéricas (default 'Smallest first'/'Largest first'). */
149
+ sortSmallest?: string;
150
+ sortLargest?: string;
130
151
  /** Agrupamento. {label} é o nome da coluna. */
131
152
  groupBy: string;
132
153
  ungroup: string;
@@ -139,6 +160,8 @@ export interface DataTableLabels {
139
160
  selectAllResults: string;
140
161
  /** Rótulo da linha de total (`totalRow`). */
141
162
  total: string;
163
+ /** Nome acessível da zona com scroll horizontal (só com `scrollAffordance`). */
164
+ scrollRegion?: string;
142
165
  }
143
166
  interface DataTableProps<T> {
144
167
  columns: DataTableColumn<T>[];
@@ -161,6 +184,12 @@ interface DataTableProps<T> {
161
184
  isAllDataLoading?: boolean;
162
185
  /** Força o modo cliente mesmo sem interação (desde que `allData` exista). */
163
186
  alwaysClient?: boolean;
187
+ /**
188
+ * Total de linhas no servidor (paginação de servidor). Fora do modo cliente, `data` é só a página à
189
+ * vista — o texto de resultados da toolbar usa então este total em vez do nº de linhas de `data`.
190
+ * Em modo cliente (ou com filtros ativos) conta-se, como sempre, as linhas filtradas.
191
+ */
192
+ totalCount?: number;
164
193
  /**
165
194
  * Avisa quando a tabela passa (ou deixa) de trabalhar sobre `allData`. Quem tem paginação
166
195
  * de servidor por fora usa isto para a esconder: em modo cliente as linhas à vista já não
@@ -186,13 +215,26 @@ interface DataTableProps<T> {
186
215
  isError?: boolean;
187
216
  /** max-height do viewport com scroll (default 70vh). */
188
217
  maxHeight?: string;
189
- /** Linhas por página. Sem isto, mostra tudo (pode ser lento com muitas linhas). */
218
+ /**
219
+ * Linhas por página. Sem isto, mostra tudo (pode ser lento com muitas linhas).
220
+ *
221
+ * Com `allData` quem pagina `data` é a app (paginação de servidor): a tabela só pagina em modo cliente
222
+ * (filtros/ordenação/agrupamento ativos), senão paginava outra vez a página que já recebeu.
223
+ * Com `storageKey`, o tamanho escolhido no selector fica na sessão (`dt_pagesize_<storageKey>`).
224
+ */
190
225
  pageSize?: number;
191
226
  /** Mostra um selector de linhas por página com estas opções. */
192
227
  pageSizeOptions?: number[];
193
228
  /** Caixa de seleção por linha + no cabeçalho. */
194
229
  selectable?: boolean;
195
230
  onSelectionChange?: (selectedKeys: Set<string>) => void;
231
+ /** Linhas que se podem selecionar (default: todas). As outras mostram a caixa desativada e ficam fora do "selecionar todas". */
232
+ isRowSelectable?: (row: T) => boolean;
233
+ /**
234
+ * Seleção inicial (chaves de `rowKey`). Volta a ser aplicada quando muda por valor (não por identidade) —
235
+ * ex.: uma pré-seleção vinda de outro ecrã. Não chama `onSelectionChange`: quem a passa já a conhece.
236
+ */
237
+ initialSelectedKeys?: Iterable<string | number>;
196
238
  /** Mudar este número limpa a seleção (ex: depois de uma ação em massa). */
197
239
  clearSelectionTrigger?: number;
198
240
  /** Guarda filtros e intervalos no sessionStorage com esta chave (e as larguras das colunas no localStorage). */
@@ -203,7 +245,8 @@ interface DataTableProps<T> {
203
245
  resizableColumns?: boolean;
204
246
  /**
205
247
  * "Ordenar A→Z / Z→A" no topo do popup de filtro. Ligado por omissão (o cabeçalho é o mesmo em todos os
206
- * portais); `false` desliga. Os textos vêm de `labels.sortAsc`/`sortDesc` (por omissão em inglês).
248
+ * portais); `false` desliga. Os textos dependem do `sortType`: `labels.sortAsc`/`sortDesc` no texto,
249
+ * `sortOldest`/`sortNewest` nas datas e `sortSmallest`/`sortLargest` nos números (por omissão em inglês).
207
250
  */
208
251
  sortFromFilter?: boolean;
209
252
  /**
@@ -241,6 +284,28 @@ interface DataTableProps<T> {
241
284
  totalRow?: boolean;
242
285
  /** Agrupamento inicial (chaves de colunas, por ordem de nível). A pessoa pode mudá-lo depois. */
243
286
  defaultGroupBy?: string[];
287
+ /**
288
+ * Agrupamento controlado (chaves de colunas, por ordem de nível). Com isto a tabela usa este valor (ignora
289
+ * `defaultGroupBy` e a sessão) e as mudanças da pessoa chegam por `onGroupByChange`.
290
+ */
291
+ groupBy?: string[];
292
+ /** Chamado quando a pessoa muda o agrupamento (também sem `groupBy`, só para acompanhar). */
293
+ onGroupByChange?: (keys: string[]) => void;
294
+ /** Chamado quando a ordenação muda (`null` = sem ordenação). Também ao montar, se a inicial não for nenhuma. */
295
+ onSortChange?: (sort: {
296
+ key: string;
297
+ dir: 'asc' | 'desc';
298
+ } | null) => void;
299
+ /**
300
+ * Chamado quando os filtros por valor das colunas mudam (chave → valores escolhidos). Também ao montar, se
301
+ * vierem filtros da sessão. Só os ativos; os intervalos ficam de fora (ver `viewRef`).
302
+ */
303
+ onColumnFiltersChange?: (filters: Record<string, string[]>) => void;
304
+ /**
305
+ * Torna focável a zona com scroll horizontal (`role="region"`, nome em `labels.scrollRegion`) e deixa
306
+ * deslizá-la com ←/→/Home/End. Default desligado.
307
+ */
308
+ scrollAffordance?: boolean;
244
309
  }
245
310
  /**
246
311
  * Timestamp de um valor de coluna de data. As apps passam a data já formatada (`value:
@@ -275,5 +340,5 @@ export declare function pesquisaCuringa(q: string): (v: string) => boolean;
275
340
  * filtrar, ordenar e agrupar só olhariam para a página à vista.
276
341
  * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
277
342
  */
278
- export default function DataTable<T>({ columns, data, allData, onDataNeeded, isAllDataLoading, alwaysClient, onClientModeChange, rowKey, onRowClick, onRowDoubleClick, rowClassName, onVisibleRowsChange, isLoading, isError, maxHeight, pageSize, pageSizeOptions, selectable, onSelectionChange, clearSelectionTrigger, storageKey, defaultMaxColumnWidth, resizableColumns, sortFromFilter, filterMode, defaultSortKey, defaultSortDir, viewRef, exportFileName, onExport, extraToolbar, emptySubLabel, emptyIcon, labels, totalRow, defaultGroupBy, }: DataTableProps<T>): React.JSX.Element;
343
+ export default function DataTable<T>({ columns, data, allData, onDataNeeded, isAllDataLoading, alwaysClient, totalCount, onClientModeChange, rowKey, onRowClick, onRowDoubleClick, rowClassName, onVisibleRowsChange, isLoading, isError, maxHeight, pageSize, pageSizeOptions, selectable, onSelectionChange, isRowSelectable, initialSelectedKeys, clearSelectionTrigger, storageKey, defaultMaxColumnWidth, resizableColumns, sortFromFilter, filterMode, defaultSortKey, defaultSortDir, viewRef, exportFileName, onExport, extraToolbar, emptySubLabel, emptyIcon, labels, totalRow, defaultGroupBy, groupBy, onGroupByChange, onSortChange, onColumnFiltersChange, scrollAffordance, }: DataTableProps<T>): React.JSX.Element;
279
344
  export {};
@@ -6,15 +6,14 @@ interface UserAvatarProps {
6
6
  company?: string | null;
7
7
  jobTitle?: string | null;
8
8
  department?: string | null;
9
+ /** Tamanho, forma e cores das iniciais (classes Tailwind), como antes. */
9
10
  className?: string;
10
11
  /** Mostra o cartão de detalhes em hover (foto ampliada + nome/email). Default: off. */
11
12
  showCard?: boolean;
12
13
  }
13
14
  /**
14
- * Avatar de utilizador: mostra a foto (se disponível) ou as iniciais, com um
15
- * cartão de detalhes em hover (via portal). Usa classes Tailwind — a app
16
- * consumidora é responsável por gerar o CSS Tailwind.
17
- * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
15
+ * Migrado para o V1: adaptador do `Avatar` (nomes antigos; o tamanho e as cores vêm do `className`).
16
+ * @deprecated Legacy — usar o `Avatar` (ou o `Person`, com o nome ao lado) do V1. Ver Storybook › Legacy.
18
17
  */
19
- export default function UserAvatar({ name, photo, email, company, jobTitle, department, className, showCard, }: UserAvatarProps): React.JSX.Element;
18
+ export default function UserAvatar({ name, photo, email, company, jobTitle, department, className, showCard }: UserAvatarProps): React.JSX.Element;
20
19
  export {};