@instructure/quiz-core 20.37.1 → 20.38.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 (91) hide show
  1. package/es/banks/components/BankSearch/presenter.js +1 -2
  2. package/es/building/api/stimuli.js +2 -1
  3. package/es/building/components/resources/DeleteStimulusModal/presenter.js +14 -7
  4. package/es/building/components/resources/quizEntry/QuizEntry/presenter.js +11 -4
  5. package/es/building/components/resources/quizEntry/QuizEntryEdit/Footer/presenter.js +1 -2
  6. package/es/common/actions/modifications.js +3 -2
  7. package/es/common/components/layout/Page/styles.js +13 -1
  8. package/es/common/components/layout/Page/theme.js +1 -2
  9. package/es/common/components/layout/sidebar/Sidebar/index.js +26 -4
  10. package/es/common/components/layout/sidebar/SidebarItem/presenter.js +13 -7
  11. package/es/common/components/layout/sidebar/Stimulus/presenter.js +14 -7
  12. package/es/common/components/resources/quiz/AddContent/Body/presenter.js +2 -2
  13. package/es/common/components/resources/quiz/instructions/styles.js +5 -2
  14. package/es/common/components/resources/stimulus/Stimulus/presenter.js +3 -2
  15. package/es/common/components/resources/stimulus/StimulusEdit/presenter.js +14 -4
  16. package/es/common/components/resources/stimulus/StimulusEdit/styles.js +1 -5
  17. package/es/common/components/resources/stimulus/StimulusEdit/theme.js +0 -2
  18. package/es/common/components/resources/stimulus/StimulusEditInfo/presenter.js +46 -29
  19. package/es/common/components/resources/stimulus/StimulusShow/index.js +10 -4
  20. package/es/common/components/resources/stimulus/StimulusShow/styles.js +0 -7
  21. package/es/common/components/resources/stimulus/StimulusShow/theme.js +0 -3
  22. package/es/common/components/shared/InteractionTypes/index.js +4 -1
  23. package/es/common/components/shared/InteractionTypes/presenter.js +38 -15
  24. package/es/common/components/shared/TimeUnitsInput/index.js +9 -8
  25. package/es/common/components/shared/drag_and_drop/dragAndDropUtils.js +3 -0
  26. package/es/common/records/QuizEntry.js +5 -0
  27. package/es/common/reducers/modifications.js +6 -3
  28. package/es/common/util/warningHelpers.js +15 -5
  29. package/es/moderating/components/resources/ModerateTable/presenter.js +1 -2
  30. package/es/moderating/components/sidebar/ModerateTray/presenter.js +1 -2
  31. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingTypeTable/presenter.js +1 -2
  32. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/NumericType/ChoiceTypeWithInfo/presenter.js +1 -1
  33. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/NumericType/presenter.js +1 -2
  34. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/RichFillBlankType/ChoiceGroupTypeTable/presenter.js +1 -2
  35. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AfsTableWrapper/presenter.js +1 -2
  36. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AggregationTable/presenter.js +1 -2
  37. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/ChoiceTypeTable/presenter.js +1 -2
  38. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/ExpandableCard/presenter.js +1 -2
  39. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +1 -2
  40. package/es/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/presenter.js +1 -2
  41. package/es/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +1 -2
  42. package/es/reporting/components/resources/ReportCard/index.js +1 -2
  43. package/es/reporting/components/resources/StudentAnalysis/ReportCard/presenter.js +1 -2
  44. package/es/reporting/components/resources/common/AnalysisUpdateDate/index.js +1 -1
  45. package/es/taking/api/taking.js +4 -0
  46. package/lib/banks/components/BankSearch/presenter.js +3 -4
  47. package/lib/building/api/stimuli.js +2 -1
  48. package/lib/building/components/resources/DeleteStimulusModal/presenter.js +14 -7
  49. package/lib/building/components/resources/quizEntry/QuizEntry/presenter.js +11 -4
  50. package/lib/building/components/resources/quizEntry/QuizEntryEdit/Footer/presenter.js +3 -4
  51. package/lib/common/actions/modifications.js +3 -2
  52. package/lib/common/components/layout/Page/styles.js +13 -1
  53. package/lib/common/components/layout/Page/theme.js +1 -2
  54. package/lib/common/components/layout/sidebar/Sidebar/index.js +25 -3
  55. package/lib/common/components/layout/sidebar/SidebarItem/presenter.js +15 -9
  56. package/lib/common/components/layout/sidebar/Stimulus/presenter.js +16 -9
  57. package/lib/common/components/resources/quiz/AddContent/Body/presenter.js +2 -2
  58. package/lib/common/components/resources/quiz/instructions/styles.js +5 -2
  59. package/lib/common/components/resources/stimulus/Stimulus/presenter.js +3 -2
  60. package/lib/common/components/resources/stimulus/StimulusEdit/presenter.js +14 -4
  61. package/lib/common/components/resources/stimulus/StimulusEdit/styles.js +1 -5
  62. package/lib/common/components/resources/stimulus/StimulusEdit/theme.js +0 -2
  63. package/lib/common/components/resources/stimulus/StimulusEditInfo/presenter.js +46 -29
  64. package/lib/common/components/resources/stimulus/StimulusShow/index.js +9 -3
  65. package/lib/common/components/resources/stimulus/StimulusShow/styles.js +0 -7
  66. package/lib/common/components/resources/stimulus/StimulusShow/theme.js +0 -3
  67. package/lib/common/components/shared/InteractionTypes/index.js +4 -1
  68. package/lib/common/components/shared/InteractionTypes/presenter.js +38 -15
  69. package/lib/common/components/shared/TimeUnitsInput/index.js +10 -9
  70. package/lib/common/components/shared/drag_and_drop/dragAndDropUtils.js +3 -0
  71. package/lib/common/records/QuizEntry.js +5 -0
  72. package/lib/common/reducers/modifications.js +6 -3
  73. package/lib/common/util/warningHelpers.js +15 -5
  74. package/lib/moderating/components/resources/ModerateTable/presenter.js +3 -4
  75. package/lib/moderating/components/sidebar/ModerateTray/presenter.js +5 -6
  76. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingTypeTable/presenter.js +6 -7
  77. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/NumericType/ChoiceTypeWithInfo/presenter.js +9 -9
  78. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/NumericType/presenter.js +2 -3
  79. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/RichFillBlankType/ChoiceGroupTypeTable/presenter.js +5 -6
  80. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AfsTableWrapper/presenter.js +4 -5
  81. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AggregationTable/presenter.js +3 -4
  82. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/ChoiceTypeTable/presenter.js +3 -4
  83. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/ExpandableCard/presenter.js +8 -9
  84. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +20 -21
  85. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/presenter.js +9 -10
  86. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +20 -21
  87. package/lib/reporting/components/resources/ReportCard/index.js +1 -2
  88. package/lib/reporting/components/resources/StudentAnalysis/ReportCard/presenter.js +9 -10
  89. package/lib/reporting/components/resources/common/AnalysisUpdateDate/index.js +2 -2
  90. package/lib/taking/api/taking.js +4 -0
  91. package/package.json +8 -12
