This commit is contained in:
DCCONSTRUCTIONS 2026-04-20 17:57:08 +03:00
parent 47d379e77f
commit 5b2a2fc104
5 changed files with 44 additions and 8 deletions

View File

@ -240,6 +240,9 @@
- empty-state не должен использовать декоративную серую подложку под SVG; media-box прозрачный, SVG выравнивается через `display:flex` и центрирование - empty-state не должен использовать декоративную серую подложку под SVG; media-box прозрачный, SVG выравнивается через `display:flex` и центрирование
- detail-toolbar в карточке запроса использует общий glass-cluster для листания `prev/next`, а сами кнопки внутри кластера — круглые, без квадратной подложки - detail-toolbar в карточке запроса использует общий glass-cluster для листания `prev/next`, а сами кнопки внутри кластера — круглые, без квадратной подложки
- `Добавить запрос` в header `Внешних контуров` — это filled accent CTA с тёмным текстом, каноничным радиусом и hover в более светлый тон того же акцента - `Добавить запрос` в header `Внешних контуров` — это filled accent CTA с тёмным текстом, каноничным радиусом и hover в более светлый тон того же акцента
- global sidebar quick action `Новый рабочий элемент` не показывается на маршруте `external-contours`, потому что этот экран уже имеет собственный primary CTA в header
- active/passive карточки `Внешних контуров` обязаны брать фон только из `--nodedc-card-active-rgb` и `--nodedc-card-passive-rgb`
- header `Внешних контуров` и detail-pane опускаются на единый верхний ритм; нельзя прижимать breadcrumbs, CTA и detail-header к верхней кромке
- popup выбора `Приоритет / Метки` внутри detail view не рендерится inline в property-row; он обязан уходить в `portal` - popup выбора `Приоритет / Метки` внутри detail view не рендерится inline в property-row; он обязан уходить в `portal`
- секции с dropdown-trigger внутри blur/glass shell обязаны иметь `overflow: visible` и `isolation: isolate`, иначе popup визуально “тонет” внутри блока - секции с dropdown-trigger внутри blur/glass shell обязаны иметь `overflow: visible` и `isolation: isolate`, иначе popup визуально “тонет” внутри блока
- при переключении `Открытые / Закрытые` store обязан очистить stale request list до нового fetch, чтобы пользователь не видел flash старой верстки - при переключении `Открытые / Закрытые` store обязан очистить stale request list до нового fetch, чтобы пользователь не видел flash старой верстки
@ -254,6 +257,12 @@
<Button className="nodedc-external-primary-button">...</Button> <Button className="nodedc-external-primary-button">...</Button>
``` ```
- Route-aware quick action hide:
```tsx
const pathname = usePathname();
if (pathname?.includes("/external-contours")) return null;
```
- List spacing: - List spacing:
```tsx ```tsx
<div key={resolvedTab} className="space-y-3"> <div key={resolvedTab} className="space-y-3">
@ -271,6 +280,18 @@ const resolvedTab = pendingTab ?? routeTab;
const isTabTransitioning = loader === "init-loading" || pendingTab !== null || routeTab !== currentTab; const isTabTransitioning = loader === "init-loading" || pendingTab !== null || routeTab !== currentTab;
``` ```
- Card theme source:
```css
.nodedc-external-card {
background: rgb(var(--nodedc-card-passive-rgb));
}
.nodedc-external-card[data-active="true"] {
background: rgb(var(--nodedc-card-active-rgb));
color: #0b1117;
}
```
- Property popup anchor: - Property popup anchor:
```tsx ```tsx
<PriorityDropdown <PriorityDropdown

View File

