fix(ui): 3 user-reported issues

1) MODAL OFF-SCREEN (Schema/AOI/Confirm dialogs)
DialogContent had `inset-0 w-full h-full` + `min-[880px]:inset-auto`
конфликтовал — inset-0 winning по CSS specificity, modal приклеивался
к левому краю viewport вместо центра. User screenshot показал Schema edit
выходящим за левую границу экрана.

Fix: remove inset-0 fullscreen pattern. Use simple centered modal —
left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 + w-[95vw] max-h-[95vh]
overflow-y-auto. На mobile <880px max-w из size variant даёт ширину 95vw
(natural fit). На desktop max-w ограничивает до 440/560/720/880/920px.

2) LOGO 'ORDINIS MDM' С CIRCLE ICON (per redesign prototype)
Sidebar logo: 'ORDINIS' → circle icon (accent orbit ring + dot) +
'ORDINIS' bold + 'MDM' mute subtitle (Tektur). SVG inline — нет external
dep.

Collapsed mode: только circle icon, no text (uses Tektur ORDINIS dropped).

3) TIMELINE BUTTON LABEL
InfoPanel button 'Time-travel…' → 'Таймлайн' (per user feedback). Behaviour
не меняется — клик открывает picker. Inline таймлайн visualization
отложен (большой refactor, нужен product decision).

Verified:
  - Dialog modal центрируется на десктоп
  - Logo рендерится с svg + text
  - Tests: 116 pass
This commit is contained in:
Zimin A.N.
2026-05-11 17:49:57 +03:00
parent 6b277a78a5
commit abdfaa8fcc
3 changed files with 28 additions and 11 deletions
@@ -90,7 +90,7 @@ export function EditorInfoPanel({ detail, recordCount, actions }: EditorInfoPane
)}
>
<ClockCounterClockwiseIcon weight="regular" size={14} />
{t('timeTravel.button', { defaultValue: 'Time-travel…' })}
{t('timeTravel.timeline', { defaultValue: 'Таймлайн' })}
</button>
)}
{actions.onAoi && (
@@ -172,20 +172,37 @@ function SidebarContent({
const { t } = useTranslation()
return (
<>
{/* Logo block */}
{/* Logo block per redesign prototype: circle (accent) + ORDINIS + MDM mute */}
<div
className={cn(
'h-14 flex items-center border-b border-line shrink-0',
collapsed ? 'justify-center px-2' : 'px-5',
collapsed ? 'justify-center px-2' : 'px-5 gap-2',
)}
>
<Link
to="/"
className="font-display text-base tracking-wider text-navy hover:opacity-80 transition-opacity"
className="flex items-center gap-2 hover:opacity-80 transition-opacity focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm"
onClick={onNavigate}
title="ORDINIS"
title="ORDINIS MDM"
>
{collapsed ? 'O' : 'ORDINIS'}
{/* Circle orbit icon — accent ring + dot center */}
<svg
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
aria-hidden
className="shrink-0"
>
<circle cx="10" cy="10" r="8.5" stroke="var(--color-accent)" strokeWidth="1.4" />
<circle cx="10" cy="10" r="2" fill="var(--color-accent)" />
</svg>
{!collapsed && (
<span className="font-display text-base tracking-wider text-ink">
ORDINIS <span className="text-mute font-normal">MDM</span>
</span>
)}
</Link>
</div>
@@ -76,11 +76,11 @@ export const DialogContent = React.forwardRef<
ref={ref}
className={cn(
'fixed z-50 grid gap-4 border border-line bg-surface p-6 shadow-2xl duration-200',
// Mobile <880px (per handoff): fullscreen 100vw × 100dvh, no corners,
// no centered transform. Editor body становится single-column natively.
'inset-0 w-full h-full',
// Desktop ≥880px: centered modal с rounded corners + max-w из SIZE_CLASSES.
'min-[880px]:left-1/2 min-[880px]:top-1/2 min-[880px]:inset-auto min-[880px]:h-auto min-[880px]:w-full min-[880px]:-translate-x-1/2 min-[880px]:-translate-y-1/2 min-[880px]:rounded-lg',
// Centered modal — left/top 50% + translate. В <880px mode пользуем
// max-width 95vw чтобы modal не упирался в edges (вместо fullscreen
// inset-0 который конфликтовал с left-1/2 → modal off-screen).
'left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2',
'w-[95vw] max-h-[95vh] overflow-y-auto rounded-lg',
'data-[state=open]:animate-in data-[state=closed]:animate-out',
'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',