@pocketprep/ui-kit 3.4.90 → 3.5.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 (88) hide show
  1. package/README.md +2 -2
  2. package/dist/@pocketprep/ui-kit.css +1 -0
  3. package/dist/@pocketprep/ui-kit.js +16490 -18228
  4. package/dist/@pocketprep/ui-kit.js.map +1 -1
  5. package/dist/@pocketprep/ui-kit.umd.cjs +11 -11
  6. package/dist/@pocketprep/ui-kit.umd.cjs.map +1 -1
  7. package/eslint.config.ts +111 -0
  8. package/lib/components/Banners/Banner.vue +2 -2
  9. package/lib/components/Bundles/BundleList.vue +1 -1
  10. package/lib/components/Bundles/BundleSearch.vue +43 -12
  11. package/lib/components/Bundles/PremiumPill.vue +2 -2
  12. package/lib/components/Buttons/Button.vue +19 -18
  13. package/lib/components/Buttons/Link.vue +9 -8
  14. package/lib/components/Buttons/Tab.vue +4 -3
  15. package/lib/components/Calendar/Calendar.vue +14 -2
  16. package/lib/components/Charts/Bar.vue +3 -3
  17. package/lib/components/Charts/Pie.vue +4 -4
  18. package/lib/components/Controls/SegmentControl.vue +8 -7
  19. package/lib/components/Controls/Slider.vue +2 -3
  20. package/lib/components/Controls/ToggleSwitch.vue +3 -2
  21. package/lib/components/EmptyStates/EmptyState.vue +3 -2
  22. package/lib/components/Exams/ExamCard.vue +3 -3
  23. package/lib/components/Exams/ExamMenuCard.vue +2 -2
  24. package/lib/components/Filters/FilterDropdown.vue +2 -2
  25. package/lib/components/Filters/FilterOptions.vue +2 -2
  26. package/lib/components/Forms/Checkbox.vue +2 -2
  27. package/lib/components/Forms/CheckboxOption.vue +2 -2
  28. package/lib/components/Forms/Errors.vue +2 -2
  29. package/lib/components/Forms/Input.vue +2 -2
  30. package/lib/components/Forms/Radio.vue +37 -39
  31. package/lib/components/Forms/RadioButton.vue +1 -1
  32. package/lib/components/Forms/Select.vue +7 -6
  33. package/lib/components/Forms/Textarea.vue +2 -2
  34. package/lib/components/Icons/Icon.vue +1 -0
  35. package/lib/components/Icons/IconEdit.vue +4 -2
  36. package/lib/components/Icons/IconFullViewActive.vue +1 -1
  37. package/lib/components/Icons/IconLoading2.vue +1 -3
  38. package/lib/components/Loaders/SkeletonLoader.vue +2 -2
  39. package/lib/components/Messaging/InfoMessage.vue +2 -2
  40. package/lib/components/Modal/Modal.vue +2 -2
  41. package/lib/components/Modal/ModalContainer.vue +2 -2
  42. package/lib/components/Onboarding/EmailAuth.vue +5 -5
  43. package/lib/components/Onboarding/MagicCodeEntry.vue +3 -4
  44. package/lib/components/Pagination/QuestionReviewPagination.vue +23 -21
  45. package/lib/components/Pagination/TablePagination.vue +2 -2
  46. package/lib/components/Quiz/FlagToggle.vue +2 -2
  47. package/lib/components/Quiz/GlobalMetricsToggle.vue +3 -2
  48. package/lib/components/Quiz/KeyboardShortcutsButton.vue +1 -1
  49. package/lib/components/Quiz/KeyboardShortcutsModal.vue +1 -1
  50. package/lib/components/Quiz/Question/ChoicesContainer.vue +99 -132
  51. package/lib/components/Quiz/Question/DropdownExplanation.vue +41 -55
  52. package/lib/components/Quiz/Question/Explanation.vue +49 -59
  53. package/lib/components/Quiz/Question/MatrixChoicesContainer.vue +208 -226
  54. package/lib/components/Quiz/Question/MatrixRadioGroup.vue +7 -6
  55. package/lib/components/Quiz/Question/MobileMatrixChoicesContainer.vue +315 -320
  56. package/lib/components/Quiz/Question/MobileMatrixRadioGroup.vue +14 -11
  57. package/lib/components/Quiz/Question/PassageAndImage.vue +34 -45
  58. package/lib/components/Quiz/Question/PassageAndImageDropdown.vue +39 -49
  59. package/lib/components/Quiz/Question/Paywall.vue +30 -41
  60. package/lib/components/Quiz/Question/QuestionContext.vue +24 -33
  61. package/lib/components/Quiz/Question/StatsSummary.vue +12 -22
  62. package/lib/components/Quiz/Question/Summary.vue +56 -66
  63. package/lib/components/Quiz/Question/composables.ts +71 -0
  64. package/lib/components/Quiz/Question/injectionSymbols.ts +69 -0
  65. package/lib/components/Quiz/Question.vue +810 -1009
  66. package/lib/components/Quiz/QuizContainer.vue +63 -67
  67. package/lib/components/Quiz/QuizProgress.vue +73 -77
  68. package/lib/components/Quiz/QuizProgressBar.vue +3 -2
  69. package/lib/components/Quiz/question.d.ts +4 -4
  70. package/lib/components/Search/Pill.vue +2 -2
  71. package/lib/components/Search/Search.vue +2 -2
  72. package/lib/components/SidePanels/SidePanel.vue +8 -3
  73. package/lib/components/Tables/Table.vue +4 -3
  74. package/lib/components/Tables/TableActions.vue +3 -3
  75. package/lib/components/Tags/Tag.vue +2 -2
  76. package/lib/components/Toasts/Toast.vue +5 -3
  77. package/lib/components/Tooltips/OverflowTooltip.vue +2 -2
  78. package/lib/components/Tooltips/Tooltip.vue +2 -2
  79. package/lib/directives.ts +28 -23
  80. package/lib/pocketprep-export.module.scss +3 -2
  81. package/lib/pocketprep.scss +2 -2
  82. package/lib/styles/_breakpoints.scss +12 -24
  83. package/lib/styles/_colors.scss +0 -1
  84. package/package.json +38 -29
  85. package/stylelint.config.js +38 -0
  86. package/.eslintrc.cjs +0 -74
  87. package/dist/style.css +0 -1
  88. package/stylelint.config.cjs +0 -22
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div
3
3
  v-dark="isDarkMode"
