@pie-element/select-text 9.6.1-next.2 → 9.6.2-beta.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.
@@ -45,10 +45,26 @@ var _debug = _interopRequireDefault(require("debug"));
45
45
 
46
46
  var _editableHtml = require("@pie-lib/pie-toolbox/editable-html");
47
47
 
48
+ var _mathRendering = require("@pie-lib/pie-toolbox/math-rendering");
49
+
48
50
  var _Tooltip = _interopRequireDefault(require("@material-ui/core/Tooltip"));
49
51
 
50
52
  var _utils = require("./utils");
51
53
 
54
+ var _classnames = _interopRequireDefault(require("classnames"));
55
+
56
+ var _Switch = _interopRequireDefault(require("@material-ui/core/Switch"));
57
+
58
+ var _FormControlLabel = _interopRequireDefault(require("@material-ui/core/FormControlLabel"));
59
+
60
+ var _reactDom = _interopRequireDefault(require("react-dom"));
61
+
62
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
63
+
64
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
65
+
66
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
67
+
52
68
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
53
69
 
54
70
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -79,7 +95,12 @@ var Design = /*#__PURE__*/function (_React$Component) {
79
95
  u.tokens = [];
80
96
  });
81
97
  }, 200));
82
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeText", function (event) {
98
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeText", function (text) {
99
+ _this.updateText(text);
100
+
101
+ _this.clearTokens();
102
+ });
103
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeTextEvent", function (event) {
83
104
  return _this.updateText(event.target.value);
84
105
  });
85
106
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeTokens", function (tokens, mode) {
@@ -93,6 +114,14 @@ var Design = /*#__PURE__*/function (_React$Component) {
93
114
  u.maxSelections = Math.max(max, correctTokenCount);
94
115
  });
95
116
  });
117
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeTokenizedText", function (text) {
118
+ _this.apply(function (u) {
119
+ u.tokenizedText = text; // const correctTokenCount = tokens.filter((t) => t.correct).length;
120
+ // const max = isFinite(u.maxSelections) ? u.maxSelections : 0;
121
+ //
122
+ // u.maxSelections = Math.max(max, correctTokenCount);
123
+ });
124
+ });
96
125
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeMaxSelections", function (event, max) {
97
126
  _this.apply(function (u) {
98
127
  return u.maxSelections = max;
@@ -143,9 +172,193 @@ var Design = /*#__PURE__*/function (_React$Component) {
143
172
  rationale: rationale
144
173
  }));
145
174
  });
