@khanacademy/perseus 1.2.0 → 1.3.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 (29) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/es/index.css +3 -3
  3. package/dist/es/index.js +145 -179
  4. package/dist/es/index.js.map +1 -1
  5. package/dist/index.css +3 -3
  6. package/dist/index.js +143 -177
  7. package/dist/index.js.map +1 -1
  8. package/package.json +2 -2
  9. package/src/index.js +1 -0
  10. package/src/multi-items/__tests__/__snapshots__/multi-renderer_test.js.snap +21 -11
  11. package/src/styles/widgets/passage.less +7 -3
  12. package/src/widgets/__stories__/passage-ref.stories.jsx +6 -2
  13. package/src/widgets/__stories__/passage.stories.jsx +9 -1
  14. package/src/widgets/__stories__/radio.stories.jsx +11 -0
  15. package/src/widgets/__testdata__/passage-ref_testdata.js +62 -0
  16. package/src/widgets/__testdata__/passage_testdata.js +25 -0
  17. package/src/widgets/__testdata__/radio_testdata.js +52 -0
  18. package/src/widgets/__tests__/__snapshots__/group_test.jsx.snap +21 -11
  19. package/src/widgets/__tests__/__snapshots__/passage-ref_test.jsx.snap +18 -18
  20. package/src/widgets/__tests__/__snapshots__/passage_test.jsx.snap +36 -36
  21. package/src/widgets/__tests__/__snapshots__/radio_test.jsx.snap +221 -117
  22. package/src/widgets/__tests__/passage_test.jsx +6 -8
  23. package/src/widgets/__tests__/radio_test.jsx +3 -1
  24. package/src/widgets/passage.jsx +12 -41
  25. package/src/widgets/radio/__stories__/sat-styles.stories.jsx +191 -0
  26. package/src/widgets/radio/base-radio.jsx +1 -2
  27. package/src/widgets/radio/choice.jsx +4 -10
  28. package/src/widgets/radio/widget.jsx +128 -129
  29. package/src/widgets/passage/get-line-height-for-node.js +0 -9
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Core Perseus API (includes renderers and widgets)",
4
4
  "author": "Khan Academy",
5
5
  "license": "MIT",
6
- "version": "1.2.0",
6
+ "version": "1.3.1",
7
7
  "publishConfig": {
8
8
  "access": "public"
9
9
  },