4
- v-breakpoint:questionEl="breakpoints"
4
+ v-breakpoint="breakpointsWithEl"
5
5
  ref="uikit-question-summary"
6
6
  class="uikit-question-summary"
7
7
  :class="{
@@ -13,7 +13,7 @@
13
13
  {{ isQuestionCorrect ? 'Correct': isUnanswered ? 'Unanswered' : 'Incorrect' }}
14
14
  </div>
15
15
  <PocketButton
16
- v-breakpoint:questionEl="breakpoints"
16
+ v-breakpoint="breakpointsWithEl"
17
17
  type="tertiary-small"
18
18
  class="uikit-question-summary__summary-toggle-explanation"
19
19
  :class="{ 'uikit-question-summary__summary-toggle-explanation--review-mode': reviewMode }"
@@ -28,7 +28,7 @@
28
28
  tabindex="-1"
29
29
  >{{ showExplanation ? 'Hide' : 'Show' }} Explanation</span>
30
30
  <Icon
31
- v-breakpoint:questionEl="breakpoints"
31
+ v-breakpoint="breakpointsWithEl"
32
32
  type="accordionArrow"
33
33
  class="uikit-question-summary__summary-toggle-explanation-icon"
34
34
  :class="{
@@ -38,7 +38,7 @@
38
38
  </PocketButton>
39
39
  <div
40
40
  v-if="showExplanation"
41
- v-breakpoint:questionEl="breakpoints"
41
+ v-breakpoint="breakpointsWithEl"
42
42
  ref="uikit-question-summary__summary-dropdown-explanation"
43
43
  class="uikit-question-summary__summary-dropdown-explanation"
44
44
  :class="{
@@ -61,7 +61,7 @@
61
61
  >
62
62
  <PocketButton
63
63
  v-if="explanationImageLongAlt"
64
- v-breakpoint:questionEl="breakpoints"
64
+ v-breakpoint="breakpointsWithEl"
65
65
  type="tertiary-small"
66
66
  class="uikit-question-summary__toggle-summary-dropdown-explanation-img-description"
67
67
  :class="{
@@ -91,7 +91,7 @@
91
91
  v-if="showExplanationImageLongAlt"
92
92
  ref="uikit-question-summary__summary-dropdown-explanation-img-description"
93
93
  v-dark="isDarkMode"
