/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

@import "bootstrap-variables";

$logo-path: "/images/logo.png";
$input-height: 28px;
$ignite-placeholder-color: #999999;
$ignite-border-color: #ddd;
$ignite-darck-border-color: #aaa;
$ignite-border-bottom-color: $brand-primary;
$ignite-background-color: #fff;
// New background color for layouts without white content box
$ignite-new-background-color: #f9f9f9;
$ignite-header-color: #555;
$ignite-invalid-color: $brand-primary;
$ignite-button-border-radius: 4px;

// Color palette
$ignite-brand-primary: #ee2b27; // Red
$ignite-brand-success: #0067b9; // Blue

// Color for statuses
$ignite-status-active: #417505;
$ignite-status-inactive: #ee2b27;