@@ -121,6 +121,12 @@ var DeleteStimulusModal = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.de
121
121
  cancelText: (0, _formatMessage.default)('Cancel')
122
122
  };
123
123
  }
124
+ }, {
125
+ key: "isPassage",
126
+ value: function isPassage() {
127
+ var _this$props$stimulusE;
128
+ return (_this$props$stimulusE = this.props.stimulusEntry) === null || _this$props$stimulusE === void 0 ? void 0 : _this$props$stimulusE.getEntry().passage;
129
+ }
124
130
  }, {
125
131
  key: "anyImmutableKeepers",
126
132
  value: function anyImmutableKeepers() {
@@ -149,8 +155,8 @@ var DeleteStimulusModal = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.de
149
155
  return (0, _emotion.jsx)(_uiButtons.Button, {
150
156
  onClick: this.closeAction,
151
157
  margin: _quizCommon.XSMALL_SIDE_MARGIN,
152
- "data-automation": "sdk-keep-stimulus-button"
153
- }, (0, _formatMessage.default)('Keep Stimulus'));
158
+ "data-automation": "sdk-keep-".concat(this.isPassage() ? 'passage' : 'stimulus', "-button")
159
+ }, this.isPassage() ? (0, _formatMessage.default)('Keep Passage') : (0, _formatMessage.default)('Keep Stimulus'));
154
160
  }
155
161
  }, {
156
162
  key: "doneButton",
@@ -164,8 +170,8 @@ var DeleteStimulusModal = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.de
164
170
  color: "primary",
165
171
  onClick: this.handleSubmit,
166
172
  margin: _quizCommon.XSMALL_SIDE_MARGIN,
167
- "data-automation": "sdk-remove-stimulus-button"
168
- }, (0, _formatMessage.default)('Remove Stimulus'));
173
+ "data-automation": "sdk-remove-".concat(this.isPassage() ? 'passage' : 'stimulus', "-button")
174
+ }, this.isPassage() ? (0, _formatMessage.default)('Remove Passage') : (0, _formatMessage.default)('Remove Stimulus'));
169
175
  }
