Files
zulip/web/styles/inbox.css
Aman Agrawal f2a11c5858 inbox: Avoid extra margin from folders hidden by filters.
If all channels in a folder are muted, then this margin is present
in "Standard view", without there being any folder present.

Fixed by only applying margin if the folder has any header or rows
that are not hidden by filters.

This is an alternative fix to #35962 which was reverted in #36123.
2025-09-26 09:16:26 -07:00

770 lines
20 KiB
CSS

.inbox-container {
display: flex;
flex-direction: column;
background: var(--color-background-inbox);
padding: 0;
min-height: 100vh;
#inbox-pane {
max-width: 100%;
display: flex;
flex-direction: column;
margin: var(--navbar-fixed-height) 25px 0;
a {
color: var(--color-text-message-header);
text-decoration: none;
}
.unread_count {
opacity: 1;
outline: 0 solid var(--color-background-unread-counter);
transition: outline-width 0.1s ease;
&:hover {
outline-width: 1.5px;
}
}
.search_group {
position: sticky;
top: var(--navbar-fixed-height);
background: var(--color-background-inbox);
display: flex;
/* This padding-top value aligns the inbox filters
with the filters in the left and right sidebars. */
padding: 10px 0;
z-index: 1;
}
.button-inbox-selected {
background-color: var(--color-background-button-inbox-selected);
}
#inbox-filters {
.inbox-search-wrapper {
flex-grow: 1;
max-width: var(--width-inbox-search);
}
}
.inbox-empty-text {
display: none;
}
#inbox-loading-indicator {
margin-top: 20px;
margin-bottom: var(--max-unmaximized-compose-height);
.searching-for-more-topics {
margin-left: 0;
}
}
#inbox-list {
overflow: hidden;
/* search box left border (1px) + search box right border (1px)
+ dropdown left border (1px) + dropdown right border (1px) = 4px at 16px em */
max-width: calc(
var(--width-inbox-search) +
var(--width-inbox-filters-dropdown) + 0.25em
);
.inbox-channel-topic-list {
margin: 0;
}
.inbox-focus-border {
display: flex;
min-height: 1.875em; /* 30px at 16px em */
border: 2px solid transparent;
border-radius: 3px;
box-sizing: border-box;
justify-content: space-between;
}
.inbox-header {
user-select: none;
display: block;
height: 1.875em; /* 30px at 16px em */
.inbox-focus-border {
height: 1.875em; /* 30px at 16px em */
}
.inbox-left-part {
grid-template:
auto / minmax(auto, min-content)
auto min-content min-content;
grid-template-areas: "header_name collapse_button unread_mention_info unread_count";
}
.inbox-header-name {
grid-area: header_name;
display: flex;
align-items: center;
overflow: hidden;
outline: 0;
cursor: pointer;
.inbox-header-name-text {
margin: 0;
padding: 1px 0;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
font-weight: 600;
}
}
&:focus {
outline: 0;
}
&:hover {
.collapsible-button {
visibility: visible;
}
}
}
.fa-lock {
margin-right: 3px;
}
.stream-privacy.filter-icon {
/* 0 5px at 16px/1em */
padding: 0 0.3125em;
margin: 0;
}
.zulip-icon-user {
position: relative;
top: -1px;
margin-right: 4px;
}
.collapsible-button {
grid-area: collapse_button;
&:hover {
cursor: pointer;
}
.zulip-icon-chevron-down {
padding: 0.3125em 0.25em; /* 5px 4px at 16px em */
transform: rotate(180deg);
}
}
.user-circle {
/* 8.5328px at 16px/1em */
font-size: 0.5333em;
/* TODO: Refactor inbox rows to use grid, to avoid the
min-width here that holds the other rows to similar
columns. */
/* 16px at 8.5328px/1em */
min-width: 1.8751em;
top: 0;
text-align: center;
}
.zulip-icon-bot,
.conversation-partners-icon {
opacity: 0.7;
/* Required to align DM fullnames in user circle icon */
/* 2px at 16px / 1em */
margin-left: 0.125em;
}
.user_block .zulip-icon {
/* 0 5px at 16px/1em */
padding: 0 0.3125em;
&.user-circle {
/* 5px at 16px / ~ 0.5em */
padding: 0 0.586em;
}
}
.inbox-row {
user-select: none;
display: block;
background-color: var(--color-background-inbox-row);
&:hover {
background: var(--color-background-inbox-row-hover);
}
.inbox-left-part {
grid-template:
auto / min-content minmax(0, 1fr)
min-content min-content;
grid-template-areas: "match_topic_and_dm_start recipient_info unread_mention_info unread_count";
}
.inbox-topic-container .user-circle {
grid-area: match_topic_and_dm_start;
}
.recipients_info,
.inbox-topic-name {
grid-area: recipient_info;
}
}
.channel-visibility-policy-indicator,
.visibility-policy-indicator {
display: flex;
align-items: center;
border-radius: 3px;
margin-left: 3px;
}
.unread-count-focus-outline {
/* Because the inbox view font-size will
never be smaller than the em-equivalent
of 15px, we restate the base font-size
here so that unreads match others in
the UI at legacy size (14px). */
font-size: var(--base-font-size-px);
grid-area: unread_count;
display: flex;
align-items: center;
justify-content: center;
border-radius: 3px;
padding: 0 5px;
/* Stretch to the row to keep unread
count from affecting overall row
size as test scales up. */
align-self: stretch;
}
.unread_mention_info {
grid-area: unread_mention_info;
margin-right: 0;
}
.stream-privacy {
display: flex;
align-items: center;
margin-right: 4px;
margin-left: 17px;
.zulip-icon {
line-height: 0.875em; /* 14px at 16px em */
height: 1em;
width: 1em;
}
}
.inbox-topic-name {
/* 16px channel icon width + 10px padding */
padding-left: 1.625em; /* 26x at 16px em */
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
& a {
padding: 1px 0;
white-space: pre;
}
}
.inbox-left-part-wrapper {
display: flex;
width: 80%;
}
#inbox-direct-messages-container {
/* Since a direct message row can have span to multiple lines,
having an underline focus will not work very well.
*/
.inbox-row:focus-visible {
box-shadow: inset 0 0 0 2px var(--color-outline-focus);
}
}
.inbox-left-part {
width: 100%;
display: grid;
align-items: center;
&:hover {
cursor: pointer;
}
.inbox-group-or-bot-dm {
position: relative;
left: -3px;
/* We don't display status emoji in group DMs,
so prepare an ordinary inline layout... */
.user-status-microlayout {
display: inline;
white-space: collapse;
}
/* ...and hide the status emoji. */
.status-emoji {
display: none;
}
}
.recipients_info {
display: flex;
flex-wrap: wrap;
column-gap: 10px;
grid-area: recipient_info;
.user_block {
display: flex;
align-items: center;
}
}
}
}
#inbox-collapsed-note {
display: none;
overflow: hidden;
max-width: calc(
var(--width-inbox-search) +
var(--width-inbox-filters-dropdown) + 0.25em
);
.inbox-collapsed-note-and-button-wrapper {
margin-top: 3px;
padding-left: 8px;
.inbox-collpased-note-span {
font-size: 1em;
}
#inbox-expand-all-button {
display: block;
margin-top: 5px;
}
}
}
.inbox-right-part-wrapper {
flex-grow: 1;
.inbox-right-part {
display: flex;
justify-content: space-between;
flex-grow: 1;
> .inbox-action-button:first-child {
margin-left: auto;
}
}
}
.inbox-row,
.inbox-header {
&:hover {
.inbox-row-visibility-policy-inherit,
.inbox-action-button {
opacity: 1;
}
}
}
.inbox-row-visibility-policy-inherit {
opacity: 0;
&.visibility-policy-popover-visible {
opacity: 1;
}
}
.inbox-action-button {
display: flex;
border-radius: 3px;
outline: none;
opacity: 0;
&.hide {
display: none;
}
& i {
padding: 0.3125em; /* 5px at 16px em */
opacity: 0.3;
color: var(--color-vdots-hover);
&:hover {
opacity: 1;
cursor: pointer;
}
}
}
}
.inbox-header-stream-archived {
color: var(--color-text-message-header-archived);
}
}
#inbox-view {
display: none;
position: relative;
.inbox-folder {
margin-bottom: 1px;
background-color: transparent;
.inbox-header-name-text,
.unread_mention_info {
color: var(--color-folder-header);
opacity: 0.5;
}
.inbox-header-name-text {
font-style: normal;
font-weight: var(--font-weight-sidebar-heading);
line-height: 112.5%;
letter-spacing: var(--letter-spacing-sidebar-heading);
text-transform: uppercase;
outline: none;
/* 16px at 16px / 1em */
font-size: 1em;
/* Align the folder title with the channel privacy icons; 5px at 16px/1em.
TODO: Reduce the depth of selectors in this file,
so that the use of !important becomes unnecessary
here. */
padding-left: 0.3125em !important;
}
&:hover {
.inbox-header-name-text,
.collapsible-button .zulip-icon,
.unread_mention_info,
.unread_count {
opacity: 1;
}
}
}
.hidden_by_filters {
display: none !important;
}
}
.inbox-container #inbox-pane #inbox-empty-without-search {
margin-top: 70px;
display: flex;
flex-direction: column;
align-items: center;
}
.inbox-empty-illustration {
width: 54px;
height: 54px;
margin-bottom: 16px;
background-color: var(--color-background-inbox-no-unreads-illustration);
mask: url("../images/empty-view-illustrations/inbox-done.svg") no-repeat
center;
}
.inbox-empty-title {
/* Matches the font-size used for .empty-list-message */
font-size: 1.5em;
color: var(--color-background-inbox-no-unreads-illustration);
}
.inbox-empty-action {
font-size: 1.3em;
padding-top: 0.5em;
}
.inbox-container #inbox-pane .inbox-empty-action-link {
color: var(--color-text-url);
&:hover {
color: var(--color-text-url-hover);
}
}
#inbox-filter_widget {
margin-right: 0.3571em; /* 5px / 14px em */
max-width: var(--width-inbox-filters-dropdown);
border: 1px solid var(--color-border-inbox-search);
background-color: var(--color-background-inbox-search);
gap: 0.3571em; /* 5px / 14px em */
/* 1.5px at 16px/1em and legacy 6px at 14px/1em. */
padding: 0.0937em 0.4285em;
&:hover {
background-color: var(--color-background-inbox-search-hover);
border: 1px solid var(--color-border-inbox-search-hover);
}
&:focus {
outline: none;
}
}
#recent-view-filter_widget .dropdown_widget_value,
#inbox-filter_widget .dropdown_widget_value {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
width: 100%;
text-align: left;
}
#recent-view-filter_widget .zulip-icon-chevron-down,
#inbox-filter_widget .zulip-icon-chevron-down {
color: var(--color-icons-inbox);
opacity: 0.4;
}
.dropdown-list-item-common-styles .dropdown-list-text-selected {
font-weight: 700;
}
.recent-view-filter-dropdown-list-container .dropdown-list-wrapper,
.inbox-filter-dropdown-list-container .dropdown-list-wrapper {
/* We want these dropdowns to open to fit their
contents, which differ based on the language
in use. */
width: 100%;
/* We also don't want to set a min-width, again
so that the content is in charge. This pushes
back against more generic styles. */
min-width: unset;
}
.recent-view-filter-dropdown-list-container
.dropdown-list
.dropdown-list-item-common-styles,
.inbox-filter-dropdown-list-container
.dropdown-list
.dropdown-list-item-common-styles {
/* Parallel to the `width: 100%` set on
.dropdown-list-wrapper above, we set
min-width here to max-content so that
the box opens to accommodate different
lengths of text--and to ensure that
hovered/selectable areas look correct. */
min-width: max-content;
padding: 5px 10px;
display: flex;
flex-direction: column;
/* For columnar flex items, we need
to make set alignment to the start
of the flex container. This pushes
back against non-columnar flexboxes
that require centered alignment. */
align-items: flex-start;
}
.recent-view-filter-dropdown-list-container .dropdown-list-item-name,
.inbox-filter-dropdown-list-container .dropdown-list-item-name {
white-space: nowrap;
font-weight: 500;
padding: 0;
margin: 0;
text-overflow: ellipsis;
overflow: hidden;
}
.recent-view-filter-dropdown-list-container .dropdown-list-item-description,
.inbox-filter-dropdown-list-container .dropdown-list-item-description {
white-space: nowrap;
font-weight: 400;
font-size: 0.9285em; /* 13px at 14px em */
opacity: 0.8;
padding: 0;
text-overflow: ellipsis;
overflow: hidden;
}
.inbox-container #inbox-pane .inbox-folder .unread_count {
transition: none;
cursor: default;
&:hover {
outline: 0;
}
}
.inbox-container #inbox-pane .inbox-folder:not(#inbox-dm-header) .unread_count {
display: none;
}
#inbox-pane #inbox-list .collapsible-button {
visibility: hidden;
}
#inbox-pane #inbox-list .inbox-collapsed-state .collapsible-button {
visibility: visible;
.zulip-icon-chevron-down {
transform: rotate(0deg);
}
}
.folder-row-chevron {
color: var(--color-folder-header);
}
.channel-row-chevron {
color: var(--color-inbox-row-chevron);
}
.inbox-collapsed-state {
.folder-row-chevron,
.channel-row-chevron {
opacity: 0.5;
}
}
.inbox-container #inbox-pane .inbox-folder .unread_mention_info {
display: none;
}
.inbox-container
#inbox-pane
.inbox-folder.inbox-collapsed-state
.unread_mention_info,
.inbox-container
#inbox-pane
.inbox-folder.inbox-collapsed-state:not(#inbox-dm-header)
.unread_count {
display: inline;
}
.inbox-folder-components {
border-radius: 5px;
border: 0.5px solid hsl(0deg 0% 0% / 13%);
overflow: hidden;
&:has(.inbox-row:not(.hidden_by_filters)),
&:has(.inbox-header:not(.hidden_by_filters)) {
margin-bottom: 0.5em;
}
}
.inbox-folder.inbox-collapsed-state,
.inbox-folder.hidden_by_filters {
+ .inbox-folder-components {
border: 0;
}
}
#inbox-pane #inbox-list .inbox-collapsed-state {
+ .inbox-folder-components,
+ .inbox-topic-container {
display: none;
}
}
#inbox-pane
#inbox-list
.inbox-streams-container
.inbox-header
.inbox-header-name {
/* 5px at 16px / 1em */
padding: 1px 0.3125em 1px 0;
}
#inbox-view.no-visible-focus-outlines
.inbox-container
#inbox-pane
[tabindex="0"] {
/* Remove default focus outline from elements. */
&:focus-visible {
outline: 0;
}
}
#inbox-view:not(.no-visible-focus-outlines) .inbox-container #inbox-pane {
/* Only show focus outlines when user uses keyboard. */
#inbox-filter_widget {
&:focus-visible {
outline: 2px solid var(--color-outline-focus);
}
}
.inbox-header {
&:focus-visible {
.inbox-focus-border {
border-color: var(--color-outline-focus);
}
.collapsible-button > .zulip-icon {
opacity: 1;
}
.collapsible-button {
visibility: visible;
}
}
}
.inbox-row {
&:focus-visible {
.inbox-focus-border {
border: 2px solid var(--color-outline-focus);
border-radius: 3px;
}
outline: 0;
padding: 0;
}
}
.channel-visibility-policy-indicator,
.visibility-policy-indicator {
&:focus-visible {
outline: 2px solid var(--color-outline-focus);
}
}
.inbox-action-button {
&:focus-visible {
box-shadow: 0 0 0 2px var(--color-outline-focus);
}
}
.unread-count-focus-outline {
&:focus-visible {
outline: 2px solid var(--color-outline-focus);
}
}
.inbox-row,
.inbox-header {
/* Don't show the icons unless user is visibly focused
on the element or one of the elements within it. */
&:focus-within:not(:focus),
&:focus-visible {
.channel-visibility-policy-indicator,
.inbox-row-visibility-policy-inherit,
.inbox-action-button {
opacity: 1;
}
}
}
.inbox-folder {
&:focus-visible {
.inbox-header-name-text,
.collapsible-button .zulip-icon,
.unread_mention_info,
.unread_count {
opacity: 1;
}
background: light-dark(
transparent,
var(--color-background-hover-popover-menu)
);
}
}
}