175
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "createDOMAnnotation", function (elems, annotation) {
176
+ var classes = _this.props.classes;
177
+ var id = annotation.id;
178
+ (elems || []).forEach(function (elem) {
179
+ elem.dataset.id = id;
180
+ elem.className = (0, _classnames["default"])(classes.token); // elem.onclick = !disabled && this.handleClick;
181
+ // elem.onmouseover = this.handleHover;
182
+ // elem.onmouseout = this.handleCancelHover;
183
+ });
184
+ });
185
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "createNewAnnotation", function (selectedElems, selectionDetails) {
186
+ var annotation = _objectSpread({
187
+ id: [selectionDetails.start, selectionDetails.end, new Date().getTime()].join('-')
188
+ }, selectionDetails);
189
+
190
+ _this.createDOMAnnotation(selectedElems, annotation);
191
+
192
+ return annotation;
193
+ });
194
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "wrapSentencesInSpans", function (html) {
195
+ var onClickHandler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
196
+ var classes = _this.props.classes;
197
+ var container = document.createElement('div');
198
+ container.innerHTML = html;
199
+
200
+ var splitSentences = function splitSentences(text) {
201
+ // Match sentences ending with punctuation:
202
+ // "." or "!" or "?"
203
+ var pattern = /([^.!?]+[.!?]+[\s"]*)|([^.!?]+$)/g;
204
+ var matches = text.match(pattern);
205
+ return matches || [];
206
+ };
207
+
208
+ var processNode = function processNode(node) {
209
+ if (node.nodeType === Node.TEXT_NODE) {
210
+ var sentences = splitSentences(node.textContent);
211
+ var fragment = document.createDocumentFragment();
212
+
213
+ var _iterator = _createForOfIteratorHelper(sentences),
214
+ _step;
215
+
216
+ try {
217
+ var _loop = function _loop() {
218
+ var sentence = _step.value;
219
+
220
+ if (sentence.trim()) {
221
+ var span = document.createElement('span');
222
+ span.textContent = sentence;
223
+ span.className = (0, _classnames["default"])(classes.token);
224
+
225
+ if (onClickHandler) {
226
+ span.addEventListener('click', function (e) {
227
+ onClickHandler(e, sentence);
228
+ });
229
+ }
230
+
231
+ fragment.appendChild(span);
232
+ } else {
233
+ fragment.appendChild(document.createTextNode(sentence));
234
+ }
235
+ };
236
+
237
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
238
+ _loop();
239
+ }
240
+ } catch (err) {
241
+ _iterator.e(err);
242
+ } finally {
243
+ _iterator.f();
244
+ }
245
+
246
+ node.replaceWith(fragment);
247
+ } else if (node.nodeType === Node.ELEMENT_NODE) {
248
+ Array.from(node.childNodes).forEach(processNode);
249
+ }
250
+ };
251
+
252
+ Array.from(container.childNodes).forEach(processNode);
253
+ return container;
254
+ });
255
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleSelection", function (event) {
256
+ var selection = window.getSelection(); // prevent unwanted selections
257
+
258
+ if (event.detail > 2) {
259
+ (0, _utils.clearSelection)();
260
+ return;
261
+ }
262
+
263
+ if (selection && selection.rangeCount > 0) {
264
+ _this.wrapSelectionInSpan(selection);
265
+
266
+ (0, _utils.clearSelection)();
267
+
268
+ if (_this.textRef) {
269
+ var content = _this.textRef.getHTML();
270
+
271
+ _this.changeTokenizedText(content); // this.setState({ tokenizedText: content });
272
+
273
+ }
274
+ }
275
+ });
276
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleTokenClick", function (event) {
277
+ var correctMode = _this.state.correctMode;
278
+
279
+ if (!correctMode) {
280
+ return;
281
+ }
282
+
283
+ event.target.classList.toggle('correct');
284
+ });
285
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "clearTokens", function () {
286
+ var model = _this.props.model;
287
+
288
+ if (_this.textRef) {
289
+ var container = document.createElement('div');
290
+ container.innerHTML = model.text; // Remove all children and add new content
291
+
292
+ _this.textRef.innerHTML = '';
293
+
294
+ _this.textRef.appendChild(container);
295
+ }
296
+
297
+ _this.changeTokenizedText(model.text);
298
+
299
+ _this.setState({
300
+ tokenizedText: model.text
301
+ });
302
+ });
303
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "selectWords", function () {
304
+ var text = _this.state.text;
305
+
306
+ _this.clearTokens();
307
+
308
+ var tokenized = _this.wrapWordsInSpans(text, function (e) {
309
+ return _this.handleTokenClick(e);
310
+ });
311
+
312
+ console.log('words:', tokenized);
313
+
314
+ _this.changeTokenizedText(tokenized);
315
+
316
+ _this.setState({
317
+ tokenizedText: tokenized
318
+ });
319
+ });
320
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "selectSentences", function () {
321
+ var text = _this.state.text;
322
+
323
+ _this.clearTokens();
324
+
325
+ var container = _this.wrapSentencesInSpans(text); // Remove all children and add new content
326
+
327
+
328
+ _this.textRef.innerHTML = '';
329
+
330
+ _this.textRef.appendChild(container);
331
+
332
+ var tokenized = container.innerHTML;
333
+ console.log('sentences:', tokenized);
334
+
335
+ _this.changeTokenizedText(tokenized); // this.setState({ tokenizedText: tokenized });
336
+
337
+ });
338
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "selectParagraphs", function () {
339
+ var text = _this.state.text;
340
+
341
+ _this.clearTokens();
342
+
343
+ var container = _this.wrapParagraphContentInSpan(text); // Remove all children and add new content
344
+
345
+
346
+ _this.textRef.innerHTML = '';
347
+
348
+ _this.textRef.appendChild(container);
349
+
350
+ var tokenized = container.innerHTML;
351
+ console.log('paragraphs:', tokenized);
352
+
353
+ _this.changeTokenizedText(tokenized); // this.setState({ tokenizedText: tokenized });
354
+
355
+ });
146
356
  var _model = _this.props.model;
147
357
  _this.state = {
148
- text: _model && _model.text || ''
358
+ correctMode: false,
359
+ selectMode: false,
360
+ text: _model && _model.text || '',
361
+ tokenizedText: _model && _model.token || ''
149
362
  };
150
363
  return _this;
151
364
  }
