// Copyright (C) 2009 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;

import com.google.gwt.resources.client.CssResource;

public interface GerritCss extends CssResource {
  String accountDashboard();
  String accountInfoBlock();
  String accountLinkPanel();
  String accountPassword();
  String accountUsername();
  String activeRow();
  String addBranch();
  String addMemberTextBox();
  String addSshKeyPanel();
  String addWatchPanel();
  String avatarInfoPanel();
  String bottomheader();
  String branchTableDeleteButton();
  String branchTablePrevNextLinks();
  String cAPPROVAL();
  String cLastUpdate();
  String cOWNER();
  String cSIZE();
  String cSUBJECT();
  String cSTATUS();
  String changeSize();
  String changeTable();
  String changeTablePrevNextLinks();
  String commentedActionDialog();
  String commentedActionMessage();
  String contributorAgreementAlreadySubmitted();
  String contributorAgreementButton();
  String contributorAgreementLegal();
  String contributorAgreementShortDescription();
  String createProjectPanel();
  String dataCell();
  String dataCellHidden();
  String dataHeader();
  String dataHeaderHidden();
  String downloadBox();
  String downloadBoxTable();
  String downloadBoxTableCommandColumn();
  String downloadBoxSpacer();
  String downloadBoxScheme();
  String downloadBoxCopyLabel();
  String downloadLink();
  String downloadLinkCopyLabel();
  String downloadLinkHeader();
  String downloadLinkHeaderGap();
  String downloadLinkList();
  String downloadLink_Active();
  String editHeadButton();
  String emptySection();
  String errorDialog();
  String errorDialogButtons();
  String errorDialogErrorType();
  String errorDialogGlass();
  String errorDialogTitle();
  String extensionPanel();
  String loadingPluginsDialog();
  String gerritBody();
  String gerritTopMenu();
  String greenCheckClass();
  String groupDescriptionPanel();
  String groupIncludesTable();
  String groupMembersTable();
  String groupName();
  String groupNamePanel();
  String groupNameTextBox();
  String groupOptionsPanel();
  String groupOwnerPanel();
  String groupOwnerTextBox();
  String groupUUIDPanel();
  String header();
  String iconCell();
  String iconHeader();
  String identityUntrustedExternalId();
  String infoBlock();
  String inputFieldTypeHint();
  String labelNotApplicable();
  String leftMostCell();
  String link();
  String linkMenuBar();
  String linkMenuItemNotLast();
  String maxObjectSizeLimitEffectiveLabel();
  String menuBarUserName();
  String menuBarUserNameAvatar();
  String menuBarUserNameFocusPanel();
  String menuBarUserNamePanel();
  String menuItem();
  String menuScreenMenuBar();
  String needsReview();
  String negscore();
  String oauthExpires();
  String oauthInfoBlock();
  String oauthPanel();
  String oauthPanelCookieEntry();
  String oauthPanelCookieHeading();
  String oauthPanelNetRCEntry();
  String oauthPanelNetRCHeading();
  String oauthToken();
  String pagingLink();
  String patchSetActions();
  String pluginProjectConfigInheritedValue();
  String pluginsTable();
  String posscore();
  String projectActions();
  String projectFilterLabel();
  String projectFilterPanel();
  String projectNameColumn();
  String queryIcon();
  String rebaseContentPanel();
  String rebaseSuggestBox();
  String registerScreenExplain();
  String registerScreenNextLinks();
  String registerScreenSection();
  String rpcStatus();
  String screen();
  String screenHeader();
  String searchPanel();
  String suggestBoxPopup();
  String sectionHeader();
  String singleLine();
  String smallHeading();
  String specialBranchDataCell();
  String specialBranchIconCell();
  String sshHostKeyPanel();
  String sshHostKeyPanelFingerprintData();
  String sshHostKeyPanelHeading();
  String sshHostKeyPanelKnownHostEntry();
  String sshKeyPanelEncodedKey();
  String sshKeyPanelInvalid();
  String sshKeyTable();
  String stringListPanelButtons();
  String topmenu();
  String topmenuMenuLeft();
  String topmenuMenuRight();
  String topmenuTDglue();
  String topmenuTDmenu();
  String topmost();
  String userInfoPopup();
  String usernameField();
  String watchedProjectFilter();
}
