@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.
Files changed (51) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/es/index.css +9 -245
  3. package/dist/es/index.js +138 -584
  4. package/dist/es/index.js.map +1 -1
  5. package/dist/index.css +9 -245
  6. package/dist/index.js +135 -581
  7. package/dist/index.js.map +1 -1
  8. package/package.json +1 -1
  9. package/src/__stories__/hints-renderer.stories.jsx +9 -1
  10. package/src/__testdata__/graphie_testdata.js +53 -0
  11. package/src/__tests__/__snapshots__/perseus-markdown_test.jsx.snap +0 -9
  12. package/src/__tests__/__snapshots__/renderer_test.jsx.snap +0 -9
  13. package/src/components/__stories__/graphie.stories.jsx +5 -1
  14. package/src/hint-renderer.jsx +11 -14
  15. package/src/perseus-api.jsx +0 -23
  16. package/src/perseus-markdown.jsx +0 -25
  17. package/src/styles/constants.js +0 -21
  18. package/src/styles/global-constants.js +0 -6
  19. package/src/styles/khan-exercise.css +9 -1
  20. package/src/styles/perseus-renderer.less +0 -259
  21. package/src/styles/variables.less +0 -11
  22. package/src/styles/variables.shared.less +0 -10
  23. package/src/types.js +0 -16
  24. package/src/widgets/__stories__/input-number.stories.jsx +0 -14
  25. package/src/widgets/__stories__/radio.stories.jsx +0 -3
  26. package/src/widgets/__tests__/__snapshots__/definition_test.js.snap +18 -28
  27. package/src/widgets/__tests__/__snapshots__/group_test.jsx.snap +0 -9
  28. package/src/widgets/__tests__/__snapshots__/image_test.jsx.snap +0 -18
  29. package/src/widgets/__tests__/__snapshots__/numeric-input_test.jsx.snap +2 -440
  30. package/src/widgets/__tests__/__snapshots__/radio_test.jsx.snap +66 -3726
  31. package/src/widgets/__tests__/numeric-input_test.jsx +54 -118
  32. package/src/widgets/__tests__/radio/choice-icon_test.jsx +25 -75
  33. package/src/widgets/__tests__/radio_test.jsx +362 -394
  34. package/src/widgets/definition.jsx +27 -14
  35. package/src/widgets/input-number.jsx +2 -60
  36. package/src/widgets/numeric-input.jsx +17 -89
  37. package/src/widgets/radio/__stories__/base-radio.stories.jsx +1 -3
  38. package/src/widgets/radio/__stories__/choice-icon.stories.jsx +23 -105
  39. package/src/widgets/radio/__stories__/option-status.stories.jsx +0 -8
  40. package/src/widgets/radio/base-radio.jsx +13 -96
  41. package/src/widgets/radio/choice-icon/choice-icon.jsx +177 -50
  42. package/src/widgets/radio/choice-icon/cross-out-line.jsx +9 -13
  43. package/src/widgets/radio/choice-icon/shared-styles.js +2 -3
  44. package/src/widgets/radio/choice.jsx +5 -59
  45. package/src/widgets/radio/option-status.jsx +2 -14
  46. package/src/components/__stories__/possible-answers.stories.jsx +0 -22
  47. package/src/components/possible-answers.jsx +0 -36
  48. package/src/styles/widgets/definition.less +0 -86
  49. package/src/widgets/radio/__stories__/sat-styles.stories.jsx +0 -191
  50. package/src/widgets/radio/choice-icon/library-choice-icon.jsx +0 -225
  51. package/src/widgets/radio/choice-icon/sat-choice-icon.jsx +0 -120
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Core Perseus API (includes renderers and widgets)",
4
4
  "author": "Khan Academy",
5
5
  "license": "MIT",
6
- "version": "1.4.1",
6
+ "version": "2.0.0",
7
7
  "publishConfig": {
8
8
  "access": "public"
9
9
  },
@@ -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 <HintsRenderer {...args} />;
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
- //TODO(scottgrant): Add a wider range of stories here
30
+ export const PieChartGraphieLabels = (args: StoryArgs): React.Node => {
31
+ return <ItemRendererWithDebugUI item={itemWithPieChart} />;
32
+ };
@@ -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
- !apiOptions.satStyling &&
98
- totalHints &&
99
- pos != null && (
100
- <span
101
- className="perseus-hint-label"
102
- style={{
103
- display: "block",
104
- color: apiOptions.hintProgressColor,
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"
@@ -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,
@@ -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>
@@ -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 { white-space: pre; }
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.