diff --git a/web/navigation-panels/chat-thread-ancestors.css b/web/navigation-panels/chat-thread-ancestors.css
--- a/web/navigation-panels/chat-thread-ancestors.css
+++ b/web/navigation-panels/chat-thread-ancestors.css
@@ -1,51 +1,39 @@
-div.ancestorThreadsContainer {
+.container {
font-size: var(--xs-font-12);
display: flex;
align-items: center;
- column-gap: 5px;
+ column-gap: 12px;
}
-div.ancestorName {
- display: flex;
- align-items: center;
- padding: 2px 6px;
- border-radius: 2px;
- box-sizing: border-box;
- line-height: 1.5;
-}
-
-button.seeFullStructure {
- background-color: transparent;
- border: none;
- cursor: pointer;
+.communityName {
+ color: var(--thread-ancestor-color);
+ font-size: var(--l-font-18);
+ font-weight: var(--semi-bold);
+ white-space: nowrap;
}
-div.ancestorKeyserver {
+.ancestorThreadsContainer {
+ border: 1px solid var(--topbar-lines);
+ border-radius: 8px;
display: flex;
- align-items: center;
+ padding: 7px 12px;
+ margin-right: 16px;
}
-div.ancestorKeyserverName {
- border-radius: 0 2px 2px 0;
+.ancestorName {
+ color: var(--thread-ancestor-color);
+ font-size: var(--xs-font-12);
+ font-weight: var(--semi-bold);
+ line-height: 1.5;
+ white-space: nowrap;
}
-svg.ancestorSeparator {
+svg.chevronRight {
color: var(--thread-ancestor-separator-color);
+ flex-shrink: 0;
}
-div.ancestorKeyserverOperator {
- display: flex;
- column-gap: 5px;
- padding: 0 5px;
- align-items: center;
- border: 1px solid var(--thread-ancestor-keyserver-border);
- border-radius: 2px 0 0 2px;
- height: 22px;
- box-sizing: border-box;
-}
-
-button.seeFullAncestor {
- font-size: var(--xs-font-12);
- font-weight: var(--semi-bold);
- cursor: pointer;
+svg.ancestorSeparator {
+ align-self: center;
+ padding: 0 8px;
}
diff --git a/web/navigation-panels/chat-thread-ancestors.react.js b/web/navigation-panels/chat-thread-ancestors.react.js
--- a/web/navigation-panels/chat-thread-ancestors.react.js
+++ b/web/navigation-panels/chat-thread-ancestors.react.js
@@ -1,126 +1,70 @@
// @flow
-import classNames from 'classnames';
+import classnames from 'classnames';
import * as React from 'react';
+import { ChevronRight } from 'react-feather';
-import SWMansionIcon from 'lib/components/SWMansionIcon.react.js';
import { useAncestorThreads } from 'lib/shared/ancestor-threads.js';
-import { colorIsDark } from 'lib/shared/thread-utils.js';
-import { useKeyserverAdmin } from 'lib/shared/user-utils.js';
import type { ThreadInfo } from 'lib/types/thread-types.js';
import { useResolvedThreadInfo } from 'lib/utils/entity-helpers.js';
import css from './chat-thread-ancestors.css';
-import CommIcon from '../CommIcon.react.js';
-
-const SHOW_SEE_FULL_STRUCTURE = false;
type ThreadAncestorsProps = {
+threadInfo: ThreadInfo,
};
function ThreadAncestors(props: ThreadAncestorsProps): React.Node {
const { threadInfo } = props;
- const { color: threadColor } = threadInfo;
- const darkColor = colorIsDark(threadColor);
- const threadColorStyle = React.useMemo(
- () => ({
- backgroundColor: `#${threadColor}`,
- color: darkColor
- ? 'var(--thread-ancestor-color-light)'
- : 'var(--thread-ancestor-color-dark)',
- }),
- [darkColor, threadColor],
- );
- const fullStructureButtonColorStyle = React.useMemo(
- () => ({ color: `#${threadColor}` }),
- [threadColor],
- );
- const ancestorThreads = useAncestorThreads(threadInfo);
-
- const community = ancestorThreads[0] ?? threadInfo;
- const keyserverAdmin = useKeyserverAdmin(community);
- const keyserverOwnerUsername = keyserverAdmin?.username;
+ const ancestorThreadsWithCommunity = useAncestorThreads(threadInfo);
+ const community = ancestorThreadsWithCommunity[0] ?? threadInfo;
const resolvedCommunity = useResolvedThreadInfo(community);
- const keyserverInfo = React.useMemo(
- () => (
-
-
-
- {keyserverOwnerUsername}
-
-
- {resolvedCommunity.uiName}
-
-
- ),
- [resolvedCommunity.uiName, keyserverOwnerUsername, threadColorStyle],
- );
+ const threadHasNoAncestors = community === threadInfo;
+
+ const ancestorThreads = ancestorThreadsWithCommunity.slice(1);
- const middlePath = React.useMemo(() => {
- if (ancestorThreads.length < 2) {
+ const chevronRight = React.useMemo(() => {
+ if (threadHasNoAncestors) {
return null;
}
- return (
- <>
-
-
- …
-
- >
- );
- }, [ancestorThreads.length, threadColorStyle]);
-
- const threadHasNoAncestors = community === threadInfo;
+ return ;
+ }, [threadHasNoAncestors]);
const { uiName } = useResolvedThreadInfo(threadInfo);
- const currentThread = React.useMemo(() => {
+
+ const path = React.useMemo(() => {
if (threadHasNoAncestors) {
return null;
}
+ const ancestors = ancestorThreads.map(ancestor => (
+
+ ));
return (
- <>
-
-
- {uiName}
-
- >
+
+ {ancestors}
+
{uiName}
+
);
- }, [threadHasNoAncestors, threadColorStyle, uiName]);
+ }, [ancestorThreads, threadHasNoAncestors, uiName]);
- let seeFullStructure = null;
- if (SHOW_SEE_FULL_STRUCTURE) {
- seeFullStructure = (
-
- );
- }
+ return (
+
+
{resolvedCommunity.uiName}
+ {chevronRight}
+ {path}
+
+ );
+}
+function ThreadAncestor(props: ThreadAncestorsProps): React.Node {
+ const { uiName } = useResolvedThreadInfo(props.threadInfo);
+ const chevronClasses = classnames(css.ancestorSeparator, css.chevronRight);
return (
<>
-
- {keyserverInfo}
- {middlePath}
- {currentThread}
-
- {seeFullStructure}
+ {uiName}
+
>
);
}
diff --git a/web/navigation-panels/nav-state-info-bar.css b/web/navigation-panels/nav-state-info-bar.css
--- a/web/navigation-panels/nav-state-info-bar.css
+++ b/web/navigation-panels/nav-state-info-bar.css
@@ -3,27 +3,27 @@
background-color: var(--bg);
align-items: center;
justify-content: space-between;
- padding: 0 16px;
color: var(--thread-top-bar-color);
height: 56px;
}
div.topBarThreadInfo {
- height: 24px;
display: flex;
align-items: center;
- column-gap: 8px;
+ overflow: scroll;
+ scrollbar-width: none;
+}
+
+.topBarThreadInfo::-webkit-scrollbar {
+ display: none;
}
div.threadColorSquare {
width: 24px;
height: 24px;
border-radius: 4px;
-}
-
-p.threadTitle {
- font-size: var(--m-font-16);
- font-weight: var(--bold);
+ flex: 0 0 auto;
+ margin: 0 12px 0 16px;
}
div.hide {
diff --git a/web/navigation-panels/nav-state-info-bar.react.js b/web/navigation-panels/nav-state-info-bar.react.js
--- a/web/navigation-panels/nav-state-info-bar.react.js
+++ b/web/navigation-panels/nav-state-info-bar.react.js
@@ -4,7 +4,6 @@
import * as React from 'react';
import type { ThreadInfo } from 'lib/types/thread-types.js';
-import { useResolvedThreadInfo } from 'lib/utils/entity-helpers.js';
import ThreadAncestors from './chat-thread-ancestors.react.js';
import css from './nav-state-info-bar.css';
@@ -22,7 +21,6 @@
[threadInfo.color],
);
- const { uiName } = useResolvedThreadInfo(threadInfo);
return (
<>
@@ -30,7 +28,6 @@
className={css.threadColorSquare}
style={threadBackgroundColorStyle}
/>
-
{uiName}
>
diff --git a/web/theme.css b/web/theme.css
--- a/web/theme.css
+++ b/web/theme.css
@@ -108,8 +108,7 @@
--thread-top-bar-color: var(--shades-white-100);
--thread-top-bar-menu-color: var(--shades-white-70);
--thread-ancestor-keyserver-border: var(--shades-black-70);
- --thread-ancestor-color-light: var(--shades-white-70);
- --thread-ancestor-color-dark: var(--shades-black-100);
+ --thread-ancestor-color: var(--shades-white-100);
--thread-ancestor-separator-color: var(--shades-white-60);
--text-message-default-background: var(--shades-black-80);
--message-action-tooltip-bg: var(--shades-black-90);
@@ -209,4 +208,5 @@
--filter-panel-fg: var(--shades-black-60);
--topbar-button-bg-hover: var(--shades-black-80);
--topbar-button-fg: var(--shades-white-60);
+ --topbar-lines: rgba(255, 255, 255, 0.08);
}