@@ -156,17 +369,160 @@ var Design = /*#__PURE__*/function (_React$Component) {
156
369
  var model = nProps.model;
157
370
 
158
371
  if (model && model.text) {
159
- this.setState({
372
+ var _this$setState;
373
+
374
+ this.setState((_this$setState = {
160
375
  text: model.text
161
- });
376
+ }, (0, _defineProperty2["default"])(_this$setState, "text", model.text), (0, _defineProperty2["default"])(_this$setState, "tokenizedText", model.tokenizedText || model.text), _this$setState)); // model.tokens.forEach((annotation) => {
377
+ // console.log('annotation', annotation);
378
+ // const [domStart, domEnd] = getDOMNodes(annotation.start, annotation.end, this.textRef);
379
+ // console.log('domStart, domEnd', domStart, domEnd);
380
+ //
381
+ // if (domStart && domEnd) {
382
+ // const range = document.createRange();
383
+ //
384
+ // range.setStart(domStart.node, domStart.offset);
385
+ // range.setEnd(domEnd.node, domEnd.offset);
386
+ //
387
+ // const spans = wrapRange(range);
388
+ //
389
+ // this.createDOMAnnotation(spans, annotation);
390
+ // }
391
+ // });
162
392
  }
163
393
  }
394
+ }, {
395
+ key: "componentDidUpdate",
396
+ value: function componentDidUpdate() {
397
+ // console.log('UPDATED');
398
+ // console.log('this.state.text', this.state.text);
399
+ //eslint-disable-next-line
400
+ var domNode = _reactDom["default"].findDOMNode(this);
401
+
402
+ (0, _mathRendering.renderMath)(domNode);
403
+ }
404
+ }, {
405
+ key: "wrapWordsInSpans",
406
+ value: // addAnnotation = (type) => {
407
+ // const { annotations, onChange } = this.props;
408
+ // const annotation = this.createNewAnnotation('', type);
409
+ // const labelElem = getLabelElement(annotation.id);
410
+ //
411
+ // annotations.push(annotation);
412
+ //
413
+ // this.setState({
414
+ // openedMenu: false,
415
+ // openedEditor: true,
416
+ // annotationIndex: annotations.length - 1,
417
+ // annotation,
418
+ // labelElem,
419
+ // });
420
+ //
421
+ // onChange(annotations);
422
+ // };
423
+ // new functionalities
424
+ function wrapWordsInSpans(html, onClick) {
425
+ var classes = this.props.classes;
426
+ var container = document.createElement('div');
427
+ container.innerHTML = html;
428
+
429
+ var processNode = function processNode(node) {
430
+ if (node.nodeType === Node.TEXT_NODE) {
431
+ var words = node.textContent.split(/(\s+|\b)/); // split by word boundaries + spaces
432
+
433
+ var fragment = document.createDocumentFragment();
434
+
435
+ var _iterator2 = _createForOfIteratorHelper(words),
436
+ _step2;
437
+
438
+ try {
439
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
440
+ var word = _step2.value;
441
+
442
+ if (word.trim()) {
443
+ var span = document.createElement('span');
444
+ span.className = (0, _classnames["default"])(classes.token);
445
+ span.addEventListener('click', function (e) {
446
+ return onClick(e);
447
+ });
448
+ span.textContent = word;
449
+ fragment.appendChild(span);
450
+ } else {
451
+ fragment.appendChild(document.createTextNode(word));
452
+ }
453
+ }
454
+ } catch (err) {
455
+ _iterator2.e(err);
456
+ } finally {
457
+ _iterator2.f();
458
+ }
459
+
460
+ node.replaceWith(fragment);
461
+ } else if (node.nodeType === Node.ELEMENT_NODE) {
462
+ Array.from(node.childNodes).forEach(processNode);
463
+ }
464
+ };
465
+
466
+ Array.from(container.childNodes).forEach(processNode);
467
+ return container.innerHTML;
468
+ }
469
+ }, {
470
+ key: "wrapParagraphContentInSpan",
471
+ value: function wrapParagraphContentInSpan(html) {
472
+ var _this2 = this;
473
+
474
+ var classes = this.props.classes;
475
+ var container = document.createElement('div');
476
+ container.innerHTML = html;
477
+ container.querySelectorAll('p').forEach(function (p) {
478
+ var span = document.createElement('span');
479
+ span.className = (0, _classnames["default"])(classes.token);
480
+ span.addEventListener('click', _this2.handleTokenClick); // Move all children of <p> into the span
481
+
482
+ while (p.firstChild) {
483
+ span.appendChild(p.firstChild);
484
+ }
485
+
486
+ p.appendChild(span);
487
+ });
488
+ return container;
489
+ }
490
+ }, {
491
+ key: "wrapSelectionInSpan",
492
+ value: function wrapSelectionInSpan(selection) {
493
+ var classes = this.props.classes;
494
+ var range = selection.getRangeAt(0);
495
+
496
+ if (range.collapsed) {
497
+ console.log('Selection is collapsed (no text selected).');
498
+ return;
499
+ } // Extract the contents of the selection
500
+
501
+
502
+ var contents = range.extractContents(); // Create the span wrapper
503
+
504
+ var span = document.createElement('span');
505
+ span.className = (0, _classnames["default"])(classes.token);
506
+ span.addEventListener('click', this.handleTokenClick);
507
+ span.appendChild(contents); // Insert back into the DOM
508
+
509
+ range.insertNode(span); // Collapse the selection
510
+
511
+ selection.removeAllRanges();
512
+ }
164
513
  }, {
165
514
  key: "render",
166
515
  value: function render() {
167
- var _configuration$teache, _configuration$prompt, _configuration$ration;
168
-
169
- var textValue = this.state.text;
516
+ var _configuration$teache,
517
+ _configuration$prompt,
518
+ _this3 = this,
519
+ _configuration$ration;
520
+
521
+ var _this$state = this.state,
522
+ textValue = _this$state.text,
523
+ correctMode = _this$state.correctMode,
524
+ selectMode = _this$state.selectMode,
525
+ tokenizedText = _this$state.tokenizedText;
170
526
  var _this$props6 = this.props,
171
527
  classes = _this$props6.classes,
172
528
  configuration = _this$props6.configuration,
@@ -336,65 +692,60 @@ var Design = /*#__PURE__*/function (_React$Component) {
336
692
  mathMlOptions: mathMlOptions
337
693
  }), promptError && /*#__PURE__*/_react["default"].createElement("div", {
338
694
  className: classes.errorText
339
- }, promptError)), text.settings && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
695
+ }, promptError)), /*#__PURE__*/_react["default"].createElement("div", {
696
+ className: classes.subheader
697
+ }, "NEW functionality", /*#__PURE__*/_react["default"].createElement(_FormControlLabel["default"], {
698
+ control: /*#__PURE__*/_react["default"].createElement(_Switch["default"], {
699
+ checked: selectMode,
700
+ onChange: function onChange() {
701
+ _this3.setState({
702
+ selectMode: !selectMode
703
+ }); // renderMath(this);
704
+
705
+ }
706
+ }),
707
+ label: "Select tokens"
708
+ })), selectMode && /*#__PURE__*/_react["default"].createElement(_textSelect.Controls, {
709
+ onClear: this.clearTokens,
710
+ onWords: this.selectWords,
711
+ onSentences: this.selectSentences,
712
+ onParagraphs: this.selectParagraphs,
713
+ setCorrectMode: correctMode,
714
+ onToggleCorrectMode: function onToggleCorrectMode() {
715
+ return _this3.setState({
716
+ correctMode: !correctMode
717
+ });
718
+ }
719
+ }), text.settings && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
340
720
  label: text.label || '',
