@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
|
@@ -45,7 +45,7 @@ function ConfirmDialog(props) {
|
|
|
45
45
|
}
|
|
46
46
|
function confirmText() {
|
|
47
47
|
return props.confirmLoading
|
|
48
|
-
? "Aguarde..."
|
|
48
|
+
? props.loadingLabel || "Aguarde..."
|
|
49
49
|
: props.confirmLabel || "Confirmar";
|
|
50
50
|
}
|
|
51
51
|
function handleCancel(event) {
|
|
@@ -148,6 +148,6 @@ function ConfirmDialog(props) {
|
|
|
148
148
|
removeOverlay(uid);
|
|
149
149
|
};
|
|
150
150
|
}, []);
|
|
151
|
-
return (_jsx(_Fragment, { children: props.open ? (_jsx(_Fragment, { children: _jsx("div", { onClick: (event) => handleOverlayClick(event), className: overlayClasses(), children: _jsxs("div", { role: "alertdialog", "aria-modal": "true", ref: dialogRef, "aria-label": props.title, tabIndex: -1, onClick: (event) => stopPropagation(event), onKeyDown: (event) => handleTrapKeydown(event), className: dialogClasses(), children: [_jsx("div", { className: "umds-confirm-dialog__icon-wrap", children: _jsx(Icon, { variant: "inherit", customSize: "24px", icon: iconName() }) }), _jsxs("div", { className: "umds-confirm-dialog__content", children: [_jsx("h2", { className: "umds-confirm-dialog__title", children: props.title }), props.description ? (_jsx("p", { className: "umds-confirm-dialog__description", children: props.description })) : null, props.children ? (_jsx("div", { className: "umds-confirm-dialog__body", children: _jsx(_Fragment, { children: props.children }) })) : null] }), _jsxs("div", { className: "umds-confirm-dialog__footer", children: [_jsx("button", { type: "button", className: "umds-confirm-dialog__btn umds-confirm-dialog__btn--cancel", ref: cancelBtnRef, onClick: (event) => props.onCancel?.(event), children: props.cancelLabel || "Cancelar" }), _jsx("button", { type: "button", onClick: (event) => props.onConfirm?.(event), disabled: props.confirmLoading, className: confirmBtnClass(), children: confirmText() })] })] }) }) })) : null }));
|
|
151
|
+
return (_jsx(_Fragment, { children: props.open ? (_jsx(_Fragment, { children: _jsx("div", { onClick: (event) => handleOverlayClick(event), className: overlayClasses(), children: _jsxs("div", { role: "alertdialog", "aria-modal": "true", ref: dialogRef, "aria-label": props.title, tabIndex: -1, onClick: (event) => stopPropagation(event), onKeyDown: (event) => handleTrapKeydown(event), className: dialogClasses(), children: [_jsx("div", { className: "umds-confirm-dialog__icon-wrap", children: _jsx(Icon, { variant: "inherit", customSize: "24px", icon: iconName() }) }), _jsxs("div", { className: "umds-confirm-dialog__content", children: [_jsx("h2", { className: "umds-confirm-dialog__title", children: props.title }), props.description ? (_jsx("p", { className: "umds-confirm-dialog__description", children: props.description })) : null, props.children ? (_jsx("div", { className: "umds-confirm-dialog__body", children: _jsx(_Fragment, { children: props.children }) })) : null] }), _jsxs("div", { className: "umds-confirm-dialog__footer", children: [_jsx("button", { type: "button", className: "umds-confirm-dialog__btn umds-confirm-dialog__btn--cancel", ref: cancelBtnRef, onClick: (event) => props.onCancel?.(event), children: props.cancelLabel || "Cancelar" }), _jsx("button", { type: "button", onClick: (event) => props.onConfirm?.(event), disabled: props.confirmLoading || props.confirmDisabled, className: confirmBtnClass(), children: confirmText() })] })] }) }) })) : null }));
|
|
152
152
|
}
|
|
153
153
|
export default ConfirmDialog;
|
|
@@ -154,6 +154,26 @@
|
|
|
154
154
|
outline-offset: -2px;
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
+
/* ── Linha de grupo (prop rowGroup) ──
|
|
158
|
+
Um <th scope="rowgroup"> que atravessa a tabela. Não é clicável nem
|
|
159
|
+
selecionável, então o hover da linha comum não se aplica. */
|
|
160
|
+
.umds-datatable__row--group,
|
|
161
|
+
.umds-datatable__row--group:hover {
|
|
162
|
+
background: var(--umds-semantic-color-background-light); /* #F4F6F9 */
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.umds-datatable__group {
|
|
166
|
+
padding: var(--umds-primitive-spacing-nano) var(--umds-primitive-spacing-xxxs); /* 8px 16px */
|
|
167
|
+
font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
|
|
168
|
+
font-weight: 700;
|
|
169
|
+
text-align: left;
|
|
170
|
+
color: var(--umds-semantic-color-neutral-dark-down); /* #565656 */
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.umds-datatable--compact .umds-datatable__group {
|
|
174
|
+
padding: var(--umds-primitive-spacing-quarck) var(--umds-primitive-spacing-nano); /* 4px 8px */
|
|
175
|
+
}
|
|
176
|
+
|
|
157
177
|
/* ── Células ── */
|
|
158
178
|
.umds-datatable__td {
|
|
159
179
|
padding: var(--umds-primitive-spacing-mini) var(--umds-primitive-spacing-xxxs); /* protótipo --space-3 (12px): candidato a novo token; 16px */
|
|
@@ -237,3 +257,63 @@
|
|
|
237
257
|
0% { background-position: 200% 0; }
|
|
238
258
|
100% { background-position: -200% 0; }
|
|
239
259
|
}
|
|
260
|
+
|
|
261
|
+
/* ── Variante document (variant="document") ──
|
|
262
|
+
Tabela de CONTEÚDO de documento (itens de nota, cotações): lê-se e imprime-se,
|
|
263
|
+
não se opera. Sem hover, sem cursor, sem cabeçalho grudado; grade de bordas
|
|
264
|
+
finas em todas as células, como no papel. Na impressão o cabeçalho se repete
|
|
265
|
+
a cada página e uma linha nunca é cortada ao meio. */
|
|
266
|
+
.umds-datatable--document {
|
|
267
|
+
border: none;
|
|
268
|
+
border-radius: var(--umds-primitive-border-radius-none);
|
|
269
|
+
background: transparent;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.umds-datatable--document .umds-datatable__table {
|
|
273
|
+
border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-medium);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.umds-datatable--document .umds-datatable__thead {
|
|
277
|
+
position: static;
|
|
278
|
+
border-bottom: none;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.umds-datatable--document .umds-datatable__th,
|
|
282
|
+
.umds-datatable--document .umds-datatable__td {
|
|
283
|
+
border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-medium);
|
|
284
|
+
vertical-align: top;
|
|
285
|
+
user-select: auto;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.umds-datatable--document .umds-datatable__th {
|
|
289
|
+
font-size: var(--umds-primitive-font-size-xxs); /* 14px: no papel o cabeçalho é lido, não escaneado */
|
|
290
|
+
white-space: normal;
|
|
291
|
+
color: var(--umds-semantic-color-neutral-dark-pure);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.umds-datatable--document .umds-datatable__row,
|
|
295
|
+
.umds-datatable--document .umds-datatable__row:hover {
|
|
296
|
+
background: transparent;
|
|
297
|
+
border-bottom: none;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.umds-datatable--document .umds-datatable__td {
|
|
301
|
+
overflow-wrap: anywhere;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
@media print {
|
|
305
|
+
.umds-datatable--document {
|
|
306
|
+
overflow-x: visible;
|
|
307
|
+
-webkit-print-color-adjust: exact;
|
|
308
|
+
print-color-adjust: exact;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.umds-datatable--document .umds-datatable__thead {
|
|
312
|
+
display: table-header-group;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.umds-datatable--document .umds-datatable__row {
|
|
316
|
+
break-inside: avoid;
|
|
317
|
+
page-break-inside: avoid;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
@@ -7,8 +7,10 @@ import './DataTable.css';
|
|
|
7
7
|
* @property {string} width - Largura fixa da coluna (ex.: "120px")
|
|
8
8
|
* @property {string} align - Alinhamento do conteúdo: 'left' | 'center' | 'right'
|
|
9
9
|
* @property {function} render - Renderização customizada da célula: recebe a linha e o
|
|
10
|
-
* índice e retorna o conteúdo
|
|
11
|
-
*
|
|
10
|
+
* índice e retorna o conteúdo. No React devolve qualquer nó (badge, avatar, botão).
|
|
11
|
+
* No Vue o retorno é tratado como TEXTO: para célula com markup use o slot
|
|
12
|
+
* `#cell-<key>` (recebe `{ row, value, rowIndex }`), que vale sobre o `render`.
|
|
13
|
+
* Sem `render` nem slot, a célula exibe `row[key]`.
|
|
12
14
|
*/
|
|
13
15
|
export interface DataTableColumn {
|
|
14
16
|
key: string;
|
|
@@ -32,6 +34,7 @@ export interface DataTableColumn {
|
|
|
32
34
|
* (selectedKeys/onSelectKeys) em vez de índice — sobrevive a paginação e ordenação.
|
|
33
35
|
* @property {Array<string|number>} selectedKeys - Chaves das linhas selecionadas (controlado;
|
|
34
36
|
* requer rowKey)
|
|
37
|
+
* @property {string} variant - 'default' (tabela de interface) | 'document' (tabela de CONTEÚDO de documento: sem ordenação, seleção nem clique de linha, bordas finas, cabeçalho repetido e linha inteira por página na impressão)
|
|
35
38
|
* @property {string} density - Densidade das células: 'default' | 'compact'
|
|
36
39
|
* @property {string} sortKey - Chave da coluna atualmente ordenada
|
|
37
40
|
* @property {string} sortDirection - Direção da ordenação: 'asc' | 'desc'
|
|
@@ -42,8 +45,16 @@ export interface DataTableColumn {
|
|
|
42
45
|
* @property {function} onSelectKeys - Callback ao alterar a seleção por chave (requer rowKey)
|
|
43
46
|
* @property {function} onRowClick - Callback ao clicar numa linha (recebe índice e a linha);
|
|
44
47
|
* cliques no checkbox de seleção não disparam
|
|
45
|
-
* @
|
|
46
|
-
*
|
|
48
|
+
* @property {string|function} rowGroup - Agrupa linhas consecutivas: nome do campo ou função
|
|
49
|
+
* (row, rowIndex) => rótulo. Antes da primeira linha de cada grupo entra uma linha de
|
|
50
|
+
* grupo (`<th scope="rowgroup">` ocupando a largura toda). Linha sem rótulo não abre grupo.
|
|
51
|
+
* A tabela não reordena: ordene `data` por grupo antes de passar.
|
|
52
|
+
* @property {function} renderRowGroup - Conteúdo da linha de grupo: (label, row, rowIndex) => nó.
|
|
53
|
+
* Só no React. No Vue use o slot `#row-group` (recebe `{ label, row, rowIndex }`).
|
|
54
|
+
* @slot cell-<key> - Só no Vue. Célula livre da coluna `<key>`: `<template #cell-nome="{ row, value, rowIndex }">`.
|
|
55
|
+
* @slot row-group - Só no Vue. Conteúdo da linha de grupo: `{ label, row, rowIndex }`.
|
|
56
|
+
* @quandoUsar Dados TABULARES que se comparam coluna a coluna, com ordenação, seleção e paginação. Semântica de tabela para leitor de tela. Com `variant="document"`, a tabela que faz parte do TEXTO de um documento que se imprime (itens de nota, cotações): sem interação, com bordas finas e quebra de página que não corta linha.
|
|
57
|
+
* @quandoNaoUsar Para hierarquia pai-filho — use `Tree`. Para cards em grade sem comparação coluna a coluna, use `Grid` com `Card`. Para pares rótulo/valor de um documento (sem cabeçalho de coluna), use `DescriptionList`.
|
|
47
58
|
*/
|
|
48
59
|
export interface DataTableProps {
|
|
49
60
|
columns: DataTableColumn[];
|
|
@@ -53,7 +64,11 @@ export interface DataTableProps {
|
|
|
53
64
|
selectable?: boolean;
|
|
54
65
|
selectedRows?: number[];
|
|
55
66
|
rowKey?: string | ((row: Record<string, any>) => string | number);
|
|
67
|
+
rowGroup?: string | ((row: Record<string, any>, rowIndex: number) => string | undefined);
|
|
68
|
+
renderRowGroup?: (label: string, row: Record<string, any>, rowIndex: number) => any;
|
|
56
69
|
selectedKeys?: Array<string | number>;
|
|
70
|
+
/** `document`: tabela de conteúdo de documento, imprimível e sem interação. @default 'default' */
|
|
71
|
+
variant?: "default" | "document";
|
|
57
72
|
density?: "default" | "compact";
|
|
58
73
|
sortKey?: string;
|
|
59
74
|
sortDirection?: "asc" | "desc";
|
|
@@ -63,6 +78,10 @@ export interface DataTableProps {
|
|
|
63
78
|
onSelect?: (selectedIndexes: number[]) => void;
|
|
64
79
|
onSelectKeys?: (selectedKeys: Array<string | number>) => void;
|
|
65
80
|
onRowClick?: (rowIndex: number, row: Record<string, any>) => void;
|
|
81
|
+
/** Nome acessível do checkbox de selecionar todas as linhas. Troque para traduzir. @default 'Selecionar todas as linhas' */
|
|
82
|
+
selectAllLabel?: string;
|
|
83
|
+
/** Nome acessível do checkbox de cada linha. Recebe o número da linha (a partir de 1). Troque para traduzir. @default (rowNumber) => 'Selecionar linha ' + rowNumber */
|
|
84
|
+
selectRowLabel?: (rowNumber: number) => string;
|
|
66
85
|
}
|
|
67
86
|
declare function DataTable(props: DataTableProps): import("react/jsx-runtime").JSX.Element;
|
|
68
87
|
export default DataTable;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import './DataTable.css';
|
|
4
|
+
import * as React from "react";
|
|
4
5
|
import { faSort, faSortUp, faSortDown, faInbox, } from "@fortawesome/free-solid-svg-icons";
|
|
5
6
|
import Icon from "../Icon/Icon";
|
|
6
7
|
import Checkbox from "../Checkbox/Checkbox";
|
|
@@ -11,7 +12,7 @@ function DataTable(props) {
|
|
|
11
12
|
function rows() {
|
|
12
13
|
return props.data || [];
|
|
13
14
|
}
|
|
14
|
-
function
|
|
15
|
+
function selectedIndexes() {
|
|
15
16
|
return props.selectedRows || [];
|
|
16
17
|
}
|
|
17
18
|
function selectedKeysList() {
|
|
@@ -20,9 +21,16 @@ function DataTable(props) {
|
|
|
20
21
|
function usesKeys() {
|
|
21
22
|
return !!props.rowKey;
|
|
22
23
|
}
|
|
24
|
+
function isDocument() {
|
|
25
|
+
return props.variant === "document";
|
|
26
|
+
}
|
|
27
|
+
function canSelect() {
|
|
28
|
+
return !!props.selectable && props.variant !== "document";
|
|
29
|
+
}
|
|
23
30
|
function tableClasses() {
|
|
24
31
|
return [
|
|
25
32
|
"umds-datatable",
|
|
33
|
+
props.variant === "document" ? "umds-datatable--document" : "",
|
|
26
34
|
props.density === "compact" ? "umds-datatable--compact" : "",
|
|
27
35
|
props.className,
|
|
28
36
|
]
|
|
@@ -43,8 +51,31 @@ function DataTable(props) {
|
|
|
43
51
|
function hasRows() {
|
|
44
52
|
return !props.loading && rows().length > 0;
|
|
45
53
|
}
|
|
54
|
+
function groupOf(row, index) {
|
|
55
|
+
if (!props.rowGroup)
|
|
56
|
+
return "";
|
|
57
|
+
const bruto = typeof props.rowGroup === "function"
|
|
58
|
+
? props.rowGroup(row, index)
|
|
59
|
+
: row[props.rowGroup];
|
|
60
|
+
return bruto === undefined || bruto === null ? "" : String(bruto);
|
|
61
|
+
}
|
|
62
|
+
function newGroupLabel(index) {
|
|
63
|
+
if (!props.rowGroup)
|
|
64
|
+
return "";
|
|
65
|
+
const atual = groupOf(rows()[index], index);
|
|
66
|
+
if (!atual)
|
|
67
|
+
return "";
|
|
68
|
+
if (index === 0)
|
|
69
|
+
return atual;
|
|
70
|
+
return groupOf(rows()[index - 1], index - 1) === atual ? "" : atual;
|
|
71
|
+
}
|
|
72
|
+
function groupContent(label, row, index) {
|
|
73
|
+
if (props.renderRowGroup)
|
|
74
|
+
return props.renderRowGroup(label, row, index);
|
|
75
|
+
return label;
|
|
76
|
+
}
|
|
46
77
|
function colSpan() {
|
|
47
|
-
return columnsList().length + (
|
|
78
|
+
return columnsList().length + (canSelect() ? 1 : 0);
|
|
48
79
|
}
|
|
49
80
|
function rowKeyOf(row, index) {
|
|
50
81
|
if (typeof props.rowKey === "function")
|
|
@@ -59,17 +90,17 @@ function DataTable(props) {
|
|
|
59
90
|
if (usesKeys()) {
|
|
60
91
|
return rows().every((row, i) => selectedKeysList().includes(rowKeyOf(row, i)));
|
|
61
92
|
}
|
|
62
|
-
return
|
|
93
|
+
return selectedIndexes().length === rows().length;
|
|
63
94
|
}
|
|
64
95
|
function someSelected() {
|
|
65
96
|
if (usesKeys()) {
|
|
66
97
|
return (!allSelected() &&
|
|
67
98
|
rows().some((row, i) => selectedKeysList().includes(rowKeyOf(row, i))));
|
|
68
99
|
}
|
|
69
|
-
return
|
|
100
|
+
return selectedIndexes().length > 0 && !allSelected();
|
|
70
101
|
}
|
|
71
102
|
function handleSort(col) {
|
|
72
|
-
if (!col.sortable)
|
|
103
|
+
if (!col.sortable || props.variant === "document")
|
|
73
104
|
return;
|
|
74
105
|
const dir = props.sortKey === col.key && props.sortDirection === "asc"
|
|
75
106
|
? "desc"
|
|
@@ -110,7 +141,7 @@ function DataTable(props) {
|
|
|
110
141
|
const nextKeys = current.includes(key)
|
|
111
142
|
? current.filter((k) => k !== key)
|
|
112
143
|
: [...current, key];
|
|
113
|
-
const currentIdx =
|
|
144
|
+
const currentIdx = selectedIndexes();
|
|
114
145
|
const nextIdx = currentIdx.includes(index)
|
|
115
146
|
? currentIdx.filter((i) => i !== index)
|
|
116
147
|
: [...currentIdx, index];
|
|
@@ -119,7 +150,7 @@ function DataTable(props) {
|
|
|
119
150
|
}
|
|
120
151
|
if (!props.onSelect)
|
|
121
152
|
return;
|
|
122
|
-
const current =
|
|
153
|
+
const current = selectedIndexes();
|
|
123
154
|
const next = current.includes(index)
|
|
124
155
|
? current.filter((i) => i !== index)
|
|
125
156
|
: [...current, index];
|
|
@@ -129,7 +160,7 @@ function DataTable(props) {
|
|
|
129
160
|
if (usesKeys()) {
|
|
130
161
|
return selectedKeysList().includes(rowKeyOf(row, index));
|
|
131
162
|
}
|
|
132
|
-
return
|
|
163
|
+
return selectedIndexes().includes(index);
|
|
133
164
|
}
|
|
134
165
|
function cellContent(col, row, rowIndex) {
|
|
135
166
|
if (col.render)
|
|
@@ -137,11 +168,13 @@ function DataTable(props) {
|
|
|
137
168
|
return row[col.key];
|
|
138
169
|
}
|
|
139
170
|
function handleRowClick(rowIndex, row) {
|
|
171
|
+
if (props.variant === "document")
|
|
172
|
+
return;
|
|
140
173
|
if (props.onRowClick)
|
|
141
174
|
props.onRowClick(rowIndex, row);
|
|
142
175
|
}
|
|
143
176
|
function aoTeclarNaLinha(rowIndex, row, event) {
|
|
144
|
-
if (!props.onRowClick || !event)
|
|
177
|
+
if (!props.onRowClick || props.variant === "document" || !event)
|
|
145
178
|
return;
|
|
146
179
|
// Só a própria linha aciona. Sem esta guarda, o Espaço dentro do
|
|
147
180
|
// checkbox de seleção era engolido pelo preventDefault abaixo e a
|
|
@@ -157,25 +190,33 @@ function DataTable(props) {
|
|
|
157
190
|
handleRowClick(rowIndex, row);
|
|
158
191
|
}
|
|
159
192
|
function rowTabIndex() {
|
|
160
|
-
return props.onRowClick ? 0 : undefined;
|
|
193
|
+
return props.onRowClick && props.variant !== "document" ? 0 : undefined;
|
|
161
194
|
}
|
|
162
195
|
function rowRole() {
|
|
163
196
|
return undefined;
|
|
164
197
|
}
|
|
165
198
|
function rowSelectLabel(index) {
|
|
199
|
+
if (props.selectRowLabel)
|
|
200
|
+
return props.selectRowLabel(index + 1);
|
|
166
201
|
return "Selecionar linha " + (index + 1);
|
|
167
202
|
}
|
|
168
203
|
function thClasses(col) {
|
|
169
204
|
return [
|
|
170
205
|
"umds-datatable__th",
|
|
171
|
-
col.sortable
|
|
172
|
-
|
|
206
|
+
col.sortable && props.variant !== "document"
|
|
207
|
+
? "umds-datatable__th--sortable"
|
|
208
|
+
: "",
|
|
209
|
+
props.sortKey === col.key && props.variant !== "document"
|
|
210
|
+
? "umds-datatable__th--sorted"
|
|
211
|
+
: "",
|
|
173
212
|
col.align ? `umds-datatable__th--${col.align}` : "",
|
|
174
213
|
]
|
|
175
214
|
.filter(Boolean)
|
|
176
215
|
.join(" ");
|
|
177
216
|
}
|
|
178
217
|
function ariaSort(col) {
|
|
218
|
+
if (props.variant === "document")
|
|
219
|
+
return undefined;
|
|
179
220
|
if (props.sortKey !== col.key)
|
|
180
221
|
return "none";
|
|
181
222
|
return props.sortDirection === "asc" ? "ascending" : "descending";
|
|
@@ -193,6 +234,9 @@ function DataTable(props) {
|
|
|
193
234
|
return faSort;
|
|
194
235
|
return props.sortDirection === "desc" ? faSortDown : faSortUp;
|
|
195
236
|
}
|
|
237
|
+
function sortableCol(col) {
|
|
238
|
+
return !!col.sortable && props.variant !== "document";
|
|
239
|
+
}
|
|
196
240
|
function tdClasses(col) {
|
|
197
241
|
return [
|
|
198
242
|
"umds-datatable__td",
|
|
@@ -205,15 +249,17 @@ function DataTable(props) {
|
|
|
205
249
|
return [
|
|
206
250
|
"umds-datatable__row",
|
|
207
251
|
isSelected(row, rowIdx) ? "umds-datatable__row--selected" : "",
|
|
208
|
-
props.onRowClick
|
|
252
|
+
props.onRowClick && props.variant !== "document"
|
|
253
|
+
? "umds-datatable__row--clickable"
|
|
254
|
+
: "",
|
|
209
255
|
]
|
|
210
256
|
.filter(Boolean)
|
|
211
257
|
.join(" ");
|
|
212
258
|
}
|
|
213
|
-
return (_jsx("div", { className: tableClasses(), children: _jsxs("table", { className: "umds-datatable__table", "aria-busy": props.loading, children: [_jsx("thead", { className: "umds-datatable__thead", children: _jsxs("tr", { children: [
|
|
259
|
+
return (_jsx("div", { className: tableClasses(), children: _jsxs("table", { className: "umds-datatable__table", "aria-busy": props.loading, children: [_jsx("thead", { className: "umds-datatable__thead", children: _jsxs("tr", { children: [canSelect() ? (_jsx("th", { scope: "col", className: "umds-datatable__th umds-datatable__th--checkbox", children: _jsx(Checkbox, { checked: allSelected(), indeterminate: someSelected(), ariaLabel: props.selectAllLabel || "Selecionar todas as linhas", onChange: (event) => toggleAll() }) })) : null, columnsList()?.map((col) => (_jsxs("th", { scope: "col", style: col.width
|
|
214
260
|
? {
|
|
215
261
|
width: col.width,
|
|
216
262
|
}
|
|
217
|
-
: {}, "aria-sort": ariaSort(col), className: thClasses(col), children: [col
|
|
263
|
+
: {}, "aria-sort": ariaSort(col), className: thClasses(col), children: [sortableCol(col) ? (_jsxs("button", { type: "button", className: "umds-datatable__sort-button umds-datatable__th-content", onClick: (event) => handleSort(col), children: [col.label, _jsx("span", { "aria-hidden": "true", className: sortIconClasses(col), children: _jsx(Icon, { variant: "inherit", customSize: "12px", icon: sortIconName(col) }) })] })) : null, !sortableCol(col) ? (_jsx("span", { className: "umds-datatable__th-content", children: col.label })) : null] }, col.key)))] }) }), _jsxs("tbody", { className: "umds-datatable__tbody", children: [props.loading ? (_jsx(_Fragment, { children: skeletonRowsList()?.map((_, rowIdx) => (_jsxs("tr", { className: "umds-datatable__row umds-datatable__row--skeleton", children: [canSelect() ? (_jsx("td", { className: "umds-datatable__td umds-datatable__td--checkbox", children: _jsx("div", { className: "umds-datatable__skeleton umds-datatable__skeleton--checkbox" }) })) : null, columnsList()?.map((col) => (_jsx("td", { className: "umds-datatable__td", children: _jsx("div", { className: "umds-datatable__skeleton" }) }, col.key)))] }, `sk-${rowIdx}`))) })) : null, isEmpty() ? (_jsx("tr", { className: "umds-datatable__row--empty", children: _jsx("td", { className: "umds-datatable__td umds-datatable__td--empty", colSpan: colSpan(), children: _jsxs("div", { className: "umds-datatable__empty", children: [_jsx("span", { "aria-hidden": "true", className: "umds-datatable__empty-icon", children: _jsx(Icon, { variant: "inherit", customSize: "48px", icon: faInbox }) }), _jsx("span", { children: props.emptyMessage || "Nenhum registro encontrado" })] }) }) })) : null, hasRows() ? (_jsx(_Fragment, { children: rows()?.map((row, rowIdx) => (_jsxs(React.Fragment, { children: [newGroupLabel(rowIdx) ? (_jsx("tr", { className: "umds-datatable__row umds-datatable__row--group", children: _jsx("th", { scope: "rowgroup", className: "umds-datatable__group", colSpan: colSpan(), children: groupContent(newGroupLabel(rowIdx), row, rowIdx) }) })) : null, _jsxs("tr", { onClick: (event) => handleRowClick(rowIdx, row), onKeyDown: (event) => aoTeclarNaLinha(rowIdx, row, event), tabIndex: rowTabIndex(), role: rowRole(), className: rowClasses(row, rowIdx), children: [canSelect() ? (_jsx("td", { className: "umds-datatable__td umds-datatable__td--checkbox", onClick: (event) => event.stopPropagation(), children: _jsx(Checkbox, { checked: isSelected(row, rowIdx), ariaLabel: rowSelectLabel(rowIdx), onChange: (event) => toggleRow(row, rowIdx) }) })) : null, columnsList()?.map((col) => (_jsx("td", { className: tdClasses(col), children: cellContent(col, row, rowIdx) }, col.key)))] })] }, rowIdx))) })) : null] })] }) }));
|
|
218
264
|
}
|
|
219
265
|
export default DataTable;
|
|
@@ -156,6 +156,14 @@
|
|
|
156
156
|
background-color: var(--umds-semantic-field-readonly-background);
|
|
157
157
|
}
|
|
158
158
|
|
|
159
|
+
/* Somente leitura não é desabilitado: o texto segue lido e o WCAG 1.4.3 vale
|
|
160
|
+
sem isenção. O placeholder padrão foi calibrado para fundo branco e cai para
|
|
161
|
+
~4,2:1 sobre o fundo de somente leitura; neutral-dark-down passa 4,5:1 em
|
|
162
|
+
todos os temas (1doc 6,78:1 · 1doc-dark 10,83:1 · alto contraste 16,48:1). */
|
|
163
|
+
.umds-datepicker--readonly .umds-datepicker__placeholder {
|
|
164
|
+
color: var(--umds-semantic-color-neutral-dark-down);
|
|
165
|
+
}
|
|
166
|
+
|
|
159
167
|
/* ── Wrapper flutuante (Portal no body; posicionado pelo floating-ui via style inline) ── */
|
|
160
168
|
.umds-datepicker__floating {
|
|
161
169
|
display: block;
|
|
@@ -67,6 +67,10 @@ export interface DatePickerProps {
|
|
|
67
67
|
previousMonthLabel?: string;
|
|
68
68
|
/** Rótulo acessível do botão de próximo mês. @default 'Próximo mês' */
|
|
69
69
|
nextMonthLabel?: string;
|
|
70
|
+
/** Nome acessível do painel do calendário (e do campo, quando não há `label` nem `ariaLabel`). Troque para traduzir. @default 'Selecionar data' ou, com mode="range", 'Selecionar período' */
|
|
71
|
+
dialogLabel?: string;
|
|
72
|
+
/** Nome acessível de cada dia da grade. Recebe a data em ISO (YYYY-MM-DD). Troque para traduzir. @default (isoDate) => '20 de julho de 2026' (mês por `locale.months`, em minúsculas) */
|
|
73
|
+
dayLabel?: (isoDate: string) => string;
|
|
70
74
|
/** Período selecionado (modo controlado). */
|
|
71
75
|
/** Modo de seleção. "single" = uma data; "range" = período de duas datas. */
|
|
72
76
|
mode?: "single" | "range";
|
|
@@ -34,14 +34,21 @@ function DatePicker(props) {
|
|
|
34
34
|
const [viewYear, setViewYear] = useState(() => 0);
|
|
35
35
|
const [viewMonth, setViewMonth] = useState(() => 0);
|
|
36
36
|
const [uid, setUid] = useState(() => "umds-datepicker-" + Math.random().toString(36).slice(2, 9));
|
|
37
|
-
const [internalFrom, setInternalFrom] = useState(() =>
|
|
37
|
+
const [internalFrom, setInternalFrom] = useState(() => props.mode !== "range" && props.defaultValue
|
|
38
|
+
? props.defaultValue
|
|
39
|
+
: (props.defaultRange && props.defaultRange.from) || "");
|
|
38
40
|
const [internalTo, setInternalTo] = useState(() => (props.defaultRange && props.defaultRange.to) || "");
|
|
39
41
|
const [hoverIso, setHoverIso] = useState(() => "");
|
|
40
42
|
const [focusedIso, setFocusedIso] = useState(() => "");
|
|
41
43
|
function currentFrom() {
|
|
44
|
+
if (props.mode !== "range" && props.value !== undefined) {
|
|
45
|
+
return props.value || "";
|
|
46
|
+
}
|
|
42
47
|
return props.range !== undefined ? props.range.from || "" : internalFrom;
|
|
43
48
|
}
|
|
44
49
|
function currentTo() {
|
|
50
|
+
if (props.mode !== "range" && props.value !== undefined)
|
|
51
|
+
return "";
|
|
45
52
|
return props.range !== undefined ? props.range.to || "" : internalTo;
|
|
46
53
|
}
|
|
47
54
|
function monthNames() {
|
|
@@ -83,6 +90,8 @@ function DatePicker(props) {
|
|
|
83
90
|
return props.label ? labelId() : undefined;
|
|
84
91
|
}
|
|
85
92
|
function textoDoAlvo() {
|
|
93
|
+
if (props.dialogLabel)
|
|
94
|
+
return props.dialogLabel;
|
|
86
95
|
return props.mode === "range" ? "Selecionar período" : "Selecionar data";
|
|
87
96
|
}
|
|
88
97
|
function comboboxAriaLabel() {
|
|
@@ -447,6 +456,8 @@ function DatePicker(props) {
|
|
|
447
456
|
.join(" ");
|
|
448
457
|
}
|
|
449
458
|
function dayAriaLabel(cell) {
|
|
459
|
+
if (props.dayLabel)
|
|
460
|
+
return props.dayLabel(cell.iso);
|
|
450
461
|
const parts = cell.iso.split("-");
|
|
451
462
|
return (Number(parts[2]) +
|
|
452
463
|
" de " +
|
|
@@ -487,6 +498,8 @@ function DatePicker(props) {
|
|
|
487
498
|
}
|
|
488
499
|
function handleKeydown(event) {
|
|
489
500
|
if (event && event.key === "Escape" && open) {
|
|
501
|
+
// O Esc é do calendário (fecha só ele): o Modal em volta não reage.
|
|
502
|
+
event.preventDefault();
|
|
490
503
|
closeCalendar();
|
|
491
504
|
}
|
|
492
505
|
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/* ─────────────────────────────────────────────
|
|
2
|
+
DESCRIPTION LIST
|
|
3
|
+
Pares rótulo/valor de um documento, em <dl>.
|
|
4
|
+
|
|
5
|
+
inline: grade de bordas finas, rótulo pintado à esquerda, sem cabeçalho.
|
|
6
|
+
As linhas viram `display: contents` para as duas colunas alinharem
|
|
7
|
+
entre todos os pares; as bordas são as linhas de 1px que a grade
|
|
8
|
+
deixa entre as células (o fundo da lista é a cor da borda).
|
|
9
|
+
stacked: rótulo pequeno em cima, valor embaixo, em até 4 colunas.
|
|
10
|
+
|
|
11
|
+
Cores: semânticos · Medidas: primitivos
|
|
12
|
+
───────────────────────────────────────────── */
|
|
13
|
+
|
|
14
|
+
.umds-description-list {
|
|
15
|
+
margin: 0;
|
|
16
|
+
padding: 0;
|
|
17
|
+
font-family: var(--umds-semantic-font-family-base);
|
|
18
|
+
font-size: var(--umds-primitive-font-size-xxs); /* 14px */
|
|
19
|
+
color: var(--umds-semantic-color-neutral-dark-pure);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.umds-description-list__term,
|
|
23
|
+
.umds-description-list__description {
|
|
24
|
+
margin: 0;
|
|
25
|
+
overflow-wrap: anywhere;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* ── inline ── */
|
|
29
|
+
.umds-description-list--inline {
|
|
30
|
+
display: grid;
|
|
31
|
+
grid-template-columns: max-content minmax(0, 1fr);
|
|
32
|
+
gap: var(--umds-primitive-border-width-hairline);
|
|
33
|
+
border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-medium);
|
|
34
|
+
background: var(--umds-semantic-color-neutral-light-medium);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.umds-description-list--inline.umds-description-list--fit {
|
|
38
|
+
display: inline-grid;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.umds-description-list--inline .umds-description-list__item {
|
|
42
|
+
display: contents;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.umds-description-list--inline .umds-description-list__term,
|
|
46
|
+
.umds-description-list--inline .umds-description-list__description {
|
|
47
|
+
padding: var(--umds-primitive-spacing-quarck) var(--umds-primitive-spacing-nano); /* 4px 8px */
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* O rótulo é a coluna pintada: sem negrito e sem quebra. */
|
|
51
|
+
.umds-description-list--inline .umds-description-list__term {
|
|
52
|
+
background: var(--umds-semantic-color-background-light);
|
|
53
|
+
color: var(--umds-semantic-color-neutral-dark-down);
|
|
54
|
+
font-weight: var(--umds-primitive-font-weight-regular);
|
|
55
|
+
white-space: nowrap;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.umds-description-list--inline .umds-description-list__description {
|
|
59
|
+
background: var(--umds-semantic-color-background-white);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* ── stacked ── */
|
|
63
|
+
.umds-description-list--stacked {
|
|
64
|
+
display: grid;
|
|
65
|
+
gap: var(--umds-primitive-spacing-xxxs); /* 16px */
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.umds-description-list--cols-1 { grid-template-columns: minmax(0, 1fr); }
|
|
69
|
+
.umds-description-list--cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
70
|
+
.umds-description-list--cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
|
|
71
|
+
.umds-description-list--cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
|
|
72
|
+
|
|
73
|
+
.umds-description-list--stacked .umds-description-list__item {
|
|
74
|
+
display: flex;
|
|
75
|
+
flex-direction: column;
|
|
76
|
+
gap: var(--umds-primitive-spacing-quarck); /* 4px */
|
|
77
|
+
min-width: 0;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.umds-description-list--stacked .umds-description-list__term {
|
|
81
|
+
font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
|
|
82
|
+
font-weight: var(--umds-primitive-font-weight-semibold);
|
|
83
|
+
color: var(--umds-semantic-color-neutral-dark-down);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.umds-description-list--bordered .umds-description-list__description {
|
|
87
|
+
padding: var(--umds-primitive-spacing-nano) var(--umds-primitive-spacing-mini); /* 8px 12px */
|
|
88
|
+
border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-medium);
|
|
89
|
+
border-radius: var(--umds-primitive-border-radius-sm);
|
|
90
|
+
background: var(--umds-semantic-field-readonly-background);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Telas estreitas: o stacked vira uma coluna só. */
|
|
94
|
+
@media (max-width: 640px) {
|
|
95
|
+
.umds-description-list--cols-2,
|
|
96
|
+
.umds-description-list--cols-3,
|
|
97
|
+
.umds-description-list--cols-4 {
|
|
98
|
+
grid-template-columns: minmax(0, 1fr);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* ── Impressão: o par não é cortado entre duas páginas e a cor do rótulo sai ── */
|
|
103
|
+
@media print {
|
|
104
|
+
.umds-description-list {
|
|
105
|
+
-webkit-print-color-adjust: exact;
|
|
106
|
+
print-color-adjust: exact;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.umds-description-list__item {
|
|
110
|
+
break-inside: avoid;
|
|
111
|
+
page-break-inside: avoid;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import './DescriptionList.css';
|
|
2
|
+
/**
|
|
3
|
+
* Par rótulo/valor da DescriptionList.
|
|
4
|
+
* @property {string} label - Rótulo (o termo).
|
|
5
|
+
* @property {any} value - Valor (a descrição). No Vue é tratado como texto.
|
|
6
|
+
* @property {string} id - Identidade estável do par (padrão: o próprio rótulo).
|
|
7
|
+
*/
|
|
8
|
+
export interface DescriptionListItem {
|
|
9
|
+
label: string;
|
|
10
|
+
value?: any;
|
|
11
|
+
id?: string;
|
|
12
|
+
[key: string]: any;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* DescriptionList — pares rótulo/valor de um documento, em `<dl>`.
|
|
16
|
+
*
|
|
17
|
+
* Dois desenhos para o mesmo dado:
|
|
18
|
+
* - `inline` (padrão): uma linha por par, rótulo pintado à esquerda e valor à
|
|
19
|
+
* direita, numa grade de bordas finas e SEM cabeçalho. Encolhe até o conteúdo
|
|
20
|
+
* (`fit`) ou ocupa a largura toda. É a tabela de "dotação orçamentária" de um
|
|
21
|
+
* despacho.
|
|
22
|
+
* - `stacked`: rótulo pequeno em cima e valor embaixo, em até 4 `columns`. É o
|
|
23
|
+
* bloco "Dados do processo". Com `bordered`, o valor ganha a caixa de um campo
|
|
24
|
+
* somente leitura.
|
|
25
|
+
*
|
|
26
|
+
* O que é do papel fica nela: sem hover, sem foco, sem clique, e na impressão o
|
|
27
|
+
* par nunca é cortado entre duas páginas. Para tabela com cabeçalho de coluna,
|
|
28
|
+
* use `DataTable variant="document"`.
|
|
29
|
+
*
|
|
30
|
+
* Semântica: `<dl>` com `<dt>` e `<dd>`, agrupados por `<div>` (HTML 5.2). O
|
|
31
|
+
* leitor de tela anuncia a lista de termos e a quantidade.
|
|
32
|
+
* @property {DescriptionListItem[]} items - Os pares, na ordem em que aparecem
|
|
33
|
+
* @property {string} layout - 'inline' (padrão) | 'stacked'
|
|
34
|
+
* @property {number} columns - Só no `stacked`: colunas de pares, de 1 a 4 (padrão 2)
|
|
35
|
+
* @property {boolean} bordered - Só no `stacked`: o valor numa caixa de campo somente leitura
|
|
36
|
+
* @property {boolean} fit - Só no `inline`: encolhe até o conteúdo em vez de ocupar a largura toda
|
|
37
|
+
* @property {string} emptyValue - Texto quando o valor vem vazio (padrão: "—")
|
|
38
|
+
* @property {string} ariaLabel - Nome acessível da lista
|
|
39
|
+
* @property {string} ariaLabelledby - Id do título visível que nomeia a lista
|
|
40
|
+
* @property {string} className - Classes CSS adicionais
|
|
41
|
+
* @quandoUsar Dados cadastrais e de empenho dentro do texto de um documento, ficha de processo, bloco de detalhes de uma tela de leitura: qualquer conjunto de "campo: valor".
|
|
42
|
+
* @quandoNaoUsar Para dados com várias linhas comparáveis coluna a coluna, use `DataTable`. Para campos que a pessoa edita, use `Input` e afins. Para valor com marcação (badge, link, botão), a DescriptionList no Vue só mostra texto: monte o bloco com `Stack` e `Text`.
|
|
43
|
+
*/
|
|
44
|
+
export interface DescriptionListProps {
|
|
45
|
+
items?: DescriptionListItem[];
|
|
46
|
+
layout?: "inline" | "stacked";
|
|
47
|
+
columns?: 1 | 2 | 3 | 4;
|
|
48
|
+
bordered?: boolean;
|
|
49
|
+
fit?: boolean;
|
|
50
|
+
emptyValue?: string;
|
|
51
|
+
ariaLabel?: string;
|
|
52
|
+
ariaLabelledby?: string;
|
|
53
|
+
className?: string;
|
|
54
|
+
id?: string;
|
|
55
|
+
style?: any;
|
|
56
|
+
[key: string]: any;
|
|
57
|
+
}
|
|
58
|
+
declare function DescriptionList(props: DescriptionListProps): import("react/jsx-runtime").JSX.Element;
|
|
59
|
+
export default DescriptionList;
|