@khanacademy/perseus 0.0.1 → 0.2.1

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 (507) hide show
  1. package/.babelrc.js +1 -1
  2. package/CHANGELOG.md +29 -0
  3. package/dist/es/index.css +4361 -0
  4. package/dist/es/index.js +7 -1
  5. package/dist/es/index.js.map +1 -1
  6. package/dist/index.css +4361 -0
  7. package/dist/index.js +7 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/strings.js +148 -46
  10. package/package.json +50 -4
  11. package/src/README.md +35 -0
  12. package/src/__stories__/item-renderer.stories.jsx +27 -0
  13. package/src/__stories__/server-item-renderer.stories.jsx +27 -0
  14. package/src/__testdata__/item-renderer_testdata.js +161 -0
  15. package/src/__testdata__/renderer_testdata.js +123 -0
  16. package/src/__tests__/__snapshots__/item-renderer_test.jsx.snap +233 -0
  17. package/src/__tests__/__snapshots__/perseus-markdown_test.jsx.snap +516 -0
  18. package/src/__tests__/__snapshots__/pure-markdown_test.js.snap +113 -0
  19. package/src/__tests__/__snapshots__/renderer_test.jsx.snap +576 -0
  20. package/src/__tests__/__snapshots__/server-item-renderer_test.jsx.snap +306 -0
  21. package/src/__tests__/a11y_test.jsx +304 -0
  22. package/src/__tests__/item-renderer_test.jsx +892 -0
  23. package/src/__tests__/mock-asset-loading-widget.jsx +57 -0
  24. package/src/__tests__/mock-widget.jsx +35 -0
  25. package/src/__tests__/perseus-markdown_test.jsx +747 -0
  26. package/src/__tests__/pure-markdown_test.js +552 -0
  27. package/src/__tests__/renderability_test.jsx +481 -0
  28. package/src/__tests__/renderer-api_test.jsx +333 -0
  29. package/src/__tests__/renderer_test.jsx +1792 -0
  30. package/src/__tests__/server-item-renderer_test.jsx +516 -0
  31. package/src/__tests__/test-items/image-item.js +25 -0
  32. package/src/__tests__/test-items/input-number-1-item.js +27 -0
  33. package/src/__tests__/test-items/input-number-2-item.js +39 -0
  34. package/src/__tests__/test-items/table-item.js +30 -0
  35. package/src/__tests__/tex-wrangler_test.js +83 -0
  36. package/src/__tests__/util_test.js +41 -0
  37. package/src/a11y.js +46 -0
  38. package/src/all-widgets.js +9 -0
  39. package/src/article-renderer.jsx +215 -0
  40. package/src/asset-context.js +30 -0
  41. package/src/basic-widgets.js +13 -0
  42. package/src/components/__stories__/button-group.stories.jsx +61 -0
  43. package/src/components/__stories__/fixed-to-responsive.stories.jsx +132 -0
  44. package/src/components/__stories__/graph.stories.jsx +27 -0
  45. package/src/components/__stories__/graphie.stories.jsx +28 -0
  46. package/src/components/__stories__/hud.stories.jsx +36 -0
  47. package/src/components/__stories__/icon.stories.jsx +56 -0
  48. package/src/components/__stories__/image-loader.stories.jsx +60 -0
  49. package/src/components/__stories__/info-tip.stories.jsx +33 -0
  50. package/src/components/__stories__/inline-icon.stories.jsx +39 -0
  51. package/src/components/__stories__/input-with-examples.stories.jsx +51 -0
  52. package/src/components/__stories__/lint.stories.jsx +40 -0
  53. package/src/components/__stories__/math-input.stories.jsx +29 -0
  54. package/src/components/__stories__/math-output.stories.jsx +24 -0
  55. package/src/components/__stories__/multi-button-group.stories.jsx +69 -0
  56. package/src/components/__stories__/number-input.stories.jsx +42 -0
  57. package/src/components/__stories__/possible-answers.stories.jsx +22 -0
  58. package/src/components/__stories__/prop-check-box.stories.jsx +62 -0
  59. package/src/components/__stories__/range-input.stories.jsx +28 -0
  60. package/src/components/__stories__/simple-keypad-input.stories.jsx +28 -0
  61. package/src/components/__stories__/sortable.stories.jsx +73 -0
  62. package/src/components/__stories__/stub-tag-editor.stories.jsx +44 -0
  63. package/src/components/__stories__/svg-image.stories.jsx +60 -0
  64. package/src/components/__stories__/tex.stories.jsx +18 -0
  65. package/src/components/__stories__/text-buttons.stories.jsx +51 -0
  66. package/src/components/__stories__/text-input.stories.jsx +34 -0
  67. package/src/components/__stories__/text-list-editor.stories.jsx +33 -0
  68. package/src/components/__stories__/zoomable-tex.stories.jsx +39 -0
  69. package/src/components/__stories__/zoomable.stories.jsx +40 -0
  70. package/src/components/__testdata__/sorter_testdata.js +20 -0
  71. package/src/components/__tests__/__snapshots__/sortable_test.jsx.snap +79 -0
  72. package/src/components/__tests__/__snapshots__/sorter_test.jsx.snap +297 -0
  73. package/src/components/__tests__/number-input_test.jsx +112 -0
  74. package/src/components/__tests__/sortable_test.jsx +234 -0
  75. package/src/components/__tests__/sorter_test.jsx +111 -0
  76. package/src/components/__tests__/zoomable_test.jsx +388 -0
  77. package/src/components/button-group.jsx +131 -0
  78. package/src/components/constants.js +15 -0
  79. package/src/components/fixed-to-responsive.jsx +164 -0
  80. package/src/components/graph.jsx +415 -0
  81. package/src/components/graphie-classes.jsx +148 -0
  82. package/src/components/graphie-movables.jsx +342 -0
  83. package/src/components/graphie.jsx +353 -0
  84. package/src/components/highlighting/highlightable-content.jsx +245 -0
  85. package/src/components/highlighting/highlights.js +208 -0
  86. package/src/components/highlighting/ranges.js +299 -0
  87. package/src/components/highlighting/types.js +73 -0
  88. package/src/components/highlighting/ui/highlight-renderer.jsx +179 -0
  89. package/src/components/highlighting/ui/highlight-set-renderer.jsx +190 -0
  90. package/src/components/highlighting/ui/highlight-tooltip.jsx +153 -0
  91. package/src/components/highlighting/ui/highlighting-ui.jsx +163 -0
  92. package/src/components/highlighting/ui/selection-tracker.jsx +195 -0
  93. package/src/components/highlighting/ui/types.js +21 -0
  94. package/src/components/highlighting/ui/util.js +166 -0
  95. package/src/components/highlighting/word-indexer.jsx +155 -0
  96. package/src/components/hud.jsx +179 -0
  97. package/src/components/icon.jsx +149 -0
  98. package/src/components/image-loader.jsx +175 -0
  99. package/src/components/info-tip/info-tip.jsx +146 -0
  100. package/src/components/info-tip.jsx +38 -0
  101. package/src/components/inline-icon.jsx +81 -0
  102. package/src/components/input-with-examples.jsx +231 -0
  103. package/src/components/lint.jsx +454 -0
  104. package/src/components/math-input.jsx +282 -0
  105. package/src/components/math-output.jsx +128 -0
  106. package/src/components/multi-button-group.jsx +137 -0
  107. package/src/components/new-tooltip/README.md +110 -0
  108. package/src/components/new-tooltip/__stories__/flexible-position.stories.jsx +437 -0
  109. package/src/components/new-tooltip/__stories__/new-tooltip.stories.jsx +665 -0
  110. package/src/components/new-tooltip/__stories__/tooltip-arrow.stories.jsx +70 -0
  111. package/src/components/new-tooltip/__stories__/tooltip-bubble.stories.jsx +98 -0
  112. package/src/components/new-tooltip/__tests__/style-constants_test.js +8 -0
  113. package/src/components/new-tooltip/__tests__/util_test.js +47 -0
  114. package/src/components/new-tooltip/flexible-position.jsx +182 -0
  115. package/src/components/new-tooltip/new-tooltip.jsx +399 -0
  116. package/src/components/new-tooltip/style-constants.js +13 -0
  117. package/src/components/new-tooltip/tooltip-arrow.jsx +184 -0
  118. package/src/components/new-tooltip/tooltip-bubble.jsx +223 -0
  119. package/src/components/new-tooltip/tooltip-portal.jsx +101 -0
  120. package/src/components/new-tooltip/tooltip-positioner.jsx +529 -0
  121. package/src/components/new-tooltip/types.js +183 -0
  122. package/src/components/new-tooltip/util.js +27 -0
  123. package/src/components/number-input.jsx +253 -0
  124. package/src/components/possible-answers.jsx +36 -0
  125. package/src/components/prop-check-box.jsx +80 -0
  126. package/src/components/range-input.jsx +61 -0
  127. package/src/components/simple-keypad-input.jsx +91 -0
  128. package/src/components/sortable.jsx +873 -0
  129. package/src/components/stub-tag-editor.jsx +54 -0
  130. package/src/components/svg-image.jsx +762 -0
  131. package/src/components/tex-buttons.jsx +322 -0
  132. package/src/components/tex.jsx +70 -0
  133. package/src/components/text-input.jsx +82 -0
  134. package/src/components/text-list-editor.jsx +157 -0
  135. package/src/components/tooltip.jsx +395 -0
  136. package/src/components/visibility-observer/__stories__/visibility-observer.stories.jsx +140 -0
  137. package/src/components/visibility-observer/get-scroll-parent.js +45 -0
  138. package/src/components/visibility-observer/visibility-observer.js +109 -0
  139. package/src/components/visibility-observer/visibility-observer.jsx +123 -0
  140. package/src/components/zoomable-tex.jsx +70 -0
  141. package/src/components/zoomable.jsx +304 -0
  142. package/src/components.js +17 -0
  143. package/src/dependencies.js +22 -0
  144. package/src/error-boundary.jsx +48 -0
  145. package/src/extra-widgets.js +75 -0
  146. package/src/gorgon/README +40 -0
  147. package/src/gorgon/__tests__/matcher_test.js +497 -0
  148. package/src/gorgon/__tests__/rule_test.js +101 -0
  149. package/src/gorgon/__tests__/rules_test.js +487 -0
  150. package/src/gorgon/__tests__/selector-parser_test.js +52 -0
  151. package/src/gorgon/__tests__/tree-transformer_test.js +446 -0
  152. package/src/gorgon/gorgon.js +290 -0
  153. package/src/gorgon/proptypes.js +29 -0
  154. package/src/gorgon/rule.js +413 -0
  155. package/src/gorgon/rules/absolute-url.js +24 -0
  156. package/src/gorgon/rules/all-rules.js +72 -0
  157. package/src/gorgon/rules/blockquoted-math.js +10 -0
  158. package/src/gorgon/rules/blockquoted-widget.js +10 -0
  159. package/src/gorgon/rules/double-spacing-after-terminal.js +12 -0
  160. package/src/gorgon/rules/extra-content-spacing.js +12 -0
  161. package/src/gorgon/rules/heading-level-1.js +14 -0
  162. package/src/gorgon/rules/heading-level-skip.js +20 -0
  163. package/src/gorgon/rules/heading-sentence-case.js +11 -0
  164. package/src/gorgon/rules/heading-title-case.js +63 -0
  165. package/src/gorgon/rules/image-alt-text.js +21 -0
  166. package/src/gorgon/rules/image-in-table.js +10 -0
  167. package/src/gorgon/rules/image-spaces-around-urls.js +35 -0
  168. package/src/gorgon/rules/image-widget.js +50 -0
  169. package/src/gorgon/rules/link-click-here.js +11 -0
  170. package/src/gorgon/rules/lint-utils.js +48 -0
  171. package/src/gorgon/rules/long-paragraph.js +14 -0
  172. package/src/gorgon/rules/math-adjacent.js +10 -0
  173. package/src/gorgon/rules/math-align-extra-break.js +11 -0
  174. package/src/gorgon/rules/math-align-linebreaks.js +43 -0
  175. package/src/gorgon/rules/math-empty.js +10 -0
  176. package/src/gorgon/rules/math-font-size.js +12 -0
  177. package/src/gorgon/rules/math-frac.js +10 -0
  178. package/src/gorgon/rules/math-nested.js +11 -0
  179. package/src/gorgon/rules/math-starts-with-space.js +12 -0
  180. package/src/gorgon/rules/math-text-empty.js +10 -0
  181. package/src/gorgon/rules/math-without-dollars.js +14 -0
  182. package/src/gorgon/rules/nested-lists.js +11 -0
  183. package/src/gorgon/rules/profanity.js +10 -0
  184. package/src/gorgon/rules/table-missing-cells.js +20 -0
  185. package/src/gorgon/rules/unbalanced-code-delimiters.js +14 -0
  186. package/src/gorgon/rules/unescaped-dollar.js +10 -0
  187. package/src/gorgon/rules/widget-in-table.js +10 -0
  188. package/src/gorgon/selector.js +506 -0
  189. package/src/gorgon/tree-transformer.js +588 -0
  190. package/src/hint-renderer.jsx +159 -0
  191. package/src/hints-renderer.jsx +359 -0
  192. package/src/icon-paths.js +120 -0
  193. package/src/index.js +149 -2
  194. package/src/init.js +49 -0
  195. package/src/interaction-tracker.js +60 -0
  196. package/src/interactive2/__tests__/movable-mock.js +48 -0
  197. package/src/interactive2/__tests__/movable-point_test.js +146 -0
  198. package/src/interactive2/interactive-util.js +152 -0
  199. package/src/interactive2/movable-helper-methods.js +160 -0
  200. package/src/interactive2/movable-line-options.js +392 -0
  201. package/src/interactive2/movable-line.js +322 -0
  202. package/src/interactive2/movable-point-options.js +190 -0
  203. package/src/interactive2/movable-point.jsx +603 -0
  204. package/src/interactive2/movable-polygon-options.js +351 -0
  205. package/src/interactive2/movable-polygon.js +368 -0
  206. package/src/interactive2/movable.js +273 -0
  207. package/src/interactive2/objective_.js +79 -0
  208. package/src/interactive2/types.js +3 -0
  209. package/src/interactive2/wrapped-defaults.js +86 -0
  210. package/src/interactive2/wrapped-ellipse.js +87 -0
  211. package/src/interactive2/wrapped-line.js +109 -0
  212. package/src/interactive2/wrapped-path.js +47 -0
  213. package/src/interactive2.js +91 -0
  214. package/src/item-renderer.jsx +518 -0
  215. package/src/item-version.js +12 -0
  216. package/src/jipt-paragraphs.js +44 -0
  217. package/src/jquery.mobile.vmouse.js +545 -0
  218. package/src/keypad-context.js +33 -0
  219. package/src/loading-context.js +20 -0
  220. package/src/logging/log.js +107 -0
  221. package/src/logging/log_test.js +41 -0
  222. package/src/mixins/changeable.jsx +115 -0
  223. package/src/mixins/editor-jsonify.jsx +13 -0
  224. package/src/mixins/provide-keypad.jsx +129 -0
  225. package/src/mixins/widget-jsonify-deprecated.jsx +23 -0
  226. package/src/mixins/widget-prop-blacklist.js +36 -0
  227. package/src/multi-items/__stories__/multi-renderer.stories.js +88 -0
  228. package/src/multi-items/__testdata__/multi-renderer_testdata.js +174 -0
  229. package/src/multi-items/__tests__/__snapshots__/multi-renderer_test.js.snap +994 -0
  230. package/src/multi-items/__tests__/items_test.js +245 -0
  231. package/src/multi-items/__tests__/multi-renderer_test.js +903 -0
  232. package/src/multi-items/__tests__/prop-type-builders_test.js +134 -0
  233. package/src/multi-items/__tests__/shapes_test.js +44 -0
  234. package/src/multi-items/__tests__/trees_test.js +316 -0
  235. package/src/multi-items/item-types.js +55 -0
  236. package/src/multi-items/items.js +176 -0
  237. package/src/multi-items/multi-renderer.jsx +543 -0
  238. package/src/multi-items/prop-type-builders.js +105 -0
  239. package/src/multi-items/shape-types.js +47 -0
  240. package/src/multi-items/shapes.js +53 -0
  241. package/src/multi-items/tree-types.js +42 -0
  242. package/src/multi-items/trees.js +345 -0
  243. package/src/multi-items.js +76 -0
  244. package/src/not-gorgon.js +129 -0
  245. package/src/perseus-api.jsx +270 -0
  246. package/src/perseus-env.js +26 -0
  247. package/src/perseus-error.js +19 -0
  248. package/src/perseus-markdown.jsx +433 -0
  249. package/src/perseus-types.js +1597 -0
  250. package/src/pure-markdown.js +347 -0
  251. package/src/question-paragraph.jsx +30 -0
  252. package/src/renderability.jsx +108 -0
  253. package/src/renderer.jsx +1932 -0
  254. package/src/server-item-renderer.jsx +467 -0
  255. package/src/sigfigs.jsx +492 -0
  256. package/src/styles/articles.less +748 -0
  257. package/src/styles/constants.js +119 -0
  258. package/src/styles/global-constants.js +350 -0
  259. package/src/styles/global-styles.js +307 -0
  260. package/src/styles/khan-exercise.css +1304 -0
  261. package/src/styles/media-queries.js +48 -0
  262. package/src/styles/perseus-renderer.less +1007 -0
  263. package/src/styles/shared.js +132 -0
  264. package/src/styles/util.less +47 -0
  265. package/src/styles/variables.boostrap.less +301 -0
  266. package/src/styles/variables.less +68 -0
  267. package/src/styles/variables.shared.less +356 -0
  268. package/src/styles/widgets/categorizer.less +39 -0
  269. package/src/styles/widgets/definition.less +86 -0
  270. package/src/styles/widgets/dropdown.less +3 -0
  271. package/src/styles/widgets/expression.less +147 -0
  272. package/src/styles/widgets/graded-group.less +36 -0
  273. package/src/styles/widgets/grapher.less +11 -0
  274. package/src/styles/widgets/group.less +19 -0
  275. package/src/styles/widgets/image.less +29 -0
  276. package/src/styles/widgets/interactive-graph.less +61 -0
  277. package/src/styles/widgets/label-image.less +41 -0
  278. package/src/styles/widgets/matcher.less +8 -0
  279. package/src/styles/widgets/matrix.less +120 -0
  280. package/src/styles/widgets/measurer.less +20 -0
  281. package/src/styles/widgets/orderer.less +97 -0
  282. package/src/styles/widgets/passage.less +151 -0
  283. package/src/styles/widgets/plotter.less +33 -0
  284. package/src/styles/widgets/radio.less +52 -0
  285. package/src/styles/widgets/reaction-diagram.less +35 -0
  286. package/src/styles/widgets/sequence.less +5 -0
  287. package/src/styles/widgets/sortable.less +127 -0
  288. package/src/styles/widgets/table.less +56 -0
  289. package/src/styles/widgets/transformer.less +28 -0
  290. package/src/styles/widgets/unit.less +14 -0
  291. package/src/tex-wrangler.js +176 -0
  292. package/src/traversal.jsx +141 -0
  293. package/src/types.js +538 -0
  294. package/src/util/a11y.js +24 -0
  295. package/src/util/answer-types.js +862 -0
  296. package/src/util/answer-types_test.js +115 -0
  297. package/src/util/colors.js +94 -0
  298. package/src/util/fix-passage-refs.jsx +122 -0
  299. package/src/util/graph-utils.js +16 -0
  300. package/src/util/graphie.js +1586 -0
  301. package/src/util/interactive.js +4078 -0
  302. package/src/util/katex-preprocess.js +16 -0
  303. package/src/util/math.js +296 -0
  304. package/src/util/mobile-native-utils.js +14 -0
  305. package/src/util/mobile-native-utils_test.js +24 -0
  306. package/src/util/register-all-widgets-for-testing.js +12 -0
  307. package/src/util/scroll-utils.js +162 -0
  308. package/src/util/sizing-utils.js +46 -0
  309. package/src/util/tex.js +203 -0
  310. package/src/util/url-utils.js +36 -0
  311. package/src/util.js +990 -0
  312. package/src/version.js +11 -0
  313. package/src/widget-container.jsx +174 -0
  314. package/src/widgets/__stories__/categorizer.stories.jsx +15 -0
  315. package/src/widgets/__stories__/cs-program.stories.jsx +15 -0
  316. package/src/widgets/__stories__/definition.stories.jsx +38 -0
  317. package/src/widgets/__stories__/dropdown.stories.jsx +15 -0
  318. package/src/widgets/__stories__/explanation.stories.jsx +19 -0
  319. package/src/widgets/__stories__/expression.stories.jsx +26 -0
  320. package/src/widgets/__stories__/graded-group-set.stories.jsx +32 -0
  321. package/src/widgets/__stories__/graded-group.stories.jsx +32 -0
  322. package/src/widgets/__stories__/grapher.stories.jsx +47 -0
  323. package/src/widgets/__stories__/group.stories.jsx +15 -0
  324. package/src/widgets/__stories__/iframe.stories.jsx +15 -0
  325. package/src/widgets/__stories__/image.stories.jsx +62 -0
  326. package/src/widgets/__stories__/input-number.stories.jsx +90 -0
  327. package/src/widgets/__stories__/interaction.stories.jsx +15 -0
  328. package/src/widgets/__stories__/interactive-graph.stories.jsx +61 -0
  329. package/src/widgets/__stories__/matcher.stories.jsx +15 -0
  330. package/src/widgets/__stories__/matrix.stories.jsx +15 -0
  331. package/src/widgets/__stories__/number-line.stories.jsx +15 -0
  332. package/src/widgets/__stories__/numeric-input.stories.jsx +19 -0
  333. package/src/widgets/__stories__/orderer.stories.jsx +15 -0
  334. package/src/widgets/__stories__/passage-ref.stories.jsx +19 -0
  335. package/src/widgets/__stories__/passage.stories.jsx +19 -0
  336. package/src/widgets/__stories__/radio.stories.jsx +82 -0
  337. package/src/widgets/__stories__/sorter.stories.jsx +15 -0
  338. package/src/widgets/__stories__/transformer.stories.jsx +15 -0
  339. package/src/widgets/__stories__/unit.stories.jsx +45 -0
  340. package/src/widgets/__stories__/video-transcript-link.stories.jsx +24 -0
  341. package/src/widgets/__stories__/video.stories.jsx +15 -0
  342. package/src/widgets/__testdata__/categorizer_testdata.js +50 -0
  343. package/src/widgets/__testdata__/cs-program_testdata.js +28 -0
  344. package/src/widgets/__testdata__/dropdown_testdata.js +34 -0
  345. package/src/widgets/__testdata__/explanation_testdata.js +56 -0
  346. package/src/widgets/__testdata__/expression_testdata.js +95 -0
  347. package/src/widgets/__testdata__/graded-group-set_testdata.js +358 -0
  348. package/src/widgets/__testdata__/graded-group_testdata.js +79 -0
  349. package/src/widgets/__testdata__/grapher_testdata.js +376 -0
  350. package/src/widgets/__testdata__/group_testdata.js +156 -0
  351. package/src/widgets/__testdata__/iframe_testdata.js +36 -0
  352. package/src/widgets/__testdata__/image_testdata.js +38 -0
  353. package/src/widgets/__testdata__/input-number_testdata.js +73 -0
  354. package/src/widgets/__testdata__/interaction_testdata.js +264 -0
  355. package/src/widgets/__testdata__/interactive-graph_testdata.js +646 -0
  356. package/src/widgets/__testdata__/matcher_testdata.js +34 -0
  357. package/src/widgets/__testdata__/matrix_testdata.js +29 -0
  358. package/src/widgets/__testdata__/number-line_testdata.js +31 -0
  359. package/src/widgets/__testdata__/numeric-input_testdata.js +266 -0
  360. package/src/widgets/__testdata__/orderer_testdata.js +58 -0
  361. package/src/widgets/__testdata__/passage-ref_testdata.js +41 -0
  362. package/src/widgets/__testdata__/passage_testdata.js +71 -0
  363. package/src/widgets/__testdata__/radio_testdata.js +210 -0
  364. package/src/widgets/__testdata__/sorter_testdata.js +20 -0
  365. package/src/widgets/__testdata__/transformer_testdata.js +109 -0
  366. package/src/widgets/__testdata__/video_testdata.js +22 -0
  367. package/src/widgets/__tests__/__snapshots__/categorizer_test.jsx.snap +928 -0
  368. package/src/widgets/__tests__/__snapshots__/cs-program_test.jsx.snap +75 -0
  369. package/src/widgets/__tests__/__snapshots__/definition_test.js.snap +99 -0
  370. package/src/widgets/__tests__/__snapshots__/dropdown_test.jsx.snap +143 -0
  371. package/src/widgets/__tests__/__snapshots__/explanation_test.js.snap +473 -0
  372. package/src/widgets/__tests__/__snapshots__/expression_test.jsx.snap +38 -0
  373. package/src/widgets/__tests__/__snapshots__/graded-group-set-jipt_test.jsx.snap +754 -0
  374. package/src/widgets/__tests__/__snapshots__/graded-group-set_test.jsx.snap +310 -0
  375. package/src/widgets/__tests__/__snapshots__/graded-group_test.jsx.snap +863 -0
  376. package/src/widgets/__tests__/__snapshots__/grapher_test.jsx.snap +2880 -0
  377. package/src/widgets/__tests__/__snapshots__/group_test.jsx.snap +1154 -0
  378. package/src/widgets/__tests__/__snapshots__/iframe_test.jsx.snap +69 -0
  379. package/src/widgets/__tests__/__snapshots__/image_test.jsx.snap +388 -0
  380. package/src/widgets/__tests__/__snapshots__/input-number_test.jsx.snap +978 -0
  381. package/src/widgets/__tests__/__snapshots__/interaction_test.jsx.snap +311 -0
  382. package/src/widgets/__tests__/__snapshots__/interactive-graph_test.jsx.snap +2915 -0
  383. package/src/widgets/__tests__/__snapshots__/matcher_test.jsx.snap +1039 -0
  384. package/src/widgets/__tests__/__snapshots__/matrix_test.jsx.snap +450 -0
  385. package/src/widgets/__tests__/__snapshots__/number-line_test.jsx.snap +888 -0
  386. package/src/widgets/__tests__/__snapshots__/numeric-input_test.jsx.snap +930 -0
  387. package/src/widgets/__tests__/__snapshots__/orderer_test.jsx.snap +275 -0
  388. package/src/widgets/__tests__/__snapshots__/passage-ref_test.jsx.snap +446 -0
  389. package/src/widgets/__tests__/__snapshots__/passage_test.jsx.snap +1988 -0
  390. package/src/widgets/__tests__/__snapshots__/radio_test.jsx.snap +7107 -0
  391. package/src/widgets/__tests__/__snapshots__/video_test.jsx.snap +163 -0
  392. package/src/widgets/__tests__/categorizer_test.jsx +205 -0
  393. package/src/widgets/__tests__/cs-program_test.jsx +45 -0
  394. package/src/widgets/__tests__/definition_test.js +152 -0
  395. package/src/widgets/__tests__/dropdown_test.jsx +106 -0
  396. package/src/widgets/__tests__/explanation_test.js +199 -0
  397. package/src/widgets/__tests__/expression_test.jsx +439 -0
  398. package/src/widgets/__tests__/graded-group-set-jipt_test.jsx +33 -0
  399. package/src/widgets/__tests__/graded-group-set_test.jsx +270 -0
  400. package/src/widgets/__tests__/graded-group_test.jsx +233 -0
  401. package/src/widgets/__tests__/grapher.cypress.jsx +486 -0
  402. package/src/widgets/__tests__/grapher_test.jsx +35 -0
  403. package/src/widgets/__tests__/group_test.jsx +512 -0
  404. package/src/widgets/__tests__/iframe_test.jsx +47 -0
  405. package/src/widgets/__tests__/image_test.jsx +65 -0
  406. package/src/widgets/__tests__/input-number_test.jsx +360 -0
  407. package/src/widgets/__tests__/interaction_test.jsx +33 -0
  408. package/src/widgets/__tests__/interactive-graph.cypress.jsx +697 -0
  409. package/src/widgets/__tests__/interactive-graph_test.jsx +105 -0
  410. package/src/widgets/__tests__/matcher_test.jsx +157 -0
  411. package/src/widgets/__tests__/matrix_test.jsx +84 -0
  412. package/src/widgets/__tests__/number-line_test.jsx +81 -0
  413. package/src/widgets/__tests__/numeric-input_test.jsx +574 -0
  414. package/src/widgets/__tests__/orderer_test.jsx +75 -0
  415. package/src/widgets/__tests__/passage-ref_test.jsx +166 -0
  416. package/src/widgets/__tests__/passage_test.jsx +133 -0
  417. package/src/widgets/__tests__/radio/base-radio_test.jsx +82 -0
  418. package/src/widgets/__tests__/radio_test.jsx +651 -0
  419. package/src/widgets/__tests__/renderQuestion.jsx +66 -0
  420. package/src/widgets/__tests__/unit_test.jsx +144 -0
  421. package/src/widgets/__tests__/video_test.jsx +55 -0
  422. package/src/widgets/categorizer.jsx +338 -0
  423. package/src/widgets/cs-program.jsx +227 -0
  424. package/src/widgets/definition.jsx +141 -0
  425. package/src/widgets/dropdown.jsx +143 -0
  426. package/src/widgets/explanation.jsx +315 -0
  427. package/src/widgets/expression.jsx +652 -0
  428. package/src/widgets/graded-group-answer-bar.jsx +152 -0
  429. package/src/widgets/graded-group-set.jsx +285 -0
  430. package/src/widgets/graded-group.jsx +448 -0
  431. package/src/widgets/grapher/util.jsx +806 -0
  432. package/src/widgets/grapher.jsx +663 -0
  433. package/src/widgets/group.jsx +213 -0
  434. package/src/widgets/iframe.jsx +198 -0
  435. package/src/widgets/image.jsx +310 -0
  436. package/src/widgets/input-number.jsx +411 -0
  437. package/src/widgets/interaction/arrow-picker.jsx +39 -0
  438. package/src/widgets/interaction/color-picker.jsx +69 -0
  439. package/src/widgets/interaction/dash-picker.jsx +46 -0
  440. package/src/widgets/interaction/element-container.jsx +97 -0
  441. package/src/widgets/interaction.jsx +742 -0
  442. package/src/widgets/interactive-graph.jsx +2820 -0
  443. package/src/widgets/label-image/__stories__/answer-choices.stories.jsx +93 -0
  444. package/src/widgets/label-image/__stories__/marker.stories.jsx +172 -0
  445. package/src/widgets/label-image/answer-choices.jsx +311 -0
  446. package/src/widgets/label-image/marker.jsx +365 -0
  447. package/src/widgets/label-image/types.js +33 -0
  448. package/src/widgets/label-image.jsx +841 -0
  449. package/src/widgets/label-image_test.js +840 -0
  450. package/src/widgets/lights-puzzle.jsx +356 -0
  451. package/src/widgets/matcher.jsx +271 -0
  452. package/src/widgets/matrix.jsx +616 -0
  453. package/src/widgets/measurer.jsx +215 -0
  454. package/src/widgets/molecule/__tests__/layout_test.jsx +159 -0
  455. package/src/widgets/molecule/__tests__/parser_test.jsx +142 -0
  456. package/src/widgets/molecule/molecule-drawing.jsx +175 -0
  457. package/src/widgets/molecule/molecule-layout.jsx +367 -0
  458. package/src/widgets/molecule/smiles-parser.jsx +300 -0
  459. package/src/widgets/molecule.jsx +172 -0
  460. package/src/widgets/number-line.jsx +858 -0
  461. package/src/widgets/numeric-input.jsx +622 -0
  462. package/src/widgets/orderer.jsx +753 -0
  463. package/src/widgets/passage/__tests__/passage-markdown_test.jsx +382 -0
  464. package/src/widgets/passage/get-line-height-for-node.js +10 -0
  465. package/src/widgets/passage/passage-markdown.jsx +416 -0
  466. package/src/widgets/passage-ref-target.jsx +70 -0
  467. package/src/widgets/passage-ref.jsx +198 -0
  468. package/src/widgets/passage.jsx +601 -0
  469. package/src/widgets/plotter.jsx +1198 -0
  470. package/src/widgets/radio/__stories__/base-radio.stories.jsx +40 -0
  471. package/src/widgets/radio/__stories__/choice-icon.stories.jsx +157 -0
  472. package/src/widgets/radio/__stories__/choice-none-above.stories.jsx +26 -0
  473. package/src/widgets/radio/__stories__/cross-out-button.stories.jsx +64 -0
  474. package/src/widgets/radio/__stories__/cross-out-menu.stories.jsx +59 -0
  475. package/src/widgets/radio/__stories__/cross-out-tooltip.stories.jsx +59 -0
  476. package/src/widgets/radio/__stories__/focus-ring.stories.jsx +38 -0
  477. package/src/widgets/radio/__stories__/option-status.stories.jsx +118 -0
  478. package/src/widgets/radio/__stories__/toggleable-radio-button.stories.jsx +28 -0
  479. package/src/widgets/radio/base-radio.jsx +642 -0
  480. package/src/widgets/radio/choice-icon.jsx +468 -0
  481. package/src/widgets/radio/choice-none-above.jsx +54 -0
  482. package/src/widgets/radio/choice.jsx +692 -0
  483. package/src/widgets/radio/choice.jsx.fixture.js +64 -0
  484. package/src/widgets/radio/cross-out-button.jsx +136 -0
  485. package/src/widgets/radio/cross-out-menu-wrapper.jsx +492 -0
  486. package/src/widgets/radio/cross-out-tooltip.jsx +129 -0
  487. package/src/widgets/radio/focus-ring.jsx +51 -0
  488. package/src/widgets/radio/option-status.jsx +89 -0
  489. package/src/widgets/radio/toggleable-radio-button.jsx +133 -0
  490. package/src/widgets/radio/util.js +32 -0
  491. package/src/widgets/radio/util_test.js +19 -0
  492. package/src/widgets/radio/widget.jsx +470 -0
  493. package/src/widgets/radio.jsx +156 -0
  494. package/src/widgets/reaction-diagram.jsx +137 -0
  495. package/src/widgets/sequence.jsx +140 -0
  496. package/src/widgets/simulator.jsx +808 -0
  497. package/src/widgets/sorter.jsx +146 -0
  498. package/src/widgets/table.jsx +394 -0
  499. package/src/widgets/transformer.jsx +2876 -0
  500. package/src/widgets/unit.jsx +372 -0
  501. package/src/widgets/video-transcript-link.jsx +84 -0
  502. package/src/widgets/video-transcript-link_test.js +211 -0
  503. package/src/widgets/video.jsx +126 -0
  504. package/src/widgets.js +431 -0
  505. package/src/zoom.js +539 -0
  506. package/README.md +0 -3
  507. package/src/__tests__/index.test.js +0 -14
