From cf21a5bd178a18753321811b6d8ac81ff848d676 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Sat, 12 Sep 2026 22:07:29 +0300 Subject: [PATCH] feat(card): refine header and inline actions --- src/pages/card/ui/CardPage.module.css | 41 +++++++++ src/pages/card/ui/CardPage.view.tsx | 119 +++++++++++++++++++------- 2 files changed, 129 insertions(+), 31 deletions(-) diff --git a/src/pages/card/ui/CardPage.module.css b/src/pages/card/ui/CardPage.module.css index d1fb713..c7171ed 100644 --- a/src/pages/card/ui/CardPage.module.css +++ b/src/pages/card/ui/CardPage.module.css @@ -1,3 +1,30 @@ +.card { + position: relative; + width: 100%; + max-width: 28rem; +} +.cardActions { + position: absolute; + top: 4.5rem; + right: clamp(1.1rem, 3vw, 1.6rem); + padding: 4px; + border: 1px solid var(--mantine-color-gray-3); + border-radius: var(--mantine-radius-lg); + background: var(--mantine-color-white); + box-shadow: 0 3px 12px #0000001a; +} +@media (hover: hover) and (pointer: fine) { + .cardActions { + opacity: 0; + pointer-events: none; + } + .card:hover .cardActions, + .card:focus-within .cardActions { + opacity: 1; + pointer-events: auto; + } +} + .wrap { overflow-wrap: anywhere; min-width: 0; @@ -21,7 +48,21 @@ .operations[data-pending] { opacity: 0.55; } +@media (pointer: coarse) { + .cardActions button { + min-width: 36px; + min-height: 36px; + } +} @media (prefers-reduced-motion: no-preference) { + .cardActions { + transition: opacity 180ms ease; + } + .page button { + transition: + background-color 180ms ease, + color 180ms ease; + } .operations { animation: operations-appear 200ms ease-out; transition: opacity 150ms ease; diff --git a/src/pages/card/ui/CardPage.view.tsx b/src/pages/card/ui/CardPage.view.tsx index 74c0c9f..61305c1 100644 --- a/src/pages/card/ui/CardPage.view.tsx +++ b/src/pages/card/ui/CardPage.view.tsx @@ -4,7 +4,6 @@ import { Button, Group, Pagination, - Paper, Select, Skeleton, Stack, @@ -124,41 +123,76 @@ const CardPageView: FC = (props) => { ); } return ( - - - - - {card.name} - + + + + {card.name} + +
- {t("bank.manualBalance")} - - - - + + - {vm.archiveError ? ( - void vm.card.refetch()} - /> - ) : null} - {card.archivedAt && {t("bank.archiveHint")}} - - +
+ {vm.archiveError ? ( + void vm.card.refetch()} + /> + ) : null} + {card.archivedAt && {t("bank.archiveHint")}} +
{vm.card.isError && ( {t("bank.refreshError")} @@ -185,7 +219,30 @@ const CardPageView: FC = (props) => { retry={() => void vm.summary.refetch()} /> - {t("bank.operations")} + + {t("bank.operations")} + vm.setOperation("new")} + > + + +