@1doc/1ds-react 2.7.2 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1280 -0
- package/dist/components/AIContent/AIContent.d.ts +10 -0
- package/dist/components/AIContent/AIContent.js +1 -1
- package/dist/components/AILabel/AILabel.d.ts +4 -0
- package/dist/components/AILabel/AILabel.js +2 -2
- package/dist/components/Accordion/Accordion.d.ts +6 -2
- package/dist/components/Alert/Alert.css +2 -0
- package/dist/components/Alert/Alert.d.ts +3 -1
- package/dist/components/Alert/Alert.js +7 -1
- package/dist/components/AppHeader/AppHeader.css +82 -8
- package/dist/components/AppHeader/AppHeader.d.ts +12 -1
- package/dist/components/AppHeader/AppHeader.js +186 -1
- package/dist/components/AppNavItem/AppNavItem.css +11 -3
- package/dist/components/AppShell/AppShell.css +9 -0
- package/dist/components/AppShell/AppShell.d.ts +8 -0
- package/dist/components/AppShell/AppShell.js +4 -1
- package/dist/components/AppSidebar/AppSidebar.css +1 -1
- package/dist/components/AppSidebar/AppSidebar.d.ts +4 -0
- package/dist/components/AppSidebar/AppSidebar.js +3 -1
- package/dist/components/AttachmentCard/AttachmentCard.css +17 -1
- package/dist/components/AttachmentCard/AttachmentCard.d.ts +29 -2
- package/dist/components/AttachmentCard/AttachmentCard.js +88 -20
- package/dist/components/Avatar/Avatar.css +7 -2
- package/dist/components/Avatar/AvatarGroup.d.ts +27 -0
- package/dist/components/Avatar/AvatarGroup.js +28 -4
- package/dist/components/Badge/Badge.css +61 -3
- package/dist/components/Badge/Badge.d.ts +14 -4
- package/dist/components/Badge/Badge.js +1 -0
- package/dist/components/BottomSheet/BottomSheet.css +1 -0
- package/dist/components/BottomSheet/BottomSheet.d.ts +8 -0
- package/dist/components/BottomSheet/BottomSheet.js +14 -2
- package/dist/components/Box/Box.css +83 -0
- package/dist/components/Box/Box.d.ts +82 -2
- package/dist/components/Box/Box.js +42 -2
- package/dist/components/Button/Button.css +29 -0
- package/dist/components/Button/Button.d.ts +4 -4
- package/dist/components/Button/Button.js +4 -1
- package/dist/components/Calendar/Calendar.css +245 -0
- package/dist/components/Calendar/Calendar.d.ts +125 -0
- package/dist/components/Calendar/Calendar.js +320 -0
- package/dist/components/Chart/BarChart.d.ts +6 -0
- package/dist/components/Chart/BarChart.js +3 -1
- package/dist/components/Chart/LineChart.d.ts +6 -0
- package/dist/components/Chart/LineChart.js +3 -1
- package/dist/components/Checkbox/Checkbox.css +4 -1
- package/dist/components/Chips/Chips.css +39 -0
- package/dist/components/Chips/Chips.d.ts +7 -2
- package/dist/components/Chips/Chips.js +6 -2
- package/dist/components/Coachmark/Coachmark.css +118 -0
- package/dist/components/Coachmark/Coachmark.d.ts +75 -0
- package/dist/components/Coachmark/Coachmark.js +321 -0
- package/dist/components/CodeBlock/CodeBlock.css +96 -0
- package/dist/components/CodeBlock/CodeBlock.d.ts +47 -0
- package/dist/components/CodeBlock/CodeBlock.js +103 -0
- package/dist/components/ColorPicker/ColorPicker.css +133 -0
- package/dist/components/ColorPicker/ColorPicker.d.ts +73 -0
- package/dist/components/ColorPicker/ColorPicker.js +219 -0
- package/dist/components/Combobox/Combobox.css +11 -3
- package/dist/components/ConfirmAIAction/ConfirmAIAction.d.ts +11 -1
- package/dist/components/ConfirmAIAction/ConfirmAIAction.js +6 -1
- package/dist/components/ConfirmDialog/ConfirmDialog.css +3 -0
- package/dist/components/ConfirmDialog/ConfirmDialog.d.ts +14 -0
- package/dist/components/ConfirmDialog/ConfirmDialog.js +2 -2
- package/dist/components/DataTable/DataTable.css +80 -0
- package/dist/components/DataTable/DataTable.d.ts +23 -4
- package/dist/components/DataTable/DataTable.js +61 -15
- package/dist/components/DatePicker/DatePicker.css +8 -0
- package/dist/components/DatePicker/DatePicker.d.ts +4 -0
- package/dist/components/DatePicker/DatePicker.js +14 -1
- package/dist/components/DescriptionList/DescriptionList.css +113 -0
- package/dist/components/DescriptionList/DescriptionList.d.ts +59 -0
- package/dist/components/DescriptionList/DescriptionList.js +51 -0
- package/dist/components/Drawer/Drawer.css +1 -0
- package/dist/components/Dropdown/Dropdown.js +47 -29
- package/dist/components/FileInput/FileInput.css +24 -4
- package/dist/components/FileInput/FileInput.d.ts +22 -2
- package/dist/components/FileInput/FileInput.js +23 -2
- package/dist/components/Grid/Grid.js +5 -5
- package/dist/components/IconPicker/IconPicker.css +107 -0
- package/dist/components/IconPicker/IconPicker.d.ts +74 -0
- package/dist/components/IconPicker/IconPicker.js +194 -0
- package/dist/components/Input/Input.css +41 -3
- package/dist/components/Input/Input.d.ts +14 -1
- package/dist/components/Input/Input.js +72 -6
- package/dist/components/Kanban/Kanban.css +5 -0
- package/dist/components/Kanban/Kanban.d.ts +41 -0
- package/dist/components/Kanban/Kanban.js +59 -27
- package/dist/components/Kanban/KanbanCard.d.ts +2 -0
- package/dist/components/Kanban/KanbanCard.js +1 -1
- package/dist/components/Kanban/KanbanColumn.d.ts +2 -0
- package/dist/components/Kanban/KanbanColumn.js +3 -0
- package/dist/components/Kbd/Kbd.css +66 -0
- package/dist/components/Kbd/Kbd.d.ts +32 -0
- package/dist/components/Kbd/Kbd.js +40 -0
- package/dist/components/Link/Link.css +1 -1
- package/dist/components/List/List.css +136 -0
- package/dist/components/List/List.d.ts +82 -0
- package/dist/components/List/List.js +53 -0
- package/dist/components/List/ListItem.d.ts +85 -0
- package/dist/components/List/ListItem.js +81 -0
- package/dist/components/Modal/Modal.css +93 -8
- package/dist/components/Modal/Modal.d.ts +45 -7
- package/dist/components/Modal/Modal.js +106 -6
- package/dist/components/MultiSelect/MultiSelect.css +9 -1
- package/dist/components/MultiSelect/MultiSelect.js +45 -8
- package/dist/components/OrgChart/OrgChart.css +149 -0
- package/dist/components/OrgChart/OrgChart.d.ts +83 -0
- package/dist/components/OrgChart/OrgChart.js +297 -0
- package/dist/components/OtpInput/OtpInput.css +93 -0
- package/dist/components/OtpInput/OtpInput.d.ts +60 -0
- package/dist/components/OtpInput/OtpInput.js +215 -0
- package/dist/components/Pagination/Pagination.d.ts +6 -0
- package/dist/components/Pagination/Pagination.js +9 -1
- package/dist/components/PhoneInput/PhoneInput.css +9 -1
- package/dist/components/PhoneInput/PhoneInput.d.ts +10 -0
- package/dist/components/PhoneInput/PhoneInput.js +20 -3
- package/dist/components/Popover/Popover.d.ts +7 -0
- package/dist/components/Popover/Popover.js +11 -1
- package/dist/components/RichTextEditor/RichTextEditor.css +203 -0
- package/dist/components/RichTextEditor/RichTextEditor.d.ts +83 -0
- package/dist/components/RichTextEditor/RichTextEditor.js +494 -0
- package/dist/components/SegmentedControl/SegmentedControl.d.ts +2 -0
- package/dist/components/SegmentedControl/SegmentedControl.js +21 -8
- package/dist/components/Select/Select.css +71 -1
- package/dist/components/Select/Select.d.ts +12 -0
- package/dist/components/Select/Select.js +93 -10
- package/dist/components/SidePanel/SidePanel.css +4 -4
- package/dist/components/SidePanelItem/SidePanelItem.css +7 -5
- package/dist/components/SidePanelSearch/SidePanelSearch.css +2 -2
- package/dist/components/SidePanelSection/SidePanelSection.css +7 -5
- package/dist/components/Stack/Stack.css +49 -0
- package/dist/components/Stack/Stack.d.ts +65 -7
- package/dist/components/Stack/Stack.js +30 -2
- package/dist/components/StatCard/StatCard.css +73 -0
- package/dist/components/StatCard/StatCard.d.ts +17 -0
- package/dist/components/StatCard/StatCard.js +4 -1
- package/dist/components/Stepper/Stepper.css +4 -1
- package/dist/components/Stepper/Stepper.d.ts +8 -0
- package/dist/components/Stepper/Stepper.js +4 -4
- package/dist/components/Switch/Switch.css +1 -0
- package/dist/components/Tabs/Tab.d.ts +15 -0
- package/dist/components/Tabs/Tab.js +30 -1
- package/dist/components/Tabs/Tabs.css +132 -0
- package/dist/components/Tabs/Tabs.d.ts +7 -0
- package/dist/components/Tabs/Tabs.js +13 -2
- package/dist/components/Tag/Tag.css +85 -2
- package/dist/components/Tag/Tag.d.ts +13 -6
- package/dist/components/Tag/Tag.js +1 -0
- package/dist/components/Text/Text.d.ts +9 -1
- package/dist/components/Text/Text.js +2 -2
- package/dist/components/Textarea/Textarea.css +11 -3
- package/dist/components/TimePicker/TimePicker.css +8 -0
- package/dist/components/TimePicker/TimePicker.d.ts +6 -0
- package/dist/components/TimePicker/TimePicker.js +1 -1
- package/dist/components/Tooltip/Tooltip.css +40 -0
- package/dist/components/Tooltip/Tooltip.d.ts +11 -0
- package/dist/components/Tooltip/Tooltip.js +114 -11
- package/dist/index.d.ts +25 -0
- package/dist/index.js +14 -0
- package/dist/teste/AILabel.test.d.ts +1 -0
- package/dist/teste/AILabel.test.js +33 -0
- package/dist/teste/AccordionConteudoLivre.test.d.ts +1 -0
- package/dist/teste/AccordionConteudoLivre.test.js +29 -0
- package/dist/teste/Alert.test.d.ts +1 -0
- package/dist/teste/Alert.test.js +27 -0
- package/dist/teste/AtributosRepassados.test.d.ts +1 -0
- package/dist/teste/AtributosRepassados.test.js +52 -0
- package/dist/teste/AttachmentCardIA.test.d.ts +1 -0
- package/dist/teste/AttachmentCardIA.test.js +89 -0
- package/dist/teste/AvatarGroupOverlap.test.d.ts +1 -0
- package/dist/teste/AvatarGroupOverlap.test.js +56 -0
- package/dist/teste/BadgeTag.test.d.ts +1 -0
- package/dist/teste/BadgeTag.test.js +42 -0
- package/dist/teste/BottomSheet.test.d.ts +1 -0
- package/dist/teste/BottomSheet.test.js +23 -0
- package/dist/teste/BoxItemFlex.test.d.ts +1 -0
- package/dist/teste/BoxItemFlex.test.js +54 -0
- package/dist/teste/BoxLayout.test.d.ts +1 -0
- package/dist/teste/BoxLayout.test.js +35 -0
- package/dist/teste/Button.test.d.ts +1 -0
- package/dist/teste/Button.test.js +27 -0
- package/dist/teste/Calendar.test.d.ts +1 -0
- package/dist/teste/Calendar.test.js +221 -0
- package/dist/teste/ChipsXs.test.d.ts +1 -0
- package/dist/teste/ChipsXs.test.js +31 -0
- package/dist/teste/Coachmark.test.d.ts +1 -0
- package/dist/teste/Coachmark.test.js +149 -0
- package/dist/teste/ColorPicker.test.d.ts +1 -0
- package/dist/teste/ColorPicker.test.js +132 -0
- package/dist/teste/ConfirmAIAction.test.d.ts +1 -0
- package/dist/teste/ConfirmAIAction.test.js +33 -0
- package/dist/teste/DataTableCelulaLivre.test.d.ts +1 -0
- package/dist/teste/DataTableCelulaLivre.test.js +76 -0
- package/dist/teste/DataTableDocumento.test.d.ts +1 -0
- package/dist/teste/DataTableDocumento.test.js +92 -0
- package/dist/teste/DatePicker.test.js +23 -0
- package/dist/teste/Dropdown.test.js +111 -0
- package/dist/teste/FileInputTrigger.test.d.ts +1 -0
- package/dist/teste/FileInputTrigger.test.js +53 -0
- package/dist/teste/IconPicker.test.d.ts +1 -0
- package/dist/teste/IconPicker.test.js +130 -0
- package/dist/teste/InputMascaraEAfins.test.d.ts +1 -0
- package/dist/teste/InputMascaraEAfins.test.js +99 -0
- package/dist/teste/KbdCodeBlock.test.d.ts +1 -0
- package/dist/teste/KbdCodeBlock.test.js +95 -0
- package/dist/teste/List.test.d.ts +1 -0
- package/dist/teste/List.test.js +153 -0
- package/dist/teste/Modal.test.d.ts +1 -0
- package/dist/teste/Modal.test.js +26 -0
- package/dist/teste/ModalVariantes.test.d.ts +1 -0
- package/dist/teste/ModalVariantes.test.js +151 -0
- package/dist/teste/MultiSelectErro.test.d.ts +1 -0
- package/dist/teste/MultiSelectErro.test.js +62 -0
- package/dist/teste/NomeAcessivelSsr.test.d.ts +1 -0
- package/dist/teste/NomeAcessivelSsr.test.js +88 -0
- package/dist/teste/OrgChart.test.d.ts +1 -0
- package/dist/teste/OrgChart.test.js +162 -0
- package/dist/teste/OtpInput.test.d.ts +1 -0
- package/dist/teste/OtpInput.test.js +143 -0
- package/dist/teste/PopoverMaxHeight.test.d.ts +1 -0
- package/dist/teste/PopoverMaxHeight.test.js +38 -0
- package/dist/teste/RichTextEditor.test.d.ts +1 -0
- package/dist/teste/RichTextEditor.test.js +287 -0
- package/dist/teste/RotulosTraduziveis.test.d.ts +1 -0
- package/dist/teste/RotulosTraduziveis.test.js +405 -0
- package/dist/teste/SegmentedControl.test.js +33 -0
- package/dist/teste/Select.test.d.ts +1 -0
- package/dist/teste/Select.test.js +62 -0
- package/dist/teste/SelectPlacementFiltro.test.d.ts +1 -0
- package/dist/teste/SelectPlacementFiltro.test.js +88 -0
- package/dist/teste/Stack.test.d.ts +1 -0
- package/dist/teste/Stack.test.js +57 -0
- package/dist/teste/StatCardRotuloTopo.test.d.ts +1 -0
- package/dist/teste/StatCardRotuloTopo.test.js +34 -0
- package/dist/teste/TabsContadorFechavel.test.d.ts +1 -0
- package/dist/teste/TabsContadorFechavel.test.js +79 -0
- package/dist/teste/Tooltip.test.d.ts +1 -0
- package/dist/teste/Tooltip.test.js +109 -0
- package/dist/teste/TooltipDark.test.d.ts +1 -0
- package/dist/teste/TooltipDark.test.js +31 -0
- package/dist/utils/calendario.d.ts +28 -0
- package/dist/utils/calendario.js +73 -0
- package/dist/utils/chart.d.ts +4 -0
- package/dist/utils/chart.js +3 -2
- package/dist/utils/html-seguro.d.ts +27 -0
- package/dist/utils/html-seguro.js +97 -0
- package/dist/utils/id.d.ts +2 -0
- package/dist/utils/id.js +23 -0
- package/dist/utils/paleta-de-cores.d.ts +26 -0
- package/dist/utils/paleta-de-cores.js +10 -0
- package/dist/utils/texto.d.ts +5 -0
- package/dist/utils/texto.js +5 -0
- package/package.json +3 -3
- package/src/index.ts +26 -0
- package/src/teste/AILabel.test.tsx +41 -0
- package/src/teste/AccordionConteudoLivre.test.tsx +39 -0
- package/src/teste/Alert.test.tsx +32 -0
- package/src/teste/AtributosRepassados.test.tsx +73 -0
- package/src/teste/AttachmentCardIA.test.tsx +126 -0
- package/src/teste/AvatarGroupOverlap.test.tsx +74 -0
- package/src/teste/BadgeTag.test.tsx +64 -0
- package/src/teste/BottomSheet.test.tsx +25 -0
- package/src/teste/BoxItemFlex.test.tsx +81 -0
- package/src/teste/BoxLayout.test.tsx +50 -0
- package/src/teste/Button.test.tsx +39 -0
- package/src/teste/Calendar.test.tsx +282 -0
- package/src/teste/ChipsXs.test.tsx +41 -0
- package/src/teste/Coachmark.test.tsx +198 -0
- package/src/teste/ColorPicker.test.tsx +153 -0
- package/src/teste/ConfirmAIAction.test.tsx +41 -0
- package/src/teste/DataTableCelulaLivre.test.tsx +103 -0
- package/src/teste/DataTableDocumento.test.tsx +102 -0
- package/src/teste/DatePicker.test.tsx +38 -0
- package/src/teste/Dropdown.test.tsx +146 -0
- package/src/teste/FileInputTrigger.test.tsx +89 -0
- package/src/teste/IconPicker.test.tsx +145 -0
- package/src/teste/InputMascaraEAfins.test.tsx +124 -0
- package/src/teste/KbdCodeBlock.test.tsx +106 -0
- package/src/teste/List.test.tsx +269 -0
- package/src/teste/Modal.test.tsx +28 -0
- package/src/teste/ModalVariantes.test.tsx +173 -0
- package/src/teste/MultiSelectErro.test.tsx +97 -0
- package/src/teste/NomeAcessivelSsr.test.tsx +110 -0
- package/src/teste/OrgChart.test.tsx +183 -0
- package/src/teste/OtpInput.test.tsx +163 -0
- package/src/teste/PopoverMaxHeight.test.tsx +47 -0
- package/src/teste/RichTextEditor.test.tsx +329 -0
- package/src/teste/RotulosTraduziveis.test.tsx +545 -0
- package/src/teste/SegmentedControl.test.tsx +57 -0
- package/src/teste/Select.test.tsx +97 -0
- package/src/teste/SelectPlacementFiltro.test.tsx +110 -0
- package/src/teste/Stack.test.tsx +80 -0
- package/src/teste/StatCardRotuloTopo.test.tsx +44 -0
- package/src/teste/TabsContadorFechavel.test.tsx +144 -0
- package/src/teste/Tooltip.test.tsx +219 -0
- package/src/teste/TooltipDark.test.tsx +51 -0
- package/src/utils/calendario.ts +78 -0
- package/src/utils/chart.ts +7 -2
- package/src/utils/html-seguro.ts +94 -0
- package/src/utils/id.ts +24 -0
- package/src/utils/paleta-de-cores.ts +34 -0
- package/src/utils/texto.ts +5 -0
|
@@ -22,6 +22,9 @@ import './StatCard.css';
|
|
|
22
22
|
* @property {string} trendIntent - Se a variação é boa ou ruim (cor), independente da direção: 'positive' | 'negative' | 'neutral'
|
|
23
23
|
* @property {string} trendLabel - Texto da variação (ex.: '12% em relação ao mês anterior')
|
|
24
24
|
* @property {string} description - Texto auxiliar abaixo do rótulo
|
|
25
|
+
* @property {string} labelPosition - Onde o rótulo aparece: 'bottom' (padrão, embaixo do número) | 'top' (no topo do cartão, acima do ícone e do número, com o número em 32/800). No HTML o número continua vindo antes do rótulo, então o leitor de tela anuncia igual.
|
|
26
|
+
* @property {string} infoTooltip - Texto de ajuda: mostra um ⓘ ao lado do rótulo com um Tooltip escuro. É um botão dentro do cartão; com `onClick` no cartão, evite (botão dentro de botão).
|
|
27
|
+
* @property {string} infoLabel - Nome acessível do ⓘ. Troque para traduzir. Padrão: "Mais informações".
|
|
25
28
|
* @property {string} align - Alinhamento do conteúdo
|
|
26
29
|
* @property {string} className - Classes CSS adicionais
|
|
27
30
|
* @property {function} onClick - Torna o cartão acionável (vira botão)
|
|
@@ -56,6 +59,20 @@ export interface StatCardProps {
|
|
|
56
59
|
description?: string;
|
|
57
60
|
/** Alinhamento do conteúdo. @default 'start' */
|
|
58
61
|
align?: "start" | "center";
|
|
62
|
+
/**
|
|
63
|
+
* Onde o rótulo aparece. `top` põe o rótulo no topo do cartão, acima do
|
|
64
|
+
* ícone e do número (que passa a 32/800), como no painel da 1Doc. No HTML o
|
|
65
|
+
* número segue antes do rótulo: só a posição visual muda.
|
|
66
|
+
* @default 'bottom'
|
|
67
|
+
*/
|
|
68
|
+
labelPosition?: "bottom" | "top";
|
|
69
|
+
/**
|
|
70
|
+
* Texto de ajuda: mostra o ⓘ ao lado do rótulo, com um Tooltip escuro. É um
|
|
71
|
+
* botão focável dentro do cartão; com `onClick` no cartão, evite.
|
|
72
|
+
*/
|
|
73
|
+
infoTooltip?: string;
|
|
74
|
+
/** Nome acessível do ⓘ. @default 'Mais informações' */
|
|
75
|
+
infoLabel?: string;
|
|
59
76
|
/** Classes CSS adicionais. */
|
|
60
77
|
className?: string;
|
|
61
78
|
/** Torna o cartão acionável. */
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import './StatCard.css';
|
|
4
|
+
import { faCircleInfo } from "@fortawesome/free-solid-svg-icons";
|
|
4
5
|
import Icon from "../Icon/Icon";
|
|
6
|
+
import Tooltip from "../Tooltip/Tooltip";
|
|
5
7
|
function StatCard(props) {
|
|
6
8
|
function classes() {
|
|
7
9
|
return [
|
|
8
10
|
"umds-stat-card",
|
|
9
11
|
`umds-stat-card--${props.variant || "neutral"}`,
|
|
10
12
|
props.align === "center" ? "umds-stat-card--centro" : "",
|
|
13
|
+
props.labelPosition === "top" ? "umds-stat-card--rotulo-topo" : "",
|
|
11
14
|
props.onClick ? "umds-stat-card--acionavel" : "",
|
|
12
15
|
props.className,
|
|
13
16
|
]
|
|
@@ -45,6 +48,6 @@ function StatCard(props) {
|
|
|
45
48
|
if (props.onClick)
|
|
46
49
|
props.onClick();
|
|
47
50
|
}
|
|
48
|
-
return (_jsxs("div", { className: classes(), onClick: (event) => aoClicar(), role: ehAcionavel() ? "button" : undefined, tabIndex: ehAcionavel() ? 0 : undefined, children: [props.icon ? (_jsx("span", { className: "umds-stat-card__icone", "aria-hidden": "true", children: _jsx(Icon, { size: "md", variant: "inherit", icon: props.icon }) })) : null, _jsxs("div", { className: "umds-stat-card__corpo", children: [_jsx("span", { className: "umds-stat-card__valor", children: props.value }),
|
|
51
|
+
return (_jsxs("div", { className: classes(), onClick: (event) => aoClicar(), role: ehAcionavel() ? "button" : undefined, tabIndex: ehAcionavel() ? 0 : undefined, children: [props.icon ? (_jsx("span", { className: "umds-stat-card__icone", "aria-hidden": "true", children: _jsx(Icon, { size: "md", variant: "inherit", icon: props.icon }) })) : null, _jsxs("div", { className: "umds-stat-card__corpo", children: [_jsx("span", { className: "umds-stat-card__valor", children: props.value }), _jsxs("span", { className: "umds-stat-card__rotulo", children: [props.label, props.infoTooltip ? (_jsx(Tooltip, { variant: "dark", side: "top", content: props.infoTooltip, children: _jsx("button", { type: "button", className: "umds-stat-card__info", "aria-label": props.infoLabel || "Mais informações", children: _jsx(Icon, { variant: "inherit", customSize: "14px", icon: faCircleInfo }) }) })) : null] }), props.description ? (_jsx("span", { className: "umds-stat-card__descricao", children: props.description })) : null, props.trendLabel ? (_jsxs("span", { className: classesDaVariacao(), children: [_jsx("span", { "aria-hidden": "true", children: simboloDaVariacao() }), props.trendLabel] })) : null] })] }));
|
|
49
52
|
}
|
|
50
53
|
export default StatCard;
|
|
@@ -84,7 +84,10 @@
|
|
|
84
84
|
.umds-stepper__step--pending .umds-stepper__indicator {
|
|
85
85
|
background: var(--umds-semantic-color-background-white); /* #FFFFFF */
|
|
86
86
|
border-color: var(--umds-semantic-color-neutral-light-down); /* #D5D5D5 */
|
|
87
|
-
|
|
87
|
+
/* O número da etapa pendente é texto, e a etapa não está desabilitada:
|
|
88
|
+
neutral-dark-up (#A3A3A3, 2,5:1) reprovava o WCAG 1.4.3. Mesma cor do
|
|
89
|
+
título pendente — #565656, 7,34:1. */
|
|
90
|
+
color: var(--umds-semantic-color-neutral-dark-down);
|
|
88
91
|
}
|
|
89
92
|
|
|
90
93
|
/* Status: active */
|
|
@@ -25,6 +25,14 @@ export interface StepperProps {
|
|
|
25
25
|
currentStep?: number;
|
|
26
26
|
orientation?: "horizontal" | "vertical";
|
|
27
27
|
className?: string;
|
|
28
|
+
/** Estado lido pelo leitor de tela num passo concluído. Troque para traduzir. @default 'concluído' */
|
|
29
|
+
completedLabel?: string;
|
|
30
|
+
/** Estado lido pelo leitor de tela num passo com erro. Troque para traduzir. @default 'erro' */
|
|
31
|
+
errorLabel?: string;
|
|
32
|
+
/** Estado lido pelo leitor de tela no passo atual. Troque para traduzir. @default 'atual' */
|
|
33
|
+
activeLabel?: string;
|
|
34
|
+
/** Estado lido pelo leitor de tela num passo pendente. Troque para traduzir. @default 'pendente' */
|
|
35
|
+
pendingLabel?: string;
|
|
28
36
|
}
|
|
29
37
|
declare function Stepper(props: StepperProps): import("react/jsx-runtime").JSX.Element;
|
|
30
38
|
export default Stepper;
|
|
@@ -49,12 +49,12 @@ function Stepper(props) {
|
|
|
49
49
|
function statusLabel(step, index) {
|
|
50
50
|
const s = resolveStatus(step, index);
|
|
51
51
|
if (s === "completed")
|
|
52
|
-
return "concluído";
|
|
52
|
+
return props.completedLabel || "concluído";
|
|
53
53
|
if (s === "error")
|
|
54
|
-
return "erro";
|
|
54
|
+
return props.errorLabel || "erro";
|
|
55
55
|
if (s === "active")
|
|
56
|
-
return "atual";
|
|
57
|
-
return "pendente";
|
|
56
|
+
return props.activeLabel || "atual";
|
|
57
|
+
return props.pendingLabel || "pendente";
|
|
58
58
|
}
|
|
59
59
|
function stepAriaLabel(step, index) {
|
|
60
60
|
const parts = [step.title];
|
|
@@ -115,6 +115,7 @@
|
|
|
115
115
|
.umds-switch--sm {
|
|
116
116
|
width: 44px;
|
|
117
117
|
height: var(--umds-primitive-spacing-xxs);
|
|
118
|
+
/* stylelint-disable-next-line 1ds/espaco-da-escala -- geometria do trilho: (24px - 21px do polegar) / 2; 1px ou 2px descentraliza o polegar */
|
|
118
119
|
padding: 1.5px; /* sem equivalente 1DS: candidato a novo token */
|
|
119
120
|
}
|
|
120
121
|
|
|
@@ -16,6 +16,21 @@ export interface TabProps {
|
|
|
16
16
|
icon?: IconProp;
|
|
17
17
|
/** Se a tab está desabilitada */
|
|
18
18
|
disabled?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Contador em pílula ao lado do texto: azul na aba ativa, cinza nas outras.
|
|
21
|
+
* Aceita número ou texto; o `0` aparece. Sem a prop, não há pílula.
|
|
22
|
+
*/
|
|
23
|
+
count?: number | string;
|
|
24
|
+
/**
|
|
25
|
+
* Mostra o × para fechar a aba (abas de navegador, documentos abertos). O
|
|
26
|
+
* × é um botão próprio, irmão da aba (não dentro dela), e a tecla Delete
|
|
27
|
+
* na aba focada faz o mesmo. Quem remove a aba é o app, em `onClose`.
|
|
28
|
+
*/
|
|
29
|
+
closable?: boolean;
|
|
30
|
+
/** Chamado ao fechar a aba, com o `index` dela e o evento. */
|
|
31
|
+
onClose?: (index: string, event?: any) => void;
|
|
32
|
+
/** Prefixo do nome acessível do ×; o texto da aba vem depois ("Fechar Documento 1"). Troque para traduzir. @default 'Fechar' */
|
|
33
|
+
closeLabel?: string;
|
|
19
34
|
/** Classes CSS adicionais */
|
|
20
35
|
className?: string;
|
|
21
36
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useContext } from "react";
|
|
4
|
+
import { faXmark } from "@fortawesome/free-solid-svg-icons";
|
|
4
5
|
import TabsContext from "./tabs.context";
|
|
5
6
|
import Icon from "../Icon/Icon";
|
|
6
7
|
function Tab(props) {
|
|
@@ -17,11 +18,26 @@ function Tab(props) {
|
|
|
17
18
|
? tabsContext.tabsId + "-panel-" + props.index
|
|
18
19
|
: undefined;
|
|
19
20
|
}
|
|
21
|
+
function temContador() {
|
|
22
|
+
return (props.count !== undefined && props.count !== null && props.count !== "");
|
|
23
|
+
}
|
|
24
|
+
function itemClasses() {
|
|
25
|
+
return [
|
|
26
|
+
"umds-tabs__item",
|
|
27
|
+
props.closable ? "umds-tabs__item--closable" : "",
|
|
28
|
+
]
|
|
29
|
+
.filter(Boolean)
|
|
30
|
+
.join(" ");
|
|
31
|
+
}
|
|
32
|
+
function closeAriaText() {
|
|
33
|
+
return (props.closeLabel || "Fechar") + " " + props.label;
|
|
34
|
+
}
|
|
20
35
|
function classes() {
|
|
21
36
|
return [
|
|
22
37
|
"umds-tabs__tab",
|
|
23
38
|
isSelected() ? "umds-tabs__tab--selected" : "",
|
|
24
39
|
props.disabled ? "umds-tabs__tab--disabled" : "",
|
|
40
|
+
props.closable ? "umds-tabs__tab--closable" : "",
|
|
25
41
|
props.className,
|
|
26
42
|
]
|
|
27
43
|
.filter(Boolean)
|
|
@@ -42,9 +58,22 @@ function Tab(props) {
|
|
|
42
58
|
tabsContext.onChange(props.index);
|
|
43
59
|
}
|
|
44
60
|
}
|
|
61
|
+
function handleClose(event) {
|
|
62
|
+
event.stopPropagation();
|
|
63
|
+
if (props.disabled)
|
|
64
|
+
return;
|
|
65
|
+
if (typeof props.onClose === "function") {
|
|
66
|
+
props.onClose(props.index, event);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
45
69
|
function handleKeyDown(event) {
|
|
46
70
|
if (props.disabled)
|
|
47
71
|
return;
|
|
72
|
+
if (props.closable && event.key === "Delete") {
|
|
73
|
+
event.preventDefault();
|
|
74
|
+
handleClose(event);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
48
77
|
if (event.key === "Enter" || event.key === " ") {
|
|
49
78
|
event.preventDefault();
|
|
50
79
|
handleClick();
|
|
@@ -81,6 +110,6 @@ function Tab(props) {
|
|
|
81
110
|
}
|
|
82
111
|
}
|
|
83
112
|
const tabsContext = useContext(TabsContext);
|
|
84
|
-
return (_jsxs("button", { role: "tab", id: tabId(), "aria-controls": panelId(), "data-tab-index": props.index, "aria-selected": isSelected(), "aria-disabled": props.disabled, tabIndex: isSelected() ? 0 : -1, disabled: props.disabled, onClick: (event) => handleClick(), onKeyDown: (event) => handleKeyDown(event), className: classes(), children: [props.icon ? (_jsx(Icon, { size: "md", variant: "inherit", icon: props.icon })) : null, _jsx("span", { className: labelClasses(), children: props.label })] }));
|
|
113
|
+
return (_jsxs("span", { role: "presentation", className: itemClasses(), children: [_jsxs("button", { role: "tab", id: tabId(), "aria-controls": panelId(), "data-tab-index": props.index, "aria-selected": isSelected(), "aria-disabled": props.disabled, tabIndex: isSelected() ? 0 : -1, disabled: props.disabled, onClick: (event) => handleClick(), onKeyDown: (event) => handleKeyDown(event), className: classes(), children: [props.icon ? (_jsx(Icon, { size: "md", variant: "inherit", icon: props.icon })) : null, _jsx("span", { className: labelClasses(), children: props.label }), temContador() ? (_jsx("span", { className: "umds-tabs__count", children: props.count })) : null] }), props.closable ? (_jsx("button", { type: "button", className: "umds-tabs__close", "aria-label": closeAriaText(), disabled: props.disabled, tabIndex: -1, onClick: (event) => handleClose(event), children: _jsx(Icon, { variant: "inherit", customSize: "10px", icon: faXmark }) })) : null] }));
|
|
85
114
|
}
|
|
86
115
|
export default Tab;
|
|
@@ -8,6 +8,36 @@
|
|
|
8
8
|
font-family: var(--umds-semantic-font-family-base);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
+
/* ============================
|
|
12
|
+
Barra: o tablist e, com onAdd, o botão "+" (fora do tablist)
|
|
13
|
+
============================ */
|
|
14
|
+
.umds-tabs__bar {
|
|
15
|
+
display: flex;
|
|
16
|
+
align-items: stretch;
|
|
17
|
+
min-width: 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.umds-tabs__bar .umds-tabs__list {
|
|
21
|
+
flex: 1 1 auto;
|
|
22
|
+
min-width: 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* Com "+", a lista não estica: o botão fica logo depois da última aba. */
|
|
26
|
+
.umds-tabs__bar--com-add .umds-tabs__list {
|
|
27
|
+
flex: 0 1 auto;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Envoltório de cada aba (presentation). Sem × é transparente para o layout;
|
|
31
|
+
com × vira a âncora do botão de fechar. */
|
|
32
|
+
.umds-tabs__item {
|
|
33
|
+
display: contents;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.umds-tabs__item--closable {
|
|
37
|
+
display: flex;
|
|
38
|
+
position: relative;
|
|
39
|
+
}
|
|
40
|
+
|
|
11
41
|
/* ============================
|
|
12
42
|
Tab List (tablist)
|
|
13
43
|
============================ */
|
|
@@ -150,3 +180,105 @@
|
|
|
150
180
|
.umds-tabs-content {
|
|
151
181
|
width: 100%;
|
|
152
182
|
}
|
|
183
|
+
|
|
184
|
+
/* ============================
|
|
185
|
+
Contador em pílula (count)
|
|
186
|
+
Cinza nas abas inativas, azul na ativa. 18px de altura (16 + 2, dois degraus
|
|
187
|
+
do DS somados; sem token próprio).
|
|
188
|
+
============================ */
|
|
189
|
+
.umds-tabs__count {
|
|
190
|
+
display: inline-flex;
|
|
191
|
+
align-items: center;
|
|
192
|
+
justify-content: center;
|
|
193
|
+
box-sizing: border-box;
|
|
194
|
+
height: calc(var(--umds-primitive-spacing-xxxs) + var(--umds-primitive-spacing-micro)); /* 18px */
|
|
195
|
+
min-width: calc(var(--umds-primitive-spacing-xxxs) + var(--umds-primitive-spacing-micro)); /* 18px */
|
|
196
|
+
padding: 0 var(--umds-primitive-spacing-quarck);
|
|
197
|
+
border-radius: var(--umds-primitive-border-radius-pill);
|
|
198
|
+
background-color: var(--umds-semantic-color-neutral-light-medium);
|
|
199
|
+
color: var(--umds-semantic-color-neutral-dark-down);
|
|
200
|
+
font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
|
|
201
|
+
font-weight: var(--umds-primitive-font-weight-semibold);
|
|
202
|
+
line-height: 1;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.umds-tabs__tab--selected .umds-tabs__count {
|
|
206
|
+
background-color: var(--umds-semantic-color-primary-pure);
|
|
207
|
+
color: var(--umds-semantic-color-neutral-light-pure);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.umds-tabs__tab--disabled .umds-tabs__count {
|
|
211
|
+
background-color: var(--umds-semantic-color-neutral-light-up);
|
|
212
|
+
color: var(--umds-semantic-color-neutral-dark-up);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/* ============================
|
|
216
|
+
Aba fechável (closable): × em botão próprio, sobre a folga direita da aba
|
|
217
|
+
============================ */
|
|
218
|
+
.umds-tabs__tab--closable {
|
|
219
|
+
/* folga para o ×: 8 de margem + 20 do botão + 4 de respiro */
|
|
220
|
+
padding-right: var(--umds-primitive-spacing-xs); /* 32px */
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.umds-tabs__close {
|
|
224
|
+
position: absolute;
|
|
225
|
+
top: 50%;
|
|
226
|
+
right: var(--umds-primitive-spacing-nano);
|
|
227
|
+
transform: translateY(-50%);
|
|
228
|
+
display: inline-flex;
|
|
229
|
+
align-items: center;
|
|
230
|
+
justify-content: center;
|
|
231
|
+
width: 20px; /* círculo de 20px: o glifo é de 10px */
|
|
232
|
+
height: 20px;
|
|
233
|
+
padding: 0;
|
|
234
|
+
border: none;
|
|
235
|
+
border-radius: var(--umds-primitive-border-radius-circular);
|
|
236
|
+
background: transparent;
|
|
237
|
+
color: var(--umds-semantic-color-neutral-dark-down);
|
|
238
|
+
cursor: pointer;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.umds-tabs__close:hover:not(:disabled) {
|
|
242
|
+
background-color: var(--umds-semantic-color-neutral-light-medium);
|
|
243
|
+
color: var(--umds-semantic-color-neutral-dark-pure);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.umds-tabs__close:focus-visible {
|
|
247
|
+
outline: 2px solid var(--umds-semantic-color-primary-pure);
|
|
248
|
+
outline-offset: 1px;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.umds-tabs__close:disabled {
|
|
252
|
+
cursor: not-allowed;
|
|
253
|
+
color: var(--umds-semantic-color-neutral-dark-up);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/* ============================
|
|
257
|
+
Botão "+" (onAdd)
|
|
258
|
+
============================ */
|
|
259
|
+
.umds-tabs__add {
|
|
260
|
+
display: inline-flex;
|
|
261
|
+
align-items: center;
|
|
262
|
+
justify-content: center;
|
|
263
|
+
align-self: center;
|
|
264
|
+
flex-shrink: 0;
|
|
265
|
+
width: var(--umds-primitive-spacing-xs); /* 32px */
|
|
266
|
+
height: var(--umds-primitive-spacing-xs);
|
|
267
|
+
margin-left: var(--umds-primitive-spacing-quarck);
|
|
268
|
+
padding: 0;
|
|
269
|
+
border: none;
|
|
270
|
+
border-radius: var(--umds-primitive-border-radius-sm);
|
|
271
|
+
background: transparent;
|
|
272
|
+
color: var(--umds-semantic-color-neutral-dark-down);
|
|
273
|
+
cursor: pointer;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.umds-tabs__add:hover {
|
|
277
|
+
background-color: var(--umds-semantic-color-neutral-light-medium);
|
|
278
|
+
color: var(--umds-semantic-color-neutral-dark-pure);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.umds-tabs__add:focus-visible {
|
|
282
|
+
outline: 2px solid var(--umds-semantic-color-primary-pure);
|
|
283
|
+
outline-offset: 2px;
|
|
284
|
+
}
|
|
@@ -23,6 +23,13 @@ export interface TabsProps {
|
|
|
23
23
|
* como gerar um id compartilhado automaticamente).
|
|
24
24
|
*/
|
|
25
25
|
id?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Mostra o botão "+" depois da última aba (abrir nova aba, como no navegador)
|
|
28
|
+
* e o chama com `onAdd`. O botão fica fora do `tablist`.
|
|
29
|
+
*/
|
|
30
|
+
onAdd?: (event?: any) => void;
|
|
31
|
+
/** Nome acessível do botão "+". Troque para traduzir. @default 'Adicionar aba' */
|
|
32
|
+
addLabel?: string;
|
|
26
33
|
/** Classes CSS adicionais */
|
|
27
34
|
className?: string;
|
|
28
35
|
/** Subcomponentes Tab */
|
|
@@ -1,15 +1,26 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import './Tabs.css';
|
|
4
|
+
import { faPlus } from "@fortawesome/free-solid-svg-icons";
|
|
5
|
+
import Icon from "../Icon/Icon";
|
|
4
6
|
import TabsContext from "./tabs.context";
|
|
5
7
|
function Tabs(props) {
|
|
6
8
|
function classes() {
|
|
7
9
|
return ["umds-tabs", props.className].filter(Boolean).join(" ");
|
|
8
10
|
}
|
|
11
|
+
function barClasses() {
|
|
12
|
+
return ["umds-tabs__bar", props.onAdd ? "umds-tabs__bar--com-add" : ""]
|
|
13
|
+
.filter(Boolean)
|
|
14
|
+
.join(" ");
|
|
15
|
+
}
|
|
16
|
+
function handleAdd(event) {
|
|
17
|
+
if (typeof props.onAdd === "function")
|
|
18
|
+
props.onAdd(event);
|
|
19
|
+
}
|
|
9
20
|
return (_jsx(TabsContext.Provider, { value: {
|
|
10
21
|
value: props.value,
|
|
11
22
|
onChange: props.onChange,
|
|
12
23
|
tabsId: props.id,
|
|
13
|
-
}, children: _jsx("div", { className: classes(), children: _jsx("div", { role: "tablist", className: "umds-tabs__list", "aria-label": props.ariaLabel, children: props.children }) }) }));
|
|
24
|
+
}, children: _jsx("div", { className: classes(), children: _jsxs("div", { className: barClasses(), children: [_jsx("div", { role: "tablist", className: "umds-tabs__list", "aria-label": props.ariaLabel, children: props.children }), props.onAdd ? (_jsx("button", { type: "button", className: "umds-tabs__add", "aria-label": props.addLabel || "Adicionar aba", onClick: (event) => handleAdd(event), children: _jsx(Icon, { variant: "inherit", customSize: "12px", icon: faPlus }) })) : null] }) }) }));
|
|
14
25
|
}
|
|
15
26
|
export default Tabs;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/* ============================================
|
|
2
2
|
Tag Component
|
|
3
|
-
Aparências (appearance): outlined, solid
|
|
4
|
-
Tamanhos: sm, md, lg
|
|
3
|
+
Aparências (appearance): outlined, solid, soft
|
|
4
|
+
Tamanhos: xs, sm, md, lg
|
|
5
|
+
Modificador: pill
|
|
5
6
|
============================================ */
|
|
6
7
|
|
|
7
8
|
.umds-tag {
|
|
@@ -84,6 +85,26 @@
|
|
|
84
85
|
|
|
85
86
|
/* ── Tamanhos ── */
|
|
86
87
|
|
|
88
|
+
/* xs: 18px de altura (12 de fonte com line-height 1 + 2 + 2 de padding + 2 de
|
|
89
|
+
borda). O alvo de toque do × e dos ícones clicáveis continua em 24px, mas a
|
|
90
|
+
margem negativa devolve o excesso, então a tag não cresce. */
|
|
91
|
+
.umds-tag--xs {
|
|
92
|
+
gap: var(--umds-primitive-spacing-quarck);
|
|
93
|
+
padding: var(--umds-primitive-spacing-micro) var(--umds-primitive-spacing-nano);
|
|
94
|
+
border-radius: var(--umds-primitive-border-radius-sm);
|
|
95
|
+
font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
|
|
96
|
+
line-height: 1;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.umds-tag--xs .umds-icon {
|
|
100
|
+
font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.umds-tag--xs .umds-tag__close,
|
|
104
|
+
.umds-tag--xs .umds-tag__icon--clickable {
|
|
105
|
+
margin: calc(-1 * var(--umds-primitive-spacing-nano)) 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
87
108
|
.umds-tag--sm {
|
|
88
109
|
gap: var(--umds-primitive-spacing-quarck);
|
|
89
110
|
padding: var(--umds-primitive-spacing-quarck) var(--umds-primitive-spacing-nano); /* 3px: candidato a novo token */
|
|
@@ -132,6 +153,38 @@
|
|
|
132
153
|
border-color: var(--umds-semantic-color-primary-dark);
|
|
133
154
|
}
|
|
134
155
|
|
|
156
|
+
/* ── Aparência: Soft (fundo claro da cor, sem contorno) ── */
|
|
157
|
+
.umds-tag--soft {
|
|
158
|
+
background-color: var(--umds-semantic-color-neutral-light-medium);
|
|
159
|
+
border-color: transparent;
|
|
160
|
+
color: var(--umds-semantic-color-neutral-dark-down);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.umds-tag--soft.umds-tag--primary {
|
|
164
|
+
background-color: var(--umds-semantic-color-primary-light);
|
|
165
|
+
color: var(--umds-semantic-color-primary-pure);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.umds-tag--soft.umds-tag--positive {
|
|
169
|
+
background-color: var(--umds-semantic-color-feedback-positive-light);
|
|
170
|
+
color: var(--umds-semantic-color-feedback-positive-dark);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.umds-tag--soft.umds-tag--negative {
|
|
174
|
+
background-color: var(--umds-semantic-color-feedback-negative-light);
|
|
175
|
+
color: var(--umds-semantic-color-feedback-negative-dark);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.umds-tag--soft.umds-tag--info {
|
|
179
|
+
background-color: var(--umds-semantic-color-feedback-info-light);
|
|
180
|
+
color: var(--umds-semantic-color-feedback-info-dark);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* ── Formato pílula (depois dos tamanhos, para vencer o raio deles) ── */
|
|
184
|
+
.umds-tag--pill {
|
|
185
|
+
border-radius: var(--umds-primitive-border-radius-pill);
|
|
186
|
+
}
|
|
187
|
+
|
|
135
188
|
/* ── Variantes semânticas (paridade com o Badge) ──
|
|
136
189
|
neutral (default) não gera classe — visual histórico intacto. */
|
|
137
190
|
.umds-tag--outlined.umds-tag--primary {
|
|
@@ -174,6 +227,36 @@
|
|
|
174
227
|
|
|
175
228
|
/* solid+primary = visual default do solid (primary-pure) — sem regra extra. */
|
|
176
229
|
|
|
230
|
+
/* ── Variante new (novidade, amarelo) ──
|
|
231
|
+
O DS não tem token semântico de amarelo: usa os primitivos de amarelo e o
|
|
232
|
+
cinza escuro, fixos nos temas (candidato a token semântico de destaque). */
|
|
233
|
+
.umds-tag--new {
|
|
234
|
+
font-weight: var(--umds-primitive-font-weight-bold);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.umds-tag--outlined.umds-tag--new {
|
|
238
|
+
/* stylelint-disable-next-line 1ds/cor-por-token -- o DS não tem token semântico de amarelo (candidato a novo token) */
|
|
239
|
+
border-color: var(--umds-primitive-yellow-pure);
|
|
240
|
+
/* stylelint-disable-next-line 1ds/cor-por-token -- o DS não tem token semântico de amarelo (candidato a novo token) */
|
|
241
|
+
color: var(--umds-primitive-yellow-dark);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.umds-tag--solid.umds-tag--new {
|
|
245
|
+
/* stylelint-disable-next-line 1ds/cor-por-token -- o DS não tem token semântico de amarelo (candidato a novo token) */
|
|
246
|
+
background-color: var(--umds-primitive-yellow-medium);
|
|
247
|
+
/* stylelint-disable-next-line 1ds/cor-por-token -- o DS não tem token semântico de amarelo (candidato a novo token) */
|
|
248
|
+
border-color: var(--umds-primitive-yellow-medium);
|
|
249
|
+
/* stylelint-disable-next-line 1ds/cor-por-token -- par fixo do amarelo: o semântico inverte no tema escuro e perderia o contraste */
|
|
250
|
+
color: var(--umds-primitive-gray-darkest);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.umds-tag--soft.umds-tag--new {
|
|
254
|
+
/* stylelint-disable-next-line 1ds/cor-por-token -- o DS não tem token semântico de amarelo (candidato a novo token) */
|
|
255
|
+
background-color: var(--umds-primitive-yellow-light);
|
|
256
|
+
/* stylelint-disable-next-line 1ds/cor-por-token -- o DS não tem token semântico de amarelo (candidato a novo token) */
|
|
257
|
+
color: var(--umds-primitive-yellow-dark);
|
|
258
|
+
}
|
|
259
|
+
|
|
177
260
|
/* ── Disabled ── */
|
|
178
261
|
.umds-tag--disabled {
|
|
179
262
|
opacity: 0.5;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import './Tag.css';
|
|
2
2
|
/**
|
|
3
3
|
* Componente Tag para exibir rótulos, categorias e seleções.
|
|
4
|
-
* Suporta aparências outlined/solid,
|
|
4
|
+
* Suporta aparências outlined/solid/soft, 4 tamanhos, formato pílula e ícones opcionais.
|
|
5
5
|
* Ideal para uso em multi-select, filtros e categorização.
|
|
6
6
|
* @quandoUsar Rótulo ESTÁTICO que classifica ou dá status a um item: categoria de um processo, estado ("Em andamento"), prioridade. É leitura, não controle.
|
|
7
7
|
* @quandoNaoUsar Quando o usuário pode remover o item ou alternar a seleção — use `Chips`. Para contagem numérica sobreposta a um ícone, use `Badge`.
|
|
@@ -16,22 +16,29 @@ export interface TagProps {
|
|
|
16
16
|
*/
|
|
17
17
|
label?: string;
|
|
18
18
|
/**
|
|
19
|
-
* Estilo visual da tag.
|
|
19
|
+
* Estilo visual da tag. `soft` é o fundo claro da cor da variante, sem
|
|
20
|
+
* contorno (setores, perfil, "Publicado", "Dado simulado").
|
|
20
21
|
* @default 'outlined'
|
|
21
22
|
*/
|
|
22
|
-
appearance?: "outlined" | "solid";
|
|
23
|
+
appearance?: "outlined" | "solid" | "soft";
|
|
24
|
+
/**
|
|
25
|
+
* Formato de pílula (cantos totalmente arredondados).
|
|
26
|
+
* @default false
|
|
27
|
+
*/
|
|
28
|
+
pill?: boolean;
|
|
23
29
|
/**
|
|
24
30
|
* Variante semântica de cor (paridade com o Badge) — para tag de STATUS
|
|
25
31
|
* (achado mobile/prefeitura: sem isso, status exigia trocar para Badge).
|
|
26
32
|
* 'neutral' mantém o visual atual.
|
|
27
33
|
* @default 'neutral'
|
|
28
34
|
*/
|
|
29
|
-
variant?: "neutral" | "primary" | "positive" | "negative" | "info";
|
|
35
|
+
variant?: "neutral" | "primary" | "positive" | "negative" | "info" | "new";
|
|
30
36
|
/**
|
|
31
|
-
* Tamanho da tag.
|
|
37
|
+
* Tamanho da tag. `xs` é a compacta de 18px (`line-height: 1`), para linha
|
|
38
|
+
* de lista e card; `sm` continua com 27px.
|
|
32
39
|
* @default 'md'
|
|
33
40
|
*/
|
|
34
|
-
size?: "sm" | "md" | "lg";
|
|
41
|
+
size?: "xs" | "sm" | "md" | "lg";
|
|
35
42
|
/**
|
|
36
43
|
* Ícone Font Awesome exibido à esquerda do label.
|
|
37
44
|
*/
|
|
@@ -59,7 +59,15 @@ export interface TextProps {
|
|
|
59
59
|
as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "p" | "span" | "div" | "label";
|
|
60
60
|
/** Alinhamento do texto */
|
|
61
61
|
align?: "left" | "center" | "right" | "justify";
|
|
62
|
-
/**
|
|
62
|
+
/**
|
|
63
|
+
* Cor do texto usando tokens semânticos.
|
|
64
|
+
*
|
|
65
|
+
* `disabled` (`neutral-dark-up`, #A3A3A3, 2,5:1 sobre branco) é SÓ para
|
|
66
|
+
* texto de controle desabilitado (rótulo, valor ou ajuda de um campo ou
|
|
67
|
+
* botão inativo), que o WCAG 1.4.3 isenta de contraste. Em qualquer outro
|
|
68
|
+
* texto (apoio, legenda, etapa pendente, placeholder) ela reprova o
|
|
69
|
+
* mínimo de 4,5:1: use `secondary` (`neutral-dark-down`, #565656, 7,34:1).
|
|
70
|
+
*/
|
|
63
71
|
color?: "primary" | "secondary" | "disabled" | "negative" | "inherit"
|
|
64
72
|
/** @deprecated use "negative" — mantido para não quebrar Input, Select e Textarea */
|
|
65
73
|
| "error";
|
|
@@ -77,7 +77,7 @@ function Text(props) {
|
|
|
77
77
|
.filter(Boolean)
|
|
78
78
|
.join(" ");
|
|
79
79
|
}
|
|
80
|
-
function
|
|
80
|
+
function estiloInline() {
|
|
81
81
|
const styles = {};
|
|
82
82
|
if (props.maxLines) {
|
|
83
83
|
styles["--umds-text-max-lines"] = String(props.maxLines);
|
|
@@ -98,6 +98,6 @@ function Text(props) {
|
|
|
98
98
|
}
|
|
99
99
|
return out;
|
|
100
100
|
}
|
|
101
|
-
return (_jsxs(_Fragment, { children: [elementTag() === "h1" ? (_jsx("h1", { id: props.id, style:
|
|
101
|
+
return (_jsxs(_Fragment, { children: [elementTag() === "h1" ? (_jsx("h1", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h2" ? (_jsx("h2", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h3" ? (_jsx("h3", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h4" ? (_jsx("h4", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h5" ? (_jsx("h5", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h6" ? (_jsx("h6", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "p" ? (_jsx("p", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "span" ? (_jsx("span", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "label" ? (_jsx("label", { htmlFor: props.forId, id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "div" ? (_jsx("div", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null] }));
|
|
102
102
|
}
|
|
103
103
|
export default Text;
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
align-items: flex-start;
|
|
31
31
|
position: relative;
|
|
32
32
|
background-color: var(--umds-semantic-color-background-white);
|
|
33
|
-
border: 1px solid var(--umds-semantic-
|
|
33
|
+
border: 1px solid var(--umds-semantic-field-border-default);
|
|
34
34
|
border-radius: var(--umds-primitive-border-radius-sm);
|
|
35
35
|
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
|
36
36
|
}
|
|
@@ -110,11 +110,11 @@
|
|
|
110
110
|
/* Read Only State */
|
|
111
111
|
.umds-textarea--readonly .umds-textarea__container {
|
|
112
112
|
background-color: var(--umds-semantic-field-readonly-background);
|
|
113
|
-
border-color: var(--umds-semantic-
|
|
113
|
+
border-color: var(--umds-semantic-field-border-default);
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
.umds-textarea--readonly .umds-textarea__container:hover {
|
|
117
|
-
border-color: var(--umds-semantic-
|
|
117
|
+
border-color: var(--umds-semantic-field-border-default);
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
.umds-textarea--readonly .umds-textarea__container:focus-within {
|
|
@@ -128,6 +128,14 @@
|
|
|
128
128
|
resize: none;
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
/* Somente leitura não é desabilitado: o texto segue lido e a WCAG 1.4.3 vale
|
|
132
|
+
sem isenção. O placeholder padrão foi calibrado para fundo branco e cai para
|
|
133
|
+
~4,2:1 sobre o fundo de somente leitura; neutral-dark-down passa 4,5:1 em
|
|
134
|
+
todos os temas (1doc 6,78:1 · 1doc-dark 10,83:1 · alto contraste 16,48:1). */
|
|
135
|
+
.umds-textarea--readonly .umds-textarea__control::placeholder {
|
|
136
|
+
color: var(--umds-semantic-color-neutral-dark-down);
|
|
137
|
+
}
|
|
138
|
+
|
|
131
139
|
/* Footer (Helper/Error + Counter) */
|
|
132
140
|
.umds-textarea__footer {
|
|
133
141
|
display: flex;
|
|
@@ -297,6 +297,14 @@
|
|
|
297
297
|
border-color: var(--umds-semantic-field-border-default);
|
|
298
298
|
}
|
|
299
299
|
|
|
300
|
+
/* Somente leitura não é desabilitado: o texto segue lido e a WCAG 1.4.3 vale
|
|
301
|
+
sem isenção. O placeholder padrão foi calibrado para fundo branco e cai para
|
|
302
|
+
~4,2:1 sobre o fundo de somente leitura; neutral-dark-down passa 4,5:1 em
|
|
303
|
+
todos os temas (1doc 6,78:1 · 1doc-dark 10,83:1 · alto contraste 16,48:1). */
|
|
304
|
+
.umds-timepicker--readonly .umds-timepicker__placeholder {
|
|
305
|
+
color: var(--umds-semantic-color-neutral-dark-down);
|
|
306
|
+
}
|
|
307
|
+
|
|
300
308
|
/* ── Alto contraste ──
|
|
301
309
|
O traço do painel é neutral-light-medium — #5A5A5A neste tema, 3:1 sobre o
|
|
302
310
|
preto. As superfícies flutuantes do tema usam a borda branca
|