@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,33 @@
1
+ import React from 'react';
2
+ export interface FilterChipItem {
3
+ /** Identificador único da etiqueta. */
4
+ key: string;
5
+ /** Texto (ex: "Estado: Cancelado"). */
6
+ label: React.ReactNode;
7
+ /** Tira este filtro. */
8
+ onRemove: () => void;
9
+ /** Ícone antes do texto (ex: o de agrupar). */
10
+ icon?: React.ReactNode;
11
+ /** `filter` (turquesa): um filtro. `group` (violeta): um agrupamento. */
12
+ tone?: 'filter' | 'group';
13
+ /** Cores próprias (classes), em vez das do `tone` — ex: a cor do estado. */
14
+ colorClassName?: string;
15
+ }
16
+ export interface FilterChipsProps {
17
+ items: FilterChipItem[];
18
+ /** Tira todos. Sem isto não aparece o "Limpar tudo". */
19
+ onClearAll?: () => void;
20
+ clearAllLabel?: string;
21
+ /** Nome do botão × para leitores de ecrã (recebe o texto da etiqueta, quando é texto). */
22
+ removeLabel?: string;
23
+ className?: string;
24
+ }
25
+ /**
26
+ * Etiquetas dos filtros ativos, cada uma com × para o tirar, e "Limpar tudo".
27
+ *
28
+ * É o mesmo que a `DataTable` mostra por cima da tabela: usar este sempre que
29
+ * um ecrã mostra os filtros escolhidos (ex: ao clicar num gráfico), para se
30
+ * reconhecerem como a mesma coisa em todo o lado. Sem itens não desenha nada.
31
+ */
32
+ export default function FilterChips({ items, onClearAll, clearAllLabel, removeLabel, className }: FilterChipsProps): React.JSX.Element | null;
33
+ export { FilterChips };
@@ -0,0 +1,68 @@
1
+ import React from 'react';
2
+ /**
3
+ * Estados com significado: `ok` (verde), `risco` (âmbar), `incumprido` (vermelho).
4
+ * Sem estado: `default` (texto normal) e `brand` (azul da marca).
5
+ * A cor é a do número — não usar cores só para enfeitar: um indicador sem
6
+ * significado bom/mau fica em `default`.
7
+ */
8
+ export type KpiTone = 'default' | 'brand' | 'ok' | 'risco' | 'incumprido';
9
+ export interface KpiProps {
10
+ label: React.ReactNode;
11
+ value: React.ReactNode;
12
+ tone?: KpiTone;
13
+ /** Linha por baixo do valor (ex: "de 120", "+12% do compromisso"). */
14
+ detail?: React.ReactNode;
15
+ /** Ícone antes do rótulo (ex: `<Inbox size={14} />`). */
16
+ icon?: React.ReactNode;
17
+ /** Ponto colorido antes do rótulo — liga o indicador à cor que ele tem no mapa ou na legenda. */
18
+ dot?: string;
19
+ /**
20
+ * Barra por baixo do valor. Um número é uma percentagem; uma lista é uma
21
+ * barra repartida, com cada troço proporcional ao seu peso.
22
+ *
23
+ * Serve para o indicador dizer a PROPORÇÃO e não só o valor: "253 concluídas"
24
+ * não diz nada sem saber de quantas.
25
+ */
26
+ bar?: number | {
27
+ weight: number;
28
+ color: string;
29
+ }[];
30
+ /** Linha pequena no fim, para um dado que acompanha mas não é o indicador. */
31
+ footer?: React.ReactNode;
32
+ /**
33
+ * Faixa fina em vez de cartão: alinha à esquerda e corta a altura para metade.
34
+ * Para muitos indicadores que empurrariam o conteúdo para fora do ecrã.
35
+ */
36
+ dense?: boolean;
37
+ /** Fundo no tom claro da cor, em vez de só o número colorido. */
38
+ tinted?: boolean;
39
+ /** Clicável (ex: filtra a tabela). Mostra o funil no canto (ou a seta, com `clickAction="open"`). */
40
+ onClick?: () => void;
41
+ /** O que o clique faz: `filter` (funil, por omissão) ou `open` (seta: abre uma lista ou um detalhe, não filtra). */
42
+ clickAction?: 'filter' | 'open';
43
+ /** Filtro ativo (Kpi clicável selecionado): contorno azul. */
44
+ active?: boolean;
45
+ /** Explicação no tooltip (camada `data-tip`), ex: "Filtrar a tabela" ou como o valor é calculado. */
46
+ hint?: string;
47
+ className?: string;
48
+ /** @deprecated Nome antigo (Legacy) de `detail`. */
49
+ delta?: React.ReactNode;
50
+ /** @deprecated Nome antigo (Legacy) de `tinted`. */
51
+ bgTint?: boolean;
52
+ /** @deprecated Nome antigo (Legacy) de `bar`. */
53
+ barra?: number | {
54
+ peso: number;
55
+ cor: string;
56
+ }[];
57
+ /** @deprecated Nome antigo (Legacy) de `footer`. */
58
+ rodape?: React.ReactNode;
59
+ /** @deprecated Nome antigo (Legacy) de `dense`. */
60
+ denso?: boolean;
61
+ }
62
+ /**
63
+ * Indicador: um número com o seu rótulo (ex: "Em progresso 13"). Quando é
64
+ * clicável filtra a vista e mostra-o com o funil; `active` marca o filtro
65
+ * aplicado. Dispor vários numa grelha (`grid gap-3`).
66
+ */
67
+ export default function Kpi({ label, value, tone, detail: detailProp, icon, dot, bar: barProp, footer: footerProp, dense: denseProp, tinted: tintedProp, onClick, clickAction, active, hint, className, delta, bgTint, barra, rodape, denso, }: KpiProps): React.JSX.Element;
68
+ export { Kpi };
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ export type NoticeTone = 'info' | 'warning' | 'error' | 'success';
3
+ export interface NoticeProps {
4
+ /** `info` (azul), `warning` (âmbar), `error` (vermelho), `success` (verde). */
5
+ tone?: NoticeTone;
6
+ /** Título curto em cima (ex: "Automação — saída de colaborador"). */
7
+ title?: React.ReactNode;
8
+ children?: React.ReactNode;
9
+ /** Ícone à esquerda; por omissão, o do tom. `null` sem ícone. */
10
+ icon?: React.ReactNode | null;
11
+ /** Ação à direita (ex: "Voltar ao meu perfil"). */
12
+ action?: {
13
+ label: React.ReactNode;
14
+ onClick: () => void;
15
+ };
16
+ /**
17
+ * `box` (por omissão): caixa no meio do conteúdo, para explicar uma regra ou avisar de algo nesse sítio.
18
+ * `banner`: faixa a toda a largura no topo, para um estado que afeta a página inteira (ex: "Ver como").
19
+ */
20
+ variant?: 'box' | 'banner';
21
+ className?: string;
22
+ }
23
+ /**
24
+ * Aviso ou explicação: uma caixa com ícone, título e texto (ex: a regra de uma
25
+ * automação, dados possivelmente incompletos), ou uma faixa no topo da página.
26
+ * Não é para o resultado de uma ação — esse é um toast (`useToast`).
27
+ */
28
+ export default function Notice({ tone, title, children, icon, action, variant, className }: NoticeProps): React.JSX.Element;
29
+ export { Notice };
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { type AvatarProps } from '../Avatar/Avatar';
3
+ export interface PersonProps extends AvatarProps {
4
+ /** Só o avatar (o nome fica no cartão e no tooltip), ex: em colunas estreitas. */
5
+ hideName?: boolean;
6
+ /** O que mostrar sem nome nem email. */
7
+ empty?: React.ReactNode;
8
+ }
9
+ /**
10
+ * Uma pessoa, igual em todo o lado: o avatar (fotografia ou iniciais, com o cartão
11
+ * de detalhes ao passar o rato) e o nome ao lado, numa linha. Usar sempre que se
12
+ * mostra o nome de alguém (ex: solicitante, responsável, quem aprovou).
13
+ */
14
+ export default function Person({ hideName, empty, className, ...avatar }: PersonProps): React.JSX.Element;
15
+ export { Person };
@@ -2,6 +2,13 @@ import React from 'react';
2
2
  export interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {
3
3
  /** Marca a caixa a vermelho (ex: aceitar os termos, por marcar ao submeter). */
4
4
  invalid?: boolean;
5
+ /**
6
+ * Meio marcada: um traço em vez do visto (ex: "selecionar todos" com só
7
+ * algumas marcadas). Só o aspeto: ao clicar, o browser tira-o e a caixa passa
8
+ * a marcada ou desmarcada pelo `onChange`, como sempre. Para leitores de ecrã é
9
+ * "parcialmente marcada".
10
+ */
11
+ indeterminate?: boolean;
5
12
  }