@@ -0,0 +1,1007 @@
1
+ @import (inline) "./khan-exercise.css";
2
+
3
+ //
4
+ // Edit this file in the *perseus* repo!
5
+ // (All changes outside the perseus repo will be overwritten)
6
+ //
7
+
8
+ @import "./variables.less";
9
+ @import "./util.less";
10
+
11
+ // Article Renderer
12
+ @import "./articles.less";
13
+
14
+ #perseus {
15
+ position: relative;
16
+ }
17
+
18
+ .framework-perseus.perseus-mobile {
19
+ margin-top: 48px;
20
+ }
21
+
22
+ // .no-select is used to prevent selection of certain widgets.
23
+ // often, allowing selection makes for an awkward mobile experience
24
+ // where you constantly highlight elements unintentionally.
25
+ .no-select {
26
+ -moz-user-select: -moz-none;
27
+ -khtml-user-select: none;
28
+ -webkit-user-select: none;
29
+ -o-user-select: none;
30
+ user-select: none;
31
+ }
32
+
33
+ // .blank-background is used to prevent drawing under transparent widgets.
34
+ // drawing under transparent widgets is particularly annoying because if
35
+ // you lift up your pen and put it down again, you can't continue drawing,
36
+ // because you're now clicking on the widget. This is very
37
+ // counterintuitive, so we simply don't let you see anything you draw under
38
+ // a widget.
39
+ .blank-background {
40
+ background-color: #FDFDFD; // Keep in sync with KhanUtil._BACKGROUND
41
+ }
42
+ // There is no scratchpad in the answer_area, and it has a different color
43
+ // background, so just make it transparent
44
+ #answer_area .blank-background {
45
+ background-color: transparent;
46
+ }
47
+
48
+ .above-scratchpad {
49
+ position: relative;
50
+ z-index: @zIndexAboveScratchpad;
51
+ }
52
+
53
+ // All graphie components placed above the scratchpad should have their
54
+ // background wiped out.
55
+ .graphie.above-scratchpad,
56
+ .graphie-container.above-scratchpad {
57
+ .blank-background;
58
+ }
59
+
60
+ .perseus-mobile .graphie-container.above-scratchpad {
61
+ background: #ffffff;
62
+ }
63
+
64
+ // Selectable graphie components make for awkward touch experiences
65
+ .graphie {
66
+ .no-select;
67
+ }
68
+
69
+ .perseus-interactive,
70
+ .perseus-interactive.above-scratchpad {
71
+ position: relative;
72
+ z-index: @zIndexInteractiveComponent;
73
+ }
74
+
75
+ &, // and moar specificity...
76
+ #answercontent input[type=text],
77
+ #answercontent input[type=number],
78
+ .framework-perseus input[type=text],
79
+ .framework-perseus input[type=number] {
80
+ &.perseus-input-size-normal
81
+ {
82
+ border: 1px solid #ccc;
83
+ width: 80px;
84
+ }
85
+
86
+ &.perseus-input-size-small {
87
+ border: 1px solid #ccc;
88
+ width: 40px;
89
+ }
90
+
91
+ &.perseus-input-right-align {
92
+ text-align: right;
93
+ }
94
+ }
95
+
96
+ .framework-perseus.perseus-mobile {
97
+ .perseus-input-right-align .keypad-input {
98
+ text-align: right;
99
+ }
100
+ }
101
+
102
+ .framework-perseus {
103
+ #problemarea {
104
+ input, button {
105
+ .perseus-interactive;
106
+ }
107
+ }
108
+
109
+ div.paragraph {
110
+ .legacy-typography;
111
+ margin: 22px 0px;
112
+ }
113
+
114
+ // HACK(yejia): Override the font size and line height for blurbs
115
+ //
116
+ // NOTE(yejia): Minion Pro is only loaded on GTP pages, because those
117
+ // are the main call sites for blurbs and the passage widget. We
118
+ // considered inserting the relevant stylesheet whenever the passage
119
+ // widget loads, but this approach produced a "flash of unstyled
120
+ // text", so we decided to embed the stylesheet into the relevant
121
+ // page templates instead.
122
+ //
123
+ // NOTE(yejia): Minion Pro will not be available on ZNDs, due to
124
+ // restrictions in our Adobe TypeKit configuration.
125
+ //
126
+ // TODO(TP-3315): Remove once Perseus uses Wonder Blocks BodySerif
127
+ .test-prep-blurb div.paragraph {
128
+ font-size: 16px;
129
+ line-height: 20px;
130
+ }
131
+
132
+ div.instructions {
133
+ display: block;
134
+ font-style: italic;
135
+ font-weight: bold;
136
+ }
137
+
138
+ .perseus-renderer > .paragraph > ul:not(.perseus-widget-radio),
139
+ .perseus-renderer > .paragraph > ol {
140
+ margin: -11px 0px 22px 0px; // first-level lists need padding
141
+ }
142
+
143
+ .paragraph ul:not(.perseus-widget-radio) {
144
+ .legacy-typography;
145
+ padding-left: 35px;
146
+ }
147
+
148
+ .paragraph ul:not(.perseus-widget-radio) li {
149
+ list-style-type: disc;
150
+ }
151
+
152
+ .paragraph ol {
153
+ list-style: decimal;
154
+ padding-left: 2em;
155
+ }
156
+
157
+ blockquote {
158
+ padding: 0 2.5em;
159
+ }
160
+
161
+ .zoomable {
162
+ -webkit-tap-highlight-color: rgba(0,0,0,0);
163
+ -webkit-touch-callout: none;
164
+ }
165
+
166
+ // We do not apply this styling to MathQuill elements because the
167
+ // styles interfere with calculation of the size of the container
168
+ // surrounding the math.
169
+ sup:not(.mq-non-leaf) {
170
+ font-size: smaller;
171
+ vertical-align: super;
172
+
173
+ // by default, vertical-align: super changes the line height of
174
+ // the line this text is in, which repositions surrounding text
175
+ // and is sad. This is especially important for the passage
176
+ // widget, as changes to line-height there make the line numbers
177
+ // incorrect. This hack fixes that, and seems to not cause problems
178
+ // even if there is no other text on the line (it still gets the
179
+ // standard line-height of what non `vertical-align: super` text
180
+ // would be.
181
+ line-height: 0;
182
+ }
183
+
184
+ // place on a div above the inputs
185
+ .range-input {
186
+ border: 1px solid #ccc;
187
+ border-radius: 5px;
188
+ display: inline-block;
189
+ padding: 0px 5px;
190
+
191
+ & > input {
192
+ border: 0;
193
+ display: inline;
194
+ text-align: center;
195
+ width: 30px;
196
+ }
197
+
198
+ & > span {
199
+ color: #999;
200
+ font-size: 14px;
201
+ }
202
+ }
203
+
204
+ .number-input {
205
+ border: 1px solid #ccc;
206
+ border-radius: 5px;
207
+ margin: 0; // override
208
+ padding: 5px 0; // override
209
+ text-align: center;
210
+ width: 40px;
211
+
212
+ &.invalid-input {
213
+ background-color: @red;
214
+ outline-color: red;
215
+ }
216
+
217
+ &.mini {
218
+ width: 40px;
219
+ }
220
+ &.small {
221
+ width: 60px;
222
+ }
223
+ &.normal {
224
+ width: 80px;
225
+ }
226
+ }
227
+
228
+ .math-output {
229
+ display: inline-block;
230
+ min-width: 80px;
231
+ min-height: 36px;
232
+ border-radius: 5px;
233
+ padding: 0;
234
+ margin-top: 4px;
235
+ margin-bottom: 4px;
236
+ background: white;
237
+ border: 1px solid #a4a4a4;
238
+ }
239
+
240
+ .graph-settings {
241
+ .graph-settings-axis-label {
242
+ border: 1px solid #ccc;
243
+ border-radius: 5px;
244
+ display: inline-block;
245
+ padding: 5px 5px;
246
+ width: 70px;
247
+ float: right;
248
+ margin: 0 5px;
249
+ }
250
+ .graph-settings-background-url {
251
+ width: 250px;
252
+ }
253
+ }
254
+
255
+ .graphie-container {
256
+ // TODO(alex): Is this still used?
257
+ position: relative;
258
+ }
259
+
260
+ .graph-settings, .image-settings, .misc-settings {
261
+ padding-bottom: 5px;
262
+ }
263
+
264
+ .misc-settings, .type-settings {
265
+ border-top: 1px solid black;
266
+ padding-top: 5px;
267
+ }
268
+
269
+ .svg-image {
270
+ display: inline-block;
271
+ }
272
+
273
+ .unresponsive-svg-image, .perseus-rendered-radio .unresponsive-svg-image {
274
+ display: inline-block;
275
+ position: relative;
276
+
277
+ > .graphie-container {
278
+ position: absolute;
279
+ top: 0;
280
+ left: 0;
281
+ }
282
+ }
283
+
284
+ .fixed-to-responsive {
285
+ position: relative;
286
+ width: 100%;
287
+
288
+ // The first child is different than the rest - it's a div
289
+ // with vertical padding that reserves space for the rest
290
+ // of the children (which are absolutely positioned and
291
+ // thus can't claim space for themselves).
292
+ > :not(:first-child) {
293
+ position: absolute;
294
+ top: 0;
295
+ left: 0;
296
+ width: 100%;
297
+ height: 100%;
298
+ }
299
+ }
300
+ }
301
+
302
+ /* Legacy table styles. Remove when XOM is rolled out (see below for
303
+ updated XOM styles). */
304
+ .framework-perseus:not(.perseus-mobile) {
305
+ table {
306
+ .legacy-typography;
307
+
308
+ th, td {
309
+ padding: 5px 10px;
310
+ text-align: left;
311
+
312
+ &[align=center] {
313
+ text-align: center;
314
+ }
315
+
316
+ &[align=right] {
317
+ text-align: right;
318
+ }
319
+ }
320
+
321
+ th {
322
+ border-bottom: 2px solid #ccc;
323
+ font-weight: bold;
324
+ padding-bottom: 2px;
325
+ }
326
+
327
+ tr:nth-child(odd) {
328
+ // Doesn't work in IE8 :(
329
+ td {
330
+ background-color: #ededed;
331
+ }
332
+ }
333
+ }
334
+
335
+ .perseus-titled-table {
336
+ display: inline-block;
337
+
338
+ // Center the table in a titled table
339
+ table {
340
+ margin-left: auto;
341
+ margin-right: auto;
342
+ }
343
+ }
344
+
345
+ // Center the title in a titled table
346
+ .perseus-table-title {
347
+ text-align: center;
348
+ font-size: larger;
349
+ }
350
+
351
+ table.non-markdown {
352
+ tr:nth-child(odd) {
353
+ td {
354
+ background-color: transparent;
355
+ }
356
+ }
357
+
358
+ th, td {
359
+ border-width: 0;
360
+ }
361
+ }
362
+ }
363
+
364
+ /* New XOM styles for tables. */
365
+ .framework-perseus.perseus-mobile {
366
+ /* There are three kinds of tables:
367
+ 1) normal "tables" - emitted by markdown (src/perseus-markdown.jsx)
368
+ 2) "titled tables" - emitted by markdown as well (these are just
369
+ tables with a title, and encased in one more element)
370
+ 3) "table widget" - where a user is expected to enter answers in a
371
+ table form (src/widgets/table.jsx).
372
+ Moreover, there the Categorizer widget uses <table> tags, so these
373
+ stylings will apply there as well. */
374
+ // TODO(benkomalo): be more explicit by adding className values to all
375
+ // widgets and stop relying on tag names when using CSS. or use aphrodite
376
+ // evurrwhere
377
+ table {
378
+ border-collapse: collapse;
379
+ margin: 0 auto;
380
+
381
+ tbody > tr {
382
+ border: 1px solid #e5e5e5;
383
+ }
384
+
385
+ th,
386
+ td {
387
+ padding: 16px;
388
+ text-align: left;
389
+
390
+ &[align=center] {
391
+ text-align: center;
392
+ }
393
+
394
+ &[align=right] {
395
+ text-align: right;
396
+ }
397
+ }
398
+
399
+ td {
400
+ background: #fff;
401
+ }
402
+
403
+ th {
404
+ font-weight: bold;
405
+ }
406
+ }
407
+
408
+ @media (max-width: @pure-sm-max) {
409
+ table {
410
+ // Make tables "full-bleed" on phones.
411
+ width: 100%;
412
+ min-width: 480px;
413
+
414
+ tbody > tr {
415
+ border-left: 0;
416
+ border-right: 0;
417
+ }
418
+ }
419
+ }
420
+
421
+ .perseus-titled-table {
422
+ display: inline-block;
423
+ }
424
+
425
+ // Center the title in a titled table
426
+ .perseus-table-title {
427
+ text-align: center;
428
+ font-size: larger;
429
+ }
430
+
431
+ table.non-markdown {
432
+ // No customizations for table widgets for now.
433
+ }
434
+ }
435
+
436
+ /* Widget CSS */
437
+
438
+ .perseus-graph-padding {
439
+ padding: 25px 25px 0 0;
440
+ }
441
+
442
+ @import "./widgets/categorizer.less";
443
+ @import "./widgets/definition.less";
444
+ @import "./widgets/dropdown.less";
445
+ @import "./widgets/expression.less";
446
+ @import "./widgets/grapher.less";
447
+ @import "./widgets/graded-group.less";
448
+ @import "./widgets/group.less";
449
+ @import "./widgets/image.less";
450
+ @import "./widgets/interactive-graph.less";
451
+ @import "./widgets/label-image.less";
452
+ @import "./widgets/matcher.less";
453
+ @import "./widgets/matrix.less";
454
+ @import "./widgets/measurer.less";
455
+ @import "./widgets/orderer.less";
456
+ @import "./widgets/passage.less";
457
+ @import "./widgets/plotter.less";
458
+ @import "./widgets/radio.less";
459
+ @import "./widgets/reaction-diagram.less";
460
+ @import "./widgets/sequence.less";
461
+ @import "./widgets/sortable.less";
462
+ @import "./widgets/table.less";
463
+ @import "./widgets/transformer.less";
464
+ @import "./widgets/unit.less";
465
+
466
+ .perseus-widget-container {
467
+ &.widget-nohighlight {
468
+ transition: all 0.15s;
469
+ }
470
+
471
+ &.widget-highlight {
472
+ @highlight: 0px 0px 0px 2px rgba(255, 165, 0, 1);
473
+ -webkit-box-shadow: @highlight;
474
+ -moz-box-shadow: @highlight;
475
+ box-shadow: @highlight;
476
+ transition: all 0.15s;
477
+ }
478
+
479
+ &.widget-inline {
480
+ display: inline;
481
+ }
482
+
483
+ &.widget-inline-block {
484
+ display: inline-block;
485
+ }
486
+ }
487
+
488
+
489
+ // Hide new hints styling everywhere except Bibliotron. Note that the Bibliotron
490
+ // styles are used both in webapp and in the mobile native apps.
491
+ .bibliotron-exercise .perseus-hint-renderer {
492
+ border-left: 4px solid #f6f7f7;
493
+ padding-left: 16px;
494
+ position: relative;
495
+ &:focus {
496
+ border-left-color: #d6d8da;
497
+ outline: none;
498
+ }
499
+ &:before,
500
+ &:after {
501
+ content: "";
502
+ display: table;
503
+ clear: both;
504
+ }
505
+ // NOTE(charlie): In XOM, these margins get overridden with the paragraph
506
+ // defaults. Instead, we apply similar margins through inline styles in
507
+ // `hints-renderer.jsx`.
508
+ div.paragraph {
509
+ margin-top: 0px;
510
+ margin-bottom: 16px;
511
+ }
512
+ &.last-hint {
513
+ margin-bottom: 32px;
514
+ }
515
+ }
516
+
517
+ @media (max-width: @pure-sm-max) {
518
+ .bibliotron-exercise .perseus-hint-renderer {
519
+ &.last-hint {
520
+ margin-bottom: 0;
521
+ }
522
+ }
523
+ }
524
+
525
+ @default3: #00457c;
526
+ @science3: #9e034e;
527
+ @math3: #007d96;
528
+ @economics3: #a75a05;
529
+ @partner3: #208170;
530
+ @humanities3: #be2612;
531
+ @testPrep3: #543b78;
532
+ @cs3: #0d923f;
533
+ .perseus-hint-label {
534
+ color: @default3;
535
+ display: none;
536
+ font-weight: 600;
537
+ margin-right: 13px;
538
+ position: absolute;
539
+ right: 100%;
540
+ white-space: nowrap;
541
+ }
542
+ .perseus-domain-science .perseus-hint-label {
543
+ color: @science3;
544
+ }
545
+ .perseus-domain-math .perseus-hint-label {
546
+ color: @math3;
547
+ }
548
+ .perseus-domain-economics .perseus-hint-label {
549
+ color: @economics3;
550
+ }
551
+ .perseus-domain-partner .perseus-hint-label {
552
+ color: @partner3;
553
+ }
554
+ .perseus-domain-humanities .perseus-hint-label {
555
+ color: @humanities3;
556
+ }
557
+ .perseus-domain-test-prep .perseus-hint-label {
558
+ color: @testPrep3;
559
+ }
560
+ .perseus-domain-cs .perseus-hint-label {
561
+ color: @cs3;
562
+ }
563
+ .bibliotron-exercise .perseus-hint-renderer.last-rendered .perseus-hint-label {
564
+ display: block;
565
+ }
566
+
567
+ @media (max-width: @pure-sm-max) {
568
+ .bibliotron-exercise .perseus-hint-renderer.last-rendered .perseus-hint-label {
569
+ display: none;
570
+ }
571
+ }
572
+
573
+ // TODO(joel) - remove?
574
+ .perseus-tooltip {
575
+ background: #fff;
576
+ padding: 5px 10px;
577
+ width: 240px;
578
+ }
579
+
580
+ // CSS is evil; let's overwrite some styles. T_T
581
+ .perseus-formats-tooltip {
582
+ .perseus-tooltip;
583
+ color: #777;
584
+ }
585
+ .framework-perseus .perseus-formats-tooltip .paragraph > ul {
586
+ padding: 0;
587
+ margin: -20px 0 -16px 0;
588
+ > li {
589
+ list-style-type: none;
590
+ }
591
+ }
592
+
593
+ .box-shadow(@shadow: 0 1px 3px rgba(0,0,0,.25)) {
594
+ box-shadow: @shadow;
595
+ -o-box-shadow: @shadow;
596
+ -ms-box-shadow: @shadow;
597
+ -moz-box-shadow: @shadow;
598
+ -webkit-box-shadow: @shadow;
599
+ }
600
+
601
+ .perseus-math-input.mq-editable-field.mq-math-mode {
602
+ // Mimic native text input
603
+ background: #fff;
604
+
605
+ // If the font-size is too small, super/subscripts become hard to input
606
+ font-size: 18px;
607
+
608
+ // Make the click target easier to hit
609
+ min-width: 100px;
610
+
611
+ // Mimic native text input w/o using -moz/-webkit-apperance: textfield
612
+ // border-color: rgb(78, 187, 212);
613
+ border-color: #a4a4a4;
614
+
615
+ border-radius: 5px;
616
+
617
+ & > .mq-root-block {
618
+ // A bit of extra whitespace here greatly improves legibility
619
+ padding: 4px;
620
+ }
621
+
622
+ // Fixes for strange default MathQuill styles:
623
+
624
+ // Cursor shouldn't actually be touching left border
625
+ .mq-cursor {
626
+ padding-left: 0;
627
+ }
628
+
629
+ // Don't gray out implicitly created closing parens
630
+ .mq-paren.mq-ghost {
631
+ color: inherit;
632
+ }
633
+
634
+ // Don't put vertical margins on an expression wrapped in parens
635
+ // because it messes up baseline alignment, e.g. h(x)
636
+ .mq-paren + span {
637
+ margin: 0;
638
+ }
639
+
640
+ .mq-binary-operator {
641
+ // MathQuill uses Symbola to render binary operators. Unfortunately,
642
+ // Firefox 47 on Windows doesn't render the +/- signs correctly when
643
+ // using Symbola so we override it and use KaTeX_Main instead.
644
+ font-family: KaTeX_Main !important;
645
+ }
646
+
647
+ sup {
648
+ // This is set to 0 across Perseus normally, but we need to override it
649
+ // here so nth-roots are rendered correctly.
650
+ line-height: normal;
651
+ }
652
+ }
653
+
654
+ // override normal 5px border radius for the editor only
655
+ .perseus-widget-editor .perseus-math-input.mq-editable-field.mq-math-mode > .mq-root-block {
656
+ border-radius: 0;
657
+ }
658
+
659
+ // This style looks a little off in the expression editor. Luckily users don't
660
+ // use the expression editor.
661
+ .math-input-buttons {
662
+ background-color: rgba(255, 255, 255, 0.7);
663
+ border-radius: 5px;
664
+ border: 1px solid #ddd;
665
+ box-sizing: border-box;
666
+ margin-top: 5px;
667
+ padding: 2px;
668
+ // each button is 35 + 4 px, plus 4 padding, plus 2 border
669
+ width: 39px*5 + 4px + 2px; // (201)
670
+
671
+ &.absolute {
672
+ left: -2px;
673
+ position: absolute;
674
+ top: -3px;
675
+ z-index: @zIndexCalculator;
676
+ }
677
+ };
678
+
679
+ // Math domain color
680
+ @borderColor: #1c758a;
681
+
682
+ .tex-button {
683
+ display: block;
684
+ float: left;
685
+ width: 35px;
686
+ height: 35px;
687
+ margin: 2px;
688
+ border: 1px solid @borderColor;
689
+ background-color: white;
690
+ border-radius: 5px;
691
+
692
+ &:hover {
693
+ cursor: pointer;
694
+ background-color: #f0f0f0;
695
+ }
696
+
697
+ &:focus {
698
+ border: 2px solid @borderColor;
699
+ outline: none;
700
+ }
701
+ }
702
+
703
+ .tex-button-row {
704
+ margin: 5px 0;
705
+
706
+ &:first-child {
707
+ margin-top: 0;
708
+ }
709
+
710
+ &:last-child {
711
+ margin-bottom: 0;
712
+ }
713
+ }
714
+
715
+ .renderer-widget-error {
716
+ background-color: #fcc;
717
+ }
718
+
719
+ @satTopSpacingForTwoColumnLayout: 48px;
720
+ @satTwoColumnLayoutSideMargin: 32px;
721
+
722
+ // #sat-mission (below) matches when we're inside the SAT MVP product,
723
+ // basically internal-only and in flux.
724
+ #sat-mission {
725
+ @satContentWidth: 592px;
726
+
727
+ .content-area > div {
728
+ margin-left: auto;
729
+ margin-right: auto;
730
+ width: @satContentWidth;
731
+ .perseus-input-with-label {
732
+ display: flex;
733
+ align-items: center;
734
+ .perseus-input-label {
735
+ font-weight: 600;
736
+ padding-right: 10px;
737
+ }
738
+ }
739
+ .perseus-input-with-answer-blurb {
740
+ // numeric-inputs widgets use labels whereas input-number widgets
741
+ // use spans.
742
+ > span, > label {
743
+ display: inline-block;
744
+ }
745
+
746
+ .perseus-possible-answers {
747
+ color: rgb(0, 153, 0);
748
+ display: inline-block;
749
+ padding-right: 4px;
750
+
751
+ dt, dd {
752
+ // If you just use inline, then screen readers (or at least
753
+ // ChromeVox) won't read the answers as distinct items;
754
+ // if 2 and 4 were both correct, then it would read them
755
+ // concatenated as "twenty-four".
756
+ display: inline-block;
757
+ }
758
+
759
+ dt {
760
+ padding: 0 5px 0 13px;
761
+ color: rgb(18, 18, 18);
762
+ text-transform: uppercase;
763
+ }
764
+
765
+ dt::after {
766
+ content: ":";
767
+ }
768
+
769
+ dd:not(:last-child)::after {
770
+ // TODO(johnsullivan): Figure out a better way to do this list
771
+ // joining.
772
+ // TODO(mattdr): Joining in CSS makes semantic sense here
773
+ // (they're definition list entries that we happen to be
774
+ // rendering as a line of text joined by "or"), but CSS is
775
+ // more difficult to internationalize. SAT is English-only
776
+ // for now, though.
777
+ content: "or";
778
+ padding: 0 5px;
779
+ color: rgb(18, 18, 18);
780
+ }
781
+ }
782
+ }
783
+
784
+ input.perseus-incorrect {
785
+ color: @satIncorrectColor;
786
+ background-color: @satIncorrectBackgroundColor;
787
+ border: solid 1px @satIncorrectBorderColor;
788
+ }
789
+
790
+ input.perseus-correct {
791
+ color: @satCorrectColor;
792
+ background-color: @satCorrectBackgroundColor;
793
+ border: solid 1px @satCorrectBorderColor;
794
+ }
795
+
796
+ input.perseus-unanswered {
797
+ background-color: #eee;
798
+ border: solid 1px #999;
799
+ }
800
+
801
+ &.perseus-renderer-two-columns {
802
+ width: 1024px;
803
+
804
+ // This prevents a strange blank space from appearing above
805
+ // passages.
806
+ // TODO(johnsullivan): Try and get rid of the wrapping div that's
807
+ // causing this instead of modifying its margin like this.
808
+ & > .paragraph {
809
+ margin: 0;
810
+ }
811
+
812
+ .perseus-two-columns {
813
+ display: flex;
814
+ justify-content: center;
815
+ }
816
+
817
+ .perseus-column {
818
+ // NOTE(emily): For some reason, these prefixes aren't being
819
+ // added by our auto-prefixer, and we need these prefixes to
820
+ // work in Safari <= 8.
821
+ display: -webkit-flex;
822
+ -webkit-flex-direction: column;
823
+
824
+ display: flex;
825
+ flex-direction: column;
826
+ // Should this be @articleMaxWidthTablet? or is this
827
+ // conceptually a different value?
828
+ width: 512px;
829
+
830
+ &:nth-child(1) {
831
+ background: #eee;
832
+ border-right: 1px solid #ddd;
833
+ box-sizing: border-box;
834
+
835
+ .perseus-column-content {
836
+ padding-top: @satTopSpacingForTwoColumnLayout;
837
+ padding-bottom: 22px;
838
+ padding-left: 46px;
839
+ padding-right: @satTwoColumnLayoutSideMargin;
840
+ }
841
+
842
+ .perseus-widget-passage-container {
843
+ position: relative;
844
+ .perseus-widget-passage-instructions div.paragraph {
845
+ margin-top: 0;
846
+ }
847
+ }
848
+ .perseus-widget-passage {
849
+ // We've replaced the margin here with padding in the
850
+ // parent element to stay consistent with non-passage
851
+ // two-column mode.
852
+ margin: 0;
853
+ }
854
+
855
+ & > .paragraph {
856
+ margin-right: 40px;
857
+ }
858
+
859
+ blockquote {
860
+ padding: 0;
861
+ margin-right: 22px;
862
+
863
+ & > .paragraph:nth-child(1) {
864
+ margin-top: 0;
865
+ }
866
+ }
867
+ }
868
+
869
+ &:nth-child(2) {
870
+ .perseus-column-content {
871
+ padding-left: @satTwoColumnLayoutSideMargin;
872
+ padding-right: @satTwoColumnLayoutSideMargin;
873
+ }
874
+
875
+ .perseus-group {
876
+ margin-bottom: 20px;
877
+ }
878
+ }
879
+ }
880
+
881
+ .perseus-column-content {
882
+ flex: 1 1 auto;
883
+ overflow-y: auto;
884
+
885
+ & > .paragraph {
886
+ margin-top: 0;
887
+ }
888
+ }
889
+
890
+ }
891
+ }
892
+
893
+ input[type=text],
894
+ input[type=number] {
895
+ border: 1px solid #aaa;
896
+ font-family: @boldFontFamily;
897
+ font-size: 14px;
898
+ margin: 10px 0;
899
+ padding: 5px;
900
+
901
+ &:focus {
902
+ border-color: @satBlue;
903
+ box-shadow: 0 0 10px fade(@satBlue, 80%);
904
+ outline: none;
905
+ }
906
+ }
907
+
908
+ .valid-answer-mixin() {
909
+ input[type=text]:valid, input[type=number]:valid {
910
+ border: 1px solid @satBlue;
911
+ background: @satSelectedBackgroundColor;
912
+ color: initial;
913
+
914
+ &:focus {
915
+ box-shadow: 0 0 10px fade(@satBlue, 80%);
916
+ }
917
+ }
918
+ }
919
+
920
+ .invalid-answer-mixin() {
921
+ input[type=text]:valid, input[type=number]:valid {
922
+ color: @satIncorrectColor;
923
+ background-color: @satIncorrectBackgroundColor;
924
+ border: solid 1px @satIncorrectBorderColor;
925
+
926
+ &:focus {
927
+ box-shadow: 0 0 10px fade(@satIncorrectBorderColor, 80%);
928
+ }
929
+ }
930
+ }
931
+
932
+ // If a textbox appears inside a Perseus group widget, then the group
933
+ // widget's validity should override the item's validity when styling that
934
+ // item.
935
+ //
936
+ // That is, if a group widget is valid, but the item as a whole is
937
+ // invalid, inputs inside the valid group widget should still render as
938
+ // valid.
939
+ //
940
+ // This is implemented as a mixin and mixed into .valid-answer and
941
+ // .invalid-answer, in order to ensure that there's no ambiguity as to
942
+ // which selector takes precedence. Additionally, this ensures that these
943
+ // styles will only be applied when validity is relevant to the user (i.e.
944
+ // not in review mode).
945
+ .perseus-group-validity-override() {
946
+ .perseus-group-valid-answer {
947
+ .valid-answer-mixin();
948
+ }
949
+ .perseus-group-invalid-answer {
950
+ .invalid-answer-mixin();
951
+ }
952
+ }
953
+
954
+ .valid-answer {
955
+ .valid-answer-mixin();
956
+ .perseus-group-validity-override();
957
+ }
958
+ .invalid-answer {
959
+ .invalid-answer-mixin();
960
+ .perseus-group-validity-override();
961
+ }
962
+
963
+ #sat-route-task, #sat-route-section {
964
+ .content-area > .perseus-renderer-two-columns {
965
+ // Override column top margin to 0 (the first column will get
966
+ // the desired spacing by adding padding - to preserve the
967
+ // gray background)
968
+ margin-top: 0;
969
+
970
+ // Add spacing to the second column, by way of its first child.
971
+ // We want the margins to auto collapse, and so we can't add
972
+ // it to perseus-column because it's floated.
973
+ .perseus-column:nth-child(2) > .perseus-column-content > :first-child {
974
+ margin-top: @satTopSpacingForTwoColumnLayout;
975
+ }
976
+ }
977
+ }
978
+ }
979
+
980
+ .perseus-error {
981
+ background: @red;
982
+ border: 2px solid red;
983
+ border-radius: 5px;
984
+ padding: 20px;
985
+ margin: 15px 0 10px;
986
+ }
987
+
988
+ @media (max-width: @pure-sm-max) {
989
+ .perseus-renderer-responsive {
990
+ margin: 0 @phoneMargin;
991
+
992
+ // Horizontal margins should only be applied to top-level Renderers.
993
+ .perseus-renderer-responsive {
994
+ margin: 0;
995
+ }
996
+ }
997
+ }
998
+
999
+ .perseus-mobile {
1000
+ @media (max-width: 767px) {
1001
+ .perseus-block-math {
1002
+ font-size: 18px;
1003
+ }
1004
+ }
1005
+ }
1006
+
1007
+ @import (inline) "../../../math-input/dist/index.css";