mirror of
https://github.com/zulip/zulip.git
synced 2026-06-18 21:01:52 +08:00
Send typing notification events when user types in the compose box. Listen for these events and display a notification. Sending notifications: Notifications are throttled, so that start notifications are sent every 10 seconds of active typing, and stop notifications are sent 5 seconds after active typing stops or when the compose box is closed. Displaying notifications: When a typing notification is received, if the current narrow is private messages or is: pm-with and the user is not the sender, "Othello is typing..." is displayed underneath the last message. This notification is removed after 15 seconds. If another notification is received during this period, the expiration is extended. When a stop notification is received the notification is removed. Internally, a list of users currently typing is maintained for each conversation (in a dict). When an event is received the list (for the appropriate conversation) is updated and the notifications template is re-rendered based on the narrow information. This template is also re-rendered when the narrow changes. Significantly modified by tabbott for clarity. Fixes #150.
347 lines
6.2 KiB
CSS
347 lines
6.2 KiB
CSS
.screen-medium-show,
|
|
.screen-narrow-show {
|
|
display: none !important;
|
|
}
|
|
|
|
/* This max-width must be synced with message_viewport.is_narrow */
|
|
@media (max-width: 975px) {
|
|
|
|
.screen-full-show {
|
|
display: none !important;
|
|
}
|
|
|
|
.screen-medium-show {
|
|
display: block !important;
|
|
}
|
|
|
|
.app-main,
|
|
.header-main {
|
|
min-width: 750px;
|
|
}
|
|
|
|
.column-right {
|
|
display: none;
|
|
}
|
|
|
|
.column-right.expanded {
|
|
display: block;
|
|
position: absolute;
|
|
float: none;
|
|
right: 15px;
|
|
top: 0px;
|
|
}
|
|
|
|
.column-right.expanded .right-sidebar {
|
|
background: rgba(255,255,255,1);
|
|
box-shadow: 0px -2px 3px 0px rgba(0,0,0,0.1);
|
|
border-left: 1px solid #dddddd;
|
|
margin-top: 40px;
|
|
padding-top: 10px;
|
|
height: 100%;
|
|
right: 0px;
|
|
}
|
|
|
|
.header-main .column-right {
|
|
display: inline-block;
|
|
width: 30px;
|
|
}
|
|
|
|
|
|
#top_navbar.rightside-userlist .navbar-search {
|
|
margin-right: 100px;
|
|
}
|
|
|
|
#top_navbar.rightside-userlist #navbar-buttons {
|
|
margin-right: 41px;
|
|
}
|
|
|
|
.navbar-search {
|
|
margin-right: 60px;
|
|
}
|
|
|
|
|
|
#userlist-toggle {
|
|
display: block;
|
|
}
|
|
|
|
.compose-content {
|
|
margin-right: 7px;
|
|
}
|
|
|
|
#typing_notifications {
|
|
margin-right: 7px;
|
|
}
|
|
|
|
.nav .dropdown-menu {
|
|
min-width: 180px;
|
|
-webkit-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
|
|
-moz-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
|
|
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
|
|
}
|
|
|
|
.nav .dropdown-menu:after {
|
|
right: 10px;
|
|
}
|
|
|
|
.column-middle {
|
|
margin-right: 7px;
|
|
}
|
|
|
|
#subscriptions-status {
|
|
left: 300px;
|
|
right: 50px;
|
|
}
|
|
|
|
}
|
|
|
|
@media (max-width: 775px) {
|
|
|
|
body {
|
|
padding: 0px;
|
|
}
|
|
|
|
.screen-narrow-show {
|
|
display: inline-block !important;
|
|
}
|
|
|
|
.column-left {
|
|
display: none;
|
|
}
|
|
|
|
.column-left.expanded {
|
|
display: block;
|
|
position: absolute;
|
|
float: none;
|
|
left: 0px;
|
|
top: 0px;
|
|
}
|
|
|
|
.column-left.expanded .left-sidebar {
|
|
background: rgba(255,255,255,1);
|
|
box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.1);
|
|
border-right: 1px solid #dddddd;
|
|
margin-top: 40px;
|
|
padding-top: 10px;
|
|
height: 100%;
|
|
padding-left: 10px;
|
|
width: 250px;
|
|
}
|
|
|
|
body, html,
|
|
.app-main,
|
|
.header-main {
|
|
min-width: 350px;
|
|
}
|
|
|
|
.column-middle,
|
|
.app-main .column-middle {
|
|
margin-left: 7px;
|
|
margin-right: 7px;
|
|
}
|
|
|
|
.header-main .column-middle {
|
|
margin-left: 0px;
|
|
}
|
|
|
|
.column-middle-inner {
|
|
margin-left: 0px;
|
|
margin-right: 15px;
|
|
}
|
|
|
|
.app-main .column-middle .column-middle-inner {
|
|
margin-right: 0px;
|
|
}
|
|
|
|
.skinny-user-gravatar {
|
|
position: absolute;
|
|
top: 0px;
|
|
}
|
|
|
|
#streamlist-toggle {
|
|
display: block;
|
|
}
|
|
|
|
.compose-content {
|
|
margin-right: 7px;
|
|
margin-left: 7px;
|
|
}
|
|
|
|
#typing_notifications {
|
|
margin-right: 7px;
|
|
margin-left: 7px;
|
|
}
|
|
|
|
#searchbox {
|
|
margin-left: 42px;
|
|
}
|
|
|
|
#top_navbar.rightside-userlist .navbar-search {
|
|
margin-right: 127px;
|
|
}
|
|
|
|
.navbar-search {
|
|
margin-right: 81px;
|
|
}
|
|
|
|
#subscriptions-status {
|
|
left: 35px;
|
|
}
|
|
|
|
}
|
|
|
|
@media (max-width: 500px) {
|
|
.stream-name {
|
|
max-width: 120px;
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.column-right.expanded .right-sidebar,
|
|
.column-left.expanded .left-sidebar {
|
|
margin-top: 31px;
|
|
}
|
|
|
|
.column-left.expanded .left-sidebar {
|
|
padding: 0px;
|
|
}
|
|
|
|
.column-left.expanded .left-sidebar #streams_header {
|
|
padding-right: 10px;
|
|
}
|
|
|
|
.column-left.expanded .bottom_sidebar {
|
|
margin-top: 10px;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 350px) {
|
|
html {
|
|
overflow-x: hidden;
|
|
}
|
|
.stream_row .description {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 500px) {
|
|
.compose_stream_button,
|
|
.compose_private_button {
|
|
padding: 5px 10px 5px 10px;
|
|
}
|
|
|
|
#streamlist-toggle,
|
|
#userlist-toggle,
|
|
#navbar-buttons,
|
|
.navbar-search,
|
|
#tab_bar,
|
|
#searchbox,
|
|
#search_query,
|
|
#tab_list li,
|
|
#tab_list,
|
|
.header {
|
|
height: 30px;
|
|
line-height: 30px;
|
|
}
|
|
|
|
#streamlist-toggle-button,
|
|
#userlist-toggle-button {
|
|
height: 30px;
|
|
padding-top: 0px;
|
|
padding-bottom: 0px;
|
|
}
|
|
|
|
#navbar-buttons ul.nav .dropdown-toggle,
|
|
#navbar-buttons ul.nav li.active .dropdown-toggle {
|
|
top: -5px;
|
|
}
|
|
|
|
#top_navbar.rightside-userlist .navbar-search {
|
|
margin-right: 115px;
|
|
}
|
|
|
|
#searchbox .input-append .icon-vector-search {
|
|
top: 5px;
|
|
}
|
|
|
|
#searchbox .search_button, #searchbox .search_button[disabled]:hover {
|
|
top: 2px;
|
|
}
|
|
|
|
#tab_bar_underpadding {
|
|
top: 30px;
|
|
}
|
|
|
|
.messagebox-content {
|
|
padding-right: 15px;
|
|
}
|
|
|
|
.message_time {
|
|
right: auto;
|
|
left: -3px;
|
|
}
|
|
|
|
.message_controls {
|
|
width: 56px;
|
|
right: -10px;
|
|
top: 0px;
|
|
}
|
|
|
|
.message_hovered .message_controls {
|
|
z-index: 10;
|
|
}
|
|
|
|
.selected_message .message_controls {
|
|
right: -10px;
|
|
}
|
|
|
|
.include-sender .message_controls {
|
|
background: none !important;
|
|
padding: none !important;
|
|
border: none !important;
|
|
top: -3px;
|
|
}
|
|
|
|
.include-sender .message_time {
|
|
left: auto;
|
|
right: -5px;
|
|
}
|
|
|
|
.include-sender .message_controls {
|
|
right: 40px;
|
|
}
|
|
|
|
.sender_name {
|
|
max-width: 250px;
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
textarea.new_message_textarea {
|
|
height: 30px !important;
|
|
min-height: 30px !important;
|
|
}
|
|
|
|
#tab_bar_underpadding {
|
|
height: 10px;
|
|
}
|
|
|
|
#floating_recipient_bar {
|
|
top: 40px;
|
|
}
|
|
|
|
.message_content {
|
|
padding-right: 50px;
|
|
}
|
|
|
|
}
|
|
|
|
@media only screen and (min-device-width: 300px) and (max-device-width: 700px) {
|
|
#unmute_muted_topic_notification {
|
|
width: calc(90% - 30px);
|
|
left: 5%;
|
|
top: 5%;
|
|
}
|
|
}
|