@ -75,7 +75,7 @@ export const ExternalContoursRoot = observer(function ExternalContoursRoot(props
/> />
</div> </div>
)} )}
<div className="flex h-full w-full overflow-hidden bg-surface-1"> <div className="flex h-full w-full overflow-hidden bg-surface-1 pt-2">
<div <div
className={cn( className={cn(
"absolute top-[50px] bottom-0 z-10 w-full flex-shrink-0 bg-surface-1 transition-all lg:!relative lg:!top-0 lg:w-2/6", "absolute top-[50px] bottom-0 z-10 w-full flex-shrink-0 bg-surface-1 transition-all lg:!relative lg:!top-0 lg:w-2/6",

View File

@ -74,8 +74,8 @@ export function AuthHeaderBase(props: TAuthHeaderBase) {
<div className="sticky top-0 flex w-full flex-shrink-0 items-center justify-between gap-6 px-2 py-1"> <div className="sticky top-0 flex w-full flex-shrink-0 items-center justify-between gap-6 px-2 py-1">
<Link href="/"> <Link href="/">
<PlaneLockup <PlaneLockup
height={84} height={31}
width={402} width={148}
className="nodedc-auth-logo-lockup text-primary transition-opacity hover:opacity-90" className="nodedc-auth-logo-lockup text-primary transition-opacity hover:opacity-90"
/> />
</Link> </Link>

View File

@ -6,7 +6,7 @@
import { useRef, useState } from "react"; import { useRef, useState } from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { useParams } from "next/navigation"; import { useParams, usePathname } from "next/navigation";
// plane imports // plane imports
import { EUserPermissions, EUserPermissionsLevel, SIDEBAR_TRACKER_ELEMENTS } from "@plane/constants"; import { EUserPermissions, EUserPermissionsLevel, SIDEBAR_TRACKER_ELEMENTS } from "@plane/constants";
import { useTranslation } from "@plane/i18n"; import { useTranslation } from "@plane/i18n";
@ -31,6 +31,7 @@ export const SidebarQuickActions = observer(function SidebarQuickActions() {
const timeoutRef = useRef<any>(); const timeoutRef = useRef<any>();
// router // router
const { workspaceSlug: routerWorkspaceSlug } = useParams(); const { workspaceSlug: routerWorkspaceSlug } = useParams();
const pathname = usePathname();
const workspaceSlug = routerWorkspaceSlug?.toString(); const workspaceSlug = routerWorkspaceSlug?.toString();
// store hooks // store hooks
const { toggleCreateIssueModal } = useCommandPalette(); const { toggleCreateIssueModal } = useCommandPalette();
@ -45,6 +46,9 @@ export const SidebarQuickActions = observer(function SidebarQuickActions() {
); );
const disabled = joinedProjectIds.length === 0 || !canCreateIssue; const disabled = joinedProjectIds.length === 0 || !canCreateIssue;
const workspaceDraftIssue = workspaceSlug ? (storedValue?.[workspaceSlug] ?? undefined) : undefined; const workspaceDraftIssue = workspaceSlug ? (storedValue?.[workspaceSlug] ?? undefined) : undefined;
const effectivePathname =
pathname || (typeof window !== "undefined" ? window.location.pathname : undefined);
const isExternalContoursRoute = effectivePathname?.includes("/external-contours");
const handleMouseEnter = () => { const handleMouseEnter = () => {
// if enter before time out clear the timeout // if enter before time out clear the timeout
@ -67,6 +71,8 @@ export const SidebarQuickActions = observer(function SidebarQuickActions() {
return Promise.resolve(); return Promise.resolve();
}; };
if (isExternalContoursRoute) return null;
return ( return (
<> <>
<CreateUpdateIssueModal <CreateUpdateIssueModal

View File

@ -810,9 +810,7 @@
max-width: 32rem; max-width: 32rem;
border: 0 !important; border: 0 !important;
outline: none !important; outline: none !important;
box-shadow: box-shadow: none !important;
0 24px 64px rgba(0, 0, 0, 0.34),
0 8px 20px rgba(0, 0, 0, 0.18) !important;
border-radius: 1.9rem !important; border-radius: 1.9rem !important;
padding: 2.2rem !important; padding: 2.2rem !important;
background: background:
@ -1016,12 +1014,23 @@
.nodedc-external-card[data-active="true"] { .nodedc-external-card[data-active="true"] {
background: background:
linear-gradient(180deg, rgba(255, 255, 255, 0.024) 0%, rgba(255, 255, 255, 0.008) 100%), linear-gradient(180deg, rgba(255, 255, 255, 0.024) 0%, rgba(255, 255, 255, 0.008) 100%),
rgba(255, 255, 255, 0.035) !important; rgb(var(--nodedc-card-active-rgb)) !important;
color: #0b1117 !important;
box-shadow: box-shadow:
inset 0 0 0 1px rgba(var(--nodedc-accent-rgb), 0.32), inset 0 0 0 1px rgba(var(--nodedc-accent-rgb), 0.32),
0 12px 32px rgba(0, 0, 0, 0.16) !important; 0 12px 32px rgba(0, 0, 0, 0.16) !important;
} }
.nodedc-external-card[data-active="true"] .text-primary {
color: #0b1117 !important;
}
.nodedc-external-card[data-active="true"] .text-secondary,
.nodedc-external-card[data-active="true"] .text-tertiary,
.nodedc-external-card[data-active="true"] .text-placeholder {
color: rgba(11, 17, 23, 0.72) !important;
}
.nodedc-external-content-shell { .nodedc-external-content-shell {
border: 0 !important; border: 0 !important;
outline: none !important; outline: none !important;