94
- v-breakpoint:questionEl="breakpoints"
94
+ v-breakpoint="breakpointsWithEl"
95
95
  class="uikit-question-summary__summary-dropdown-explanation-img-description"
96
96
  tabindex="-1"
97
97
  v-html="explanationImageLongAlt"
@@ -121,77 +121,67 @@
121
121
  </div>
122
122
  </template>
123
123
 
124
- <script lang="ts">
125
- import { Component, Emit, Prop, Vue } from 'vue-facing-decorator'
126
- import type { Study } from '@pocketprep/types'
124
+ <script setup lang="ts">
125
+ import { computed } from 'vue'
127
126
  import Icon from '../../Icons/Icon.vue'
128
127
  import PocketButton from '../../Buttons/Button.vue'
129
- import { breakpoint, dark } from '../../../directives'
130
- import type { TBreakPointsObject } from './../question'
131
128
  import { highlightKeywordsInText } from '../../../utils'
132
-
133
- @Component({
134
- components: {
135
- Icon,
136
- PocketButton,
137
- },
138
- directives: {
139
- dark,
140
- breakpoint,
141
- },
129
+ import { dark as vDark, breakpoint as vBreakpoint } from '../../../directives'
130
+ import { useQuestionContext } from './composables'
131
+
132
+ const emit = defineEmits<{
133
+ 'toggleSummaryExplanation': []
134
+ 'toggleSummaryExplanationImageLongAlt': []
135
+ }>()
136
+
137
+ const {
138
+ // questionEl is used by the breakpoint directive
139
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
140
+ questionEl,
141
+ question,
142
+ showExplanation,
143
+ showExplanationImageLongAlt,
144
+ explanationImageUrl,
145
+ explanationImageAlt,
146
+ explanationImageLongAlt,
147
+ reference,
148
+ hideReferences,
149
+ isCorrect,
150
+ isMatrixQuestionCorrect,
151
+ isUnanswered,
152
+ reviewMode,
153
+ isDarkMode,
154
+ isMatrixQuestion,
155
+ breakpointsWithEl,
156
+ keywordDefinitions,
157
+ } = useQuestionContext()
158
+
159
+ const isQuestionCorrect = computed(() => {
160
+ return (!isMatrixQuestion.value && isCorrect.value) ||
161
+ (isMatrixQuestion.value && isMatrixQuestionCorrect.value && !isUnanswered.value)
142
162
  })
143
- export default class Summary extends Vue {
144
- @Prop() question!: Study.Class.QuestionJSON
145
- @Prop({ default: false }) showExplanation!: boolean
146
- @Prop({ default: false }) showExplanationImageLongAlt!: boolean
147
- @Prop({ default: null }) explanationImageUrl!: string | null
148
- @Prop({ default: undefined }) explanationImageAlt!: string | undefined
149
- @Prop({ default: undefined }) explanationImageLongAlt!: string | undefined
150
- @Prop({ default: undefined }) reference!: string | undefined
151
- @Prop({ default: false }) hideReferences!: boolean
152
- @Prop({ default: false }) isCorrect!: boolean
153
- @Prop({ default: false }) isMatrixQuestionCorrect!: boolean
154
- @Prop({ default: false }) isUnanswered!: boolean
155
- @Prop({ default: false }) reviewMode!: boolean
156
- @Prop({ default: false }) isDarkMode!: boolean
157
- @Prop({ default: false }) isMatrixQuestion!: boolean
158
- @Prop({ default: null }) questionEl!: Element | null
159
- @Prop({ default: {
160
- 'mobile': 767,
161
- 'tablet-portrait': 1023,
162
- 'tablet-landscape': 1439,
163
- } }) breakpoints!: TBreakPointsObject
164
- @Prop({ default: [] }) keywordDefinitions!: { keyword: string; definition: string }[]
165
-
166
- get isQuestionCorrect () {
167
- return (!this.isMatrixQuestion && this.isCorrect) ||
168
- (this.isMatrixQuestion && this.isMatrixQuestionCorrect && !this.isUnanswered)
169
- }
170
163
 
171
- get summary () {
172
- return highlightKeywordsInText({
173
- text: this.question.explanation || '',
174
- keywordDefinitions: this.keywordDefinitions,
175
- isDarkMode: this.isDarkMode,
176
- location: 'explanation',
177
- })
178
- }
164
+ const summary = computed(() => {
165
+ return highlightKeywordsInText({
166
+ text: question.value.explanation || '',
167
+ keywordDefinitions: keywordDefinitions.value,
168
+ isDarkMode: isDarkMode.value,
169
+ location: 'explanation',
170
+ })
171
+ })
179
172
 
180
- @Emit('toggleSummaryExplanation')
181
- toggleSummaryExplanation () {
182
- return
183
- }
173
+ const toggleSummaryExplanation = () => {
174
+ emit('toggleSummaryExplanation')
175
+ }
184
176
 
185
- @Emit('toggleSummaryExplanationImageLongAlt')
186
- toggleSummaryExplanationImageLongAlt () {
187
- return
188
- }
177
+ const toggleSummaryExplanationImageLongAlt = () => {
178
+ emit('toggleSummaryExplanationImageLongAlt')
189
179
  }
190
180
  </script>
191
181
 
192
182
  <style lang="scss">
193
- @import '../../../styles/colors';
194
- @import '../../../styles/breakpoints';
183
+ @use '@/styles/breakpoints' as *;
184
+ @use '@/styles/colors' as *;
195
185
 
196
186
  .uikit-question-summary {
197
187
  position: relative;
@@ -0,0 +1,71 @@
1
+ import { inject, ref } from 'vue'
2
+ import * as InjectionKeys from './injectionSymbols'
3
+ import type { TChoice, TChoiceKey, TMatrixChoiceKey } from '../question'
4
+
5
+ export const useQuestionContext = () => {
6
+ const question = inject(InjectionKeys.questionKey)
7
+ if (!question) {
8
+ throw new Error('useQuestionContext: no question provided')
9
+ }
10
+ const choiceScores = inject(InjectionKeys.choiceScoresKey)
11
+ if (!choiceScores) {
12
+ throw new Error('useQuestionContext: no choiceScores provided')
13
+ }
14
+ return {
15
+ question,
16
+ choiceScores,
17
+ choices: inject(InjectionKeys.choicesKey, ref<TChoice[]>([])),
18
+ questionEl: inject(InjectionKeys.questionElKey, ref(null)),
19
+ breakpointsWithEl: inject(InjectionKeys.breakpointsWithElKey, ref({
20
+ breakpoints: {
21
+ 'mobile': 767,
22
+ 'tablet-portrait': 1023,
23
+ 'tablet-landscape': 1439,
24
+ },
25
+ containerEl: null,
26
+ })),
27
+ quizLength: inject(InjectionKeys.quizLengthKey),
28
+ quizMode: inject(InjectionKeys.quizModeKey, ref('quick10')),
29
+ questionNumber: inject(InjectionKeys.questionNumberKey),
30
+ isDarkMode: inject(InjectionKeys.isDarkModeKey, ref(false)),
31
+ isCorrect: inject(InjectionKeys.isCorrectKey, ref(false)),
32
+ contextIconType: inject(InjectionKeys.contextIconTypeKey),
33
+ showAnswers: inject(InjectionKeys.showAnswersKey, ref(false)),
34
+ showMatrixAnswers: inject(InjectionKeys.showMatrixAnswersKey, ref(false)),
35
+ imageUrlPrefix: inject(InjectionKeys.imageUrlPrefixKey, ref('')),
36
+ passageImageUrl: inject(InjectionKeys.passageImageUrlKey, ref<string | null>(null)),
37
+ passageImageAlt: inject(InjectionKeys.passageImageAltKey, ref<string | undefined>('')),
38
+ passageImageLongAlt: inject(InjectionKeys.passageImageLongAltKey, ref<string | undefined>('')),
39
+ showPassageImageLongAlt: inject(InjectionKeys.showPassageImageLongAltKey, ref(false)),
40
+ passageAndImageTitle: inject(InjectionKeys.passageAndImageTitleKey, ref('Passage')),
41
+ showExplanation: inject(InjectionKeys.showExplanationKey, ref(false)),
42
+ isMCR: inject(InjectionKeys.isMCRKey, ref(false)),
43
+ isUnanswered: inject(InjectionKeys.isUnansweredKey, ref(false)),
44
+ answerKeys: inject(InjectionKeys.answerKeysKey, ref<TChoiceKey[]>([])),
45
+ hoverChoiceKey: inject(InjectionKeys.hoverChoiceKeyKey, ref(null)),
46
+ focusChoiceKey: inject(InjectionKeys.focusChoiceKeyKey, ref(null)),
47
+ selectedChoices: inject(InjectionKeys.selectedChoicesKey, ref<TChoiceKey[]>([])),
48
+ distractorKeys: inject(InjectionKeys.distractorKeysKey, ref<TChoiceKey[]>([])),
49
+ choiceStrikes: inject(InjectionKeys.choiceStrikesKey, ref<TChoiceKey[]>([])),
50
+ globalMetrics: inject(InjectionKeys.globalMetricsKey, ref(null)),
51
+ reviewMode: inject(InjectionKeys.reviewModeKey, ref(false)),
52
+ showExplanationImageLongAlt: inject(InjectionKeys.showExplanationImageLongAltKey, ref(false)),
53
+ explanationImageUrl: inject(InjectionKeys.explanationImageUrlKey, ref<string | null>(null)),
54
+ explanationImageAlt: inject(InjectionKeys.explanationImageAltKey, ref<string | undefined>(undefined)),
55
+ explanationImageLongAlt: inject(InjectionKeys.explanationImageLongAltKey, ref<string | undefined>(undefined)),
56
+ reference: inject(InjectionKeys.referenceKey, ref<string | undefined>(undefined)),
57
+ hideReferences: inject(InjectionKeys.hideReferencesKey, ref(false)),
58
+ keywordDefinitions: inject(InjectionKeys.keywordDefinitionsKey, ref([])),
59
+ showPaywall: inject(InjectionKeys.showPaywallKey, ref(false)),
60
+ showPassageAndImage: inject(InjectionKeys.showPassageAndImageKey, ref(false)),
61
+ isMatrixQuestion: inject(InjectionKeys.isMatrixQuestionKey, ref(false)),
62
+ matrixChoiceScores: inject(InjectionKeys.matrixChoiceScoresKey, ref({
63
+ totalAnswered: 0,
64
+ answeredCorrectly: 0,
65
+ })),
66
+ isMatrixQuestionCorrect: inject(InjectionKeys.isMatrixQuestionCorrectKey, ref(false)),
67
+ matrixAnswerKeys: inject(InjectionKeys.matrixAnswerKeysKey, ref<TMatrixChoiceKey[]>([])),
68
+ selectedMatrixChoices: inject(InjectionKeys.selectedMatrixChoicesKey, ref([])),
69
+ isTeachGroupReview: inject(InjectionKeys.isTeachGroupReviewKey, ref(false)),
70
+ }
71
+ }
@@ -0,0 +1,69 @@
1
+ import type { Study } from '@pocketprep/types'
2
+ import type {
3
+ TChoice,
4
+ TChoiceKey,
5
+ TChoiceScores,
6
+ TContextIcon,
7
+ TMatrixChoiceKey,
8
+ TMatrixChoiceScores,
9
+ TQuizMode,
10
+ } from '../question'
11
+ import type { ComputedRef, InjectionKey, Ref } from 'vue'
12
+
13
+ export const questionKey = Symbol('question') as InjectionKey<ComputedRef<Study.Class.QuestionJSON>>
14
+ export const choicesKey = Symbol('choices') as InjectionKey<ComputedRef<TChoice[]>>
15
+ export const questionElKey = Symbol('questionEl') as InjectionKey<Ref<Element | null>>
16
+ export const breakpointsWithElKey = Symbol('breakpointsWithEl') as InjectionKey<Ref<{
17
+ breakpoints: {
18
+ mobile: number
19
+ 'tablet-portrait': number
20
+ 'tablet-landscape': number
21
+ }
22
+ containerEl: HTMLElement | null
23
+ }>>
24
+ export const quizLengthKey = Symbol('quizLength') as InjectionKey<Ref<number>>
25
+ export const quizModeKey = Symbol('quizMode') as InjectionKey<Ref<TQuizMode>>
26
+ export const questionNumberKey = Symbol('questionNumber') as InjectionKey<Ref<number>>
27
+ export const isDarkModeKey = Symbol('isDarkMode') as InjectionKey<Ref<boolean>>
28
+ export const isCorrectKey = Symbol('isCorrect') as InjectionKey<ComputedRef<boolean>>
29
+ export const contextIconTypeKey = Symbol('contextIconType') as InjectionKey<ComputedRef<TContextIcon>>
30
+ export const showAnswersKey = Symbol('showAnswers') as InjectionKey<Ref<boolean>>
31
+ export const showMatrixAnswersKey = Symbol('showMatrixAnswers') as InjectionKey<Ref<boolean>>
32
+ export const imageUrlPrefixKey = Symbol('imageUrlPrefix') as InjectionKey<Ref<string>>
33
+ export const passageImageUrlKey = Symbol('passageImageUrl') as InjectionKey<ComputedRef<string | null>>
34
+ export const passageImageAltKey = Symbol('passageImageAlt') as InjectionKey<ComputedRef<string | undefined>>
35
+ export const passageImageLongAltKey = Symbol('passageImageLongAlt') as InjectionKey<ComputedRef<string | undefined>>
36
+ export const showPassageImageLongAltKey = Symbol('showPassageImageLongAlt') as InjectionKey<Ref<boolean>>
37
+ export const passageAndImageTitleKey = Symbol('passageAndImageTitle') as InjectionKey<ComputedRef<string>>
38
+ export const showExplanationKey = Symbol('showExplanation') as InjectionKey<Ref<boolean>>
39
+ export const isMCRKey = Symbol('isMCR') as InjectionKey<Ref<boolean>>
40
+ export const isUnansweredKey = Symbol('isUnanswered') as InjectionKey<Ref<boolean>>
41
+ export const answerKeysKey = Symbol('answerKeys') as InjectionKey<Ref<TChoiceKey[]>>
42
+ export const hoverChoiceKeyKey = Symbol('hoverChoiceKey') as InjectionKey<Ref<TChoiceKey | null>>
43
+ export const focusChoiceKeyKey = Symbol('focusChoiceKey') as InjectionKey<Ref<TChoiceKey | null>>
44
+ export const selectedChoicesKey = Symbol('selectedChoices') as InjectionKey<Ref<TChoiceKey[]>>
45
+ export const distractorKeysKey = Symbol('distractorKeys') as InjectionKey<ComputedRef<TChoiceKey[]>>
46
+ export const choiceStrikesKey = Symbol('choiceStrikes') as InjectionKey<Ref<TChoiceKey[]>>
47
+ export const choiceScoresKey = Symbol('choiceScores') as InjectionKey<ComputedRef<TChoiceScores>>
48
+ export const globalMetricsKey = Symbol('globalMetrics') as
49
+ InjectionKey<Ref<Study.Class.GlobalQuestionMetricJSON | null>>
50
+ export const reviewModeKey = Symbol('reviewMode') as InjectionKey<Ref<boolean>>
51
+ export const showExplanationImageLongAltKey = Symbol('showExplanationImageLongAlt') as InjectionKey<Ref<boolean>>
52
+ export const explanationImageUrlKey = Symbol('explanationImageUrl') as InjectionKey<ComputedRef<string | null>>
53
+ export const explanationImageAltKey = Symbol('explanationImageAlt') as InjectionKey<ComputedRef<string | undefined>>
54
+ export const explanationImageLongAltKey = Symbol('explanationImageLongAlt') as
55
+ InjectionKey<ComputedRef<string | undefined>>
56
+ export const referenceKey = Symbol('reference') as InjectionKey<ComputedRef<string | undefined>>
57
+ export const hideReferencesKey = Symbol('hideReferences') as InjectionKey<Ref<boolean>>
58
+ export const keywordDefinitionsKey = Symbol('keywordDefinitions') as InjectionKey<Ref<{
59
+ keyword: string
60
+ definition: string
61
+ }[]>>
62
+ export const showPaywallKey = Symbol('showPaywall') as InjectionKey<Ref<boolean>>
63
+ export const showPassageAndImageKey = Symbol('showPassageAndImage') as InjectionKey<ComputedRef<boolean>>
64
+ export const isMatrixQuestionKey = Symbol('isMatrixQuestion') as InjectionKey<ComputedRef<boolean>>
65
+ export const matrixChoiceScoresKey = Symbol('matrixChoiceScores') as InjectionKey<ComputedRef<TMatrixChoiceScores>>
66
+ export const isMatrixQuestionCorrectKey = Symbol('isMatrixQuestionCorrect') as InjectionKey<ComputedRef<boolean>>
67
+ export const matrixAnswerKeysKey = Symbol('matrixAnswerKeys') as InjectionKey<ComputedRef<TMatrixChoiceKey[]>>
68
+ export const selectedMatrixChoicesKey = Symbol('selectedMatrixChoices') as InjectionKey<Ref<TMatrixChoiceKey[]>>
69
+ export const isTeachGroupReviewKey = Symbol('isTeachGroupReview') as InjectionKey<Ref<boolean>>