341
721
  className: classes.promptHolder
342
- }, /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
343
- className: classes.input,
344
- multiline: true,
345
- defaultValue: textValue,
346
- onChange: this.changeText,
347
- spellCheck: spellCheckEnabled
348
- })), tokens.settings && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
349
- label: tokens.label || '',
350
- className: classes.tokenizerContainer
351
- }, /*#__PURE__*/_react["default"].createElement(_Tooltip["default"], {
352
- classes: {
353
- tooltip: classes.tooltip
722
+ }, selectMode ? /*#__PURE__*/_react["default"].createElement("div", {
723
+ className: classes.textContainer,
724
+ ref: function ref(r) {
725
+ return _this3.textRef = r;
354
726
  },
355
- disableFocusListener: true,
356
- disableTouchListener: true,
357
- placement: 'right',
358
- title: validationMessage
359
- }, /*#__PURE__*/_react["default"].createElement(_Info["default"], {
360
- fontSize: 'small',
361
- color: 'primary',
362
- style: {
363
- position: 'absolute',
364
- left: '48px',
365
- top: '-3px'
727
+ onMouseDown: selectMode && !correctMode ? _utils.clearSelection : function () {},
728
+ onMouseUp: selectMode && !correctMode ? this.handleSelection : function () {},
729
+ dangerouslySetInnerHTML: {
730
+ __html: tokenizedText
366
731
  }
367
- })), /*#__PURE__*/_react["default"].createElement(_textSelect.Tokenizer, {
368
- className: classes.tokenizer,
369
- text: model.text,
370
- tokens: tokensModel,
371
- onChange: this.changeTokens
372
- })), tokensError && /*#__PURE__*/_react["default"].createElement("div", {
373
- className: classes.errorText
374
- }, tokensError), selectionsError && /*#__PURE__*/_react["default"].createElement("div", {
375
- className: classes.errorText
376
- }, selectionsError), /*#__PURE__*/_react["default"].createElement("div", {
377
- className: classes.tokensDetails
378
- }, mode.settings && /*#__PURE__*/_react["default"].createElement(_Chip["default"], {
379
- label: "".concat(mode.label, ": ").concat(model.mode ? model.mode : 'None'),
380
- className: classes.chip
381
- }), selections.settings && /*#__PURE__*/_react["default"].createElement(_Chip["default"], {
382
- label: "".concat(selections.label, ": ").concat(tokensModel.length),
383
- className: classes.chip
384
- }), correctAnswer.settings && /*#__PURE__*/_react["default"].createElement(_Chip["default"], {
385
- label: "".concat(correctAnswer.label, ": ").concat(tokensModel.filter(function (t) {
386
- return t.correct;
387
- }).length),
388
- className: classes.chip
389
- }), selectionCount.settings && /*#__PURE__*/_react["default"].createElement(_configUi.NumberTextField, {
390
- min: tokensModel.filter(function (t) {
391
- return t.correct;
392
- }).length || 0,
393
- label: "".concat(selectionCount.label, " (0:any)"),
394
- max: tokensModel.length,
395
- value: model.maxSelections,
396
- onChange: this.changeMaxSelections,
397
- className: classes.numberField
732
+ }) : /*#__PURE__*/_react["default"].createElement(_editableHtml.EditableHtml, {
733
+ className: classes.prompt,
734
+ markup: textValue,
735
+ onChange: this.changeText,
736
+ nonEmpty: false,
737
+ disableUnderline: true,
738
+ toolbarOpts: toolbarOpts,
739
+ pluginProps: getPluginProps(text === null || text === void 0 ? void 0 : text.inputConfiguration),
740
+ spellCheck: spellCheckEnabled,
741
+ imageSupport: imageSupport,
742
+ uploadSoundSupport: uploadSoundSupport,
743
+ languageCharactersProps: [{
744
+ language: 'spanish'
745
+ }, {
746
+ language: 'special'
747
+ }],
748
+ mathMlOptions: mathMlOptions
398
749
  })), rationaleEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
399
750
  label: rationale.label || '',
400
751
  className: classes.promptHolder
@@ -499,6 +850,43 @@ var _default = (0, _styles.withStyles)(function (theme) {
499
850
  fontSize: theme.typography.fontSize - 2,
500
851
  color: theme.palette.error.main,
501
852
  paddingTop: theme.spacing.unit
853
+ },
854
+ subheader: {
855
+ paddingBottom: '8px',
856
+ borderBottom: '1px solid grey',
857
+ marginBottom: '16px',
858
+ marginTop: '24px',
859
+ display: 'flex',
860
+ alignItems: 'center',
861
+ justifyContent: 'space-between'
862
+ },
863
+ textContainer: {
864
+ padding: '15px 21px',
865
+ border: '1px solid #ccc',
866
+ borderRadius: '4px',
867
+ overflowY: 'scroll',
868
+ whiteSpace: 'pre-wrap',
869
+ overflowWrap: 'break-word',
870
+ '& p': {
871
+ margin: 0
872
+ },
873
+ '& span[data-latex]': {
874
+ userSelect: 'none',
875
+ '-webkit-user-select': 'none',
876
+ '-moz-user-select': 'none',
877
+ '-ms-user-select': 'none'
878
+ }
879
+ },
880
+ token: {
881
+ position: 'relative',
882
+ cursor: 'pointer',
883
+ backgroundColor: '#fff9c4',
884
+ '&:hover': {
885
+ backgroundColor: '#E5E0B0'
886
+ },
887
+ '&.correct': {
888
+ backgroundColor: '#4caf50'
889
+ }
502
890
  }
503
891
  };
504
892
  })(Design);