any
This commit is contained in:
parent
47d379e77f
commit
5b2a2fc104
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue