zulip/web/styles/subscriptions.css
Shubham Padia 87b3642b62 stream_create: Soft remove users on clicking the remove button.
Fixes #29825.
Clicking on remove button will not delete the row anymore. We will
add a strikethrough to the user pill and email text. `Remove` button
will change to `Add` on click to undo this action.
Re-adding a user explicitly should will not undo the soft remove on
their row. e.g If `Iago` was added as part of a group and crossed out.
Now, adding another group with Iago as part of it should not undo the
soft remove.
We maintain a seperate set of soft removed users, but we will not
remove those users from the main user list on clicking `Remove`.
That list can only be modified by actions with the input pills.
We will subtract the soft removed user ids from main user id list
when sending the request to add subscribers to the new channel.
I've not added extra puppetteer tests, since adding users was
not part of the existing tests.
2024-06-28 15:35:56 -07:00

1258 lines
27 KiB
CSS

#subs_page_loading_indicator {
margin: 10px auto;
}
.member_list_loading_indicator,
.subscriber_list_loading_indicator {
margin: 10px auto;
}
.member_list_loading_indicator:empty,
.subscriber_list_loading_indicator:empty {
margin: 0;
}
.subscriptions div #response {
overflow-wrap: break-word;
}
.subscription_settings .btn {
border-radius: 2px;
}
.stream-email {
font-family: "Source Code Pro", monospace;
padding: 10px;
font-size: 0.85rem;
background-color: hsl(0deg 0% 98%);
border: 1px solid hsl(0deg 0% 87%);
border-radius: 4px;
}
.sp-preview {
width: 20px;
border: none;
box-shadow: 0 0 1px hsl(0deg 0% 0%);
}
.sp-replacer {
margin-right: 12px;
border: none;
box-shadow: 0 0 2px hsl(0deg 0% 0% / 80%);
}
.stream-email .email-address {
display: block;
margin: auto;
word-wrap: break-word;
word-break: break-all;
white-space: normal;
}
.sub_setting_checkbox {
display: flex;
& .control-label-disabled label.checkbox + label {
cursor: not-allowed;
}
}
.mute-note {
font-size: 90%;
opacity: 0.5;
}
.hide-mute-note {
display: none;
}
.sub_setting_control {
display: inline-block;
margin-right: 10px;
}
.create_user_group_plus_button,
.create_stream_plus_button {
font-size: 24px;
font-weight: 400;
position: relative;
top: 2px;
border: 1px solid hsl(0deg 0% 80%);
border-radius: 5px;
background-color: hsl(0deg 0% 100%);
color: hsl(0deg 0% 0%);
margin: 0 0 0 5px;
height: 27px;
&:hover {
border: 1px solid hsl(0deg 0% 47%);
}
& span {
position: relative;
top: -5px;
}
}
#create_user_group_description,
#create_stream_description {
width: calc(100% - 15px);
}
.user_group_creation_error,
.stream_creation_error {
display: none;
margin-left: 2px;
color: hsl(0deg 100% 50%);
}
/* TODO: Unify with settings.css definition */
h3.stream_setting_subsection_title,
h3.user_group_setting_subsection_title {
display: inline-block;
font-size: 1.5em;
font-weight: normal;
line-height: 1.5;
}
h4.stream_setting_subsection_title {
margin-bottom: 5px;
}
h4.stream_setting_subsection_title,
h4.user_group_setting_subsection_title {
display: inline-block;
font-size: 1.35em;
font-weight: normal;
line-height: 1.5;
}
.member-list-box,
.subscriber-list-box {
text-align: center;
border-left: 1px solid hsl(0deg 0% 87%);
border-right: 1px solid hsl(0deg 0% 87%);
border-radius: 4px;
.member_list_container,
.subscriber_list_container {
position: relative;
max-height: var(--stream-subscriber-list-max-height);
overflow: auto;
text-align: left;
-webkit-overflow-scrolling: touch;
.member-list,
.subscriber-list {
width: 100%;
margin: auto;
& tbody {
border-bottom: none;
}
& tr {
& td,
th {
padding: 4px 0 4px 5px;
vertical-align: middle;
&:first-of-type {
padding-left: 10px;
}
}
}
.subscriber_list_remove {
padding-right: 16px;
display: inline-block;
}
& thead th {
&:first-of-type {
border-top-left-radius: 4px;
}
&:last-of-type {
border-top-right-radius: 4px;
}
position: sticky;
top: 0;
z-index: 1;
}
& tbody tr:last-child td {
border-bottom: 1px solid hsl(0deg 0% 87%);
&:first-of-type {
border-bottom-left-radius: 4px;
}
&:last-of-type {
border-bottom-right-radius: 4px;
}
}
.hidden-subscriber-email {
font-style: italic;
}
th.user-remove-actions {
min-width: 80px;
}
.strikethrough {
text-decoration: line-through;
}
}
}
}
.subscriber-name,
.subscriber-email {
padding: 5px;
}
.subscriber-email {
margin-left: 20px;
padding-right: 8px;
}
.subscriber_list_add,
.member_list_add {
width: 100%;
margin: 0 0 10px;
.user_group_subscription_request_result,
.stream_subscription_request_result {
& a {
color: inherit;
}
}
}
.member-search,
.subscriber-search {
margin: 10px 0 0;
.search {
max-width: 160px;
}
@media (max-width: $ms_min) {
float: none;
display: flex;
justify-content: flex-start;
align-items: center;
margin: 0 0 5px;
}
}
.subscriber_list_add .form-inline,
.member_list_add .form-inline {
margin-bottom: 0;
}
.add_subscribers_container,
.add_members_container {
display: inline-flex;
width: 100%;
align-items: center;
}
.add_subscribers_container .add_subscriber_btn_wrapper,
.add_members_container .add_member_btn_wrapper {
padding-left: 5px;
}
.remove-subscriber-form {
margin: 0;
}
#subscriptions h1 {
font-size: 25px;
font-weight: 300;
padding-top: 40px;
}
.subscriptions-container .subscriptions-header .fa-chevron-left,
.user-groups-container .user-groups-header .fa-chevron-left,
#settings_overlay_container .settings-header.mobile .fa-chevron-left {
position: relative;
transform: translate(-50px, 0);
opacity: 0;
color: hsl(0deg 0% 67%);
float: left;
padding: 2px 10px;
cursor: pointer;
transition: all 0.3s ease;
}
.user-groups-container .user-groups-header.slide-left .fa-chevron-left,
.subscriptions-container .subscriptions-header.slide-left .fa-chevron-left,
#settings_overlay_container
.settings-header.mobile.slide-left
.fa-chevron-left {
transform: translate(0, 0);
opacity: 1;
}
.user-groups-container,
.subscriptions-container {
position: relative;
height: 95%;
border-radius: 4px;
padding: 0;
width: 97%;
overflow: hidden;
max-width: 1200px;
max-height: var(--overlay-container-max-height);
.list-toggler-container .tab-switcher .ind-tab {
width: auto;
}
.user-groups-header,
.subscriptions-header {
padding: 12px;
text-align: center;
text-transform: uppercase;
font-weight: 700;
border-bottom: 1px solid hsl(0deg 0% 87%);
.fa-chevron-left {
display: none;
}
.user-groups-title,
.subscriptions-title {
display: inline-block;
transition: all 0.3s ease;
transform: translate(-13px, 0);
}
.exit {
font-weight: 600;
position: absolute;
top: 10px;
right: 10px;
color: hsl(0deg 0% 67%);
cursor: pointer;
}
}
.exit-sign {
position: relative;
top: 1px;
margin-left: 3px;
font-size: 1.5rem;
line-height: 1;
font-weight: 600;
cursor: pointer;
}
.left,
.right {
position: relative;
display: inline-block;
vertical-align: top;
width: 50%;
height: calc(100% - 45px);
margin: 0 -2px;
}
.left .no-streams-to-show,
.left .no-groups-to-show,
.right .nothing-selected {
display: block;
margin-top: calc(45vh - 75px);
text-align: center;
font-size: 1em;
margin-left: 2em;
margin-right: 2em;
& span {
color: hsl(0deg 0% 67%);
}
}
.left {
border-right: 1px solid hsl(0deg 0% 87%);
.list-toggler-container {
padding: 6px 8px;
border-bottom: 1px solid hsl(0deg 0% 87%);
display: flex;
justify-content: space-between;
}
}
.right {
width: calc(50% + 1px);
.nothing-selected {
& button {
padding: 6px 10px 8px;
display: block;
margin: 0 auto 10px;
}
}
.display-type {
padding: 2px;
text-align: center;
font-weight: 600;
border-bottom: 1px solid hsl(0deg 0% 87%);
& a {
color: inherit;
&:hover {
color: inherit;
text-decoration: none;
}
}
&.preview::after {
content: "Preview";
}
&.preferences::after {
content: "Preferences";
}
.stream-info-title,
.user-group-info-title {
display: none;
font-size: 1.5em;
line-height: 1;
margin: 9px;
font-weight: 600;
word-break: break-all;
.large-icon {
display: inline-block;
.zulip-icon {
font-size: 20px;
position: relative;
top: 3px;
}
}
.zulip-icon-globe {
font-size: 15px;
}
}
}
}
& input[type="text"].small {
border: 1px solid hsl(0deg 0% 80%);
border-radius: 4px;
padding: 3px;
outline: none;
color: hsl(0deg 0% 27%);
text-align: center;
&:focus {
text-align: left;
}
&:valid {
text-align: left;
}
}
}
#search_stream_name,
#search_group_name {
width: 100%;
padding: 3px 5px;
margin: 8px 0;
margin-left: 10px;
margin-right: -15px !important;
display: inline-block;
border-radius: 5px;
box-shadow: none;
padding-right: 20px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.stream_name_search_section,
.group_name_search_section {
width: 100%;
display: flex;
flex-direction: row;
justify-content: center;
margin-bottom: 0;
height: auto;
border-bottom: 1px solid hsl(0deg 0% 87%);
}
.user-groups-list,
.streams-list {
position: relative;
overflow: auto;
-webkit-overflow-scrolling: touch;
height: calc(100% - 85px);
width: 100%;
}
#clear_search_stream_name,
#clear_search_group_name {
right: 5px !important;
margin-left: -1px;
}
.stream-title {
font-size: 1.3em;
font-weight: 400;
}
.user-group-creation-body,
.stream-creation-body {
& section.block {
margin-bottom: 20px;
}
#announce-new-stream {
margin: 20px auto;
& div[class^="fa"] {
margin-left: 3px;
margin-right: 8px;
}
}
}
.stream-row,
.group-row {
padding: 15px 10px 11px;
border-bottom: 1px solid hsl(0deg 0% 93%);
cursor: pointer;
.check {
width: 25px;
height: 25px;
position: relative;
margin-right: 8px;
margin-top: 9px;
background-size: 60% auto;
background-repeat: no-repeat;
background-position: center center;
& svg {
fill: hsl(0deg 0% 72%);
width: 70%;
margin: 0% 15%;
}
&.checked:hover svg {
fill: hsl(240deg 41% 50%);
}
&.disabled:not(.checked) svg {
fill: hsl(0deg 0% 87%);
cursor: not-allowed;
}
.sub_unsub_status,
.join_leave_status {
display: inline-block !important;
height: auto !important;
width: auto !important;
.loading_indicator_spinner {
width: 100%;
height: 100%;
margin: 0;
}
.loading_indicator_spinner svg path {
fill: hsl(178deg 100% 40%);
}
}
}
.checked svg {
fill: hsl(240deg 96% 68%);
}
.icon {
width: 35px;
height: 35px;
margin-right: 8px;
margin-top: 4px;
background-color: hsl(300deg 100% 25%);
border-radius: 4px;
color: hsl(0deg 0% 100%);
.symbol {
font-weight: 600;
font-size: 1.1em;
}
.hashtag {
font-size: 1.4em;
font-weight: 600;
}
}
.sub-info-box,
.group-info-box {
width: calc(100% - 90px);
.top-bar,
.bottom-bar {
display: flex;
justify-content: space-between;
position: relative;
}
.top-bar .stream-name,
.top-bar .group-name-wrapper,
.bottom-bar .description {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-right: 12px;
}
.top-bar .subscriber-count,
.bottom-bar .stream-message-count {
white-space: nowrap;
color: hsl(0deg 0% 67%);
}
.top-bar .subscriber-count-text,
.top-bar .subscriber-count-lock,
.bottom-bar .stream-message-count-text {
margin-right: 5px;
}
.top-bar > div {
display: inline-block;
vertical-align: top;
}
.top-bar .stream-name,
.top-bar .group-name-wrapper {
font-weight: 600;
}
.bottom-bar {
margin-top: 2px;
line-height: 1.5;
}
.bottom-bar > div {
display: inline-block;
vertical-align: bottom;
}
}
&.active {
background-color: hsl(0deg 0% 93%);
}
> div {
display: inline-block;
vertical-align: top;
}
.check:not(.checked, .disabled):hover svg,
&.active .check:not(.checked, .disabled):hover svg {
fill: hsl(0deg 0% 27%);
}
&::selection,
.icon .hashtag::selection {
background-color: transparent;
}
}
.stream-row .sub-info-box .description:empty::after,
.group-row .group-info-box .description:empty::after {
content: attr(data-no-description);
font-style: italic;
color: hsl(0deg 0% 67%);
}
.subscriber_list_settings .add_subscribers_disabled,
.member_list_settings .add_members_disabled {
cursor: not-allowed;
.pill-container {
cursor: not-allowed;
}
}
.subscriber_list_settings,
.member_list_settings {
& button[disabled] {
pointer-events: none;
}
}
#groups_overlay,
#subscription_overlay {
#user-group-creation,
#stream-creation {
overflow: auto;
outline: none;
-webkit-overflow-scrolling: touch;
.stream-creation-simplebar-container,
.user-group-creation-simplebar-container {
height: calc(
var(--overlay-container-height) -
var(--subscriptions-overlay-header-height) -
var(--subscriptions-overlay-display-type-height) -
var(--subscriptions-overlay-sticky-footer-height)
);
max-height: calc(
var(--overlay-container-max-height) -
var(--subscriptions-overlay-header-height) -
var(--subscriptions-overlay-display-type-height) -
var(--subscriptions-overlay-sticky-footer-height)
);
}
.user-group-creation-body,
.stream-creation-body {
padding: 15px 15px 0;
}
.settings-sticky-footer {
display: flex;
justify-content: space-between;
position: absolute;
bottom: 0;
width: calc(100% - 27px);
padding: 9px 15px 15px;
text-align: right;
background-color: hsl(0deg 0% 96%);
border-top: 1px solid hsl(0deg 0% 87%);
box-shadow: inset 0 1px 0 hsl(0deg 0% 100%);
}
@media (width > $md_min) {
.settings-sticky-footer {
border-radius: 0 0 6px;
}
}
.add_all_users_to_user_group,
.add_all_users_to_stream {
margin-left: 10px;
}
.create_user_group_member_list_header,
.create_stream_subscriber_list_header {
margin-top: 10px;
margin-bottom: 3px;
& h5 {
display: inline-block;
}
}
.add-user-list-filter {
width: 140px;
float: right;
}
#user_group_creation_form,
#stream_creation_form {
margin: 0;
.user_group_create_info.show {
margin: 5px;
}
#user_group_creating_indicator,
#stream_creating_indicator {
&:not(:empty) {
position: absolute;
width: 100% !important;
height: calc(100% - 105px) !important;
display: flex !important;
justify-content: center;
align-items: center;
background-color: hsl(0deg 0% 100% / 90%);
z-index: 1;
}
.loading_indicator_text {
font-weight: 400;
}
}
}
}
.inner-box {
margin: 20px;
}
.group_settings_header,
.stream_settings_header {
white-space: nowrap;
display: flex;
margin-left: 15px;
.tab-container {
.ind-tab {
padding: 3px 4px;
width: 80px;
}
}
.button-group {
padding-top: 5px;
margin-left: auto;
margin-right: 18px;
.subscribe-button,
.join_leave_button,
#preview-stream-button,
.deactivate {
margin-right: 3px;
text-decoration: none;
}
}
}
.group-header,
.stream-header {
white-space: nowrap;
padding-top: 10px;
display: flex;
align-items: center;
.group-name-wrapper,
.stream-name {
position: relative;
font-size: 1.5em;
font-weight: 600;
margin-left: -3px;
margin-top: -5px;
white-space: nowrap;
max-width: 90%;
flex: auto;
min-width: 0;
overflow-x: clip;
text-overflow: ellipsis;
.group-name,
.sub-stream-name {
display: block;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
}
}
.button-group {
margin-left: auto;
.deactivate {
margin-right: 3px;
text-decoration: none;
}
}
.large-icon {
display: inline-block;
vertical-align: top;
margin-right: 8px;
margin-top: -5px;
&.hash::after {
top: -1px;
font-size: 1.09em;
font-weight: 700;
}
.zulip-icon {
font-size: 18px;
position: relative;
top: 1px;
}
}
.group_change_property_info,
.stream_change_property_info {
vertical-align: top;
margin: 0 5px 0 0;
}
}
.group-description-wrapper,
.stream-description {
word-break: break-all;
margin-bottom: 5px;
.no-description {
font-style: italic;
color: hsl(0deg 0% 67%);
}
}
.checkmark {
display: none;
margin-left: 5px;
color: hsl(0deg 0% 67%);
cursor: pointer;
&.show {
display: block;
}
}
.hash::after {
position: relative;
content: "#";
}
.settings {
position: relative;
height: calc(100% - 45px);
overflow-y: auto;
-webkit-overflow-scrolling: touch;
.tab-container {
padding-top: 5px;
}
}
.subscription_settings {
display: none;
position: relative;
width: 100%;
margin: 0 auto;
border-radius: 4px;
top: -1px;
&.show {
display: block;
}
}
#personal-stream-settings {
.stream_change_property_status {
margin: 9px auto 3px 3px;
}
}
.stream_details_box {
> .stream_details_subsection {
margin: 0 0 10px; /* mimic paragraph spacing */
}
.stream_email_address_error {
vertical-align: top;
margin-left: 15px;
}
}
.loading_indicator_text {
font-weight: 400;
line-height: 20px;
}
.subsection-parent .input-group {
& input[type="checkbox"] {
margin-top: 0;
}
&:last-of-type {
border-bottom: none;
}
.sp-replacer {
box-shadow: none;
}
& input[type="radio"] {
margin-right: 5px;
}
.inline {
display: inline !important;
}
}
}
div.settings-radio-input-parent {
border-bottom: 1px solid hsl(0deg 0% 87%);
margin: 2px 0 2px 5px;
padding: 2px 0;
&:last-of-type {
border-bottom: none;
}
& label.radio {
display: inline;
margin: 5px;
}
& input {
float: left;
width: auto;
cursor: pointer;
margin: 3.5px 0 1px;
&:focus {
outline: 1px dotted hsl(0deg 0% 20%);
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
&:disabled {
cursor: not-allowed;
}
}
&.default_stream_private_tooltip {
cursor: not-allowed;
& label {
pointer-events: none;
}
}
}
.stream-permissions,
.stream-creation-body,
.group-permissions {
.input-group {
margin-bottom: 10px;
&.message-retention-setting-group {
& input {
width: 5ch;
text-align: right;
}
}
}
.settings_select {
/* Match with select elements in settings page */
min-width: 325px;
max-width: 100%;
height: 30px;
}
& select.stream_post_policy_setting {
margin-bottom: 10px;
}
.dropdown-widget-button {
/* Match the margin with other input groups around. */
margin-bottom: 20px;
min-width: 325px;
max-width: 100%;
height: 30px;
}
.default-stream {
margin: 20px 0;
width: fit-content;
.inline {
display: inline;
}
}
}
#change_user_group_description,
#change_stream_description {
width: 100%;
height: 80px;
margin-bottom: 4px;
box-sizing: border-box;
}
.stream-permissions .stream-message-retention-days-input input[type="text"] {
border-radius: 5px;
box-shadow: none;
margin: 0;
height: inherit;
}
@media (width < $lg_min) {
.user-groups-container,
.subscriptions-container {
max-width: 95%;
}
#groups_overlay,
#subscription_overlay {
.left {
width: 40%;
}
.right {
width: calc(60% - 1px);
}
}
}
@media (width < $lg_min) {
.subscriptions-container .left .list-toggler-container {
flex-wrap: wrap;
}
.list-toggler-container {
text-align: center;
}
#groups_overlay .group_settings_header,
#subscription_overlay .stream_settings_header {
flex-wrap: wrap;
}
}
/* Note that this block has settings_page CSS as well, and thus needs
to match the media queries in settings.css.
Longer-term we should extract this logic two-column-overlay class
to read more naturally. */
@media (width < $md_min) {
.user-groups-container,
.subscriptions-container {
position: relative;
overflow: hidden;
.list-toggler-container {
text-align: left;
}
.user-groups-header .fa-chevron-left,
.subscriptions-header .fa-chevron-left {
display: block;
}
}
#groups_overlay .left,
#groups_overlay .right,
#subscription_overlay .left,
#subscription_overlay .right,
#settings_page .content-wrapper.right {
position: absolute;
display: block;
margin: 0;
width: 100%;
height: calc(100% - 45px);
border: none;
}
#groups_overlay .right,
#subscription_overlay .right,
#settings_page .content-wrapper.right {
position: absolute;
left: 101%;
top: 45px;
background-color: var(--color-background-modal);
border-top: none;
transition: all 0.3s ease;
z-index: 10;
&.show {
left: 0%;
}
}
#groups_overlay {
.display-type {
display: none;
}
}
#subscription_overlay,
#groups_overlay {
.user-groups-container,
.subscriptions-container {
height: 95%;
}
.settings {
overflow: auto;
-webkit-overflow-scrolling: touch;
}
}
}
@media (width < $sm_min) {
#groups_overlay .user_group_settings_wrapper,
#subscription_overlay .subscription_settings {
.button-group {
display: block;
float: right;
margin-top: 10px;
}
.group-header,
.stream-header {
.button-group {
margin-top: -5px;
}
}
.group_change_property_info,
.stream_change_property_info {
/* For small widths where there is not enough space
to show alert beside stream name we set its display
to block so it is shown in new line. But to avoid
it covering whole screen width we set max-width
so that it does not losses inline-block appearance. */
/* TODO: This will probably be not required once
we have tabbed navigation as button group width
will be smaller. */
display: block;
max-width: max-content;
white-space: nowrap;
}
.save-button-controls {
display: block;
margin: 0 0 10px;
&.hide {
display: none;
}
}
}
}
@media (width <= 500px) {
#groups_overlay,
#subscription_overlay {
.groups_settings_header,
.stream_settings_header {
display: block;
text-align: center;
margin-left: 0;
.tab-container {
.ind-tab {
width: 85px;
}
}
}
}
}