@@ -23,7 +23,7 @@
23
23
  "dependencies": {
24
24
  "@khanacademy/kas": "^0.2.7",
25
25
  "@khanacademy/kmath": "^0.0.8",
26
- "@khanacademy/math-input": "^0.6.3",
26
+ "@khanacademy/math-input": "^0.6.4",
27
27
  "@khanacademy/perseus-linter": "^0.2.3",
28
28
  "@khanacademy/pure-markdown": "^0.1.3",
29
29
  "@khanacademy/simple-markdown": "^0.8.6",
package/src/index.js CHANGED
@@ -103,6 +103,7 @@ export type {
103
103
  DeviceType,
104
104
  DomInsertCheckFn,
105
105
  EditorMode,
106
+ FocusPath,
106
107
  Hint,
107
108
  ImageDict,
108
109
  ImageUploader,
@@ -129,22 +129,24 @@ exports[`multi-item renderer should snapshot: initial render 1`] = `
129
129
  Choose 1 answer:
130
130
  </div>
131
131
  <ul
132
- class="perseus-widget-radio perseus-rendered-radio radio_zdxht7-o_O-responsiveRadioContainer_1ybwre2"
132
+ class="perseus-widget-radio perseus-rendered-radio radio_1gyjybc-o_O-responsiveRadioContainer_1ybwre2"
133
133
  style="list-style: none;"
134
134
  >
135
135
  <li
136
136
  class="aboveScratchpad_1x0jb4k-o_O-item_dswvvi-o_O-responsiveItem_85oyrd perseus-radio-option"
137
137
  >
138
138
  <div
139
+ class="description description_psmgei"
139
140
  style="flex-direction: column;"
140
141
  >
141
142
  <div
142
- style="display: flex; flex-direction: row; width: 100%; opacity: 1;"
143
+ style="display: flex; flex-direction: row; opacity: 1;"
143
144
  >
144
145
  <div
145
146
  class="perseus-sr-only"
146
147
  >
147
148
  <input
149
+ class="perseus-radio-option-content"
148
150
  id="choice-0"
149
151
  tabindex="-1"
150
152
  type="radio"
@@ -213,7 +215,7 @@ exports[`multi-item renderer should snapshot: initial render 1`] = `
213
215
  aria-disabled="false"
214
216
  aria-hidden="true"
215
217
  aria-label=""
216
- class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv description description_psmgei"
218
+ class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv"
217
219
  tabindex="0"
218
220
  type="button"
219
221
  >
@@ -311,15 +313,17 @@ exports[`multi-item renderer should snapshot: initial render 1`] = `
311
313
  class="aboveScratchpad_1x0jb4k-o_O-item_dswvvi-o_O-responsiveItem_85oyrd perseus-radio-option"
312
314
  >
313
315
  <div
316
+ class="description description_psmgei"
314
317
  style="flex-direction: column;"
315
318
  >
316
319
  <div
317
- style="display: flex; flex-direction: row; width: 100%; opacity: 1;"
320
+ style="display: flex; flex-direction: row; opacity: 1;"
318
321
  >
319
322
  <div
320
323
  class="perseus-sr-only"
321
324
  >
322
325
  <input
326
+ class="perseus-radio-option-content"
323
327
  id="choice-1"
324
328
  tabindex="-1"
325
329
  type="radio"
@@ -388,7 +392,7 @@ exports[`multi-item renderer should snapshot: initial render 1`] = `
388
392
  aria-disabled="false"
389
393
  aria-hidden="true"
390
394
  aria-label=""
391
- class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv description description_psmgei"
395
+ class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv"
392
396
  tabindex="0"
393
397
  type="button"
394
398
  >
@@ -486,15 +490,17 @@ exports[`multi-item renderer should snapshot: initial render 1`] = `
486
490
  class="aboveScratchpad_1x0jb4k-o_O-item_dswvvi-o_O-responsiveItem_85oyrd perseus-radio-option"
487
491
  >
488
492
  <div
493
+ class="description description_psmgei"
489
494
  style="flex-direction: column;"
490
495
  >
491
496
  <div
492
- style="display: flex; flex-direction: row; width: 100%; opacity: 1;"
497
+ style="display: flex; flex-direction: row; opacity: 1;"
493
498
  >
494
499
  <div
495
500
  class="perseus-sr-only"
496
501
  >
497
502
  <input
503
+ class="perseus-radio-option-content"
498
504
  id="choice-2"
499
505
  tabindex="-1"
500
506
  type="radio"
@@ -563,7 +569,7 @@ exports[`multi-item renderer should snapshot: initial render 1`] = `
563
569
  aria-disabled="false"
564
570
  aria-hidden="true"
565
571
  aria-label=""
566
- class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv description description_psmgei"
572
+ class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv"
567
573
  tabindex="0"
568
574
  type="button"
569
575
  >
@@ -661,15 +667,17 @@ exports[`multi-item renderer should snapshot: initial render 1`] = `
661
667
  class="aboveScratchpad_1x0jb4k-o_O-item_dswvvi-o_O-responsiveItem_85oyrd perseus-radio-option"
662
668
  >
663
669
  <div
670
+ class="description description_psmgei"
664
671
  style="flex-direction: column;"
665
672
  >
666
673
  <div
667
- style="display: flex; flex-direction: row; width: 100%; opacity: 1;"
674
+ style="display: flex; flex-direction: row; opacity: 1;"
668
675
  >
669
676
  <div
670
677
  class="perseus-sr-only"
671
678
  >
672
679
  <input
680
+ class="perseus-radio-option-content"
673
681
  id="choice-3"
674
682
  tabindex="-1"
675
683
  type="radio"
@@ -738,7 +746,7 @@ exports[`multi-item renderer should snapshot: initial render 1`] = `
738
746
  aria-disabled="false"
739
747
  aria-hidden="true"
740
748
  aria-label=""
741
- class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv description description_psmgei"
749
+ class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv"
742
750
  tabindex="0"
743
751
  type="button"
744
752
  >
@@ -836,15 +844,17 @@ exports[`multi-item renderer should snapshot: initial render 1`] = `
836
844
  class="aboveScratchpad_1x0jb4k-o_O-item_dswvvi-o_O-responsiveItem_85oyrd perseus-radio-option"
837
845
  >
838
846
  <div
847
+ class="description description_psmgei"
839
848
  style="flex-direction: column;"
840
849
  >
841
850
  <div
842
- style="display: flex; flex-direction: row; width: 100%; opacity: 1;"
851
+ style="display: flex; flex-direction: row; opacity: 1;"
843
852
  >
844
853
  <div
845
854
  class="perseus-sr-only"
846
855
  >
847
856
  <input
857
+ class="perseus-radio-option-content"
848
858
  id="choice-4"
849
859
  tabindex="-1"
850
860
  type="radio"
@@ -913,7 +923,7 @@ exports[`multi-item renderer should snapshot: initial render 1`] = `
913
923
  aria-disabled="false"
914
924
  aria-hidden="true"
915
925
  aria-label=""
916
- class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv description description_psmgei"
926
+ class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv"
917
927
  tabindex="0"
918
928
  type="button"
919
929
  >
@@ -45,12 +45,16 @@
45
45
 
46
46
  margin: 0 0 10px;
47
47
  }
48
+
49
+ // note(matthewc): If you need to change any of this,
50
+ // check that line numbers line up correctly.
51
+ // The margin should probably be 0 or the line height
48
52
  .passage-text div.paragraph {
49
- font-family: "Noto Serif", serif;
50
53
  font-weight: 400;
51
- font-size: 20px;
52
- line-height: 24px;
54
+ font-size: @font-size;
55
+ line-height: @line-height;
53
56
  text-indent: 20px;
57
+ margin: 0;
54
58
 
55
59
  span {
56
60
  text-indent: 0;
@@ -2,7 +2,7 @@
2
2
  import * as React from "react";
3
3
 
4
4
  import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
- import {question1} from "../__testdata__/passage-ref_testdata.js";
5
+ import {question1, question2} from "../__testdata__/passage-ref_testdata.js";
6
6
 
7
7
  type StoryArgs = {||};
8
8
 
@@ -14,6 +14,10 @@ export default ({
14
14
  title: "Perseus/Widgets/PassageRef",
15
15
  }: Story);
16
16
 
17
- export const Question1 = (args: StoryArgs): React.Node => {
17
+ export const ShortPassage = (args: StoryArgs): React.Node => {
18
18
  return <RendererWithDebugUI question={question1} />;
19
19
  };
20
+
21
+ export const LongPassage = (args: StoryArgs): React.Node => {
22
+ return <RendererWithDebugUI question={question2} />;
23
+ };
@@ -2,7 +2,11 @@
2
2
  import * as React from "react";
3
3
 
4
4
  import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
- import {question1, question2} from "../__testdata__/passage_testdata.js";
5
+ import {
6
+ question1,
7
+ question2,
8
+ question3,
9
+ } from "../__testdata__/passage_testdata.js";
6
10
 
7
11
  export default {
8
12
  title: "Perseus/Widgets/Passage",
@@ -17,3 +21,7 @@ export const SimpleQuestion = (args: StoryArgs): React.Node => {
17
21
  export const MultiPassageQuestion = (args: StoryArgs): React.Node => {
18
22
  return <RendererWithDebugUI question={question2} />;
19
23
  };
24
+
25
+ export const SingleNumberedPassage = (args: StoryArgs): React.Node => {
26
+ return <RendererWithDebugUI question={question3} />;
27
+ };
@@ -6,6 +6,7 @@ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui
6
6
  import {
7
7
  questionWithPassage,
8
8
  multiChoiceQuestion,
9
+ multiChoiceQuestionSimple,
9
10
  } from "../__testdata__/radio_testdata.js";
10
11
 
11
12
  import type {PerseusRenderer} from "../../perseus-types.js";
@@ -71,6 +72,16 @@ export const SingleSelect = (args: StoryArgs): React.Node => {
71
72
  );
72
73
  };
73
74
 
75
+ export const MultiSelectSimple = (args: StoryArgs): React.Node => {
76
+ return (
77
+ <RendererWithDebugUI
78
+ question={applyStoryArgs(multiChoiceQuestionSimple, args)}
79
+ apiOptions={buildApiOptions(args)}
80
+ reviewMode={args.reviewMode}
81
+ />
82
+ );
83
+ };
84
+
74
85
  export const MultiSelect = (args: StoryArgs): React.Node => {
75
86
  return (
76
87
  <RendererWithDebugUI
@@ -39,3 +39,65 @@ export const question1: PerseusRenderer = {
39
39
  },
40
40
  },
41
41
  };
42
+
43
+ export const question2: PerseusRenderer = {
44
+ content:
45
+ '[[☃ passage 1]]\n\n"It is!" is used in [[☃ passage-ref 1]]\n\n"unsettle" is used in [[☃ passage-ref 2]]\n\n"flagon" is used in [[☃ passage-ref 3]]\n\n',
46
+ images: {},
47
+ widgets: {
48
+ "passage 1": {
49
+ alignment: "default",
50
+ graded: true,
51
+ options: {
52
+ footnotes: "",
53
+ passageText:
54
+ '\n\nOne afternoon, Mrs. Bretton, coaxing [Paulina] from her usual station in a corner, had lifted her into the window-seat, and, by way of occupying her attention, told her to watch the passengers and count how many ladies should go down the street in a given time. She had sat listlessly, hardly looking, and not counting, when—my eye being fixed on hers—I witnessed in its iris and pupil a startling transfiguration. These sudden, dangerous natures—*sensitive* as they are called—offer many a curious spectacle to those whom a cooler temperament has secured from participation in their angular vagaries. The fixed and heavy gaze swum, trembled, then glittered in fire; the small, overcast brow cleared; the trivial and dejected features lit up; the sad countenance vanished, and in its place appeared a sudden eagerness, an intense expectancy. {{"It *is!*"}} were her words.\n\nLike a bird or a shaft, or any other swift thing, she was gone from the room. How she got the house-door open I cannot tell; probably it might be ajar; perhaps Warren was in the way and obeyed her behest, which would be impetuous enough. I—watching calmly from the window—saw her, in her black frock and tiny braided apron (to pinafores she had an antipathy), dart half the length of the street; and, as I was on the point of turning, and quietly announcing to Mrs. Bretton that the child was run out mad, and ought instantly to be pursued, I saw her caught up, and rapt at once from my cool observation, and from the wondering stare of the passengers. A gentleman had done this good turn, and now, covering her with his cloak, advanced to restore her to the house whence he had seen her issue.\n\nI concluded he would leave her in a servant\'s charge and withdraw; but he entered: having tarried a little while below, he came up-stairs.\n\nHis reception immediately explained that he was known to Mrs. Bretton. She recognised him; she greeted him, and yet she was fluttered, surprised, taken unawares. Her look and manner were even expostulatory; and in reply to these, rather than her words, he said,—"I could not help it, madam: I found it impossible to leave the country without seeing with my own eyes how she settled."\n\n"But you will {{unsettle}} her."\n\n"I hope not. And how is papa\'s little Polly?"\n\nThis question he addressed to Paulina, as he sat down and placed her gently on the ground before him.\n\n"How is Polly\'s papa?" was the reply, as she leaned on his knee, and gazed up into his face.\n\nIt was not a noisy, not a wordy scene: for that I was thankful; but it was a scene of feeling too brimful, and which, because the cup did not foam up high or furiously overflow, only oppressed one the more. On all occasions of vehement, unrestrained expansion, a sense of disdain or ridicule comes to the weary spectator\'s relief; whereas I have ever felt most burdensome that sort of sensibility which bends of its own will, a giant slave under the sway of good sense.\n\nMr. Home was a stern-featured—perhaps I should rather say, a hard-featured man: his forehead was knotty, and his cheekbones were marked and prominent. The character of his face was quite Scotch; but there was feeling in his eye, and emotion in his now agitated countenance. His northern accent in speaking harmonised with his physiognomy. He was at once proud-looking and homely-looking. He laid his hand on the child\'s uplifted head. She said—"Kiss Polly."\n\nHe kissed her. I wished she would utter some hysterical cry, so that I might get relief and be at ease. She made wonderfully little noise: she seemed to have got what she wanted—all she wanted, and to be in a trance of content. Neither in mien nor in features was this creature like her sire, and yet she was of his strain: her mind had been filled from his, as the cup from the {{flagon}}.\n',
55
+ passageTitle: "",
56
+ showLineNumbers: true,
57
+ static: false,
58
+ },
59
+ static: false,
60
+ type: "passage",
61
+ version: {
62
+ major: 0,
63
+ minor: 0,
64
+ },
65
+ },
66
+ "passage-ref 1": {
67
+ options: {
68
+ passageNumber: 1,
69
+ referenceNumber: 1,
70
+ summaryText: "",
71
+ },
72
+ type: "passage-ref",
73
+ version: {
74
+ major: 0,
75
+ minor: 1,
76
+ },
77
+ },
78
+ "passage-ref 2": {
79
+ options: {
80
+ passageNumber: 1,
81
+ referenceNumber: 2,
82
+ summaryText: "",
83
+ },
84
+ type: "passage-ref",
85
+ version: {
86
+ major: 0,
87
+ minor: 1,
88
+ },
89
+ },
90
+ "passage-ref 3": {
91
+ options: {
92
+ passageNumber: 1,
93
+ referenceNumber: 3,
94
+ summaryText: "",
95
+ },
96
+ type: "passage-ref",
97
+ version: {
98
+ major: 0,
99
+ minor: 1,
100
+ },
101
+ },
102
+ },
103
+ };
@@ -69,3 +69,28 @@ export const question2: PerseusRenderer = {
69
69
  },
70
70
  },
71
71
  };
72
+
73
+ export const question3: PerseusRenderer = {
74
+ content: "[[☃ passage 1]]",
75
+ images: {},
76
+ widgets: {
77
+ "passage 1": {
78
+ alignment: "default",
79
+ graded: true,
80
+ options: {
81
+ footnotes: "An example footnote",
82
+ passageText:
83
+ "{{For reasons that are not entirely clear, when animals make their way to isolated islands [[1]], they tend to evolve relatively quickly toward an outsized or pint-sized version of their mainland counterpart.}} \n\n{{Perhaps the most famous example of an island giant—and, sadly, of species extinction—is the dodo, once found on the Indian Ocean island of Mauritius.}} {{When the dodo's ancestor (thought to be a migratory pigeon) settled on this island with abundant food, no competition from terrestrial mammals, and no predators, it could survive without flying, and thus was freed from the energetic and size constraints of flight.}} {{New Zealand also had avian giants, now extinct, including the flightless moa, an ostrich-like bird, and Haast's eagle (_Harpagornis moorei_), which had a wingspan up to 3 meters.}} {{Though Haast's eagle could fly—and presumably used its wings to {{launch}} brutal attacks on the hapless moa—its body mass (10–14 kilograms) pushed the limits for self-propelled flight.}}\n\n{{As extreme evolutionary examples, these island birds can offer insights into the forces and events shaping evolutionary change.}} In a new study, Michael Bunce et al. compared ancient mitochondrial DNA extracted from Haast's eagle bones with DNA sequences of 16 living eagle species to better characterize the evolutionary history of the extinct giant raptor. {{Their results suggest the extinct raptor underwent a rapid evolutionary transformation that belies its kinship to some of the world's smallest eagle species.}}\n\nThe authors characterized the rates of sequence evolution within mitochondrial DNA to establish the evolutionary relationships between the different eagle species. Their analysis places Haast's eagle in the same evolutionary lineage as a group of small eagle species in the genus _Hieraaetus_. Surprisingly, the genetic distance separating the giant eagle and its more diminutive _Hieraaetus_ cousins from their last {{common}} ancestor is relatively small.\n",
84
+ passageTitle: "Passage 1",
85
+ showLineNumbers: true,
86
+ static: false,
87
+ },
88
+ static: false,
89
+ type: "passage",
90
+ version: {
91
+ major: 0,
92
+ minor: 0,
93
+ },
94
+ },
95
+ },
96
+ };
@@ -194,6 +194,58 @@ export const multiChoiceQuestion: PerseusRenderer = {
194
194
  },
195
195
  };
196
196
 
197
+ export const multiChoiceQuestionSimple: PerseusRenderer = {
198
+ content: "What are some ways to say hello?\n\n[[\u2603 radio 1]]",
199
+ images: {},
200
+ widgets: {
201
+ "radio 1": ({
202
+ graded: true,
203
+ version: {
204
+ major: 1,
205
+ minor: 0,
206
+ },
207
+ static: false,
208
+ type: "radio",
209
+ options: {
210
+ onePerLine: true,
211
+ displayCount: null,
212
+ choices: [
213
+ {
214
+ content: "Hola",
215
+ isNoneOfTheAbove: false,
216
+ correct: true,
217
+ },
218
+ {
219
+ content: "Hey",
220
+ isNoneOfTheAbove: false,
221
+ correct: true,
222
+ },
223
+ {
224
+ content: "Hi",
225
+ isNoneOfTheAbove: false,
226
+ correct: true,
227
+ },
228
+ {
229
+ content: "Goodbye",
230
+ isNoneOfTheAbove: false,
231
+ correct: false,
232
+ },
233
+ {
234
+ content: "None of these",
235
+ isNoneOfTheAbove: true,
236
+ correct: false,
237
+ },
238
+ ],
239
+ hasNoneOfTheAbove: true,
240
+ multipleSelect: true,
241
+ randomize: false,
242
+ deselectEnabled: false,
243
+ },
244
+ alignment: "default",
245
+ }: RadioWidget),
246
+ },
247
+ };
248
+
197
249
  export const multiChoiceQuestionAndAnswer: [
198
250
  PerseusRenderer,
199
251
  $ReadOnlyArray<number>,
@@ -134,22 +134,24 @@ exports[`group widget should snapshot: initial render 1`] = `
134
134
  Choose 1 answer:
135
135
  </div>
136
136
  <ul
137
- class="perseus-widget-radio perseus-rendered-radio radio_zdxht7-o_O-responsiveRadioContainer_1ybwre2"
137
+ class="perseus-widget-radio perseus-rendered-radio radio_1gyjybc-o_O-responsiveRadioContainer_1ybwre2"
138
138
  style="list-style: none;"
139
139
  >
140
140
  <li
141
141
  class="aboveScratchpad_1x0jb4k-o_O-item_dswvvi-o_O-responsiveItem_85oyrd perseus-radio-option"
142
142
  >
143
143
  <div
144
+ class="description description_psmgei"
144
145
  style="flex-direction: column;"
145
146
  >
146
147
  <div
147
- style="display: flex; flex-direction: row; width: 100%; opacity: 1;"
148
+ style="display: flex; flex-direction: row; opacity: 1;"
148
149
  >
149
150
  <div
150
151
  class="perseus-sr-only"
151
152
  >
152
153
  <input
154
+ class="perseus-radio-option-content"
153
155
  id="choice-5"
154
156
  tabindex="-1"
155
157
  type="radio"
@@ -192,7 +194,7 @@ exports[`group widget should snapshot: initial render 1`] = `
192
194
  aria-disabled="false"
193
195
  aria-hidden="true"
194
196
  aria-label=""
195
- class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv description description_psmgei"
197
+ class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv"
196
198
  tabindex="0"
197
199
  type="button"
198
200
  >
@@ -264,15 +266,17 @@ exports[`group widget should snapshot: initial render 1`] = `
264
266
  class="aboveScratchpad_1x0jb4k-o_O-item_dswvvi-o_O-responsiveItem_85oyrd perseus-radio-option"
265
267
  >
266
268
  <div
269
+ class="description description_psmgei"
267
270
  style="flex-direction: column;"
268
271
  >
269
272
  <div
270
- style="display: flex; flex-direction: row; width: 100%; opacity: 1;"
273
+ style="display: flex; flex-direction: row; opacity: 1;"
271
274
  >
272
275
  <div
273
276
  class="perseus-sr-only"
274
277
  >
275
278
  <input
279
+ class="perseus-radio-option-content"
276
280
  id="choice-6"
277
281
  tabindex="-1"
278
282
  type="radio"
@@ -315,7 +319,7 @@ exports[`group widget should snapshot: initial render 1`] = `
315
319
  aria-disabled="false"
316
320
  aria-hidden="true"
317
321
  aria-label=""
318
- class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv description description_psmgei"
322
+ class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv"
319
323
  tabindex="0"
320
324
  type="button"
321
325
  >
@@ -387,15 +391,17 @@ exports[`group widget should snapshot: initial render 1`] = `
387
391
  class="aboveScratchpad_1x0jb4k-o_O-item_dswvvi-o_O-responsiveItem_85oyrd perseus-radio-option"
388
392
  >
389
393
  <div
394
+ class="description description_psmgei"
390
395
  style="flex-direction: column;"
391
396
  >
392
397
  <div
393
- style="display: flex; flex-direction: row; width: 100%; opacity: 1;"
398
+ style="display: flex; flex-direction: row; opacity: 1;"
394
399
  >
395
400
  <div
396
401
  class="perseus-sr-only"
397
402
  >
398
403
  <input
404
+ class="perseus-radio-option-content"
399
405
  id="choice-7"
400
406
  tabindex="-1"
401
407
  type="radio"
@@ -438,7 +444,7 @@ exports[`group widget should snapshot: initial render 1`] = `
438
444
  aria-disabled="false"
439
445
  aria-hidden="true"
440
446
  aria-label=""
441
- class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv description description_psmgei"
447
+ class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv"
442
448
  tabindex="0"
443
449
  type="button"
444
450
  >
@@ -510,15 +516,17 @@ exports[`group widget should snapshot: initial render 1`] = `
510
516
  class="aboveScratchpad_1x0jb4k-o_O-item_dswvvi-o_O-responsiveItem_85oyrd perseus-radio-option"
511
517
  >
512
518
  <div
519
+ class="description description_psmgei"
513
520
  style="flex-direction: column;"
514
521
  >
515
522
  <div
516
- style="display: flex; flex-direction: row; width: 100%; opacity: 1;"
523
+ style="display: flex; flex-direction: row; opacity: 1;"
517
524
  >
518
525
  <div
519
526
  class="perseus-sr-only"
520
527
  >
521
528
  <input
529
+ class="perseus-radio-option-content"
522
530
  id="choice-8"
523
531
  tabindex="-1"
524
532
  type="radio"
@@ -561,7 +569,7 @@ exports[`group widget should snapshot: initial render 1`] = `
561
569
  aria-disabled="false"
562
570
  aria-hidden="true"
563
571
  aria-label=""
564
- class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv description description_psmgei"
572
+ class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv"
565
573
  tabindex="0"
566
574
  type="button"
567
575
  >
@@ -633,15 +641,17 @@ exports[`group widget should snapshot: initial render 1`] = `
633
641
  class="aboveScratchpad_1x0jb4k-o_O-item_dswvvi-o_O-responsiveItem_85oyrd perseus-radio-option"
634
642
  >
635
643
  <div
644
+ class="description description_psmgei"
636
645
  style="flex-direction: column;"
637
646
  >
638
647
  <div
639
- style="display: flex; flex-direction: row; width: 100%; opacity: 1;"
648
+ style="display: flex; flex-direction: row; opacity: 1;"
640
649
  >
641
650
  <div
642
651
  class="perseus-sr-only"
643
652
  >
644
653
  <input
654
+ class="perseus-radio-option-content"
645
655
  id="choice-9"
646
656
  tabindex="-1"
647
657
  type="radio"
@@ -684,7 +694,7 @@ exports[`group widget should snapshot: initial render 1`] = `
684
694
  aria-disabled="false"
685
695
  aria-hidden="true"
686
696
  aria-label=""
687
- class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv description description_psmgei"
697
+ class="button_vr44p2-o_O-reset_152ygtm-o_O-link_13xlah4-o_O-inlineStyles_bc4egv"
688
698
  tabindex="0"
689
699
  type="button"
690
700
  >
@@ -55,13 +55,13 @@ exports[`passage-ref widget should render with invalid reference 1`] = `
55
55
  <div>
56
56
  <div>
57
57
  <div
58
- class="measurer_vtwrnx"
58
+ aria-hidden="true"
59
+ class="measurer_225hir"
59
60
  >
60
- <div>
61
- <div
62
- class="paragraph"
63
- />
64
- <div />
61
+ <div
62
+ class="paragraph"
63
+ >
64
+ Line Height Measurement
65
65
  </div>
66
66
  </div>
67
67
  <div
@@ -200,13 +200,13 @@ exports[`passage-ref widget should render with multi-line reference 1`] = `
200
200
  <div>
201
201
  <div>
202
202
  <div
203
- class="measurer_vtwrnx"
203
+ aria-hidden="true"
204
+ class="measurer_225hir"
204
205
  >
205
- <div>
206
- <div
207
- class="paragraph"
208
- />
209
- <div />
206
+ <div
207
+ class="paragraph"
208
+ >
209
+ Line Height Measurement
210
210
  </div>
211
211
  </div>
212
212
  <div
@@ -350,13 +350,13 @@ exports[`passage-ref widget should render with single-line reference 1`] = `
350
350
  <div>
351
351
  <div>
352
352
  <div
353
- class="measurer_vtwrnx"
353
+ aria-hidden="true"
354
+ class="measurer_225hir"
354
355
  >
355
- <div>
356
- <div
357
- class="paragraph"
358
- />
359
- <div />
356
+ <div
357
+ class="paragraph"
358
+ >
359
+ Line Height Measurement
360
360
  </div>
361
361
  </div>
362
362
  <div