Merge "Layout commit message on left of ChangeScreen2"

This commit is contained in:
Shawn Pearce
2013-11-19 20:21:23 +00:00
committed by Gerrit Code Review
10 changed files with 281 additions and 230 deletions

View File

@@ -55,7 +55,6 @@ import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.dom.client.AnchorElement;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.ClickEvent;
@@ -70,15 +69,16 @@ import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.EventListener;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.ToggleButton;
import com.google.gwtexpui.clippy.client.CopyableLabel;
import com.google.gwtexpui.globalkey.client.GlobalKey;
import com.google.gwtexpui.globalkey.client.KeyCommand;
import com.google.gwtexpui.globalkey.client.KeyCommandSet;
import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
import com.google.gwtorm.client.KeyUtil;
import java.sql.Timestamp;
@@ -128,13 +128,12 @@ public class ChangeScreen2 extends Screen {
@UiField HTMLPanel headerLine;
@UiField Style style;
@UiField Element commitSubjectText;
@UiField ToggleButton star;
@UiField Reload reload;
@UiField AnchorElement permalink;
@UiField Anchor permalink;
@UiField Element reviewersText;
@UiField Reviewers reviewers;
@UiField Element changeIdText;
@UiField Element ownerText;
@UiField Element statusText;
@UiField Image projectQuery;
@@ -142,7 +141,6 @@ public class ChangeScreen2 extends Screen {
@UiField InlineHyperlink branchLink;
@UiField Element submitActionText;
@UiField Element notMergeable;
@UiField CopyableLabel idText;
@UiField Topic topic;
@UiField Element actionText;
@UiField Element actionDate;
@@ -236,7 +234,7 @@ public class ChangeScreen2 extends Screen {
keysNavigation.add(new KeyCommand(0, 'R', Util.C.keyReloadChange()) {
@Override
public void onKeyPress(final KeyPressEvent event) {
reload.reload();
Gerrit.display(PageLinks.toChange(changeId));
}
});
@@ -412,6 +410,12 @@ public class ChangeScreen2 extends Screen {
onReply();
}
@UiHandler("permalink")
void onReload(ClickEvent e) {
e.preventDefault();
Gerrit.display(PageLinks.toChange(changeId));
}
private void onReply() {
if (Gerrit.isSignedIn()) {
replyAction.onReply();
@@ -650,6 +654,7 @@ public class ChangeScreen2 extends Screen {
statusText.setInnerText(Util.toLongString(info.status()));
}
renderCommitSubject(info);
renderOwner(info);
renderActionTextDate(info);
renderHistory(info);
@@ -662,10 +667,7 @@ public class ChangeScreen2 extends Screen {
star.setValue(info.starred());
permalink.setHref(ChangeLink.permalink(changeId));
changeIdText.setInnerText(String.valueOf(info.legacy_id()));
idText.setText("Change-Id: " + info.change_id());
idText.setPreviewText(info.change_id());
reload.set(info);
permalink.setText(String.valueOf(info.legacy_id()));
topic.set(info, revision);
commit.set(commentLinkProcessor, info, revision);
related.set(info, revision);
@@ -697,6 +699,13 @@ public class ChangeScreen2 extends Screen {
setWindowTitle(sb.toString());
}
private void renderCommitSubject(ChangeInfo info) {
RevisionInfo rev = info.revision(revision);
String sub = rev.commit().subject();
commitSubjectText.setInnerSafeHtml(commentLinkProcessor.apply(
new SafeHtmlBuilder().append(sub).linkify()));
}
private void renderOwner(ChangeInfo info) {
// TODO info card hover
String name = info.owner().name() != null
@@ -755,7 +764,7 @@ public class ChangeScreen2 extends Screen {
updateAvailable = new UpdateAvailableBar() {
@Override
void onShow() {
reload.reload();
Gerrit.display(PageLinks.toChange(changeId));
}
void onIgnore(Timestamp newTime) {

View File

@@ -18,15 +18,14 @@ limitations under the License.
xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:c='urn:import:com.google.gerrit.client.change'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:x='urn:import:com.google.gerrit.client.ui'
xmlns:clippy='urn:import:com.google.gwtexpui.clippy.client'>
xmlns:x='urn:import:com.google.gerrit.client.ui'>
<ui:with field='ico' type='com.google.gerrit.client.GerritResources'/>
<ui:with field='res' type='com.google.gerrit.client.change.Resources'/>
<ui:style type='com.google.gerrit.client.change.ChangeScreen2.Style'>
@eval textColor com.google.gerrit.client.Gerrit.getTheme().textColor;
@eval trimColor com.google.gerrit.client.Gerrit.getTheme().trimColor;
@def INFO_WIDTH 450px;
@def COMMIT_WIDTH 560px;
@def HEADER_HEIGHT 29px;
.headerLine {
@@ -35,60 +34,74 @@ limitations under the License.
height: HEADER_HEIGHT;
}
.idBlock {
.subjectLine {
position: relative;
width: INFO_WIDTH;
width: COMMIT_WIDTH;
height: HEADER_HEIGHT;
background-color: trimColor;
color: textColor;
font-family: sans-serif;
font-weight: bold;
}
.star {
cursor: pointer;
outline: none;
position: absolute;
left: 5px;
top: 5px;
}
.idLine, .idStatus {
.subjectText {
width: 460px;
height: HEADER_HEIGHT;
line-height: HEADER_HEIGHT;
}
.idLine {
position: absolute;
top: 0;
left: 29px;
width: 245px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.idStatus {
.subjectButtons {
position: absolute;
top: 0;
right: 26px;
right: 3px;
}
.reload {
.infoLine {
position: absolute;
top: 0;
left: COMMIT_WIDTH;
height: HEADER_HEIGHT;
padding-left: 25px;
}
.statusRight {
position: absolute;
top: 0;
right: 0;
height: HEADER_HEIGHT;
}
.starChangeStatus {
display: inline-block;
width: 325px;
}
.star {
position: absolute;
top: 5px;
left: 0;
cursor: pointer;
outline: none;
}
.changeId {
display: block;
position: absolute;
top: 7px;
right: 5px;
cursor: pointer;
}
.headerButtons {
position: absolute;
top: 0;
left: INFO_WIDTH;
height: HEADER_HEIGHT;
padding-left: 5px;
left: 22px;
width: 300px;
white-space: nowrap;
line-height: HEADER_HEIGHT;
overflow: hidden;
text-overflow: ellipsis;
}
.statusText {
font-weight: bold;
}
.popdown {
position: absolute;
top: 2px;
right: 0;
div.popdown {
display: inline-block;
margin-top: 2px;
margin-left: 5px;
}
.popdown button {
cursor: pointer;
height: 25px;
@@ -110,18 +123,22 @@ limitations under the License.
.popdown button.selected {
font-weight: bold;
}
.headerLine button:disabled,
.headerTable button:disabled,
.popdown button:focus {
outline: none;
}
.headerButtons button:disabled,
#change_infoTable button:disabled,
.popdown button:disabled {
background-color: #999;
background-image: -webkit-linear-gradient(top, #999, #999);
}
.headerTable {
.infoTable {
border-spacing: 0;
}
.headerTable th {
.infoTable th {
width: 60px;
color: #444;
font-weight: normal;
@@ -130,10 +147,6 @@ limitations under the License.
padding-right: 5px;
}
.clippy div {
float: right;
}
.queryProject {
float: left;
cursor: pointer;
@@ -141,7 +154,8 @@ limitations under the License.
.infoColumn {
width: 440px;
padding-right: 10px;
padding-left: 17px;
padding-right: 17px;
vertical-align: top;
}
@@ -158,12 +172,16 @@ limitations under the License.
color: red;
}
.commitColumn, .related {
.commitColumn, .relatedColumn {
padding: 0;
vertical-align: top;
}
.commitColumn {
width: 600px;
.commitColumn { width: COMMIT_WIDTH; }
.relatedColumn { width: 375px; }
.commitSubjectText {
font-family: monospace;
white-space: pre;
}
.labels {
@@ -246,9 +264,12 @@ limitations under the License.
padding: 5px 10px;
}
.sectionHeader .headerButtons {
position: absolute;
left: 300px;
top: 2px;
height: 18px;
border-left: 1px inset #fff;
padding-left: 5px;
padding-top: 3px;
padding-bottom: 3px;
}
@@ -261,57 +282,69 @@ limitations under the License.
<g:HTMLPanel>
<g:HTMLPanel styleName='{style.headerLine}' ui:field='headerLine'>
<div class='{style.idBlock}'>
<c:StarIcon ui:field='star' styleName='{style.star}'/>
<div class='{style.idLine}'>
<ui:msg>Change <span ui:field='changeIdText'/> by <span ui:field='ownerText'/></ui:msg>
</div>
<div ui:field='statusText' class='{style.idStatus}'/>
<a ui:field='permalink' class='{style.reload}'>
<c:Reload ui:field='reload'
title='Reload the change (Shortcut: R)'>
<div class='{style.subjectLine}'>
<div class='{style.subjectText}' ui:field='commitSubjectText'/>
<div class='{style.subjectButtons} {style.headerButtons}'>
<g:Button ui:field='editMessage'
styleName=''
visible='false'
title='Edit commit message (Shortcut: e)'>
<ui:attribute name='title'/>
</c:Reload>
</a>
</div>
<div class='{style.headerButtons}'>
<g:Button ui:field='reply'
styleName=''
title='Reply and score (Shortcut: a)'>
<ui:attribute name='title'/>
<div><ui:msg>Reply&#8230;</ui:msg></div>
</g:Button>
<c:QuickApprove ui:field='quickApprove'
styleName='{style.quickApprove}'
title='Apply score with one click'>
<ui:attribute name='title'/>
</c:QuickApprove>
<g:Button ui:field='editMessage'
styleName=''
visible='false'
title='Edit commit message (Shortcut: e)'>
<ui:attribute name='title'/>
<div><ui:msg>Edit Message</ui:msg></div>
</g:Button>
<div><ui:msg>Edit Message</ui:msg></div>
</g:Button>
</div>
</div>
<g:FlowPanel styleName='{style.popdown}'>
<g:Button ui:field='includedIn' styleName='' visible="false">
<div><ui:msg>Included in</ui:msg></div>
</g:Button>
<g:Button ui:field='revisions' styleName=''>
<div><ui:msg>Revisions</ui:msg></div>
</g:Button>
<g:Button ui:field='download' styleName=''>
<div><ui:msg>Download</ui:msg></div>
</g:Button>
</g:FlowPanel>
<div class='{style.infoLine}'>
<div class='{style.headerButtons}'>
<g:Button ui:field='reply'
styleName=''
title='Reply and score (Shortcut: a)'>
<ui:attribute name='title'/>
<div><ui:msg>Reply&#8230;</ui:msg></div>
</g:Button>
<c:QuickApprove ui:field='quickApprove'
styleName='{style.quickApprove}'
title='Apply score with one click'>
<ui:attribute name='title'/>
</c:QuickApprove>
</div>
</div>
<div class='{style.statusRight}'>
<div class='{style.starChangeStatus}'>
<c:StarIcon ui:field='star' styleName='{style.star}'/>
<span class='{style.changeId}'>
<ui:msg>Change <g:Anchor ui:field='permalink' title='Reload the change (Shortcut: R)'>
<ui:attribute name='title'/>
</g:Anchor> - <span ui:field='statusText' class='{style.statusText}'/></ui:msg>
</span>
</div>
<g:FlowPanel styleName='{style.popdown}'>
<g:Button ui:field='includedIn' styleName='' visible="false">
<div><ui:msg>Included in</ui:msg></div>
</g:Button>
<g:Button ui:field='revisions' styleName=''>
<div><ui:msg>Revisions</ui:msg></div>
</g:Button>
<g:Button ui:field='download' styleName=''>
<div><ui:msg>Download</ui:msg></div>
</g:Button>
</g:FlowPanel>
</div>
</g:HTMLPanel>
<table class='{style.headerTable}'>
<table class='{style.infoTable}'>
<tr>
<td class='{style.commitColumn}'>
<c:CommitBox ui:field='commit'/>
</td>
<td class='{style.infoColumn}'>
<table id='change_infoTable'>
<tr>
<th><ui:msg>Owner</ui:msg></th>
<td ui:field='ownerText'/>
</tr>
<tr>
<th><ui:msg>Reviewers</ui:msg></th>
<td ui:field='reviewersText'/>
@@ -345,6 +378,10 @@ limitations under the License.
</x:InlineHyperlink>
</td>
</tr>
<tr>
<th><ui:msg>Topic</ui:msg></th>
<td><c:Topic ui:field='topic'/></td>
</tr>
<tr>
<th><ui:msg>Strategy</ui:msg></th>
<td>
@@ -357,29 +394,16 @@ limitations under the License.
</div>
</td>
</tr>
<tr><td colspan='2'><c:Actions ui:field='actions'/></td></tr>
<tr>
<th ui:field='actionText'/>
<td ui:field='actionDate'/>
</tr>
<tr>
<th><ui:msg>Change-Id</ui:msg></th>
<td><clippy:CopyableLabel styleName='{style.clippy}' ui:field='idText'/></td>
</tr>
<tr>
<th><ui:msg>Topic</ui:msg></th>
<td><c:Topic ui:field='topic'/></td>
</tr>
<tr><td colspan='2'><c:Actions ui:field='actions'/></td></tr>
</table>
<hr/>
<c:Labels ui:field='labels' styleName='{style.labels}'/>
</td>
<td class='{style.commitColumn}'>
<c:CommitBox ui:field='commit'/>
</td>
<td class='{style.related}'>
<td class='{style.relatedColumn}'>
<c:RelatedChanges ui:field='related'/>
</td>
</tr>

View File

@@ -28,27 +28,61 @@ import com.google.gerrit.reviewdb.client.Change.Status;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.AnchorElement;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwtexpui.clippy.client.CopyableLabel;
import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
class CommitBox extends Composite {
interface Binder extends UiBinder<HTMLPanel, CommitBox> {}
private static final Binder uiBinder = GWT.create(Binder.class);
interface Style extends CssResource {
String collapsed();
String expanded();
}
@UiField Style style;
@UiField Element commitName;
@UiField AnchorElement browserLink;
@UiField InlineHyperlink authorNameEmail;
@UiField Element authorDate;
@UiField InlineHyperlink committerNameEmail;
@UiField Element committerDate;
@UiField Element commitMessageText;
@UiField CopyableLabel idText;
@UiField HTML text;
@UiField ScrollPanel scroll;
@UiField Button more;
private boolean expanded;
CommitBox() {
initWidget(uiBinder.createAndBindUi(this));
addStyleName(style.collapsed());
}
void onShowView() {
more.setVisible(scroll.getMaximumVerticalScrollPosition() > 0);
}
@UiHandler("more")
void onMore(ClickEvent e) {
if (expanded) {
removeStyleName(style.expanded());
addStyleName(style.collapsed());
} else {
removeStyleName(style.collapsed());
addStyleName(style.expanded());
}
expanded = !expanded;
}
void set(CommentLinkProcessor commentLinkProcessor,
@@ -56,14 +90,24 @@ class CommitBox extends Composite {
String revision) {
RevisionInfo revInfo = change.revision(revision);
CommitInfo commit = revInfo.commit();
String sub = commit.subject();
String msg = commit.message();
if (msg.startsWith(sub)) {
msg = msg.substring(sub.length());
if (msg.length() > 0 && msg.charAt(0) == '\n') {
msg = msg.substring(1);
}
}
commitName.setInnerText(revision);
idText.setText("Change-Id: " + change.change_id());
idText.setPreviewText(change.change_id());
formatLink(commit.author(), authorNameEmail,
authorDate, change.status());
formatLink(commit.committer(), committerNameEmail,
committerDate, change.status());
commitMessageText.setInnerSafeHtml(commentLinkProcessor.apply(
new SafeHtmlBuilder().append(commit.message()).linkify()));
text.setHTML(commentLinkProcessor.apply(
new SafeHtmlBuilder().append(msg).linkify()));
GitwebLink gw = Gerrit.getGitwebLink();
if (gw != null && gw.canLink(revInfo)) {
@@ -86,7 +130,7 @@ class CommitBox extends Composite {
return person.name() + " <" + person.email() + ">";
}
public static String owner(GitPerson person) {
private static String owner(GitPerson person) {
if (person.email() != null) {
return person.email();
} else if (person.name() != null) {

View File

@@ -17,34 +17,82 @@ limitations under the License.
<ui:UiBinder
xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:x='urn:import:com.google.gerrit.client.ui'>
<ui:style>
.commitHeader {
border-spacing: 0;
padding: 0;
width: 564px;
xmlns:x='urn:import:com.google.gerrit.client.ui'
xmlns:clippy='urn:import:com.google.gwtexpui.clippy.client'>
<ui:image field="toggle" src="more_less.png"/>
<ui:style type='com.google.gerrit.client.change.CommitBox.Style'>
@eval trimColor com.google.gerrit.client.Gerrit.getTheme().trimColor;
.collapsed .scroll { height: 250px }
.scroll, .more { width: 560px }
.scroll {
border-right: 1px solid trimColor;
border-bottom: 1px solid trimColor;
}
.commitHeader th { width: 70px; }
.commitHeader td { white-space: pre; }
.commitMessageBox { margin: 2px; }
.commitMessage {
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
border: 1px solid white;
background-color: white;
.text {
font-family: monospace;
white-space: pre;
width: 47em;
}
.more {
height: 8px;
line-height: 8px;
text-align: center;
}
.moreButton {
padding: 0 5px 0 5px;
margin: 0;
border: none;
height: 8px;
background-color: #F7F7F7;
}
.moreButton:focus {
outline: none;
}
@sprite .toggle {
gwt-image: "toggle";
width: 13px;
height: 8px;
padding: 0;
}
.collapsed .toggle { background-position: -13px -8px }
.expanded .toggle { background-position: 0px -8px }
.collapsed button:hover .toggle { background-position: -13px 0px }
.expanded button:hover .toggle { background-position: 0px 0px }
.header {
border-spacing: 0;
padding: 0;
width: 560px;
}
.header th { width: 70px; }
.header td { white-space: nowrap; }
.date { width: 132px; }
.clippy {
position: relative;
}
.clippy div {
position: absolute;
top: 0px;
right: -16px;
}
</ui:style>
<g:HTMLPanel>
<table class='{style.commitHeader}'>
<tr>
<th><ui:msg>Commit</ui:msg></th>
<td ui:field='commitName'/>
<td><a ui:field='browserLink' href=""/></td>
</tr>
<g:ScrollPanel styleName='{style.scroll}' ui:field='scroll'>
<g:HTML styleName='{style.text}' ui:field='text'/>
</g:ScrollPanel>
<div class='{style.more}'>
<g:Button ui:field='more'
styleName='{style.moreButton}'
title='Expand/Collapse'>
<ui:attribute name='title'/>
<div class='{style.toggle}'/>
</g:Button>
</div>
<table class='{style.header}'>
<tr>
<th><ui:msg>Author</ui:msg></th>
<td><x:InlineHyperlink ui:field='authorNameEmail'
@@ -52,7 +100,7 @@ limitations under the License.
<ui:attribute name='title'/>
</x:InlineHyperlink>
</td>
<td ui:field='authorDate'/>
<td ui:field='authorDate' class='{style.date}'/>
</tr>
<tr>
<th><ui:msg>Committer</ui:msg></th>
@@ -61,12 +109,17 @@ limitations under the License.
<ui:attribute name='title'/>
</x:InlineHyperlink>
</td>
<td ui:field='committerDate'/>
<td ui:field='committerDate' class='{style.date}'/>
</tr>
<tr>
<th><ui:msg>Commit</ui:msg></th>
<td ui:field='commitName'/>
<td><a ui:field='browserLink' href=""/></td>
</tr>
<tr>
<th><ui:msg>Change-Id</ui:msg></th>
<td><clippy:CopyableLabel styleName='{style.clippy}' ui:field='idText'/></td>
</tr>
</table>
<div class='{style.commitMessageBox}'>
<div class='{style.commitMessage}' ui:field='commitMessageText'/>
</div>
</g:HTMLPanel>
</ui:UiBinder>

View File

@@ -30,7 +30,7 @@ limitations under the License.
<div class='{res.style.section}'>
<c:NpTextArea
visibleLines='30'
characterWidth='72'
characterWidth='78'
styleName='{style.commitMessage}'
ui:field='message'/>
</div>

View File

@@ -1,77 +0,0 @@
// Copyright (C) 2013 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.client.change;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.changes.ChangeInfo;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.impl.HyperlinkImpl;
class Reload extends Image implements ClickHandler,
MouseOverHandler, MouseOutHandler {
private static final HyperlinkImpl link = GWT.create(HyperlinkImpl.class);
private Change.Id changeId;
private boolean in;
Reload() {
setResource(Resources.I.reload_black());
addClickHandler(this);
addMouseOverHandler(this);
addMouseOutHandler(this);
}
void set(ChangeInfo info) {
changeId = info.legacy_id();
}
void reload() {
Gerrit.display(PageLinks.toChange(changeId));
}
@Override
public void onMouseOver(MouseOverEvent event) {
if (!in) {
in = true;
setResource(Resources.I.reload_white());
}
}
@Override
public void onMouseOut(MouseOutEvent event) {
if (in) {
in = false;
setResource(Resources.I.reload_black());
}
}
@Override
public void onClick(ClickEvent e) {
if (link.handleAsClick(e.getNativeEvent().<Event> cast())) {
e.preventDefault();
e.stopPropagation();
reload();
}
}
}

View File

@@ -25,8 +25,6 @@ public interface Resources extends ClientBundle {
@Source("star_open.png") ImageResource star_open();
@Source("star_filled.png") ImageResource star_filled();
@Source("reload_black.png") ImageResource reload_black();
@Source("reload_white.png") ImageResource reload_white();
@Source("remove_reviewer.png") ImageResource remove_reviewer();
@Source("common.css") Style style();

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 B