6
13
  /**
7
14
  * Caixa de marcar.
@@ -0,0 +1,43 @@
1
+ import React from 'react';
2
+ export interface DateInputProps {
3
+ /** Data em ISO (`aaaa-mm-dd`) ou `''` (vazio). Controlado. */
4
+ value?: string;
5
+ /** Valor inicial, sem controlar (ISO). */
6
+ defaultValue?: string;
7
+ /** Recebe só datas completas e válidas, em ISO; `''` quando se apaga. Enquanto se escreve, não é chamado. */
8
+ onChange?: (value: string) => void;
9
+ /** Ao terminar a edição: sair do campo ou escolher no calendário. */
10
+ onBlur?: () => void;
11
+ onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;
12
+ /** Limites, em ISO (só no calendário). */
13
+ min?: string;
14
+ max?: string;
15
+ disabled?: boolean;
16
+ readOnly?: boolean;
17
+ required?: boolean;
18
+ autoFocus?: boolean;
19
+ id?: string;
20
+ /** Marca o campo a vermelho (ex: obrigatório por preencher ao submeter). */
21
+ invalid?: boolean;
22
+ placeholder?: string;
23
+ /** Nome do campo para leitores de ecrã, quando não há etiqueta. */
24
+ 'aria-label'?: string;
25
+ /** Texto do botão do calendário. */
26
+ calendarLabel?: string;
27
+ /** Classes da caixa à volta (ex: largura). */
28
+ className?: string;
29
+ }
30
+ /**
31
+ * Campo de data, sempre em **dd/mm/aaaa**.
32
+ *
33
+ * O `<input type="date">` do browser mostra a data no idioma do BROWSER, não no
34
+ * da página (num Chrome em inglês aparece mm/dd/aaaa), e não há atributo que o
35
+ * force. Aqui o texto é escrito pela biblioteca, com máscara; o calendário
36
+ * continua a ser o nativo (acessível e traduzido), aberto pelo ícone.
37
+ *
38
+ * O valor entra e sai em ISO (`aaaa-mm-dd`). Dentro de um
39
+ * [FormField](?path=/docs/v1-components-forms-formfield--docs) fica ligado à
40
+ * etiqueta automaticamente.
41
+ */
42
+ export default function DateInput({ value, defaultValue, onChange, onBlur, onKeyDown, min, max, disabled, readOnly, required, autoFocus, id, invalid, placeholder, 'aria-label': ariaLabel, calendarLabel, className, }: DateInputProps): React.JSX.Element;
43
+ export { DateInput };
@@ -20,6 +20,9 @@ export interface LookupInputProps {
20
20
  * lupa ao lado (ex: escolher um projeto). A pesquisa é da app; este campo só
21
21
  * mostra o que foi escolhido.
22
22
  *
23
+ * Dentro de um [FormField](?path=/docs/v1-components-forms-formfield--docs) fica
24
+ * ligado à etiqueta automaticamente.
25
+ *
23
26
  * Não é como um `<input>` HTML: só aceita as props da tabela abaixo.
24
27
  */
25
28
  export default function LookupInput({ value, onLookup, lookupLabel, placeholder, invalid, disabled, id, className }: LookupInputProps): React.JSX.Element;
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ export interface SearchInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type' | 'className'> {
3
+ value: string;
4
+ /** O texto novo, a cada tecla (e `''` ao limpar). */
5
+ onChange: (value: string) => void;
6
+ /** Nome do campo para leitores de ecrã. Por omissão, o placeholder. */
7
+ label?: string;
8
+ /** Nome do botão ×, para leitores de ecrã. Por omissão: "Limpar pesquisa". */
9
+ clearLabel?: string;
10
+ /** Largura e posição (classes do invólucro). Por omissão `w-56`. */
11
+ className?: string;
12
+ /** Ícone à esquerda, no lugar da lupa, quando o filtro é de algo concreto (ex: empresa, colaborador). Tamanho 14. */
13
+ icon?: React.ReactNode;
14
+ }
15
+ /**
16
+ * Caixa de pesquisa das barras de páginas, tabelas e listas: a mesma altura
17
+ * dos botões ao lado. Lupa à esquerda; com texto, um × para limpar (Esc também
18
+ * limpa).
19
+ *
20
+ * Aceita os outros atributos do `<input>` (`autoFocus`, `name`, `onKeyDown`, …).
21
+ */
22
+ declare const SearchInput: React.ForwardRefExoticComponent<SearchInputProps & React.RefAttributes<HTMLInputElement>>;
23
+ export default SearchInput;
@@ -1,19 +1,70 @@
1
1
  import React from 'react';
