Studio: adding course re-run-centric static template rendering * initial HTML for dashboard states * initial HTML for new course re-run view/form * initial HTML placeholder for outline alert UI Conflicts: cms/templates/index.html Studio: adding styling for course re-run-centric views * adding new view/page mast-wizard type * refactoring create course/element form styling * adding course re-run view specific styling * adding courses processing styling (w/ alerts and status) Course rerun server-side updates: support display_name and DuplicateCourseError. Studio: further design revisions and tweaks from feedback * removing new window attribute from re-run control * removing links from processing courses * revising look/feel of dismiss action on dashboard + alert * correcting font-weight of dashboard processing title * adding extra space to course rerun action on dashboard * re-wording secondary cancel action on rerun view Conflicts: cms/templates/index.html Added interation on unsucceeded courses in dashboard Studio: removing 'rel=external' property from course re-run actions Studio: removing hover styles for processing courses Fixed value bug in split and set course listing to display run moved task.py for rerun
457 lines
7.8 KiB
SCSS
457 lines
7.8 KiB
SCSS
// studio - elements - forms
|
|
// ====================
|
|
|
|
// forms - general
|
|
input[type="text"],
|
|
input[type="email"],
|
|
input[type="password"],
|
|
textarea.text {
|
|
@include box-sizing(border-box);
|
|
@include linear-gradient($gray-l5, $white);
|
|
@extend %t-copy-sub2;
|
|
padding: 6px 8px 8px;
|
|
border: 1px solid $gray-l2;
|
|
border-radius: 2px;
|
|
background-color: $gray-l5;
|
|
box-shadow: inset 0 1px 2px $shadow-l1;
|
|
font-family: 'Open Sans', sans-serif;
|
|
color: $baseFontColor;
|
|
outline: 0;
|
|
|
|
&::-webkit-input-placeholder,
|
|
&:-moz-placeholder,
|
|
&:-ms-input-placeholder {
|
|
color: $gray-l2;
|
|
}
|
|
|
|
&:focus {
|
|
@include linear-gradient($paleYellow, tint($paleYellow, 90%));
|
|
outline: 0;
|
|
}
|
|
}
|
|
|
|
// ====================
|
|
|
|
// forms - fields - not editable
|
|
.field.is-not-editable {
|
|
|
|
& label.is-focused {
|
|
color: $gray-d2;
|
|
}
|
|
|
|
label, input, textarea {
|
|
pointer-events: none;
|
|
}
|
|
}
|
|
|
|
// ====================
|
|
|
|
// field with error
|
|
.field.error {
|
|
|
|
input, textarea {
|
|
border-color: $red;
|
|
}
|
|
}
|
|
|
|
// ====================
|
|
|
|
// forms - additional UI
|
|
form {
|
|
|
|
// CASE: cosmetic checkbox input
|
|
.checkbox-cosmetic {
|
|
|
|
.input-checkbox-checked, .input-checkbox-unchecked, .label {
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
.input-checkbox-checked, .input-checkbox-unchecked {
|
|
width: $baseline;
|
|
}
|
|
|
|
.input-checkbox {
|
|
@extend %cont-text-sr;
|
|
|
|
// CASE: unchecked
|
|
~ label .input-checkbox-checked {
|
|
display: none;
|
|
}
|
|
|
|
~ label .input-checkbox-unchecked {
|
|
display: inline-block;
|
|
}
|
|
|
|
// CASE: checked
|
|
&:checked {
|
|
|
|
~ label .input-checkbox-checked {
|
|
display: inline-block;
|
|
}
|
|
|
|
~ label .input-checkbox-unchecked {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// CASE: file input
|
|
input[type=file] {
|
|
@extend %t-copy-sub1;
|
|
}
|
|
|
|
.note {
|
|
@include box-sizing(border-box);
|
|
|
|
.title {
|
|
|
|
}
|
|
|
|
.copy {
|
|
|
|
}
|
|
|
|
// note with actions
|
|
&.has-actions {
|
|
@include clearfix();
|
|
|
|
.title {
|
|
|
|
}
|
|
|
|
.copy {
|
|
|
|
}
|
|
|
|
.list-actions {
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
.note-promotion {
|
|
|
|
}
|
|
}
|
|
|
|
// ELEM: form
|
|
// form styling for creating a new content item (course, user, textbook)
|
|
// TODO: refactor this into a placeholder to extend.
|
|
.form-create {
|
|
@extend %ui-window;
|
|
|
|
.title {
|
|
@extend %t-title4;
|
|
@extend %t-strong;
|
|
padding: $baseline ($baseline*1.5) 0 ($baseline*1.5);
|
|
}
|
|
|
|
fieldset {
|
|
padding: $baseline ($baseline*1.5);
|
|
}
|
|
|
|
|
|
.list-input {
|
|
@extend %cont-no-list;
|
|
|
|
.field {
|
|
margin: 0 0 ($baseline*0.75) 0;
|
|
|
|
&:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
&.required {
|
|
|
|
label {
|
|
@extend %t-strong;
|
|
}
|
|
|
|
label:after {
|
|
margin-left: ($baseline/4);
|
|
content: "*";
|
|
}
|
|
}
|
|
|
|
label, input, textarea {
|
|
display: block;
|
|
}
|
|
|
|
label {
|
|
@extend %t-copy-sub1;
|
|
@include transition(color $tmg-f3 ease-in-out 0s);
|
|
margin: 0 0 ($baseline/4) 0;
|
|
|
|
&.is-focused {
|
|
color: $blue;
|
|
}
|
|
}
|
|
|
|
|
|
input, textarea {
|
|
@extend %t-copy-base;
|
|
@include transition(all $tmg-f2 ease-in-out 0s);
|
|
height: 100%;
|
|
width: 100%;
|
|
padding: ($baseline/2);
|
|
|
|
&.long {
|
|
width: 100%;
|
|
}
|
|
|
|
&.short {
|
|
width: 25%;
|
|
}
|
|
|
|
/*@include placeholder {
|
|
color: $gray-l3;
|
|
}*/
|
|
|
|
&:focus {
|
|
|
|
+ .tip {
|
|
color: $gray;
|
|
}
|
|
}
|
|
}
|
|
|
|
textarea.long {
|
|
height: ($baseline*5);
|
|
}
|
|
|
|
input[type="checkbox"] {
|
|
display: inline-block;
|
|
margin-right: ($baseline/4);
|
|
width: auto;
|
|
height: auto;
|
|
|
|
& + label {
|
|
display: inline-block;
|
|
}
|
|
}
|
|
|
|
.tip {
|
|
@extend %t-copy-sub2;
|
|
@include transition(color 0.15s ease-in-out);
|
|
|
|
|
|
display: block;
|
|
margin-top: ($baseline/4);
|
|
color: $gray-l3;
|
|
}
|
|
|
|
.tip-note {
|
|
display: block;
|
|
margin-top: ($baseline/4);
|
|
}
|
|
|
|
.tip-error {
|
|
display: none;
|
|
float: none;
|
|
}
|
|
|
|
&.error {
|
|
label {
|
|
color: $red;
|
|
}
|
|
|
|
.is-showing {
|
|
@extend %anim-fadeIn;
|
|
}
|
|
|
|
.is-hiding {
|
|
@extend %anim-fadeOut;
|
|
}
|
|
|
|
.tip-error {
|
|
display: block;
|
|
color: $red;
|
|
}
|
|
|
|
input {
|
|
border-color: $red;
|
|
}
|
|
}
|
|
}
|
|
|
|
.field-inline {
|
|
|
|
input, textarea, select {
|
|
width: 62%;
|
|
display: inline-block;
|
|
}
|
|
|
|
.tip-stacked {
|
|
display: inline-block;
|
|
float: right;
|
|
width: 35%;
|
|
margin-top: 0;
|
|
}
|
|
|
|
&.error {
|
|
.tip-error {
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
.field-group {
|
|
@include clearfix();
|
|
margin: 0 0 ($baseline/2) 0;
|
|
|
|
.field {
|
|
display: block;
|
|
width: 47%;
|
|
border-bottom: none;
|
|
margin: 0 ($baseline*0.75) 0 0;
|
|
padding: ($baseline/4) 0 0 0;
|
|
float: left;
|
|
position: relative;
|
|
|
|
&:nth-child(odd) {
|
|
float: left;
|
|
}
|
|
|
|
&:nth-child(even) {
|
|
float: right;
|
|
margin-right: 0;
|
|
}
|
|
|
|
input, textarea {
|
|
width: 100%;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.actions {
|
|
box-shadow: inset 0 1px 2px $shadow;
|
|
margin-top: ($baseline*0.75);
|
|
border-top: 1px solid $gray-l1;
|
|
padding: ($baseline*0.75) ($baseline*1.5);
|
|
background: $gray-l6;
|
|
|
|
.action {
|
|
@include transition(all $tmg-f2 linear 0s);
|
|
@extend %t-strong;
|
|
display: inline-block;
|
|
padding: ($baseline/5) $baseline;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.action-primary {
|
|
@include blue-button;
|
|
@extend %t-action2;
|
|
}
|
|
|
|
.action-secondary {
|
|
@include grey-button;
|
|
@extend %t-action2;
|
|
}
|
|
}
|
|
}
|
|
|
|
// form - inline xblock name edit on unit, container, outline
|
|
|
|
// TOOD: abstract this out into a Sass placeholder
|
|
.incontext-editor.is-editable {
|
|
|
|
.incontext-editor-value,
|
|
.incontext-editor-action-wrapper {
|
|
@extend %cont-truncated;
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
max-width: 80%;
|
|
}
|
|
|
|
.incontext-editor-open-action {
|
|
@extend %ui-btn-non-blue;
|
|
@extend %t-copy-base;
|
|
padding-top: ($baseline/10);
|
|
}
|
|
|
|
.incontext-editor-form {
|
|
display: none;
|
|
}
|
|
|
|
&.is-editing {
|
|
|
|
.incontext-editor-value,
|
|
.incontext-editor-action-wrapper {
|
|
display: none;
|
|
}
|
|
|
|
.incontext-editor-form {
|
|
display: inline-block;
|
|
}
|
|
}
|
|
}
|
|
|
|
// ELEM: form wrapper
|
|
.wrapper-create-element {
|
|
height: 0;
|
|
margin-bottom: $baseline;
|
|
opacity: 0.0;
|
|
pointer-events: none;
|
|
overflow: hidden;
|
|
|
|
&.animate {
|
|
@include transition(opacity $tmg-f1 ease-in-out 0s, height $tmg-f1 ease-in-out 0s);
|
|
}
|
|
|
|
&.is-shown {
|
|
height: auto; // define a specific height for the animating version of this UI to work properly
|
|
opacity: 1.0;
|
|
pointer-events: auto;
|
|
}
|
|
}
|
|
|
|
// ====================
|
|
|
|
// forms - grandfathered
|
|
input.search {
|
|
padding: 6px 15px 8px 30px;
|
|
@include box-sizing(border-box);
|
|
border: 1px solid $darkGrey;
|
|
border-radius: 20px;
|
|
background: url(../img/search-icon.png) no-repeat 8px 7px #edf1f5;
|
|
font-family: 'Open Sans', sans-serif;
|
|
color: $baseFontColor;
|
|
outline: 0;
|
|
|
|
&::-webkit-input-placeholder {
|
|
color: #979faf;
|
|
}
|
|
}
|
|
|
|
label {
|
|
@extend %t-copy-sub2;
|
|
}
|
|
|
|
code {
|
|
padding: 0 4px;
|
|
border-radius: 3px;
|
|
background: #eee;
|
|
font-family: Monaco, monospace;
|
|
}
|
|
|
|
.CodeMirror {
|
|
@extend %t-copy-sub1;
|
|
background: #fff;
|
|
}
|
|
|
|
.text-editor {
|
|
width: 100%;
|
|
min-height: 80px;
|
|
padding: 10px;
|
|
@include box-sizing(border-box);
|
|
border: 1px solid $mediumGrey;
|
|
@include linear-gradient(top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.3));
|
|
background-color: #edf1f5;
|
|
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset;
|
|
font-family: Monaco, monospace;
|
|
}
|