diff --git a/HDESIGN-CODE.md b/HDESIGN-CODE.md index 4db421a..5c28640 100644 --- a/HDESIGN-CODE.md +++ b/HDESIGN-CODE.md @@ -240,6 +240,9 @@ - empty-state не должен использовать декоративную серую подложку под SVG; media-box прозрачный, SVG выравнивается через `display:flex` и центрирование - detail-toolbar в карточке запроса использует общий glass-cluster для листания `prev/next`, а сами кнопки внутри кластера — круглые, без квадратной подложки - `Добавить запрос` в 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` - секции с dropdown-trigger внутри blur/glass shell обязаны иметь `overflow: visible` и `isolation: isolate`, иначе popup визуально “тонет” внутри блока - при переключении `Открытые / Закрытые` store обязан очистить stale request list до нового fetch, чтобы пользователь не видел flash старой верстки @@ -254,6 +257,12 @@ ``` +- Route-aware quick action hide: +```tsx +const pathname = usePathname(); +if (pathname?.includes("/external-contours")) return null; +``` + - List spacing: ```tsx
@@ -271,6 +280,18 @@ const resolvedTab = pendingTab ?? routeTab; 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: ```tsx
)} -
+
diff --git a/plane-src/apps/web/core/components/workspace/sidebar/quick-actions.tsx b/plane-src/apps/web/core/components/workspace/sidebar/quick-actions.tsx index 9f5c654..93d39ce 100644 --- a/plane-src/apps/web/core/components/workspace/sidebar/quick-actions.tsx +++ b/plane-src/apps/web/core/components/workspace/sidebar/quick-actions.tsx @@ -6,7 +6,7 @@ import { useRef, useState } from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; +import { useParams, usePathname } from "next/navigation"; // plane imports import { EUserPermissions, EUserPermissionsLevel, SIDEBAR_TRACKER_ELEMENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; @@ -31,6 +31,7 @@ export const SidebarQuickActions = observer(function SidebarQuickActions() { const timeoutRef = useRef(); // router const { workspaceSlug: routerWorkspaceSlug } = useParams(); + const pathname = usePathname(); const workspaceSlug = routerWorkspaceSlug?.toString(); // store hooks const { toggleCreateIssueModal } = useCommandPalette(); @@ -45,6 +46,9 @@ export const SidebarQuickActions = observer(function SidebarQuickActions() { ); const disabled = joinedProjectIds.length === 0 || !canCreateIssue; 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 = () => { // if enter before time out clear the timeout @@ -67,6 +71,8 @@ export const SidebarQuickActions = observer(function SidebarQuickActions() { return Promise.resolve(); }; + if (isExternalContoursRoute) return null; + return ( <>