diff --git a/README.md b/README.md index fcd6d109..ef2df14e 100644 --- a/README.md +++ b/README.md @@ -10,20 +10,19 @@ Try it (possibly older version) live at http://api.tinode.co/x/example-react-js/ License: [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0) -Photos from https://www.pexels.com/ under [CC0 license](https://www.pexels.com/photo-license/). +Sample avatar photos from https://www.pexels.com/ under [CC0 license](https://www.pexels.com/photo-license/). Background pattern from http://subtlepatterns.com/, commercial and non-commercial use allowed with attribution. ## Missing functionality -* Cannot manage group members. -* Editing chat parameters is incomplete and buggy. * Cannot send images or other media. * No typing indicators. -* No indicators of chat status (muted, blocked, etc.). +* No indication of chat status (muted, blocked, etc.). * Long polling as a wire transport does not work. * Browser push notifications are missing. * No encryption. +* Editing chat permissions is incomplete. ## Responsive design diff --git a/css/base.css b/css/base.css index cdcfde3f..a8229b6a 100644 --- a/css/base.css +++ b/css/base.css @@ -37,17 +37,41 @@ a:focus { outline-offset: -2px; } +a.red:hover, +a.red:focus { + color: #F44336; +} + +a.flat-button { + display: flex; + align-items: center; + margin: 0.15rem 0.35rem; + height: 2em; + line-height: 2em; + font-weight: normal; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + white-space: nowrap; + text-transform: uppercase; +} +a.flat-button:hover, +a.flat-button:focus { + text-decoration: none; +} + form { font-size: 1.1rem; padding: 0.5rem 0.75rem; - line-height: 1.75; + line-height: 1.5; } -form label { +label { font-size: 1.1rem; + margin-right: auto; } -form label.small { +label.small { color: #1e88e5; font-size: 0.95rem; } @@ -159,7 +183,7 @@ textarea { height: 2.5rem; border-bottom: 1px solid #ccc; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1); - transition: all 0.2s ease-in-out; + transition: all 0.1s ease-in-out; width: 100%; } textarea:focus, @@ -225,6 +249,26 @@ ul.menu > li.separator:hover { } /* END popup/dropdown menu */ +/* Generic text colors */ +.blue { + color: #2196f3; /* blue 500 */ +} + +.red { + color: #D32F2F; /* red 700 */ +} + +.hr { + display: block; + width: 100%; + height: 0.6rem; + background-color: #f0f0f0; + box-shadow: inset 0 0.25rem 0.25rem -0.25rem rgba(0,0,0,0.15), + inset 0 -0.25rem 0.25rem -0.25rem rgba(0,0,0,0.15); +} + +/* END generic text colors */ + /* END of basic elements */ #mountPoint { @@ -251,7 +295,7 @@ ul.menu > li.separator:hover { position: relative; display: flex; flex-direction: column; - flex-grow: 0.3; + flex-grow: 0; flex-shrink: 0.3; width: 24rem; min-width: 18rem; @@ -268,7 +312,7 @@ ul.menu > li.separator:hover { #info-view { display: flex; flex-direction: column; - flex-grow: 0.3; + flex-grow: 0; flex-shrink: 0.3; width: 24rem; min-width: 18rem; @@ -374,6 +418,7 @@ ul.menu > li.separator:hover { } .avatar-box { + position: relative; flex-grow: 0; flex-shrink: 0; } @@ -446,21 +491,27 @@ ul.menu > li.separator:hover { overflow: hidden; } -.contacts-panel { +.scrollable-panel { overflow-y: auto; - margin-top: 1rem;: + margin-top: 0.25rem; margin-bottom: auto; height: 100%; } .contact-box { list-style: none; + overflow-x: hidden; } .contact-box > li { display: flex; padding: 0.35rem 0.25rem 0.5rem 0.35rem; min-height: 3.5rem; + flex-grow: 0; + flex-shrink: 0; + border-bottom: 1px solid #eee; + border-collapse: collapse; + overflow-x: hidden; } .contact-box > li:hover { background-color: #eceff1; /* blue-gray 50 highlight */ @@ -469,8 +520,19 @@ ul.menu > li.separator:hover { background-color: #cfd8dc; /* blue-gray 100 highlight */ } +.contact-box .text-box { + overflow-x: hidden; +} + .contact-box .contact-title { font-size: 1.05rem; + text-overflow: ellipsis; + overflow: hidden +} + +.contact-box .contact-comment { + text-overflow: ellipsis; + overflow: hidden } /* The down arrow head - trigger for context menu in contacts list */ @@ -521,7 +583,7 @@ ul.menu > li.separator:hover { border-radius: 50%; position: absolute; right: 0; - bottom: 0; + bottom: 0.1rem; } .contact-box .online { background-color: #4caf50; @@ -529,6 +591,22 @@ ul.menu > li.separator:hover { .contact-box .offline { background-color: #C0C0C0; } + +.contact-box .checkmark.material-icons { + display: inline-block; + width: 1.5rem; + height: 1.5rem; + font-size: 1.5rem; + line-height: 1.5rem; + vertical-align: middle; + color: #0097A7; + position: absolute; + right: 0.05rem; + bottom: 0.05rem; + background-color: white; + overflow: visible; + border: 0.0px solid transparent; +} /* END of avatar box */ #add-topic { @@ -543,20 +621,35 @@ ul.menu > li.separator:hover { flex-direction: column; } -.panel-form-one { +.panel-form-row { display: flex; justify-content: flex-start; align-items: center; + padding: 0.5rem 0.75rem; + line-height: 1.5; + flex-grow: 0; + flex-shrink: 0; } -.panel-form-two { +.panel-form-column { display: flex; flex-direction: column; - flex-grow: 1; + flex-grow: 0; + flex-shrink: 0; + padding: 0.5rem 0.75rem; + line-height: 1.5; +} +/* Make sure padding is only applied at + the top level panel */ +.panel-form-row > .panel-form-column { + padding: 0!important; + flex-grow: 1; +} +.panel-form-column > .panel-form-row { + padding: 0!important; } - -/* Styling of avatar upload area in the New Account panel */ +/* Styling of avatar upload control */ .avatar-upload { display: flex; flex-direction: column; @@ -564,8 +657,16 @@ ul.menu > li.separator:hover { width: 7rem; height: 9rem; margin-left: 0.5rem; + font-size: 4.5rem; padding: 0; } + +.avatar-upload .avatar-box { + position: relative; + width: 7rem; + height: 7rem; +} + /* Clearfix */ .avatar-upload:after { content: "."; @@ -649,6 +750,7 @@ ul.menu > li.separator:hover { #topic-caption-panel .avatar-box { + position: relative; width: 3rem; min-width: 3rem; height: 3rem; @@ -680,10 +782,11 @@ ul.menu > li.separator:hover { display: flex; align-items: center; flex: none; - padding: 0.5rem; + padding: 0.4rem; background-color: #eceff1; box-shadow: 0 -1px rgba(0,0,0,0.1); /* Faint shadow above panel */ z-index: 2; + height: 4rem; } /* A static panel shown when no topic is selected */ @@ -886,6 +989,24 @@ ul.menu > li.separator:hover { margin-right: auto; } +#group-manager { + position: relative; + display: flex; + flex-direction: column; + height: 100%; +} + +#group-manager-buttons { + display: flex; + background-color: #eceff1; + box-shadow: 0 -1px rgba(0,0,0,0.1); /* Faint shadow above panel */ + z-index: 2; + justify-content: space-around; + padding: 0.4rem; + height: 4rem; + border-left: 1px solid #ccc; +} + /* END of InfoView */ /* Modal dialog */ @@ -967,7 +1088,7 @@ ul.tabbar > li > a { font-size: 1.1rem; color: rgba(33,150,243,0.6); overflow: hidden; - box-shadow: inset 0 -2px 2.5px -1px rgba(0,0,0,0.5); + box-shadow: inset 0 -2px 2.5px -1px rgba(0,0,0,0.25); } ul.tabbar li.active > a { @@ -1007,25 +1128,19 @@ ul.tabbar li.active > a:after { background-color: #0097A7; color: white; border-radius: 50%; - padding: 0.25rem; - min-width: 1.4rem; + width: 1.35rem; + height: 1.35rem; margin-left: 0.5rem; - line-height: 1; + line-height: 1.35rem; text-align: center; vertical-align: middle; } -/* Color of buttons */ -.blue { - color: #2196f3; /* blue 500 */ -} - /* Letter tile base style, responsive square box */ .lettertile { width: 100%; padding-bottom: 100%; border-radius: 50%; - position: relative; } /* Div with letter tile content */ @@ -1044,6 +1159,10 @@ ul.tabbar li.active > a:after { color: rgba(250, 250, 250, 0.8); /* default text color #FAFAFA, gray 50 */ } +.lettertile:hover { + color: white; +} + /* Colors of letter tiles */ .lettertile.color0 { background-color: #ef9a9a; @@ -1073,7 +1192,7 @@ ul.tabbar li.active > a:after { background-color: #c5e1a5; } .lettertile.color9 { - background-color: #fff59d; + background-color: #f0e57d; } .lettertile.color10 { background-color: #f48fb1; @@ -1154,10 +1273,104 @@ ul.tabbar li.active > a:after { } #self-avatar.material-icons, .avatar-box .material-icons { - font-size: 3rem; + font-size: 2.4rem; } .avatar-box .material-icons { color: rgba(250, 250, 250, 0.8); /* #fafafa, gray 50 */ background-color: #c0c0c0; border-radius: 50%; } + +.chip-input { + display: flex; + flex-wrap: wrap; + flex-grow: 1; + cursor: text; + font-size: 1.1rem; + font-weight: normal; + background: transparent; + border-bottom: 1px solid #ccc; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1); + transition: all 0.1s ease-in-out; + width: 100%; + max-height: 10rem; + min-height: 4rem; + overflow-y: scroll; + margin: 0.25rem 0rem 0.25rem 0rem; + padding: 0 0 0.5rem 0.5rem; + outline: none; + color: #666; + align-items: center; + justify-content: flex-start; + text-align: center; +} + +.chip-input.focused { + border-bottom: 1px solid #2196f3; + box-shadow: 0 1px 0 rgba(33, 150, 243, 0.25); +} + +.chip-input > input[type="text"] { + display: inline-block; + width: auto; + border: none; + line-height: 1.8; + box-shadow: none; + min-width: 4rem; + flex: 1 0 auto; + height: 1.8rem; + margin: 0.125rem; +} + +.chip { + display: flex; + flex: 0 0 auto; + align-items: center; + height: 1.8rem; + line-height: 1.8; + border-radius: 0.9rem; + margin: 0.125rem; + background-color: #eee; + white-space: nowrap; + font-size: 90%; +} + +.chip > a { + display: inline-block; + color: #ccc; + background-color: #aaa; + border-radius: 50%; + margin: 0.3rem; + width: 1.175rem; + height: 1.175rem; + line-height: 1.15; + text-decoration: none; +} + +.chip > a:focus, +.chip > a:hover { + text-decoration: none; + color: #ddd; + background-color: #bbb; +} + +.chip .avatar-box { + position: relative; + width: 1.8rem; + min-width: 1.8rem; + height: 1.8rem; + min-height: 1.8rem; + font-size: 1rem; + margin-right: 0.2rem; +} + +.chip .avatar-box .material-icons { + font-size: 1.8rem; +} + +.chip .spacer { + display: inline-block; + margin: 0.3rem; + width: 0.25rem; + height: 1.175rem; +} diff --git a/index.html b/index.html index c5cc4165..a78beea0 100644 --- a/index.html +++ b/index.html @@ -8,7 +8,7 @@ - @@ -210,7 +210,7 @@ if (this.props.avatar === true) { if (this.props.topic && this.props.title && this.props.title.trim()) { var letter = this.props.title.trim().charAt(0); - var color = "lettertile color" + (Math.abs(stringHash(this.props.topic)) % 16); + var color = "lettertile dark-color" + (Math.abs(stringHash(this.props.topic)) % 16); avatar = (