/*
 * 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.
 */

//
// Forms
// --------------------------------------------------


// FORM FIELD FEEDBACK STATES
// --------------------------

// Error
#login .form-group.error {
  display: none;
}

.control-label {
	line-height: 24px;
	color: #C0C0C0;
	font-weight: normal;
}

.form-horizontal .form-group {
	margin-left: 20px;
	margin-right: 0px;
}

.form-control {
	height: 27px;
	padding: 0 10px;
}

.form-group {
	margin-bottom: 0;
}

// vertical-form is a custom class
.modal-body.vertical-form label {
	display: block;
}


#node-content fieldset {
	margin-bottom: 5px;
}