diff --git a/plane-src/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/work-item-header.tsx b/plane-src/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/work-item-header.tsx index 8e06dd8..6463c52 100644 --- a/plane-src/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/work-item-header.tsx +++ b/plane-src/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/work-item-header.tsx @@ -13,6 +13,7 @@ import { WorkItemsIcon } from "@plane/propel/icons"; import { Breadcrumbs, Header } from "@plane/ui"; // components import { BreadcrumbLink } from "@/components/common/breadcrumb-link"; +import { HeaderFilters } from "@/components/issues/filters"; import { IssueDetailQuickActions } from "@/components/issues/issue-detail/issue-detail-quick-actions"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; @@ -62,6 +63,14 @@ export const WorkItemDetailsHeader = observer(function WorkItemDetailsHeader() { +
+ +
{projectId && issueId && (
-
- handleLayoutChange(layout)} - selectedLayout={activeLayout} - /> -
-
- handleLayoutChange(layout)} - activeLayout={activeLayout} - /> -
+ handleLayoutChange(layout)} + selectedLayout={activeLayout} + />
-
diff --git a/plane-src/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/issues/(list)/mobile-header.tsx b/plane-src/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/issues/(list)/mobile-header.tsx index dfe400d..e43b38e 100644 --- a/plane-src/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/issues/(list)/mobile-header.tsx +++ b/plane-src/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/issues/(list)/mobile-header.tsx @@ -18,7 +18,7 @@ import { WorkItemsModal } from "@/components/analytics/work-items/modal"; import { DisplayFiltersSelection, FiltersDropdown, - MobileLayoutSelection, + LayoutSelection, } from "@/components/issues/issue-layouts/filters"; // hooks import { useIssues } from "@/hooks/store/use-issues"; @@ -69,9 +69,16 @@ export const ProjectIssuesMobileHeader = observer(function ProjectIssuesMobileHe projectDetails={currentProjectDetails ?? undefined} />
-
-
- handleLayoutChange(layout)} - selectedLayout={activeLayout} - /> -
-
- handleLayoutChange(layout)} - activeLayout={activeLayout} - /> -
+ handleLayoutChange(layout)} + selectedLayout={activeLayout} + /> {moduleId && }
-
diff --git a/plane-src/apps/web/core/components/issues/filters.tsx b/plane-src/apps/web/core/components/issues/filters.tsx index 6d23855..804204a 100644 --- a/plane-src/apps/web/core/components/issues/filters.tsx +++ b/plane-src/apps/web/core/components/issues/filters.tsx @@ -24,7 +24,6 @@ import { DisplayFiltersSelection, FiltersDropdown, LayoutSelection, - MobileLayoutSelection, } from "./issue-layouts/filters"; type Props = { @@ -104,15 +103,10 @@ export const HeaderFilters = observer(function HeaderFilters(props: Props) { [workspaceSlug, projectId, updateFilters] ); - const layoutSelection = ( - <> -
- handleLayoutChange(layout)} selectedLayout={activeLayout} /> -
-
- handleLayoutChange(layout)} activeLayout={activeLayout} /> -
- + const dockLayoutSelection = ( +
+ handleLayoutChange(layout)} selectedLayout={activeLayout} /> +
); const headerTools = ( @@ -143,7 +137,7 @@ export const HeaderFilters = observer(function HeaderFilters(props: Props) { !isCompactToolbar && expandedToolbarTarget ? createPortal(
- {layoutSelection} + {dockLayoutSelection} {headerTools}
, expandedToolbarTarget @@ -155,28 +149,28 @@ export const HeaderFilters = observer(function HeaderFilters(props: Props) { {expandedToolbarControls} {!isCompactToolbar && expandedToolbarTarget ? null : ( <> -
- {layoutSelection} -
-
- - } - title={t("common.display")} - placement="bottom-end" - > - - -
+
+ {dockLayoutSelection} +
+
+ + } + title={t("common.display")} + placement="bottom-end" + > + + +
)} diff --git a/plane-src/apps/web/core/components/issues/issue-layouts/filters/header/helpers/dropdown.tsx b/plane-src/apps/web/core/components/issues/issue-layouts/filters/header/helpers/dropdown.tsx index b1d611c..5f3cf4e 100644 --- a/plane-src/apps/web/core/components/issues/issue-layouts/filters/header/helpers/dropdown.tsx +++ b/plane-src/apps/web/core/components/issues/issue-layouts/filters/header/helpers/dropdown.tsx @@ -122,6 +122,8 @@ export function FiltersDropdown(props: Props) { ref={setReferenceElement} className={menuButtonWrapperClassName} disabled={disabled} + data-active={isOpen} + aria-pressed={isOpen} tabIndex={tabIndex} onClick={toggleDropdown} > @@ -162,6 +164,7 @@ export function FiltersDropdown(props: Props) { variant="secondary" tabIndex={-1} className="nodedc-toolbar-pill nodedc-toolbar-pill-wide" + data-active={isOpen} size="lg" > {miniIcon || title} diff --git a/plane-src/apps/web/core/components/navigation/top-nav-power-k.tsx b/plane-src/apps/web/core/components/navigation/top-nav-power-k.tsx index 1d443aa..cffa355 100644 --- a/plane-src/apps/web/core/components/navigation/top-nav-power-k.tsx +++ b/plane-src/apps/web/core/components/navigation/top-nav-power-k.tsx @@ -46,6 +46,7 @@ export const TopNavPowerK = observer((props: TTopNavPowerKProps) => { left: number; top: number; width: number; + listMaxHeight: number; } | null>(null); const sidebarSearchPortalRef = useRef(null); @@ -133,13 +134,21 @@ export const TopNavPowerK = observer((props: TTopNavPowerKProps) => { const rect = sidebarSearchButtonRef.current.getBoundingClientRect(); const width = 320; const viewportPadding = 16; - const left = Math.min(rect.left, window.innerWidth - width - viewportPadding); - const top = rect.bottom + 10; + const topSafetyOffset = 88; + const inputHeight = 32; + const inputToListGap = 12; + const dockGap = 18; + const availableAboveDock = Math.max(260, rect.top - topSafetyOffset - inputHeight - inputToListGap - dockGap); + const listMaxHeight = Math.min(window.innerHeight * 0.7, availableAboveDock); + const panelHeight = inputHeight + inputToListGap + listMaxHeight; + const left = Math.max(viewportPadding, Math.min(rect.left, window.innerWidth - width - viewportPadding)); + const top = Math.max(topSafetyOffset, rect.top - panelHeight - dockGap); setSidebarSearchPosition({ left, top, width, + listMaxHeight, }); }, [variant]); @@ -292,37 +301,6 @@ export const TopNavPowerK = observer((props: TTopNavPowerKProps) => { {isWideSearch ? ( isExpandedToolbar ? (
-
{ - openPanel(); - requestAnimationFrame(() => inputRef.current?.focus()); - }} - role="button" - > -
- { - setSearchTerm(e.target.value); - if (!isOpen) openPanel(); - }} - onMouseDown={handleMouseDown} - onFocus={handleFocus} - onKeyDown={handleKeyDown} - placeholder="" - tabIndex={isOpen ? 0 : -1} - className="nodedc-expanded-search-input placeholder-text-placeholder min-w-0 flex-1 bg-transparent outline-none" - /> - {searchTerm && ( - - )} -
-
+ )} +
+ {searchCommandContent} + + )}
)} {isWideSearch && !isExpandedToolbar && ( @@ -469,7 +474,10 @@ export const TopNavPowerK = observer((props: TTopNavPowerKProps) => { )}
-
+
{t("power_k.search_menu.quick_access_title")} diff --git a/plane-src/apps/web/core/components/rich-filters/filters-toggle.tsx b/plane-src/apps/web/core/components/rich-filters/filters-toggle.tsx index 0178b46..843e892 100644 --- a/plane-src/apps/web/core/components/rich-filters/filters-toggle.tsx +++ b/plane-src/apps/web/core/components/rich-filters/filters-toggle.tsx @@ -72,7 +72,7 @@ export const FiltersToggle = observer(function FiltersToggle

); diff --git a/plane-src/apps/web/styles/globals.css b/plane-src/apps/web/styles/globals.css index 636fc52..776d6e7 100644 --- a/plane-src/apps/web/styles/globals.css +++ b/plane-src/apps/web/styles/globals.css @@ -1682,6 +1682,11 @@ bottom: calc(100% + 0.85rem); } + .nodedc-expanded-search-floating-input { + background: rgba(255, 255, 255, 0.055); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.045); + } + .nodedc-expanded-notification-button { height: 2.78rem; width: 2.78rem; @@ -2324,6 +2329,42 @@ color: rgb(var(--nodedc-accent-rgb)) !important; } + .nodedc-bottom-dock .nodedc-project-layout-controls .nodedc-toolbar-group { + min-height: 2.5rem; + } + + .nodedc-bottom-dock .nodedc-toolbar-icon-button, + .nodedc-bottom-dock .nodedc-toolbar-filter-toggle { + background: rgba(255, 255, 255, 0.04) !important; + color: rgba(255, 255, 255, 0.72) !important; + } + + .nodedc-bottom-dock .nodedc-toolbar-icon-button:hover, + .nodedc-bottom-dock .nodedc-toolbar-icon-button:focus-visible, + .nodedc-bottom-dock .nodedc-toolbar-filter-toggle:hover, + .nodedc-bottom-dock .nodedc-toolbar-filter-toggle:focus-visible { + background: rgba(255, 255, 255, 0.08) !important; + color: rgba(255, 255, 255, 0.94) !important; + } + + .nodedc-bottom-dock .nodedc-toolbar-icon-button[data-active="true"], + .nodedc-bottom-dock .nodedc-toolbar-filter-toggle[data-active="true"], + .nodedc-bottom-dock .nodedc-toolbar-pill[data-active="true"] { + background: rgba(255, 255, 255, 0.94) !important; + color: rgba(8, 8, 10, 0.94) !important; + } + + .nodedc-bottom-dock .nodedc-toolbar-icon-button[data-active="true"] .nodedc-toolbar-icon-active-dot { + background: transparent !important; + color: rgba(8, 8, 10, 0.94) !important; + } + + .nodedc-bottom-dock .nodedc-toolbar-icon-button[data-active="true"] svg, + .nodedc-bottom-dock .nodedc-toolbar-filter-toggle[data-active="true"] svg, + .nodedc-bottom-dock .nodedc-toolbar-pill[data-active="true"] svg { + color: rgba(8, 8, 10, 0.94) !important; + } + .nodedc-filter-row-shell { background: linear-gradient(180deg, rgba(255, 255, 255, 0.03) 0%, rgba(255, 255, 255, 0.01) 100%), rgba(8, 8, 11, 0.84);