2
- export interface SelectInputProps extends React.SelectHTMLAttributes<HTMLSelectElement> {
2
+ export interface SelectOption {
3
+ value: string;
4
+ label: string;
5
+ /** Texto pequeno por baixo do rótulo, na lista. */
6
+ description?: string;
7
+ disabled?: boolean;
8
+ }
9
+ export interface SelectInputLabels {
10
+ /** Texto da caixa de pesquisa. */
11
+ search: string;
12
+ /** Nome da caixa de pesquisa para leitores de ecrã; "{label}" é o nome do campo. */
13
+ searchIn: string;
14
+ noResults: string;
15
+ }
16
+ export declare const DEFAULT_SELECT_LABELS: SelectInputLabels;
17
+ export interface SelectInputProps {
18
+ /** A opção escolhida (controlado). `''` = nenhuma. */
19
+ value?: string;
20
+ defaultValue?: string;
21
+ /** As opções: texto simples (valor = rótulo) ou `{ value, label, description }`. */
22
+ options?: readonly (string | SelectOption)[];
23
+ /** Em alternativa a `options`: `<option>` como num `<select>` (compatível com o uso antigo). */
24
+ children?: React.ReactNode;
25
+ /** Recebe o valor escolhido. */
26
+ onValueChange?: (value: string) => void;
27
+ /** Como no `<select>`: `e.target.value` é o valor escolhido. */
28
+ onChange?: (e: React.ChangeEvent<HTMLSelectElement>) => void;
29
+ /** Texto do botão sem nada escolhido; com `placeholderOption`, também a primeira opção (vazia). */
30
+ placeholder?: string;
31
+ /** O `placeholder` é também uma opção (vazia) na lista. Por omissão sim, como no `<select>`. */
32
+ placeholderOption?: boolean;
33
+ /** Primeira opção vazia para desfazer a escolha (ex: "Todas"). */
34
+ emptyOption?: string;
35
+ /** Caixa de pesquisa no topo da lista. Por omissão, só com mais de 10 opções. */
36
+ searchable?: boolean;
37
+ disabled?: boolean;
38
+ required?: boolean;
3
39
  /** Marca o campo a vermelho (ex: obrigatório por escolher ao submeter). */
4
40
  invalid?: boolean;
5
- /** Texto da primeira opção, vazia (ex: "Selecionar"). */
6
- placeholder?: string;
41
+ id?: string;
42
+ /** Nome no formulário (vai num campo escondido). */
43
+ name?: string;
44
+ 'aria-label'?: string;
45
+ 'aria-labelledby'?: string;
46
+ /** `field` (por omissão): campo. `pill`: etiqueta arredondada (ex: o estado numa linha de tabela). A lista é a mesma. */
47
+ variant?: 'field' | 'pill';
48
+ /** Cores da etiqueta (`pill`), normalmente conforme o valor escolhido; pode trazer contorno (ex: `border border-dashed`). */
49
+ pillClassName?: string;
50
+ /** 38px em vez da altura dos controlos (para alinhar com campos de formulários mais altos). */
51
+ tall?: boolean;
52
+ labels?: Partial<SelectInputLabels>;
53
+ /** Classes da caixa à volta (ex: a largura). */
54
+ className?: string;
7
55
  }
8
56
  /**
9
- * Lista de escolha (o `<select>` do browser, com o aspeto dos outros campos).
10
- * As opções são `<option>` como num `<select>` normal.
57
+ * Lista de escolha: um campo que abre uma lista desenhada pela biblioteca (não a do sistema, que não segue o
58
+ * tema nem o aspeto dos portais). A opção escolhida tem ✓; com muitas opções há pesquisa.
59
+ *
60
+ * Teclado: ↑/↓, Home/End, Enter escolhe, Esc fecha; sem pesquisa, uma letra salta para a opção.
11
61
  *
12
- * O `className` aplica-se à caixa à volta (para a largura, por exemplo).
62
+ * Dentro de um [FormField](?path=/docs/v1-components-forms-formfield--docs) fica ligado à etiqueta
63
+ * automaticamente. Clicar não chega a uma linha clicável por baixo (ex: numa tabela).
13
64
  *
14
- * **Aceita os atributos HTML do [&lt;select&gt;](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/select)**, com o mesmo comportamento: `value`/`onChange`, `required`, `disabled`, `name`, `ref`, ...
15
- * Só os próprios do V1 aparecem na tabela abaixo.
16
- * Diferença: `placeholder` acrescenta uma primeira opção vazia (o `<select>` HTML não tem placeholder).
65
+ * Usa-se como um `<select>`: `<option>` como filhos e `onChange` com `e.target.value`; `placeholder`
66
+ * acrescenta uma primeira opção vazia.
17
67
  */
18
- declare const SelectInput: React.ForwardRefExoticComponent<SelectInputProps & React.RefAttributes<HTMLSelectElement>>;
68
+ declare const SelectInput: React.ForwardRefExoticComponent<SelectInputProps & React.RefAttributes<HTMLButtonElement>>;
19
69
  export default SelectInput;
70
+ export { SelectInput };
@@ -29,6 +29,9 @@ export interface TextAreaProps extends React.TextareaHTMLAttributes<HTMLTextArea
29
29
  * Com `maxLength`, o texto não passa do limite e o campo avisa quando se tenta
30
30
  * escrever ou colar a mais. Com `overflow`, pode passar, como aviso ou erro.
31
31
  *
32
+ * Dentro de um [FormField](?path=/docs/v1-components-forms-formfield--docs) fica
33
+ * ligado à etiqueta automaticamente.
34
+ *
32
35
  * **Aceita os atributos HTML do [&lt;textarea&gt;](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/textarea)**, com o mesmo comportamento: `value`/`onChange`, `required`, `disabled`, `readOnly`, `name`, `placeholder`, `maxLength`, `minLength`, `ref`, ...
33
36
  * Só os próprios do V1 aparecem na tabela abaixo.
34
37
  * Diferenças: o `className` aplica-se à caixa à volta; com `overflow`, o `maxLength` deixa de ser imposto.
@@ -3,6 +3,8 @@
3
3
  * clara, anel suave no foco, vermelho quando inválido (`aria-invalid`) e cinzento
4
4
  * quando desativado.
5
5
  */
6
+ /** O aspeto do campo sem o `display`/largura (para quem é flex, ex: o botão do SelectInput). */
7
+ export declare const fieldBoxClasses: string;
6
8
  export declare const fieldClasses: string;
7
9
  /** Só para campos de texto: um `<select>` também conta como `:read-only` no browser. */
8
10
  export declare const readOnlyClasses = "read-only:cursor-default read-only:bg-muted";
@@ -28,7 +28,8 @@ export interface ListItemProps extends ListItemContent {
28
28
  *
29
29
  * Não sabe o que mostra: a app dá as partes (etiquetas, código, título,
30
30
  * detalhes) e o ListItem arruma-as sempre da mesma forma. Com
31
- * `onCheckedChange` leva uma caixa à esquerda, para marcar vários.
31
+ * `onCheckedChange` leva uma caixa à esquerda, para marcar vários (um
32
+ * [Checkbox](?path=/docs/v1-primitives-forms-checkbox--docs)).
32
33
  *
33
34
  * É um `<li>`: vai dentro de um `<ul>`.
34
35
  */
@@ -0,0 +1,58 @@
1
+ import React from 'react';
2
+ export interface TabItem<K extends string = string> {
3
+ id: K;
4
+ /** Normalmente texto; aceita JSX. Com `iconOnly`, tem de ser texto (vai para o nome do botão e para o tooltip). */
5
+ label: React.ReactNode;
6
+ /** Ícone antes do texto (ex: um ícone do lucide com `size={14}`). */
7
+ icon?: React.ReactNode;
8
+ /** Número ao lado do texto (ex: pendentes). Não aparece se for `undefined`. */
9
+ count?: number;
10
+ /** Explicação no tooltip (`data-tip`, com o `TooltipLayer`), com o `label` como título. */
11
+ tip?: string;
12
+ disabled?: boolean;
13
+ }
14
+ interface TabsBase<K extends string> {
15
+ items: TabItem<K>[];
16
+ /** Nome do conjunto, para leitores de ecrã (ex: "Estado das faturas"). */
17
+ label?: string;
18
+ /**
19
+ * `underline` (por omissão): separadores da página, com a linha por baixo.
20
+ * `segmented`: botões juntos numa caixa, para trocar de vista dentro de uma
21
+ * secção (ex: Lista · Quadro).
22
+ */
23
+ variant?: 'underline' | 'segmented';
24
+ /** Só os ícones; o `label` fica no tooltip e no nome do botão. */
25
+ iconOnly?: boolean;
26
+ className?: string;
27
+ }
28
+ export interface TabsSingleProps<K extends string = string> extends TabsBase<K> {
29
+ multiple?: false;
30
+ /** O separador escolhido. A app guarda este estado. */
31
+ value: K;
32
+ onChange: (id: K) => void;
33
+ }
34
+ export interface TabsMultipleProps<K extends string = string> extends TabsBase<K> {
35
+ /**
36
+ * Vários escolhidos ao mesmo tempo: um clique escolhe só esse separador;
37
+ * Ctrl/⌘/Shift + clique junta-o ou tira-o dos escolhidos.
38
+ */
39
+ multiple: true;
40
+ value: K[];
41
+ /** Os escolhidos depois do clique, e o separador clicado. */
42
+ onChange: (ids: K[], clicked: K) => void;
43
+ /** O separador "Todos": escolhê-lo limpa a escolha, e fica ativo quando não há nenhum escolhido. */
44
+ allId?: K;
45
+ }
46
+ export type TabsProps<K extends string = string> = TabsSingleProps<K> | TabsMultipleProps<K>;
47
+ /**
48
+ * Separadores: escolher uma de várias vistas do mesmo ecrã.
49
+ *
50
+ * Só desenha os botões; o conteúdo de cada vista fica na app, que mostra o
51
+ * que corresponde a `value`. Setas ← → (e Home/End) mudam de separador,
52
+ * saltando os desativados. O escolhido fica a navy (não turquesa: turquesa
53
+ * sobre branco não tem contraste para texto).
54
+ *
55
+ * Com `multiple`, vários podem estar escolhidos (ex: estados de uma lista).
56
+ */
57
+ export default function Tabs<K extends string = string>(props: TabsProps<K>): React.JSX.Element;
58
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextelco/common-ui",
3
- "version": "2.1.105",
3
+ "version": "2.1.107",
4
4
  "description": "",
5
5
  "main": "dist/esm/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -10,6 +10,7 @@
10
10
  "types": "./dist/types/index.d.ts",
11
11
  "default": "./dist/esm/index.js"
12
12
  },
13
+ "./tailwind.css": "./dist/tailwind.css",
13
14
  "./dist/*": "./dist/*",
14
15
  "./package.json": "./package.json"
15
16
  },
@@ -22,7 +23,7 @@
22
23
  ],
23
24
  "scripts": {
24
25
  "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 && node scripts/extrair-imagens-css.mjs && node scripts/gerar-tema.mjs",
26
+ "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 && node -e \"const fs=require('fs');fs.copyFileSync('src/styles/tailwind.app.css','dist/tailwind.css');fs.copyFileSync('src/styles/tokens.css','dist/tokens.css')\" && node -e \"import('./dist/esm/v1/capabilities/theme/useTheme.js').then(m=>require('fs').writeFileSync('dist/theme-boot.js',m.themeBootScript))\"",
26
27
  "storybook": "storybook dev -p 6006",
27
28
  "build-storybook": "storybook build",
28
29
  "pub": "git add . && git commit -m \"update\" && git push && npm test && npm version patch && npm run build && npm publish",
@@ -109,7 +110,6 @@
109
110
  "react-infinite-scroll-component": "^6.1.0",
110
111
  "react-remove-scroll": "^2.6.3",
111
112
  "react-switch": "^7.1.0",
112
- "react-tooltip": "^5.28.0",
113
113
  "socket.io-client": "^4.8.1",
114
114
  "tough-cookie": "^5.1.2",
115
115
  "zxing-wasm": "^3.1.5"
@@ -1,17 +0,0 @@
1
- .cui-tooltip-wrapper {
2
- position: relative;
3
- }
4
-
5
- .cui-tooltip,
6
- .cui-tooltip-interactive {
7
- position: fixed;
8
- z-index: 9999999;
9
- background-color: black;
10
- border: 1px solid black;
11
- border-radius: 8px;
12
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
13
- }
14
-
15
- .cui-tooltip-interactive {
16
- pointer-events: auto !important;
17
- }
@@ -1,41 +0,0 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import { useId } from "react";
3
- import ReactDOM from "react-dom";
4
- import { Tooltip } from "react-tooltip";
5
- import "react-tooltip/dist/react-tooltip.css";
6
- import './Tooltip.css';/* empty css */
7
- const TooltipWrapper = ({
8
- id,
9
- children,
10
- tip,
11
- interactive = false,
12
- disabled = false
13
- }) => {
14
- const generatedId = useId();
15
- const tooltipId = id || generatedId;
16
- if (disabled) return /* @__PURE__ */ jsx("div", { children });
17
- return /* @__PURE__ */ jsxs("div", { "data-tooltip-id": tooltipId, className: "cui-tooltip-wrapper", children: [
18
- children,
19
- ReactDOM.createPortal(
20
- /* @__PURE__ */ jsx(
21
- Tooltip,
22
- {
23
- id: tooltipId,
24
- place: "top",
25
- variant: "dark",
26
- delayShow: 0,
27
- delayHide: interactive ? 200 : 0,
28
- className: interactive ? "cui-tooltip-interactive" : "cui-tooltip",
29
- "data-interactive": interactive,
30
- children: /* @__PURE__ */ jsx("div", { className: "cui-tooltip__tip", children: tip })
31
- }
32
- ),
33
- document.body
34
- // Render the tooltip directly to the body element
35
- )
36
- ] });
37
- };
38
- export {
39
- TooltipWrapper as default
40
- };
41
- //# sourceMappingURL=Tooltip.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tooltip.js","sources":["../../../../../../src/legacy/components/atoms/Tooltip/Tooltip.tsx"],"sourcesContent":["import React, { ReactNode, useId } from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport { Tooltip } from 'react-tooltip'\r\nimport 'react-tooltip/dist/react-tooltip.css'\r\nimport './Tooltip.scss'\r\n\r\ninterface TooltipWrapperProps {\r\n id?: string\r\n interactive?: boolean\r\n disabled?: boolean\r\n tip: ReactNode\r\n children: ReactNode\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nconst TooltipWrapper: React.FC<TooltipWrapperProps> = ({\r\n id,\r\n children,\r\n tip,\r\n interactive = false,\r\n disabled = false,\r\n}) => {\r\n const generatedId = useId()\r\n const tooltipId = id || generatedId\r\n\r\n if (disabled) return <div>{children}</div>\r\n\r\n return (\r\n <div data-tooltip-id={tooltipId} className=\"cui-tooltip-wrapper\">\r\n {children}\r\n {ReactDOM.createPortal(\r\n <Tooltip\r\n id={tooltipId}\r\n place=\"top\"\r\n variant=\"dark\"\r\n delayShow={0}\r\n delayHide={interactive ? 200 : 0}\r\n className={interactive ? 'cui-tooltip-interactive' : 'cui-tooltip'}\r\n data-interactive={interactive}\r\n >\r\n <div className=\"cui-tooltip__tip\">{tip}</div>\r\n </Tooltip>,\r\n document.body // Render the tooltip directly to the body element\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport default TooltipWrapper\r\n"],"names":[],"mappings":";;;;;;AAeA,MAAM,iBAAgD,CAAC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AACb,MAAM;AACJ,QAAM,cAAc,MAAA;AACpB,QAAM,YAAY,MAAM;AAExB,MAAI,SAAU,QAAO,oBAAC,OAAA,EAAK,SAAA,CAAS;AAEpC,SACE,qBAAC,OAAA,EAAI,mBAAiB,WAAW,WAAU,uBACxC,UAAA;AAAA,IAAA;AAAA,IACA,SAAS;AAAA,MACR;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,UACJ,OAAM;AAAA,UACN,SAAQ;AAAA,UACR,WAAW;AAAA,UACX,WAAW,cAAc,MAAM;AAAA,UAC/B,WAAW,cAAc,4BAA4B;AAAA,UACrD,oBAAkB;AAAA,UAElB,UAAA,oBAAC,OAAA,EAAI,WAAU,oBAAoB,UAAA,IAAA,CAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAEzC,SAAS;AAAA;AAAA,IAAA;AAAA,EACX,GACF;AAEJ;"}
@@ -1,18 +0,0 @@
1
- .cui-search {
2
- width: 100%;
3
- display: flex;
4
- align-items: center;
5
- gap: 2rem;
6
- }
7
- .cui-search__icon-container {
8
- width: 1.5rem;
9
- height: 1.5rem;
10
- }
11
- .cui-search__icon {
12
- width: 100%;
13
- height: 100%;
14
- color: var(--dark-blue);
15
- }
16
- .cui-search__input {
17
- width: 100%;
18
- }
@@ -1,30 +0,0 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { useState } from "react";
3
- import Input from "../../atoms/Input/Input.js";
4
- import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
5
- import { faSearch } from "@fortawesome/free-solid-svg-icons";
6
- import './Search.css';/* empty css */
7
- const Search = ({ handleSearch }) => {
8
- const [searchTerm, setSearchTerm] = useState("");
9
- const handleChange = (e) => {
10
- const { value } = e.target;
11
- setSearchTerm(value);
12
- handleSearch(value);
13
- };
14
- return /* @__PURE__ */ jsxs("div", { className: "cui-search", children: [
15
- /* @__PURE__ */ jsx("div", { className: "cui-search__icon-container", children: /* @__PURE__ */ jsx(FontAwesomeIcon, { icon: faSearch, className: "cui-search__icon" }) }),
16
- /* @__PURE__ */ jsx("div", { className: "cui-search__input", children: /* @__PURE__ */ jsx(
17
- Input,
18
- {
19
- onChange: handleChange,
20
- value: searchTerm,
21
- placeholder: "Pesquisa aqui..."
22
- }
23
- ) })
24
- ] });
25
- };
26
- export {
27
- Search,
28
- Search as default
29
- };
30
- //# sourceMappingURL=Search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Search.js","sources":["../../../../../../src/legacy/components/molecules/Search/Search.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport Input from '../../atoms/Input/Input'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { faSearch } from '@fortawesome/free-solid-svg-icons'\r\n\r\nimport './Search.scss'\r\n\r\ntype Props = {\r\n handleSearch: (searchTerm: string) => void\r\n}\r\n\r\nexport const Search = ({ handleSearch }: Props) => {\r\n const [searchTerm, setSearchTerm] = useState('')\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const { value } = e.target\r\n setSearchTerm(value)\r\n handleSearch(value)\r\n }\r\n\r\n return (\r\n <div className={'cui-search'}>\r\n <div className={'cui-search__icon-container'}>\r\n <FontAwesomeIcon icon={faSearch} className=\"cui-search__icon\" />\r\n </div>\r\n <div className={'cui-search__input'}>\r\n <Input\r\n onChange={handleChange}\r\n value={searchTerm}\r\n placeholder=\"Pesquisa aqui...\"\r\n />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Search\r\n"],"names":[],"mappings":";;;;;;AAWO,MAAM,SAAS,CAAC,EAAE,mBAA0B;AACjD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,EAAE;AAE/C,QAAM,eAAe,CAAC,MAA2C;AAC/D,UAAM,EAAE,UAAU,EAAE;AACpB,kBAAc,KAAK;AACnB,iBAAa,KAAK;AAAA,EACpB;AAEA,SACE,qBAAC,OAAA,EAAI,WAAW,cACd,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,WAAW,8BACd,UAAA,oBAAC,mBAAgB,MAAM,UAAU,WAAU,mBAAA,CAAmB,EAAA,CAChE;AAAA,IACA,oBAAC,OAAA,EAAI,WAAW,qBACd,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAY;AAAA,MAAA;AAAA,IAAA,EACd,CACF;AAAA,EAAA,GACF;AAEJ;"}
@@ -1,39 +0,0 @@
1
- import { useState, useEffect, useCallback } from "react";
2
- const STORAGE_KEY = "proef-theme";
3
- const ORDER = ["light", "dark", "system"];
4
- function systemPrefersDark() {
5
- return typeof window !== "undefined" && window.matchMedia("(prefers-color-scheme: dark)").matches;
6
- }
7
- function apply(theme) {
8
- if (typeof document === "undefined") return;
9
- const dark = theme === "dark" || theme === "system" && systemPrefersDark();
10
- document.documentElement.classList.toggle("dark", dark);
11
- }
12
- function useTheme() {
13
- const [theme, setThemeState] = useState(() => {
14
- if (typeof localStorage === "undefined") return "system";
15
- return localStorage.getItem(STORAGE_KEY) || "system";
16
- });
17
- useEffect(() => {
18
- apply(theme);
19
- }, [theme]);
20
- useEffect(() => {
21
- if (theme !== "system" || typeof window === "undefined") return;
22
- const mq = window.matchMedia("(prefers-color-scheme: dark)");
23
- const onChange = () => apply("system");
24
- mq.addEventListener("change", onChange);
25
- return () => mq.removeEventListener("change", onChange);
26
- }, [theme]);
27
- const setTheme = useCallback((t) => {
28
- if (typeof localStorage !== "undefined") localStorage.setItem(STORAGE_KEY, t);
29
- setThemeState(t);
30
- }, []);
31
- const cycle = useCallback(() => {
32
- setTheme(ORDER[(ORDER.indexOf(theme) + 1) % ORDER.length]);
33
- }, [theme, setTheme]);
34
- return { theme, setTheme, cycle };
35
- }
36
- export {
37
- useTheme
38
- };
39
- //# sourceMappingURL=useTheme.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTheme.js","sources":["../../../../src/legacy/hooks/useTheme.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react'\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport type Theme = 'light' | 'dark' | 'system'\r\n\r\nconst STORAGE_KEY = 'proef-theme'\r\nconst ORDER: Theme[] = ['light', 'dark', 'system']\r\n\r\n/** Resolve system → light|dark via matchMedia. */\r\nfunction systemPrefersDark(): boolean {\r\n return typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches\r\n}\r\n\r\n/** Aplica/remove a classe `.dark` no <html> conforme o tema efetivo. */\r\nfunction apply(theme: Theme) {\r\n if (typeof document === 'undefined') return\r\n const dark = theme === 'dark' || (theme === 'system' && systemPrefersDark())\r\n document.documentElement.classList.toggle('dark', dark)\r\n}\r\n\r\n/**\r\n * Gestor de tema light/dark/system para o `Sidebar`/`Layout` do common-ui.\r\n * Persiste em localStorage e aplica a classe `.dark` no <html> (o CSS do\r\n * design system reage via `.dark`). Uso:\r\n *\r\n * const { theme, setTheme } = useTheme()\r\n * <Layout theme={theme} onThemeChange={setTheme} ... />\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport function useTheme() {\r\n const [theme, setThemeState] = useState<Theme>(() => {\r\n if (typeof localStorage === 'undefined') return 'system'\r\n return (localStorage.getItem(STORAGE_KEY) as Theme) || 'system'\r\n })\r\n\r\n // Aplica sempre que o tema muda.\r\n useEffect(() => {\r\n apply(theme)\r\n }, [theme])\r\n\r\n // Segue a preferência do SO quando em 'system'.\r\n useEffect(() => {\r\n if (theme !== 'system' || typeof window === 'undefined') return\r\n const mq = window.matchMedia('(prefers-color-scheme: dark)')\r\n const onChange = () => apply('system')\r\n mq.addEventListener('change', onChange)\r\n return () => mq.removeEventListener('change', onChange)\r\n }, [theme])\r\n\r\n const setTheme = useCallback((t: Theme) => {\r\n if (typeof localStorage !== 'undefined') localStorage.setItem(STORAGE_KEY, t)\r\n setThemeState(t)\r\n }, [])\r\n\r\n const cycle = useCallback(() => {\r\n setTheme(ORDER[(ORDER.indexOf(theme) + 1) % ORDER.length])\r\n }, [theme, setTheme])\r\n\r\n return { theme, setTheme, cycle }\r\n}\r\n\r\nexport default useTheme\r\n"],"names":[],"mappings":";AAKA,MAAM,cAAc;AACpB,MAAM,QAAiB,CAAC,SAAS,QAAQ,QAAQ;AAGjD,SAAS,oBAA6B;AACpC,SAAO,OAAO,WAAW,eAAe,OAAO,WAAW,8BAA8B,EAAE;AAC5F;AAGA,SAAS,MAAM,OAAc;AAC3B,MAAI,OAAO,aAAa,YAAa;AACrC,QAAM,OAAO,UAAU,UAAW,UAAU,YAAY,kBAAA;AACxD,WAAS,gBAAgB,UAAU,OAAO,QAAQ,IAAI;AACxD;AAWO,SAAS,WAAW;AACzB,QAAM,CAAC,OAAO,aAAa,IAAI,SAAgB,MAAM;AACnD,QAAI,OAAO,iBAAiB,YAAa,QAAO;AAChD,WAAQ,aAAa,QAAQ,WAAW,KAAe;AAAA,EACzD,CAAC;AAGD,YAAU,MAAM;AACd,UAAM,KAAK;AAAA,EACb,GAAG,CAAC,KAAK,CAAC;AAGV,YAAU,MAAM;AACd,QAAI,UAAU,YAAY,OAAO,WAAW,YAAa;AACzD,UAAM,KAAK,OAAO,WAAW,8BAA8B;AAC3D,UAAM,WAAW,MAAM,MAAM,QAAQ;AACrC,OAAG,iBAAiB,UAAU,QAAQ;AACtC,WAAO,MAAM,GAAG,oBAAoB,UAAU,QAAQ;AAAA,EACxD,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,WAAW,YAAY,CAAC,MAAa;AACzC,QAAI,OAAO,iBAAiB,YAAa,cAAa,QAAQ,aAAa,CAAC;AAC5E,kBAAc,CAAC;AAAA,EACjB,GAAG,CAAA,CAAE;AAEL,QAAM,QAAQ,YAAY,MAAM;AAC9B,aAAS,OAAO,MAAM,QAAQ,KAAK,IAAI,KAAK,MAAM,MAAM,CAAC;AAAA,EAC3D,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,SAAO,EAAE,OAAO,UAAU,MAAA;AAC5B;"}