170
176
  }, {
171
177
  key: "renderChooseWhich",
@@ -206,7 +212,8 @@ var DeleteStimulusModal = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.de
206
212
  }, {
207
213
  key: "renderContent",
208
214
  value: function renderContent() {
209
- var content = this.props.childEntries.size === 0 ? (0, _emotion.jsx)("span", null, (0, _formatMessage.default)('Are you sure you want to remove this stimulus?')) : this.renderMainMenu();
215
+ var message = this.isPassage() ? (0, _formatMessage.default)('Are you sure you want to remove this passage?') : (0, _formatMessage.default)('Are you sure you want to remove this stimulus?');
216
+ var content = this.props.childEntries.size === 0 ? (0, _emotion.jsx)("span", null, message) : this.renderMainMenu();
210
217
  var stimulusTitle = this.props.stimulusEntry && this.props.stimulusEntry.getEntry().title;
211
218
  return (0, _emotion.jsx)("div", {
212
219
  className: "deleteStimulusModal",
@@ -222,11 +229,11 @@ var DeleteStimulusModal = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.de
222
229
  open: this.props.modalOpen,
223
230
  onDismiss: this.closeAction,
224
231
  size: "small",
225
- label: (0, _formatMessage.default)('Confirm Stimulus Removal')
232
+ label: this.isPassage() ? (0, _formatMessage.default)('Confirm Passage Removal') : (0, _formatMessage.default)('Confirm Stimulus Removal')
226
233
  }, (0, _emotion.jsx)(_quizCommon.ModalHeader, null, (0, _emotion.jsx)(_uiHeading.Heading, {
227
234
  level: "reset",
228
235
  as: "h2"
229
- }, (0, _formatMessage.default)('Confirm Stimulus Removal')), (0, _emotion.jsx)(_uiButtons.CloseButton, {
236
+ }, this.isPassage() ? (0, _formatMessage.default)('Confirm Passage Removal') : (0, _formatMessage.default)('Confirm Stimulus Removal')), (0, _emotion.jsx)(_uiButtons.CloseButton, {
230
237
  onClick: this.closeAction,
231
238
  placement: "end",
232
239
  offset: "medium",
@@ -45,10 +45,10 @@ var QuizEntry = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _th
45
45
  function QuizEntry() {
46
46
  var _this;
47
47
  (0, _classCallCheck2.default)(this, QuizEntry);
48
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
49
- args[_key] = arguments[_key];
48
+ for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
49
+ _args[_key] = arguments[_key];
50
50
  }
51
- _this = _super.call.apply(_super, [this].concat(args));
51
+ _this = _super.call.apply(_super, [this].concat(_args));
52
52
  _this.itemOverrideTypes = function () {
53
53
  return ['choice'].concat((0, _toConsumableArray2.default)(_this.props.partialScoringEnabled ? ['multi-answer'] : []), (0, _toConsumableArray2.default)(_this.props.partialDeepScoringEnabled ? ['matching'] : []));
54
54
  };
@@ -103,7 +103,14 @@ var QuizEntry = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _th
103
103
  };
104
104
  _this.bankEntryWarningWrapperProps = function () {
105
105
  if (_this.props.quizEntry.entryEditable) {
106
- var propsFunc = _this.props.quizEntry.hasStimulus ? _warningHelpers.propsForStimulusBankEntryEditPrompt : _warningHelpers.propsForItemBankEntryEditPrompt;
106
+ var _this$props$entry;
107
+ var isPassage = (_this$props$entry = _this.props.entry) === null || _this$props$entry === void 0 ? void 0 : _this$props$entry.passage;
108
+ var propsFunc = _this.props.quizEntry.hasStimulus ? function () {
109
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
110
+ args[_key2] = arguments[_key2];
111
+ }
112
+ return _warningHelpers.propsForStimulusBankEntryEditPrompt.apply(void 0, [isPassage].concat(args));
113
+ } : _warningHelpers.propsForItemBankEntryEditPrompt;
107
114
  return propsFunc(_this.isEditing(), _this.props.switchOffEditing, function () {
108
115
  var bankEntry = _this.props.quizEntry.getEntry();
109
116
  _this.props.setUi(_quizCommon.BUILD_TRAY_OPEN, true);
@@ -14,7 +14,6 @@ var _react = require("react");
14
14
  var _propTypes = _interopRequireDefault(require("prop-types"));
15
15
  var _reactImmutableProptypes = _interopRequireDefault(require("react-immutable-proptypes"));
16
16
  var _uiView = require("@instructure/ui-view");
17
- var _uiFlex = require("@instructure/ui-flex");
18
17
  var _uiA11yContent = require("@instructure/ui-a11y-content");
19
18
  var _uiText = require("@instructure/ui-text");
20
19
  var _quizNumberInput = _interopRequireDefault(require("@instructure/quiz-number-input"));
@@ -205,13 +204,13 @@ var QuizEntryEditFooter = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.de
205
204
  as: "div",
206
205
  background: "secondary",
207
206
  padding: "xx-small none"
208
- }, (0, _emotion.jsx)(_uiFlex.Flex, {
207
+ }, (0, _emotion.jsx)(_quizCommon.Flex, {
209
208
  wrap: "wrap",
210
209
  justifyItems: "space-between",
211
210
  alignItems: "center"
212
- }, (0, _emotion.jsx)(_uiFlex.Flex.Item, {
211
+ }, (0, _emotion.jsx)(_quizCommon.Flex.Item, {
213
212
  padding: "xx-small small"
214
- }, this.renderLeftFooter()), (0, _emotion.jsx)(_uiFlex.Flex.Item, {
213
+ }, this.renderLeftFooter()), (0, _emotion.jsx)(_quizCommon.Flex.Item, {
215
214
  padding: "xx-small small"
216
215
  }, this.renderRightFooter())));
217
216
  }
@@ -520,13 +520,14 @@ function clearTemporaryBankItem(bankId) {
520
520
  // =====================
521
521
  // =====================
522
522
 
523
- function createStimulus(quizId, position) {
523
+ function createStimulus(quizId, position, isPassage) {
524
524
  return function (dispatch, getState) {
525
525
  dispatch({
526
526
  type: _quizCommon.CREATE_TEMPORARY_STIMULUS,
527
527
  payload: {
528
528
  quizId: quizId,
529
- position: position
529
+ position: position,
530
+ isPassage: isPassage
530
531
  }
531
532
  });
532
533
  };
@@ -24,7 +24,19 @@ var generateStyle = function generateStyle(componentTheme, props) {
24
24
  overflowY: 'auto'
25
25
  }), {}, {
26
26
  transition: componentTheme.contentTransition,
27
- width: '100%'
27
+ width: '100%',
28
+ '.user_content p': {
29
+ margin: "".concat(componentTheme.userContentMargin, " 0"),
30
+ '&:first-of-type': {
31
+ margin: "0 0 ".concat(componentTheme.userContentMargin)
32
+ },
33
+ '&:last-of-type': {
34
+ margin: "".concat(componentTheme.userContentMargin, " 0 0")
35
+ },
36
+ '&:only-child': {
37
+ margin: 0
38
+ }
39
+ }
28
40
  })
29
41
  };
30
42
  };
@@ -12,8 +12,7 @@ var generateComponentTheme = function generateComponentTheme(_ref) {
12
12
  return {
13
13
  fontFamily: typography.fontFamily,
14
14
  contentTransition: "transform ".concat(transitions.duration),
15
- userContentMargin: spacing.mediumSmall,
16
- userContentZeroMargin: 0
15
+ userContentMargin: spacing.mediumSmall
17
16
  };
18
17
  };
19
18
  var _default = generateComponentTheme;
@@ -23,6 +23,7 @@ var _uiView = require("@instructure/ui-view");
23
23
  var _emotion = require("@instructure/emotion");
24
24
  var _uiHeading = require("@instructure/ui-heading");
25
25
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
26
+ var _uiTooltip = require("@instructure/ui-tooltip");
26
27
  var _quizCommon = require("@instructure/quiz-common");
27
28
  var _windowChecks = require("../../../../util/windowChecks.js");
28
29
  var _CustomPropTypes = _interopRequireDefault(require("../../../../util/CustomPropTypes.js"));
@@ -108,12 +109,19 @@ var Sidebar = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _them
108
109
  }, {
109
110
  key: "renderTitle",
110
111
  value: function renderTitle() {
112
+ var navigationText = (0, _formatMessage.default)('Navigate to title');
111
113
  if (this.props.grading) {
112
114
  return;
113
115
  }
114
116
  return (0, _emotion.jsx)("div", {
115
117
  css: this.props.styles.sidebar.actionableInfo,
116
118
  className: _quizCommon.END_EDITING_TRIGGER_CLASSNAME
119
+ }, (0, _emotion.jsx)(_uiTooltip.Tooltip, {
120
+ renderTip: this.props.sidebarOpen ? '' : (0, _emotion.jsx)("span", {
121
+ "aria-hidden": "true"
122
+ }, navigationText),
123
+ placement: "start",
124
+ on: this.props.sidebarOpen ? [] : ['focus', 'hover']
117
125
  }, (0, _emotion.jsx)(_uiLink.Link, {
118
126
  href: "#",
119
127
  margin: "small",
@@ -121,7 +129,7 @@ var Sidebar = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _them
121
129
  onClick: this.scrollToTitle,
122
130
  renderIcon: _ref,
123
131
  "data-automation": "sidebar-title-button"
124
- }, (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, (0, _formatMessage.default)('Navigate to title'))), (0, _emotion.jsx)(_uiA11yContent.PresentationContent, null, (0, _emotion.jsx)("span", {
132
+ }, (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, navigationText))), (0, _emotion.jsx)(_uiA11yContent.PresentationContent, null, (0, _emotion.jsx)("span", {
125
133
  css: this.props.styles.sidebar.description,
126
134
  "data-automation": "sidebar-title-text",
127
135
  onClick: this.scrollToTitle,
@@ -131,12 +139,19 @@ var Sidebar = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _them
131
139
  }, {
132
140
  key: "renderInstructions",
133
141
  value: function renderInstructions() {
142
+ var navigationText = (0, _formatMessage.default)('Navigate to instructions');
134
143
  if (this.props.grading) {
135
144
  return;
136
145
  }
137
146
  return (0, _emotion.jsx)("div", {
138
147
  css: this.props.styles.sidebar.actionableInfo,
139
148
  className: _quizCommon.END_EDITING_TRIGGER_CLASSNAME
149
+ }, (0, _emotion.jsx)(_uiTooltip.Tooltip, {
150
+ renderTip: this.props.sidebarOpen ? '' : (0, _emotion.jsx)("span", {
151
+ "aria-hidden": "true"
152
+ }, navigationText),
153
+ placement: "start",
154
+ on: this.props.sidebarOpen ? [] : ['focus', 'hover']
140
155
  }, (0, _emotion.jsx)(_uiLink.Link, {
141
156
  href: "#",
142
157
  margin: "small",
@@ -144,7 +159,7 @@ var Sidebar = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _them
144
159
  onClick: this.scrollToInfo,
145
160
  renderIcon: _ref2,
146
161
  "data-automation": "sidebar-instructions-button"
147
- }, (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, (0, _formatMessage.default)('Navigate to instructions'))), (0, _emotion.jsx)(_uiA11yContent.PresentationContent, null, (0, _emotion.jsx)("span", {
162
+ }, (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, navigationText))), (0, _emotion.jsx)(_uiA11yContent.PresentationContent, null, (0, _emotion.jsx)("span", {
148
163
  css: this.props.styles.sidebar.description,
149
164
  "data-automation": "sidebar-instructions-text",
150
165
  onClick: this.scrollToInfo,
@@ -154,11 +169,18 @@ var Sidebar = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _them
154
169
  }, {
155
170
  key: "renderResults",
156
171
  value: function renderResults() {
172
+ var navigationText = (0, _formatMessage.default)('Navigate to results');
157
173
  if (!this.props.grading) {
158
174
  return;
159
175
  }
160
176
  return (0, _emotion.jsx)("div", {
161
177
  css: this.props.styles.sidebar.actionableInfo
178
+ }, (0, _emotion.jsx)(_uiTooltip.Tooltip, {
179
+ renderTip: this.props.sidebarOpen ? '' : (0, _emotion.jsx)("span", {
180
+ "aria-hidden": "true"
181
+ }, navigationText),
182
+ placement: "start",
183
+ on: this.props.sidebarOpen ? [] : ['focus', 'hover']
162
184
  }, (0, _emotion.jsx)(_uiLink.Link, {
163
185
  href: "#",
164
186
  margin: "small",
@@ -166,7 +188,7 @@ var Sidebar = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _them
166
188
  onClick: this.scrollToResults,
167
189
  renderIcon: _ref3,
168
190
  "data-automation": "sidebar-results-button"
169
- }, (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, (0, _formatMessage.default)('Navigate to results'))), (0, _emotion.jsx)(_uiA11yContent.PresentationContent, null, (0, _emotion.jsx)("span", {
191
+ }, (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, navigationText))), (0, _emotion.jsx)(_uiA11yContent.PresentationContent, null, (0, _emotion.jsx)("span", {
170
192
  css: this.props.styles.sidebar.description,
171
193
  "data-automation": "sidebar-results-text",
172
194
  onClick: this.scrollToResults,
@@ -12,9 +12,7 @@ var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/creat
12
12
  var _react = require("react");
13
13
  var _propTypes = _interopRequireDefault(require("prop-types"));
14
14
  var _reactImmutableProptypes = _interopRequireDefault(require("react-immutable-proptypes"));
15
- var _uiA11yContent = require("@instructure/ui-a11y-content");
16
15
  var _uiLink = require("@instructure/ui-link");
17
- var _uiFlex = require("@instructure/ui-flex");
18
16
  var _emotion = require("@instructure/emotion");
19
17
  var _index = _interopRequireDefault(require("../PositionSummary/index.js"));
20
18
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
@@ -22,6 +20,8 @@ var _quizRce = require("@instructure/quiz-rce");
22
20
  var _styles = _interopRequireDefault(require("./styles.js"));
23
21
  var _theme = _interopRequireDefault(require("./theme.js"));
24
22
  var _quizCommon = require("@instructure/quiz-common");
23
+ var _uiTooltip = require("@instructure/ui-tooltip");
24
+ var _uiA11yContent = require("@instructure/ui-a11y-content");
25
25
  var _dec, _class, _SidebarItem;
26
26
  /** @jsx jsx */
27
27
  var SidebarItem = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _theme.default), _dec(_class = (_SidebarItem = /*#__PURE__*/function (_Component) {
@@ -96,12 +96,18 @@ var SidebarItem = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _
96
96
  displayPosition = _this$props2.displayPosition,
97
97
  itemId = _this$props2.itemId,
98
98
  isAnswered = _this$props2.isAnswered;
99
- var screenReaderContent = !isAnswered && isAnswered !== null ? (0, _formatMessage.default)('Navigate to question at position {displayPosition}, unanswered', {
99
+ var content = !isAnswered && isAnswered !== null ? (0, _formatMessage.default)('Navigate to question at position {displayPosition}, unanswered', {
100
100
  displayPosition: displayPosition
101
101
  }) : (0, _formatMessage.default)('Navigate to question at position {displayPosition}', {
102
102
  displayPosition: displayPosition
103
103
  });
104
- return (0, _emotion.jsx)(_uiLink.Link, {
104
+ return (0, _emotion.jsx)(_uiTooltip.Tooltip, {
105
+ renderTip: this.props.sidebarOpen ? '' : (0, _emotion.jsx)("span", {
106
+ "aria-hidden": "true"
107
+ }, content),
108
+ placement: "start",
109
+ on: this.props.sidebarOpen ? [] : ['hover', 'focus']
110
+ }, (0, _emotion.jsx)(_uiLink.Link, {
105
111
  href: "#",
106
112
  size: "small",
107
113
  margin: "0 small",
@@ -111,8 +117,8 @@ var SidebarItem = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _
111
117
  "data-automation-item-id": itemId,
112
118
  "data-automation": "sdk-sidebar-item-button"
113
119
  }, (0, _emotion.jsx)(_uiA11yContent.AccessibleContent, {
114
- alt: screenReaderContent
115
- }, this.renderPosition()));
120
+ alt: content
121
+ }, this.renderPosition())));
116
122
  }
117
123
  }, {
118
124
  key: "renderClosed",
@@ -134,9 +140,9 @@ var SidebarItem = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _
134
140
  return (0, _emotion.jsx)("div", {
135
141
  className: parentDivClass,
136
142
  css: styles.sidebarItem
137
- }, (0, _emotion.jsx)(_uiFlex.Flex, {
143
+ }, (0, _emotion.jsx)(_quizCommon.Flex, {
138
144
  justifyItems: "space-between"
139
- }, (0, _emotion.jsx)(_uiFlex.Flex.Item, null, this.renderButton()), (0, _emotion.jsx)(_uiFlex.Flex.Item, {
145
+ }, (0, _emotion.jsx)(_quizCommon.Flex.Item, null, this.renderButton()), (0, _emotion.jsx)(_quizCommon.Flex.Item, {
140
146
  shouldGrow: true,
141
147
  shouldShrink: true,
142
148
  onClick: this.scrollToItem,
@@ -155,7 +161,7 @@ var SidebarItem = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _
155
161
  css: this.props.styles.itemBody
156
162
  }, (0, _emotion.jsx)(_quizRce.RichContentRenderer, {
157
163
  content: this.props.itemBody
158
- })))), (0, _emotion.jsx)(_uiFlex.Flex.Item, null, (0, _emotion.jsx)("div", {
164
+ })))), (0, _emotion.jsx)(_quizCommon.Flex.Item, null, (0, _emotion.jsx)("div", {
159
165
  css: this.props.styles.pinWrapper
160
166
  }, children))));
161
167
  }
@@ -15,8 +15,6 @@ var _reactImmutableProptypes = _interopRequireDefault(require("react-immutable-p
15
15
  var _uiIcons = require("@instructure/ui-icons");
16
16
  var _emotion = require("@instructure/emotion");
17
17
  var _uiLink = require("@instructure/ui-link");
18
- var _uiFlex = require("@instructure/ui-flex");
19
- var _uiA11yContent = require("@instructure/ui-a11y-content");
20
18
  var _index = _interopRequireDefault(require("./Collection/index.js"));
21
19
  var _index2 = _interopRequireDefault(require("./Title/index.js"));
22
20
  var _index3 = _interopRequireDefault(require("./Summary/index.js"));
@@ -24,6 +22,8 @@ var _styles = _interopRequireDefault(require("./styles.js"));
24
22
  var _theme = _interopRequireDefault(require("./theme.js"));
25
23
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
26
24
  var _quizCommon = require("@instructure/quiz-common");
25
+ var _uiTooltip = require("@instructure/ui-tooltip");
26
+ var _uiA11yContent = require("@instructure/ui-a11y-content");
27
27
  var _dec, _class, _SidebarStimulus;
28
28
  /** @jsx jsx */
29
29
  var DISPLAY_AS_SUMMARY_LIMIT = 5;
@@ -86,16 +86,23 @@ var SidebarStimulus = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.defaul
86
86
  key: "renderButton",
87
87
  value: function renderButton() {
88
88
  var displayPosition = this.props.displayPosition;
89
- return (0, _emotion.jsx)(_uiLink.Link, {
89
+ var textForNavigation = (0, _formatMessage.default)('Navigate to stimulus at position {displayPosition}', {
90
+ displayPosition: displayPosition
91
+ });
92
+ return (0, _emotion.jsx)(_uiTooltip.Tooltip, {
93
+ renderTip: this.props.sidebarOpen ? '' : (0, _emotion.jsx)("span", {
94
+ "aria-hidden": "true"
95
+ }, textForNavigation),
96
+ placement: "start",
97
+ on: this.props.sidebarOpen ? [] : ['hover', 'focus']
98
+ }, (0, _emotion.jsx)(_uiLink.Link, {
90
99
  href: "#",
91
100
  margin: "small",
92
101
  forceButtonRole: false,
93
102
  onClick: this.scrollToItem,
94
103
  renderIcon: _ref,
95
104
  className: _quizCommon.END_EDITING_TRIGGER_CLASSNAME
96
- }, (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, (0, _formatMessage.default)('Navigate to stimulus at position { displayPosition }', {
97
- displayPosition: displayPosition
98
- })));
105
+ }, (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, textForNavigation)));
99
106
  }
100
107
  }, {
101
108
  key: "renderClosed",
@@ -124,16 +131,16 @@ var SidebarStimulus = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.defaul
124
131
  css: this.props.styles.infoHeader
125
132
  }, (0, _formatMessage.default)('Stimulus')), (0, _emotion.jsx)("div", {
126
133
  css: this.props.styles.stimulusBody
127
- }, (0, _emotion.jsx)(_uiFlex.Flex, {
134
+ }, (0, _emotion.jsx)(_quizCommon.Flex, {
128
135
  justifyItems: "space-between"
129
- }, (0, _emotion.jsx)(_uiFlex.Flex.Item, null, this.renderButton()), (0, _emotion.jsx)(_uiFlex.Flex.Item, {
136
+ }, (0, _emotion.jsx)(_quizCommon.Flex.Item, null, this.renderButton()), (0, _emotion.jsx)(_quizCommon.Flex.Item, {
130
137
  shouldGrow: true,
131
138
  shouldShrink: true,
132
139
  onClick: this.scrollToItem,
133
140
  tabIndex: "-1"
134
141
  }, (0, _emotion.jsx)(_index2.default, {
135
142
  title: stimulus.title
136
- })), (0, _emotion.jsx)(_uiFlex.Flex.Item, null, children)), (0, _emotion.jsx)(_index3.default, {
143
+ })), (0, _emotion.jsx)(_quizCommon.Flex.Item, null, children)), (0, _emotion.jsx)(_index3.default, {
137
144
  startPosition: displayPosition,
138
145
  isDragging: isDragging,
139
146
  isShowingItems: isShowingItems,
@@ -46,11 +46,11 @@ var AddContentBody = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default
46
46
  _this.props.setUi(_quizCommon.BUILD_TRAY_POSITION, _this.props.position);
47
47
  _this.props.setUi(_quizCommon.BUILD_TRAY_STIMULUS_ID, _this.props.parentEntryId);
48
48
  };
49
- _this.addStimulus = function () {
49
+ _this.addStimulus = function (isPassage) {
50
50
  if (_this.props.editingQuizEntry) {
51
51
  _this.props.setNextQuizEntry(null, _this.props.quizId, _this.props.position);
52
52
  } else {
53
- _this.props.createStimulus(_this.props.quizId, _this.props.position);
53
+ _this.props.createStimulus(_this.props.quizId, _this.props.position, isPassage);
54
54
  }
55
55
  _this.props.onAddItem();
56
56
  };
@@ -10,7 +10,7 @@ var generateStyle = function generateStyle(componentTheme) {
10
10
  position: 'relative',
11
11
  width: '100%',
12
12
  boxSizing: 'border-box',
13
- padding: "0 ".concat(componentTheme.wrapperPadding, " ").concat(componentTheme.wrapperPadding),
13
+ padding: componentTheme.wrapperPadding,
14
14
  '&::after': {
15
15
  clear: 'both',
16
16
  content: '""',
@@ -21,8 +21,11 @@ var generateStyle = function generateStyle(componentTheme) {
21
21
  '&:first-of-type': {
22
22
  margin: "0 0 ".concat(componentTheme.userContentMargin)
23
23
  },
24
- '&:last-child': {
24
+ '&:last-of-type': {
25
25
  margin: "".concat(componentTheme.userContentMargin, " 0 0")
26
+ },
27
+ '&:only-child': {
28
+ margin: 0
26
29
  }
27
30
  }
28
31
  },
@@ -128,6 +128,7 @@ var Stimulus = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _the
128
128
  }, {
129
129
  key: "renderPanels",
130
130
  value: function renderPanels(propsForDnDZone) {
131
+ var isPassage = this.props.stimulus.passage;
131
132
  return (0, _emotion.jsx)("div", {
132
133
  css: this.props.styles.stimulus,
133
134
  ref: this.props.dndRef,
@@ -136,9 +137,9 @@ var Stimulus = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _the
136
137
  css: this.props.styles.leftPanel
137
138
  }, this.renderStimulusPanel()), (0, _emotion.jsx)("div", {
138
139
  css: this.props.styles.itemPanel
139
- }, (0, _emotion.jsx)("div", null), this.renderChildQuizEntries(), (0, _emotion.jsx)(_index4.default, Object.assign({}, propsForDnDZone, {
140
+ }, (0, _emotion.jsx)("div", null), this.renderChildQuizEntries(), !isPassage && (0, _emotion.jsx)(_index4.default, Object.assign({}, propsForDnDZone, {
140
141
  location: "in"
141
- })), this.props.childEntries.size === 0 && !this.isQuizContentLocked() && (0, _emotion.jsx)(_index.default, {
142
+ })), this.props.childEntries.size === 0 && !this.isQuizContentLocked() && !isPassage && (0, _emotion.jsx)(_index.default, {
142
143
  allowStimulusCreation: false,
143
144
  stimulusId: this.props.stimulus.id,
144
145
  parentEntryId: this.props.quizEntry.id,
@@ -20,6 +20,8 @@ var _reactDom = _interopRequireDefault(require("react-dom"));
20
20
  var _uiButtons = require("@instructure/ui-buttons");
21
21
  var _uiToggleDetails = require("@instructure/ui-toggle-details");
22
22
  var _emotion = require("@instructure/emotion");
23
+ var _uiText = require("@instructure/ui-text");
24
+ var _uiView = require("@instructure/ui-view");
23
25
  var _quizCommon = require("@instructure/quiz-common");
24
26
  var _warningHelpers = require("../../../../util/warningHelpers.js");
25
27
  var _index = _interopRequireDefault(require("../../../../../banks/components/AddToBankModal/index.js"));
@@ -325,7 +327,13 @@ var StimulusEdit = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default,
325
327
  }, {
326
328
  key: "renderAddToBankOptions",
327
329
  value: function renderAddToBankOptions() {
328
- return (0, _emotion.jsx)("div", null, (0, _emotion.jsx)(_uiToggleDetails.ToggleDetails, {
330
+ var _this$props$stimulus;
331
+ var paddingTopStyle = ((_this$props$stimulus = this.props.stimulus) === null || _this$props$stimulus === void 0 ? void 0 : _this$props$stimulus.passage) ? {
332
+ padding: 'small 0 0'
333
+ } : {};
334
+ return (0, _emotion.jsx)(_uiView.View, Object.assign({
335
+ as: "div"
336
+ }, paddingTopStyle), (0, _emotion.jsx)(_uiToggleDetails.ToggleDetails, {
329
337
  variant: "filled",
330
338
  key: "itemBanking",
331
339
  summary: (0, _formatMessage.default)('Item Banking')
@@ -345,14 +353,16 @@ var StimulusEdit = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default,
345
353
  }, {
346
354
  key: "renderStimulusEdit",
347
355
  value: function renderStimulusEdit() {
356
+ var stimulusLabel = this.props.stimulus.passage ? (0, _formatMessage.default)('Passage') : (0, _formatMessage.default)('Stimulus');
348
357
  return (0, _emotion.jsx)("div", null, (0, _emotion.jsx)("div", {
349
358
  css: this.props.styles.stimulus,
350
359
  ref: this.handleRef
351
360
  }, (0, _emotion.jsx)("div", {
352
361
  css: this.props.styles.header
353
- }, (0, _emotion.jsx)("div", {
354
- css: this.props.styles.stimulusLabel
355
- }, (0, _formatMessage.default)('Stimulus')), (0, _emotion.jsx)(_index6.default, {
362
+ }, (0, _emotion.jsx)(_uiText.Text, {
363
+ size: "small",
364
+ color: "secondary"
365
+ }, stimulusLabel), (0, _emotion.jsx)(_index6.default, {
356
366
  connectDragSource: this.props.connectDragSource,
357
367
  displayPosition: this.props.displayPosition,
358
368
  onDelete: this.handleDeleteStimulus,
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var generateStyle = function generateStyle(componentTheme) {
7
+ var generateStyle = function generateStyle(componentTheme, props) {
8
8
  return {
9
9
  stimulus: {
10
10
  paddingTop: componentTheme.stimulusPadding,
@@ -29,10 +29,6 @@ var generateStyle = function generateStyle(componentTheme) {
29
29
  height: '100%',
30
30
  padding: componentTheme.stimulusContentPadding
31
31
  },
32
- stimulusLabel: {
33
- color: componentTheme.stimulusLabelColor,
34
- fontSize: componentTheme.stimulusLabelFontSize
35
- },
36
32
  stimulusButtons: {
37
33
  flex: '0 0 auto',
38
34
  display: 'inline-flex',
@@ -15,8 +15,6 @@ var generateComponentTheme = function generateComponentTheme(_ref) {
15
15
  optionPadding: spacing.small,
16
16
  stimulusContentPadding: spacing.small,
17
17
  stimulusContentPaddingBottom: spacing.small,
18
- stimulusLabelColor: colors.ash,
19
- stimulusLabelFontSize: typography.fontSizeSmall,
20
18
  stimulusButtonsColor: colors.oxford,
21
19
  stimulusButtonsZIndex: '3333'
22
20
  };
@@ -65,8 +65,12 @@ var StimulusEditInfo = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.defau
65
65
  }
66
66
  (0, _createClass2.default)(StimulusEditInfo, [{
67
67
  key: "headerText",
68
- value: function headerText() {
69
- return this.props.stimulus.isTemporary() ? (0, _formatMessage.default)('Add Stimulus') : (0, _formatMessage.default)('Edit Stimulus');
68
+ value: function headerText(stimulus) {
69
+ if (stimulus.isTemporary()) {
70
+ return stimulus.passage ? (0, _formatMessage.default)('Add Passage') : (0, _formatMessage.default)('Add Stimulus');
71
+ } else {
72
+ return stimulus.passage ? (0, _formatMessage.default)('Edit Passage') : (0, _formatMessage.default)('Edit Stimulus');
73
+ }
70
74
  }
71
75
  }, {
72
76
  key: "renderOptionalLabel",
@@ -99,6 +103,43 @@ var StimulusEditInfo = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.defau
99
103
  value: "top"
100
104
  }, (0, _formatMessage.default)('Questions below'))));
101
105
  }
106
+ }, {
107
+ key: "renderInstructions",
108
+ value: function renderInstructions(stimulus) {
109
+ if (stimulus.passage) {
110
+ return null;
111
+ }
112
+ return (0, _emotion.jsx)("div", {
113
+ css: this.props.styles.section
114
+ }, (0, _emotion.jsx)(_quizCommon.TextInput, {
115
+ renderLabel: this.renderOptionalLabel((0, _formatMessage.default)('Instructions')),
116
+ onChange: this.onTextInputChange('instructions'),
117
+ value: stimulus.get('instructions'),
118
+ "data-automation": "sdk-stimulus-instructions-input"
119
+ }));
120
+ }
121
+ }, {
122
+ key: "renderOptions",
123
+ value: function renderOptions(stimulus) {
124
+ if (stimulus.passage) {
125
+ return null;
126
+ }
127
+ return (0, _emotion.jsx)("div", {
128
+ css: this.props.styles.section
129
+ }, (0, _emotion.jsx)(_uiToggleDetails.ToggleDetails, {
130
+ defaultExpanded: true,
131
+ variant: "filled",
132
+ key: "options",
133
+ summary: (0, _formatMessage.default)('Options')
134
+ }, this.props.stimulusOrientationEnabled ? this.renderStimulusOrientationSelect() : null, (0, _emotion.jsx)("div", {
135
+ css: this.props.styles.section
136
+ }, (0, _emotion.jsx)(_quizCommon.TextInput, {
137
+ renderLabel: this.renderOptionalLabel((0, _formatMessage.default)('Source URL'), (0, _formatMessage.default)('(optional - not visible to students)')),
138
+ onChange: this.onTextInputChange('sourceUrl'),
139
+ value: stimulus.get('sourceUrl'),
140
+ "data-automation": "sdk-source-url-input"
141
+ }))));
142
+ }
102
143
  }, {
103
144
  key: "render",
104
145
  value: function render() {
@@ -111,26 +152,17 @@ var StimulusEditInfo = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.defau
111
152
  }, (0, _emotion.jsx)(_uiHeading.Heading, {
112
153
  level: "h3",
113
154
  as: "h2"
114
- }, this.headerText()), (0, _emotion.jsx)("div", {
155
+ }, this.headerText(stimulus)), (0, _emotion.jsx)("div", {
115
156
  css: this.props.styles.section
116
157
  }, (0, _emotion.jsx)(_quizCommon.TextInput, {
117
158
  messages: this.inputErrors('title'),
118
159
  renderLabel: (0, _formatMessage.default)('Title'),
119
160
  isRequired: true,
120
- type: "text",
121
161
  ref: this.props.setTitleRef,
122
162
  onChange: this.onTextInputChange('title'),
123
163
  value: stimulus.get('title'),
124
164
  "data-automation": "sdk-stimulus-title-input"
125
- })), (0, _emotion.jsx)("div", {
126
- css: this.props.styles.section
127
- }, (0, _emotion.jsx)(_quizCommon.TextInput, {
128
- renderLabel: this.renderOptionalLabel((0, _formatMessage.default)('Instructions')),
129
- type: "text",
130
- onChange: this.onTextInputChange('instructions'),
131
- value: stimulus.get('instructions'),
132
- "data-automation": "sdk-stimulus-instructions-input"
133
- })), (0, _emotion.jsx)("div", {
165
+ })), this.renderInstructions(stimulus), (0, _emotion.jsx)("div", {
134
166
  css: this.props.styles.section
135
167
  }, (0, _emotion.jsx)(_quizCommon.FormField, {
136
168
  id: stimulusBodyId
@@ -145,22 +177,7 @@ var StimulusEditInfo = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.defau
145
177
  onBlur: this.onBodyChange,
146
178
  onChange: this.onBodyChange,
147
179
  height: _quizRce.RCE_SINGLE_LINE_HEIGHT
148
- }))), (0, _emotion.jsx)("div", {
149
- css: this.props.styles.section
150
- }, (0, _emotion.jsx)(_uiToggleDetails.ToggleDetails, {
151
- defaultExpanded: true,
152
- variant: "filled",
153
- key: "options",
154
- summary: (0, _formatMessage.default)('Options')
155
- }, this.props.stimulusOrientationEnabled ? this.renderStimulusOrientationSelect() : null, (0, _emotion.jsx)("div", {
156
- css: this.props.styles.section
157
- }, (0, _emotion.jsx)(_quizCommon.TextInput, {
158
- renderLabel: this.renderOptionalLabel((0, _formatMessage.default)('Source URL'), (0, _formatMessage.default)('(optional - not visible to students)')),
159
- type: "text",
160
- onChange: this.onTextInputChange('sourceUrl'),
161
- value: stimulus.get('sourceUrl'),
162
- "data-automation": "sdk-source-url-input"
163
- })))));
180
+ }))), this.renderOptions(stimulus));
164
181
  }
165
182
  }]);
166
183
  StimulusEditInfo.displayName = "StimulusEditInfo";