Files
zulip/templates/zerver/app/index.html
roanster007 7ebbdd942d typing: Move the typing notifications to below the mark as read banner.
Previously, the typing notifications used to appear between the
message list and the mark as read banner in a thread. This would
cause the banner to shift down whenever someone starts typing,
and shift back up if everyone stops typing.

This frequent bouncing of the banner could be distracting, and hence,
is fixed by moving the typing notifications to below the mark as
read banner.
2024-06-18 14:30:19 -07:00

300 lines
13 KiB
HTML

{% extends "zerver/base.html" %}
{% set entrypoint = "app" %}
{# The app itself. #}
{# Includes some other templates as tabs. #}
{% block meta_viewport %}
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
{% endblock %}
{% block customhead %}
<meta name="apple-mobile-web-app-capable" content="yes" />
<link href="{{ static('images/logo/apple-touch-icon-precomposed.png') }}" rel="apple-touch-icon-precomposed" />
<style>
#app-loading {
font-size: 16px;
background-color: hsl(0, 0%, 94%);
position: fixed;
height: 100%;
width: 100%;
padding: 10px;
top: 0px;
left: 0px;
z-index: 9001;
}
#app-loading-middle-content, #app-loading-bottom-content {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
padding: 10px;
}
#app-loading-middle-content h3 {
text-align: center;
}
@keyframes showAtEnd {
99% {
visibility: hidden;
}
100% {
visibility: visible;
}
}
#app-loading-bottom-content {
top: unset;
bottom: 20px;
animation: 7s showAtEnd;
animation-fill-mode: forwards;
visibility: hidden;
}
#app-loading-error {
display: flex;
height: 100vh;
justify-content: center;
align-items: center;
visibility: hidden;
}
:root.dark-theme #app-loading {
background-color: hsl(0, 0%, 11%);
color: hsl(236, 33%, 90%);
}
@media (prefers-color-scheme: dark) {
:root.color-scheme-automatic #app-loading {
background-color: hsl(0, 0%, 11%);
color: hsl(236, 33%, 90%);
}
}
.app-loading-spinner-container {
position: relative;
margin: auto;
display: flex;
justify-content: center;
}
.app-loading-logo {
height: 64px;
padding: 10px;
}
@keyframes zspinner {
to {transform: rotate(360deg);}
}
.app-loading-spinner:before {
content: '';
box-sizing: border-box;
position: absolute;
width: 84px;
height: 84px;
border-radius: 50%;
border: 4px solid hsl(0,0%,94%);
border-top-color: hsl(0,0%,52%);
animation: zspinner 1s linear infinite;
}
/* Bootstrap 'a' tag styles for styling reload link */
a#reload-lnk:focus {
outline: thin dotted #333;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
a#reload-lnk:hover,
a#reload-lnk:active {
outline: 0;
}
a#reload-lnk {
color: #0088cc;
text-decoration: none;
cursor: pointer;
}
a#reload-lnk:hover,
a#reload-lnk:focus {
color: #005580;
text-decoration: underline;
}
</style>
{% endblock %}
{% block content %}
<div id="feedback_container" class="new-style">
</div>
<div id="app-loading">
<div id="app-loading-middle-content">
<div class="app-loading-spinner-container">
<div class="app-loading-spinner"></div>
<svg class="app-loading-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 773.12 773.12"><linearGradient id="a" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#50adff"/><stop offset="1" stop-color="#7877fc"/></linearGradient><circle cx="386.56" cy="386.56" r="386.56" fill="url(#a)"/><path d="M566.66 527.25c0 33.03-24.23 60.05-53.84 60.05H260.29c-29.61 0-53.84-27.02-53.84-60.05 0-20.22 9.09-38.2 22.93-49.09l134.37-120c2.5-2.14 5.74 1.31 3.94 4.19l-49.29 98.69c-1.38 2.76.41 6.16 3.25 6.16h191.18c29.61 0 53.83 27.03 53.83 60.05zm0-281.39c0 20.22-9.09 38.2-22.93 49.09l-134.37 120c-2.5 2.14-5.74-1.31-3.94-4.19l49.29-98.69c1.38-2.76-.41-6.16-3.25-6.16H260.29c-29.61 0-53.84-27.02-53.84-60.05s24.23-60.05 53.84-60.05h252.54c29.61 0 53.83 27.02 53.83 60.05z" fill="#fff"/></svg>
</div>
</div>
<div id="app-loading-bottom-content">
<p>{% trans %}If this message does not go away, try <a class="reload-lnk">reloading</a> the page.{% endtrans %}</p>
</div>
<div id="app-loading-error">
<p>{% trans %}Error loading Zulip. Try <a class="reload-lnk">reloading</a> the page.{% endtrans %}</p>
</div>
<script nonce="{{ csp_nonce }}">
document.addEventListener('DOMContentLoaded', function () {
function reload() {
window.location.reload(true);
}
document.querySelectorAll('.reload-lnk').forEach(lnk => lnk.addEventListener('click', reload));
});
</script>
</div>
<div id="tooltip-templates-container"></div>
<div id="channels_overlay_container"></div>
<div id="groups_overlay_container"></div>
<div id="drafts_table"></div>
<div id="scheduled_messages_overlay_container"></div>
<div id="settings_overlay_container" class="overlay" data-overlay="settings" aria-hidden="true">
</div>
<div id="message-edit-history-overlay-container"></div>
<div class="informational-overlays overlay new-style" data-overlay="informationalOverlays" aria-hidden="true">
<div class="overlay-content overlay-container">
<div class="overlay-tabs">
<span class="exit">&times;</span>
</div>
<div class="overlay-body">
</div>
</div>
</div>
<div id="user-profile-modal-holder"></div>
<div id="about-zulip-modal-container"></div>
<div id="read-receipts-modal-container"></div>
<audio id="user-notification-sound-audio">
<source class="notification-sound-source-ogg" type="audio/ogg" />
<source class="notification-sound-source-mp3" type="audio/mpeg" />
</audio>
<audio id="realm-default-notification-sound-audio">
<source class="notification-sound-source-ogg" type="audio/ogg" />
<source class="notification-sound-source-mp3" type="audio/mpeg" />
</audio>
<div class="alert-box">
<div class="alert alert_sidebar alert-error home-error-bar" id="connection-error">
<div class="exit"></div>
<strong class="message">{{ _('Unable to connect to Zulip.') }}</strong>
{{ _('Updates may be delayed.') }}
{{ _('Retrying soon…') }}
<a class="restart_get_events_button">{{ _('Try now.') }}</a>
</div>
<div class="alert alert_sidebar alert-error home-error-bar" id="zephyr-mirror-error">
<div class="exit"></div>
{# The below isn't tagged for translation
intentionally, because the feature is only used at
MIT. #}
<strong>Your Zephyr mirror is not working.</strong>
<span id="normal-zephyr-mirror-error-text">
We recommend that
you <a class="webathena_login">give Zulip the ability to mirror the messages for you via
Webathena</a>. If you'd prefer, you can instead
<a href="/zephyr-mirror/" target="_blank" rel="noopener noreferrer">run the
Zephyr mirror script yourself</a> in a screen
session.
</span>
<span id="desktop-zephyr-mirror-error-text" class="notdisplayed">
To fix this, you'll need to use the web interface.
</span>
</div>
<div class="alert alert_sidebar alert-error home-error-bar" id="home-error"></div>
<div class="alert alert_sidebar alert-error home-error-bar" id="reloading-application"></div>
<div class="alert alert_sidebar" id="request-progress-status-banner">
<div class="alert-zulip-logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 773.12 773.12">
<circle cx="386.56" cy="386.56" r="386.56"></circle>
<path d="M566.66 527.25c0 33.03-24.23 60.05-53.84 60.05H260.29c-29.61 0-53.84-27.02-53.84-60.05 0-20.22 9.09-38.2 22.93-49.09l134.37-120c2.5-2.14 5.74 1.31 3.94 4.19l-49.29 98.69c-1.38 2.76.41 6.16 3.25 6.16h191.18c29.61 0 53.83 27.03 53.83 60.05zm0-281.39c0 20.22-9.09 38.2-22.93 49.09l-134.37 120c-2.5 2.14-5.74-1.31-3.94-4.19l49.29-98.69c1.38-2.76-.41-6.16-3.25-6.16H260.29c-29.61 0-53.84-27.02-53.84-60.05s24.23-60.05 53.84-60.05h252.54c29.61 0 53.83 27.02 53.83 60.05z"></path>
</svg>
</div>
<div class="loading-indicator"></div>
<div class="success-indicator">
<i class="fa fa-check"></i>
</div>
<div class="alert-content"></div>
<div class="exit"></div>
</div>
</div>
<div id="navbar-fixed-container">
<div id="navbar_alerts_wrapper"></div>
<div id="header-container"></div>
</div>
<div class="app">
<div class="app-main">
<div class="column-left" id="left-sidebar-container">
</div>
<div class="column-middle">
<div class="column-middle-inner">
<div id="recent_view">
<div class="recent_view_container">
<div id="recent_view_table"></div>
</div>
<table id="recent-view-content-table">
<tbody data-empty="{{ _('No conversations match your filters.') }}" id="recent-view-content-tbody"></tbody>
</table>
<div id="recent_view_bottom_whitespace">
<div class="bottom-messages-logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 773.12 773.12">
<circle cx="386.56" cy="386.56" r="386.56"/>
<path d="M566.66 527.25c0 33.03-24.23 60.05-53.84 60.05H260.29c-29.61 0-53.84-27.02-53.84-60.05 0-20.22 9.09-38.2 22.93-49.09l134.37-120c2.5-2.14 5.74 1.31 3.94 4.19l-49.29 98.69c-1.38 2.76.41 6.16 3.25 6.16h191.18c29.61 0 53.83 27.03 53.83 60.05zm0-281.39c0 20.22-9.09 38.2-22.93 49.09l-134.37 120c-2.5 2.14-5.74-1.31-3.94-4.19l49.29-98.69c1.38-2.76-.41-6.16-3.25-6.16H260.29c-29.61 0-53.84-27.02-53.84-60.05s24.23-60.05 53.84-60.05h252.54c29.61 0 53.83 27.02 53.83 60.05z"/>
</svg>
</div>
<div id="recent_view_loading_messages_indicator"></div>
</div>
<!-- Don't show the banner until we have some messages loaded. -->
<div class="recent-view-load-more-container main-view-banner info notvisible">
<div class="last-fetched-message banner_content">{{ _('This view is still loading messages.') }}</div>
<button class="fetch-messages-button main-view-banner-action-button right_edge notvisible">
<div class="loading-indicator"></div>
<span class="button-label">{{ _('Load more') }}</span>
</button>
</div>
</div>
<div id="inbox-view">
<div class="inbox-container">
<div id="inbox-pane"></div>
</div>
</div>
<div id="message_feed_container">
<div class="message-feed" id="main_div">
<div class="top-messages-logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 773.12 773.12">
<circle cx="386.56" cy="386.56" r="386.56"/>
<path d="M566.66 527.25c0 33.03-24.23 60.05-53.84 60.05H260.29c-29.61 0-53.84-27.02-53.84-60.05 0-20.22 9.09-38.2 22.93-49.09l134.37-120c2.5-2.14 5.74 1.31 3.94 4.19l-49.29 98.69c-1.38 2.76.41 6.16 3.25 6.16h191.18c29.61 0 53.83 27.03 53.83 60.05zm0-281.39c0 20.22-9.09 38.2-22.93 49.09l-134.37 120c-2.5 2.14-5.74-1.31-3.94-4.19l49.29-98.69c1.38-2.76-.41-6.16-3.25-6.16H260.29c-29.61 0-53.84-27.02-53.84-60.05s24.23-60.05 53.84-60.05h252.54c29.61 0 53.83 27.02 53.83 60.05z"/>
</svg>
</div>
<div id="loading_older_messages_indicator"></div>
<div id="page_loading_indicator"></div>
<div id="message_feed_errors_container"></div>
<div id="message-lists-container"></div>
<div id="scheduled_message_indicator">
</div>
<div id="mark_read_on_scroll_state_banner">
</div>
<div id="typing_notifications">
</div>
<div id="mark_read_on_scroll_state_banner_place_holder">
</div>
<div id="bottom_whitespace">
</div>
</div>
</div>
<div id="compose" {% if embedded %}data-embedded{% endif %}>
<div id="compose-container"></div>
</div>
</div>
</div>
<div class="column-right" id="right-sidebar-container">
</div><!--/right sidebar-->
</div>
</div>
<div class="hidden">
<form id="logout_form" action="/accounts/logout/" method="POST">{{ csrf_input }}
</form>
</div>
{% endblock %}