// Copyright (C) 2014 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 net.codemirror.theme;

import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ExternalTextResource;

public interface Themes extends ClientBundle {
  Themes I = GWT.create(Themes.class);

  @Source("3024-day.css")
  ExternalTextResource day_3024();

  @Source("3024-night.css")
  ExternalTextResource night_3024();

  @Source("abcdef.css")
  ExternalTextResource abcdef();

  @Source("ambiance.css")
  ExternalTextResource ambiance();

  @Source("base16-dark.css")
  ExternalTextResource base16_dark();

  @Source("base16-light.css")
  ExternalTextResource base16_light();

  @Source("bespin.css")
  ExternalTextResource bespin();

  @Source("blackboard.css")
  ExternalTextResource blackboard();

  @Source("cobalt.css")
  ExternalTextResource cobalt();

  @Source("colorforth.css")
  ExternalTextResource colorforth();

  @Source("dracula.css")
  ExternalTextResource dracula();

  @Source("duotone-dark.css")
  ExternalTextResource duotone_dark();

  @Source("duotone-light.css")
  ExternalTextResource duotone_light();

  @Source("eclipse.css")
  ExternalTextResource eclipse();

  @Source("elegant.css")
  ExternalTextResource elegant();

  @Source("erlang-dark.css")
  ExternalTextResource erlang_dark();

  @Source("hopscotch.css")
  ExternalTextResource hopscotch();

  @Source("icecoder.css")
  ExternalTextResource icecoder();

  @Source("isotope.css")
  ExternalTextResource isotope();

  @Source("lesser-dark.css")
  ExternalTextResource lesser_dark();

  @Source("liquibyte.css")
  ExternalTextResource liquibyte();

  @Source("material.css")
  ExternalTextResource material();

  @Source("mbo.css")
  ExternalTextResource mbo();

  @Source("mdn-like.css")
  ExternalTextResource mdn_like();

  @Source("midnight.css")
  ExternalTextResource midnight();

  @Source("monokai.css")
  ExternalTextResource monokai();

  @Source("neat.css")
  ExternalTextResource neat();

  @Source("neo.css")
  ExternalTextResource neo();

  @Source("night.css")
  ExternalTextResource night();

  @Source("paraiso-dark.css")
  ExternalTextResource paraiso_dark();

  @Source("paraiso-light.css")
  ExternalTextResource paraiso_light();

  @Source("pastel-on-dark.css")
  ExternalTextResource pastel_on_dark();

  @Source("railscasts.css")
  ExternalTextResource railscasts();

  @Source("rubyblue.css")
  ExternalTextResource rubyblue();

  @Source("seti.css")
  ExternalTextResource seti();

  @Source("solarized.css")
  ExternalTextResource solarized();

  @Source("the-matrix.css")
  ExternalTextResource the_matrix();

  @Source("tomorrow-night-bright.css")
  ExternalTextResource tomorrow_night_bright();

  @Source("tomorrow-night-eighties.css")
  ExternalTextResource tomorrow_night_eighties();

  @Source("ttcn.css")
  ExternalTextResource ttcn();

  @Source("twilight.css")
  ExternalTextResource twilight();

  @Source("vibrant-ink.css")
  ExternalTextResource vibrant_ink();

  @Source("xq-dark.css")
  ExternalTextResource xq_dark();

  @Source("xq-light.css")
  ExternalTextResource xq_light();

  @Source("yeti.css")
  ExternalTextResource yeti();

  @Source("zenburn.css")
  ExternalTextResource zenburn();

  // When adding a resource, update:
  // - static initializer in ThemeLoader
  // - enum value in com.google.gerrit.extensions.common.Theme
}
