@khanacademy/perseus 1.4.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/es/index.css +9 -245
- package/dist/es/index.js +138 -584
- package/dist/es/index.js.map +1 -1
- package/dist/index.css +9 -245
- package/dist/index.js +135 -581
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/__stories__/hints-renderer.stories.jsx +9 -1
- package/src/__testdata__/graphie_testdata.js +53 -0
- package/src/__tests__/__snapshots__/perseus-markdown_test.jsx.snap +0 -9
- package/src/__tests__/__snapshots__/renderer_test.jsx.snap +0 -9
- package/src/components/__stories__/graphie.stories.jsx +5 -1
- package/src/hint-renderer.jsx +11 -14
- package/src/perseus-api.jsx +0 -23
- package/src/perseus-markdown.jsx +0 -25
- package/src/styles/constants.js +0 -21
- package/src/styles/global-constants.js +0 -6
- package/src/styles/khan-exercise.css +9 -1
- package/src/styles/perseus-renderer.less +0 -259
- package/src/styles/variables.less +0 -11
- package/src/styles/variables.shared.less +0 -10
- package/src/types.js +0 -16
- package/src/widgets/__stories__/input-number.stories.jsx +0 -14
- package/src/widgets/__stories__/radio.stories.jsx +0 -3
- package/src/widgets/__tests__/__snapshots__/definition_test.js.snap +18 -28
- package/src/widgets/__tests__/__snapshots__/group_test.jsx.snap +0 -9
- package/src/widgets/__tests__/__snapshots__/image_test.jsx.snap +0 -18
- package/src/widgets/__tests__/__snapshots__/numeric-input_test.jsx.snap +2 -440
- package/src/widgets/__tests__/__snapshots__/radio_test.jsx.snap +66 -3726
- package/src/widgets/__tests__/numeric-input_test.jsx +54 -118
- package/src/widgets/__tests__/radio/choice-icon_test.jsx +25 -75
- package/src/widgets/__tests__/radio_test.jsx +362 -394
- package/src/widgets/definition.jsx +27 -14
- package/src/widgets/input-number.jsx +2 -60
- package/src/widgets/numeric-input.jsx +17 -89
- package/src/widgets/radio/__stories__/base-radio.stories.jsx +1 -3
- package/src/widgets/radio/__stories__/choice-icon.stories.jsx +23 -105
- package/src/widgets/radio/__stories__/option-status.stories.jsx +0 -8
- package/src/widgets/radio/base-radio.jsx +13 -96
- package/src/widgets/radio/choice-icon/choice-icon.jsx +177 -50
- package/src/widgets/radio/choice-icon/cross-out-line.jsx +9 -13
- package/src/widgets/radio/choice-icon/shared-styles.js +2 -3
- package/src/widgets/radio/choice.jsx +5 -59
- package/src/widgets/radio/option-status.jsx +2 -14
- package/src/components/__stories__/possible-answers.stories.jsx +0 -22
- package/src/components/possible-answers.jsx +0 -36
- package/src/styles/widgets/definition.less +0 -86
- package/src/widgets/radio/__stories__/sat-styles.stories.jsx +0 -191
- package/src/widgets/radio/choice-icon/library-choice-icon.jsx +0 -225
- package/src/widgets/radio/choice-icon/sat-choice-icon.jsx +0 -120
package/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// @flow
|
|
2
2
|
|
|
3
|
+
import {View} from "@khanacademy/wonder-blocks-core";
|
|
3
4
|
import React from "react";
|
|
4
5
|
|
|
5
6
|
import HintsRenderer from "../hints-renderer.jsx";
|
|
@@ -48,5 +49,12 @@ export default ({
|
|
|
48
49
|
}: Story);
|
|
49
50
|
|
|
50
51
|
export const Interactive = (args: StoryArgs): $FlowFixMe => {
|
|
51
|
-
return
|
|
52
|
+
return (
|
|
53
|
+
// Sorry for the hacks! The HintRenderer uses absolute positioning
|
|
54
|
+
// for the "1 / 3" label that is rendered left of the hint. So we shift
|
|
55
|
+
// everything over so we can see it.
|
|
56
|
+
<View style={{left: 80}}>
|
|
57
|
+
<HintsRenderer {...args} />
|
|
58
|
+
</View>
|
|
59
|
+
);
|
|
52
60
|
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import type {PerseusItem} from "../perseus-types.js";
|
|
4
|
+
|
|
5
|
+
export const itemWithPieChart: PerseusItem = {
|
|
6
|
+
answerArea: {
|
|
7
|
+
calculator: false,
|
|
8
|
+
chi2Table: false,
|
|
9
|
+
periodicTable: false,
|
|
10
|
+
tTable: false,
|
|
11
|
+
zTable: false,
|
|
12
|
+
},
|
|
13
|
+
hints: [],
|
|
14
|
+
itemDataVersion: {
|
|
15
|
+
major: 0,
|
|
16
|
+
minor: 1,
|
|
17
|
+
},
|
|
18
|
+
question: {
|
|
19
|
+
content: "[[☃ image 1]]",
|
|
20
|
+
images: {},
|
|
21
|
+
widgets: {
|
|
22
|
+
"image 1": {
|
|
23
|
+
alignment: "block",
|
|
24
|
+
graded: true,
|
|
25
|
+
options: {
|
|
26
|
+
alt: "This chart presents a pie graph divided into 2 sectors: 28 percent are unsuccessful and 72 percent are successful.",
|
|
27
|
+
backgroundImage: {
|
|
28
|
+
height: 210,
|
|
29
|
+
url: "web+graphie://cdn.kastatic.org/ka-perseus-graphie/7c0a5afb8670fad738df800ffe16c5e516b48777",
|
|
30
|
+
width: 210,
|
|
31
|
+
},
|
|
32
|
+
box: [210, 210],
|
|
33
|
+
caption: "Source: NASA “Current and Past Missions”",
|
|
34
|
+
labels: [],
|
|
35
|
+
range: [
|
|
36
|
+
[0, 10],
|
|
37
|
+
[0, 10],
|
|
38
|
+
],
|
|
39
|
+
static: false,
|
|
40
|
+
title: "Percentage of Successful Cometary Missions (1978-2014)",
|
|
41
|
+
},
|
|
42
|
+
static: false,
|
|
43
|
+
type: "image",
|
|
44
|
+
version: {
|
|
45
|
+
major: 0,
|
|
46
|
+
minor: 0,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
_multi: null,
|
|
52
|
+
answer: null,
|
|
53
|
+
};
|
|
@@ -21,23 +21,14 @@ exports[`perseus markdown output should output columns 1`] = `
|
|
|
21
21
|
<div
|
|
22
22
|
className="perseus-column"
|
|
23
23
|
>
|
|
24
|
-
<div
|
|
25
|
-
className="sat-header-grafting-area"
|
|
26
|
-
/>
|
|
27
24
|
<div
|
|
28
25
|
className="perseus-column-content"
|
|
29
26
|
>
|
|
30
|
-
<div
|
|
31
|
-
className="sat-skill-subscore-grafting-area"
|
|
32
|
-
/>
|
|
33
27
|
<div
|
|
34
28
|
className="paragraph"
|
|
35
29
|
>
|
|
36
30
|
col2
|
|
37
31
|
</div>
|
|
38
|
-
<div
|
|
39
|
-
className="sat-grafting-area"
|
|
40
|
-
/>
|
|
41
32
|
</div>
|
|
42
33
|
</div>
|
|
43
34
|
</div>,
|
|
@@ -302,23 +302,14 @@ exports[`renderer rendering should render columns 1`] = `
|
|
|
302
302
|
<div
|
|
303
303
|
class="perseus-column"
|
|
304
304
|
>
|
|
305
|
-
<div
|
|
306
|
-
class="sat-header-grafting-area"
|
|
307
|
-
/>
|
|
308
305
|
<div
|
|
309
306
|
class="perseus-column-content"
|
|
310
307
|
>
|
|
311
|
-
<div
|
|
312
|
-
class="sat-skill-subscore-grafting-area"
|
|
313
|
-
/>
|
|
314
308
|
<div
|
|
315
309
|
class="paragraph"
|
|
316
310
|
>
|
|
317
311
|
Stuff in column 2
|
|
318
312
|
</div>
|
|
319
|
-
<div
|
|
320
|
-
class="sat-grafting-area"
|
|
321
|
-
/>
|
|
322
313
|
</div>
|
|
323
314
|
</div>
|
|
324
315
|
</div>
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// @flow
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
|
|
4
|
+
import {ItemRendererWithDebugUI} from "../../../../../testing/item-renderer-with-debug-ui.jsx";
|
|
5
|
+
import {itemWithPieChart} from "../../__testdata__/graphie_testdata.js";
|
|
4
6
|
import Graphie from "../graphie.jsx";
|
|
5
7
|
|
|
6
8
|
type StoryArgs = {||};
|
|
@@ -25,4 +27,6 @@ export const SquareBoxSizeAndOtherwiseEmpty = (args: StoryArgs): React.Node => {
|
|
|
25
27
|
);
|
|
26
28
|
};
|
|
27
29
|
|
|
28
|
-
|
|
30
|
+
export const PieChartGraphieLabels = (args: StoryArgs): React.Node => {
|
|
31
|
+
return <ItemRendererWithDebugUI item={itemWithPieChart} />;
|
|
32
|
+
};
|
package/src/hint-renderer.jsx
CHANGED
|
@@ -93,20 +93,17 @@ class HintRenderer extends React.Component<Props> {
|
|
|
93
93
|
{i18n._("Hint #%(pos)s", {pos: pos + 1})}
|
|
94
94
|
</span>
|
|
95
95
|
)}
|
|
96
|
-
{!apiOptions.isMobile &&
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
{`${pos + 1} / ${totalHints}`}
|
|
108
|
-
</span>
|
|
109
|
-
)}
|
|
96
|
+
{!apiOptions.isMobile && totalHints != null && pos != null && (
|
|
97
|
+
<span
|
|
98
|
+
className="perseus-hint-label"
|
|
99
|
+
style={{
|
|
100
|
+
display: "block",
|
|
101
|
+
color: apiOptions.hintProgressColor,
|
|
102
|
+
}}
|
|
103
|
+
>
|
|
104
|
+
{`${pos + 1} / ${totalHints}`}
|
|
105
|
+
</span>
|
|
106
|
+
)}
|
|
110
107
|
<Renderer
|
|
111
108
|
// eslint-disable-next-line react/no-string-refs
|
|
112
109
|
ref="renderer"
|
package/src/perseus-api.jsx
CHANGED
|
@@ -41,7 +41,6 @@ export const ApiOptions = {
|
|
|
41
41
|
propTypes: (PropTypes.shape({
|
|
42
42
|
isArticle: PropTypes.bool.isRequired,
|
|
43
43
|
|
|
44
|
-
satStyling: PropTypes.bool.isRequired,
|
|
45
44
|
onInputError: PropTypes.func.isRequired,
|
|
46
45
|
onFocusChange: PropTypes.func.isRequired,
|
|
47
46
|
staticRender: PropTypes.bool.isRequired,
|
|
@@ -115,19 +114,6 @@ export const ApiOptions = {
|
|
|
115
114
|
// Whether to use the Draft.js editor or the legacy textarea
|
|
116
115
|
useDraftEditor: PropTypes.bool,
|
|
117
116
|
|
|
118
|
-
// Styling options that control the visual behavior of Perseus
|
|
119
|
-
// items.
|
|
120
|
-
// TODO(mdr): If we adopt this pattern, we'll need to think about
|
|
121
|
-
// how to make individual `styling` options be optional, and
|
|
122
|
-
// how to set their default values without overwriting provided
|
|
123
|
-
// values. For now, though, you must either specify all fields
|
|
124
|
-
// of `styling`, or omit the `styling` option entirely.
|
|
125
|
-
styling: PropTypes.shape({
|
|
126
|
-
// TODO(Nicole): Remove this after landing wonderblock-ifying
|
|
127
|
-
// the radio widget
|
|
128
|
-
primaryProductColor: PropTypes.string,
|
|
129
|
-
}),
|
|
130
|
-
|
|
131
117
|
// The color used for the hint progress indicator (eg. 1 / 3)
|
|
132
118
|
hintProgressColor: PropTypes.string,
|
|
133
119
|
|
|
@@ -181,16 +167,9 @@ export const ApiOptions = {
|
|
|
181
167
|
onFocusChange: (...a: $ReadOnlyArray<any>) => mixed,
|
|
182
168
|
onInputError: (...a: $ReadOnlyArray<any>) => mixed,
|
|
183
169
|
readOnly: boolean,
|
|
184
|
-
satStyling: boolean,
|
|
185
170
|
setDrawingAreaAvailable?: (...a: $ReadOnlyArray<any>) => mixed,
|
|
186
171
|
showAlignmentOptions: boolean,
|
|
187
172
|
staticRender: boolean,
|
|
188
|
-
styling?: {
|
|
189
|
-
// TODO(Nicole): Remove this after landing wonderblock-ifying
|
|
190
|
-
// the radio widget
|
|
191
|
-
primaryProductColor?: string,
|
|
192
|
-
...
|
|
193
|
-
},
|
|
194
173
|
trackInteraction?: (...a: $ReadOnlyArray<any>) => mixed,
|
|
195
174
|
useDraftEditor?: boolean,
|
|
196
175
|
widgetPlaceholder?: any,
|
|
@@ -200,7 +179,6 @@ export const ApiOptions = {
|
|
|
200
179
|
defaults: ({
|
|
201
180
|
isArticle: false,
|
|
202
181
|
isMobile: false,
|
|
203
|
-
satStyling: false,
|
|
204
182
|
onInputError: function () {},
|
|
205
183
|
onFocusChange: function () {},
|
|
206
184
|
staticRender: false,
|
|
@@ -217,7 +195,6 @@ export const ApiOptions = {
|
|
|
217
195
|
},
|
|
218
196
|
setDrawingAreaAvailable: function () {},
|
|
219
197
|
useDraftEditor: false,
|
|
220
|
-
styling: {},
|
|
221
198
|
canScrollPage: false,
|
|
222
199
|
inModal: false,
|
|
223
200
|
crossOutEnabled: false,
|
package/src/perseus-markdown.jsx
CHANGED
|
@@ -24,33 +24,8 @@ const rules = {
|
|
|
24
24
|
</div>
|
|
25
25
|
</div>
|
|
26
26
|
<div className="perseus-column">
|
|
27
|
-
{/* HACK(#sat) This is a cheap way to allow a custom
|
|
28
|
-
* header to be displayed in two-column items in the SAT
|
|
29
|
-
* mission.
|
|
30
|
-
* The header will be rendered into this div. Do not write
|
|
31
|
-
* code outside of the SAT mission that relies on this
|
|
32
|
-
* because this will be cleaned up with other SAT
|
|
33
|
-
* technical debt. */}
|
|
34
|
-
<div className="sat-header-grafting-area" />
|
|
35
|
-
|
|
36
27
|
<div className="perseus-column-content">
|
|
37
|
-
{/* HACK(#sat) This is a cheap way to allow a
|
|
38
|
-
* custom review-mode skill box to be displayed in
|
|
39
|
-
* SAT.
|
|
40
|
-
* Don't write code outside of the SAT mission that
|
|
41
|
-
* relies on this div because we are still telling
|
|
42
|
-
* ourselves this will be cleaned up along with other
|
|
43
|
-
* SAT technical debt. */}
|
|
44
|
-
<div className="sat-skill-subscore-grafting-area" />
|
|
45
28
|
{output(node.col2, state)}
|
|
46
|
-
{/* HACK(#sat) This is a cheap way to allow hints
|
|
47
|
-
* to be displayed in two-column items in the SAT
|
|
48
|
-
* mission.
|
|
49
|
-
* The hint renderer will be rendered into this div.
|
|
50
|
-
* Do not write code outside of the SAT mission that
|
|
51
|
-
* relies on this because this will be cleaned up with
|
|
52
|
-
* other SAT technical debt. */}
|
|
53
|
-
<div className="sat-grafting-area" />
|
|
54
29
|
</div>
|
|
55
30
|
</div>
|
|
56
31
|
</div>
|
package/src/styles/constants.js
CHANGED
|
@@ -55,27 +55,6 @@ export const pureMdMax = "1023px";
|
|
|
55
55
|
export const pureLgMax = "1279px";
|
|
56
56
|
// @tableBackgroundAccent: #f9f9f9; // for striping
|
|
57
57
|
export const tableBackgroundAccent = "#F9F9F9";
|
|
58
|
-
export const gtpBlue = "#4c00ff";
|
|
59
|
-
export const gtpIncorrectColor = "#babec2";
|
|
60
|
-
export const gtpCorrectColor = "#ffbe26";
|
|
61
|
-
// @satBlue: #0084ce;
|
|
62
|
-
export const satBlue = "#0084CE";
|
|
63
|
-
// @satSelectedBackgroundColor: #e4f3f9;
|
|
64
|
-
export const satSelectedBackgroundColor = "#E4F3F9";
|
|
65
|
-
// @satActiveBackgroundColor: #d0edf4;
|
|
66
|
-
export const satActiveBackgroundColor = "#D0EDF4";
|
|
67
|
-
// @satCorrectColor: #009900;
|
|
68
|
-
export const satCorrectColor = "#009900";
|
|
69
|
-
// @satCorrectBorderColor: #00cc00;
|
|
70
|
-
export const satCorrectBorderColor = "#00CC00";
|
|
71
|
-
// @satCorrectBackgroundColor: #e4f7e4;
|
|
72
|
-
export const satCorrectBackgroundColor = "#E4F7E4";
|
|
73
|
-
// @satIncorrectColor: #990000;
|
|
74
|
-
export const satIncorrectColor = "#990000";
|
|
75
|
-
// @satIncorrectBorderColor: #cc5252;
|
|
76
|
-
export const satIncorrectBorderColor = "#CC5252";
|
|
77
|
-
// @satIncorrectBackgroundColor: #f2ebeb;
|
|
78
|
-
export const satIncorrectBackgroundColor = "#F2EBEB";
|
|
79
58
|
// @zIndexScratchPad: 1;
|
|
80
59
|
export const zIndexScratchPad = 1;
|
|
81
60
|
// @zIndexAboveScratchpad: @zIndexScratchPad + 1;
|
|
@@ -321,12 +321,6 @@ export const collegeCareersMoreTopicColor = "#329A86";
|
|
|
321
321
|
export const collegeCareersMoreHoverColor = "#218270";
|
|
322
322
|
export const collegeCareersMoreLinkColor = "#218270";
|
|
323
323
|
export const collegeCareersMoreLinkHoverColor = "#329A86";
|
|
324
|
-
export const satDomainColor = "#0084CE";
|
|
325
|
-
export const satSubjectColor = "#0084CE";
|
|
326
|
-
export const satTopicColor = "#0084CE";
|
|
327
|
-
export const satHoverColor = "#0084CE";
|
|
328
|
-
export const satLinkColor = "#0084CE";
|
|
329
|
-
export const satLinkHoverColor = "#0084CE";
|
|
330
324
|
export const colorProficient = "#1C758A";
|
|
331
325
|
export const colorPracticed = "rgb(158, 221, 235)";
|
|
332
326
|
export const colorMastery1 = "rgb(90, 197, 221)";
|
|
@@ -372,7 +372,15 @@ body.debug .graphie { outline: 1px dashed #fdd; }
|
|
|
372
372
|
#issue fieldset label { display: inline; }
|
|
373
373
|
#issue fieldset li { margin-top: 0px; margin-bottom: 0px; }
|
|
374
374
|
|
|
375
|
-
var, div.graphie {
|
|
375
|
+
var, div.graphie {
|
|
376
|
+
white-space: pre;
|
|
377
|
+
/**
|
|
378
|
+
* Graphie didn't have a fixed font-size and was just using
|
|
379
|
+
* the surrounding font-size. However some labels are banking on
|
|
380
|
+
* specific dimensions, so we need to lock it to a specific size.
|
|
381
|
+
*/
|
|
382
|
+
font-size: 14px;
|
|
383
|
+
}
|
|
376
384
|
|
|
377
385
|
#spinner { position: relative; top: 4px; left: 4px; }
|
|
378
386
|
#issue-spinner { position: relative; top: 3px; }
|
|
@@ -443,7 +443,6 @@
|
|
|
443
443
|
}
|
|
444
444
|
|
|
445
445
|
@import "./widgets/categorizer.less";
|
|
446
|
-
@import "./widgets/definition.less";
|
|
447
446
|
@import "./widgets/dropdown.less";
|
|
448
447
|
@import "./widgets/expression.less";
|
|
449
448
|
@import "./widgets/grapher.less";
|
|
@@ -722,264 +721,6 @@
|
|
|
722
721
|
@satTopSpacingForTwoColumnLayout: 48px;
|
|
723
722
|
@satTwoColumnLayoutSideMargin: 32px;
|
|
724
723
|
|
|
725
|
-
// #sat-mission (below) matches when we're inside the SAT MVP product,
|
|
726
|
-
// basically internal-only and in flux.
|
|
727
|
-
#sat-mission {
|
|
728
|
-
@satContentWidth: 592px;
|
|
729
|
-
|
|
730
|
-
.content-area > div {
|
|
731
|
-
margin-left: auto;
|
|
732
|
-
margin-right: auto;
|
|
733
|
-
width: @satContentWidth;
|
|
734
|
-
.perseus-input-with-label {
|
|
735
|
-
display: flex;
|
|
736
|
-
align-items: center;
|
|
737
|
-
.perseus-input-label {
|
|
738
|
-
font-weight: 600;
|
|
739
|
-
padding-right: 10px;
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
.perseus-input-with-answer-blurb {
|
|
743
|
-
// numeric-inputs widgets use labels whereas input-number widgets
|
|
744
|
-
// use spans.
|
|
745
|
-
> span, > label {
|
|
746
|
-
display: inline-block;
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
.perseus-possible-answers {
|
|
750
|
-
color: rgb(0, 153, 0);
|
|
751
|
-
display: inline-block;
|
|
752
|
-
padding-right: 4px;
|
|
753
|
-
|
|
754
|
-
dt, dd {
|
|
755
|
-
// If you just use inline, then screen readers (or at least
|
|
756
|
-
// ChromeVox) won't read the answers as distinct items;
|
|
757
|
-
// if 2 and 4 were both correct, then it would read them
|
|
758
|
-
// concatenated as "twenty-four".
|
|
759
|
-
display: inline-block;
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
dt {
|
|
763
|
-
padding: 0 5px 0 13px;
|
|
764
|
-
color: rgb(18, 18, 18);
|
|
765
|
-
text-transform: uppercase;
|
|
766
|
-
}
|
|
767
|
-
|
|
768
|
-
dt::after {
|
|
769
|
-
content: ":";
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
dd:not(:last-child)::after {
|
|
773
|
-
// TODO(johnsullivan): Figure out a better way to do this list
|
|
774
|
-
// joining.
|
|
775
|
-
// TODO(mattdr): Joining in CSS makes semantic sense here
|
|
776
|
-
// (they're definition list entries that we happen to be
|
|
777
|
-
// rendering as a line of text joined by "or"), but CSS is
|
|
778
|
-
// more difficult to internationalize. SAT is English-only
|
|
779
|
-
// for now, though.
|
|
780
|
-
content: "or";
|
|
781
|
-
padding: 0 5px;
|
|
782
|
-
color: rgb(18, 18, 18);
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
input.perseus-incorrect {
|
|
788
|
-
color: @satIncorrectColor;
|
|
789
|
-
background-color: @satIncorrectBackgroundColor;
|
|
790
|
-
border: solid 1px @satIncorrectBorderColor;
|
|
791
|
-
}
|
|
792
|
-
|
|
793
|
-
input.perseus-correct {
|
|
794
|
-
color: @satCorrectColor;
|
|
795
|
-
background-color: @satCorrectBackgroundColor;
|
|
796
|
-
border: solid 1px @satCorrectBorderColor;
|
|
797
|
-
}
|
|
798
|
-
|
|
799
|
-
input.perseus-unanswered {
|
|
800
|
-
background-color: #eee;
|
|
801
|
-
border: solid 1px #999;
|
|
802
|
-
}
|
|
803
|
-
|
|
804
|
-
&.perseus-renderer-two-columns {
|
|
805
|
-
width: 1024px;
|
|
806
|
-
|
|
807
|
-
// This prevents a strange blank space from appearing above
|
|
808
|
-
// passages.
|
|
809
|
-
// TODO(johnsullivan): Try and get rid of the wrapping div that's
|
|
810
|
-
// causing this instead of modifying its margin like this.
|
|
811
|
-
& > .paragraph {
|
|
812
|
-
margin: 0;
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
.perseus-two-columns {
|
|
816
|
-
display: flex;
|
|
817
|
-
justify-content: center;
|
|
818
|
-
}
|
|
819
|
-
|
|
820
|
-
.perseus-column {
|
|
821
|
-
// NOTE(emily): For some reason, these prefixes aren't being
|
|
822
|
-
// added by our auto-prefixer, and we need these prefixes to
|
|
823
|
-
// work in Safari <= 8.
|
|
824
|
-
display: -webkit-flex;
|
|
825
|
-
-webkit-flex-direction: column;
|
|
826
|
-
|
|
827
|
-
display: flex;
|
|
828
|
-
flex-direction: column;
|
|
829
|
-
// Should this be @articleMaxWidthTablet? or is this
|
|
830
|
-
// conceptually a different value?
|
|
831
|
-
width: 512px;
|
|
832
|
-
|
|
833
|
-
&:nth-child(1) {
|
|
834
|
-
background: #eee;
|
|
835
|
-
border-right: 1px solid #ddd;
|
|
836
|
-
box-sizing: border-box;
|
|
837
|
-
|
|
838
|
-
.perseus-column-content {
|
|
839
|
-
padding-top: @satTopSpacingForTwoColumnLayout;
|
|
840
|
-
padding-bottom: 22px;
|
|
841
|
-
padding-left: 46px;
|
|
842
|
-
padding-right: @satTwoColumnLayoutSideMargin;
|
|
843
|
-
}
|
|
844
|
-
|
|
845
|
-
.perseus-widget-passage-container {
|
|
846
|
-
position: relative;
|
|
847
|
-
.perseus-widget-passage-instructions div.paragraph {
|
|
848
|
-
margin-top: 0;
|
|
849
|
-
}
|
|
850
|
-
}
|
|
851
|
-
.perseus-widget-passage {
|
|
852
|
-
// We've replaced the margin here with padding in the
|
|
853
|
-
// parent element to stay consistent with non-passage
|
|
854
|
-
// two-column mode.
|
|
855
|
-
margin: 0;
|
|
856
|
-
}
|
|
857
|
-
|
|
858
|
-
& > .paragraph {
|
|
859
|
-
margin-right: 40px;
|
|
860
|
-
}
|
|
861
|
-
|
|
862
|
-
blockquote {
|
|
863
|
-
padding: 0;
|
|
864
|
-
margin-right: 22px;
|
|
865
|
-
|
|
866
|
-
& > .paragraph:nth-child(1) {
|
|
867
|
-
margin-top: 0;
|
|
868
|
-
}
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
|
|
872
|
-
&:nth-child(2) {
|
|
873
|
-
.perseus-column-content {
|
|
874
|
-
padding-left: @satTwoColumnLayoutSideMargin;
|
|
875
|
-
padding-right: @satTwoColumnLayoutSideMargin;
|
|
876
|
-
}
|
|
877
|
-
|
|
878
|
-
.perseus-group {
|
|
879
|
-
margin-bottom: 20px;
|
|
880
|
-
}
|
|
881
|
-
}
|
|
882
|
-
}
|
|
883
|
-
|
|
884
|
-
.perseus-column-content {
|
|
885
|
-
flex: 1 1 auto;
|
|
886
|
-
overflow-y: auto;
|
|
887
|
-
|
|
888
|
-
& > .paragraph {
|
|
889
|
-
margin-top: 0;
|
|
890
|
-
}
|
|
891
|
-
}
|
|
892
|
-
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
|
|
896
|
-
input[type=text],
|
|
897
|
-
input[type=number] {
|
|
898
|
-
border: 1px solid #aaa;
|
|
899
|
-
font-family: @boldFontFamily;
|
|
900
|
-
font-size: 14px;
|
|
901
|
-
margin: 10px 0;
|
|
902
|
-
padding: 5px;
|
|
903
|
-
|
|
904
|
-
&:focus {
|
|
905
|
-
border-color: @satBlue;
|
|
906
|
-
box-shadow: 0 0 10px fade(@satBlue, 80%);
|
|
907
|
-
outline: none;
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
|
|
911
|
-
.valid-answer-mixin() {
|
|
912
|
-
input[type=text]:valid, input[type=number]:valid {
|
|
913
|
-
border: 1px solid @satBlue;
|
|
914
|
-
background: @satSelectedBackgroundColor;
|
|
915
|
-
color: initial;
|
|
916
|
-
|
|
917
|
-
&:focus {
|
|
918
|
-
box-shadow: 0 0 10px fade(@satBlue, 80%);
|
|
919
|
-
}
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
|
|
923
|
-
.invalid-answer-mixin() {
|
|
924
|
-
input[type=text]:valid, input[type=number]:valid {
|
|
925
|
-
color: @satIncorrectColor;
|
|
926
|
-
background-color: @satIncorrectBackgroundColor;
|
|
927
|
-
border: solid 1px @satIncorrectBorderColor;
|
|
928
|
-
|
|
929
|
-
&:focus {
|
|
930
|
-
box-shadow: 0 0 10px fade(@satIncorrectBorderColor, 80%);
|
|
931
|
-
}
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
// If a textbox appears inside a Perseus group widget, then the group
|
|
936
|
-
// widget's validity should override the item's validity when styling that
|
|
937
|
-
// item.
|
|
938
|
-
//
|
|
939
|
-
// That is, if a group widget is valid, but the item as a whole is
|
|
940
|
-
// invalid, inputs inside the valid group widget should still render as
|
|
941
|
-
// valid.
|
|
942
|
-
//
|
|
943
|
-
// This is implemented as a mixin and mixed into .valid-answer and
|
|
944
|
-
// .invalid-answer, in order to ensure that there's no ambiguity as to
|
|
945
|
-
// which selector takes precedence. Additionally, this ensures that these
|
|
946
|
-
// styles will only be applied when validity is relevant to the user (i.e.
|
|
947
|
-
// not in review mode).
|
|
948
|
-
.perseus-group-validity-override() {
|
|
949
|
-
.perseus-group-valid-answer {
|
|
950
|
-
.valid-answer-mixin();
|
|
951
|
-
}
|
|
952
|
-
.perseus-group-invalid-answer {
|
|
953
|
-
.invalid-answer-mixin();
|
|
954
|
-
}
|
|
955
|
-
}
|
|
956
|
-
|
|
957
|
-
.valid-answer {
|
|
958
|
-
.valid-answer-mixin();
|
|
959
|
-
.perseus-group-validity-override();
|
|
960
|
-
}
|
|
961
|
-
.invalid-answer {
|
|
962
|
-
.invalid-answer-mixin();
|
|
963
|
-
.perseus-group-validity-override();
|
|
964
|
-
}
|
|
965
|
-
|
|
966
|
-
#sat-route-task, #sat-route-section {
|
|
967
|
-
.content-area > .perseus-renderer-two-columns {
|
|
968
|
-
// Override column top margin to 0 (the first column will get
|
|
969
|
-
// the desired spacing by adding padding - to preserve the
|
|
970
|
-
// gray background)
|
|
971
|
-
margin-top: 0;
|
|
972
|
-
|
|
973
|
-
// Add spacing to the second column, by way of its first child.
|
|
974
|
-
// We want the margins to auto collapse, and so we can't add
|
|
975
|
-
// it to perseus-column because it's floated.
|
|
976
|
-
.perseus-column:nth-child(2) > .perseus-column-content > :first-child {
|
|
977
|
-
margin-top: @satTopSpacingForTwoColumnLayout;
|
|
978
|
-
}
|
|
979
|
-
}
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
|
|
983
724
|
.perseus-error {
|
|
984
725
|
background: @red;
|
|
985
726
|
border: 2px solid red;
|
|
@@ -41,17 +41,6 @@
|
|
|
41
41
|
@pure-md-max: (@pure-lg-min - 1);
|
|
42
42
|
@pure-lg-max: (@pure-xl-min - 1);
|
|
43
43
|
|
|
44
|
-
// SAT variables
|
|
45
|
-
@satBlue: #0084ce;
|
|
46
|
-
@satSelectedBackgroundColor: #e4f3f9;
|
|
47
|
-
@satActiveBackgroundColor: #d0edf4;
|
|
48
|
-
@satCorrectColor: #009900;
|
|
49
|
-
@satCorrectBorderColor: #00cc00;
|
|
50
|
-
@satCorrectBackgroundColor: #e4f7e4;
|
|
51
|
-
@satIncorrectColor: #990000;
|
|
52
|
-
@satIncorrectBorderColor: #cc5252;
|
|
53
|
-
@satIncorrectBackgroundColor: #f2ebeb;
|
|
54
|
-
|
|
55
44
|
// Layer variables
|
|
56
45
|
@zIndexScratchPad: 1;
|
|
57
46
|
@zIndexAboveScratchpad: @zIndexScratchPad + 1;
|
|
@@ -311,16 +311,6 @@
|
|
|
311
311
|
@collegeCareersMoreLinkColor: @collegeCareersMoreDomainColor;
|
|
312
312
|
@collegeCareersMoreLinkHoverColor: @collegeCareersMoreTopicColor;
|
|
313
313
|
|
|
314
|
-
// NOTE(johnsullivan): SAT isn't really a part of the domain system so doesn't
|
|
315
|
-
// get included in the .applyToDomains mixin. Currently these variables are
|
|
316
|
-
// only used for KUI buttons.
|
|
317
|
-
@satDomainColor: #0084ce;
|
|
318
|
-
@satSubjectColor: #0084ce;
|
|
319
|
-
@satTopicColor: #0084ce;
|
|
320
|
-
@satHoverColor: @satDomainColor;
|
|
321
|
-
@satLinkColor: @satDomainColor;
|
|
322
|
-
@satLinkHoverColor: @satTopicColor;
|
|
323
|
-
|
|
324
314
|
// Exercise Colors
|
|
325
315
|
// If you update these colours, please update thumbnail_handler.py's
|
|
326
316
|
// get_domain_color method.
|