@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.
- package/README.md +2 -2
- package/dist/@pocketprep/ui-kit.css +1 -0
- package/dist/@pocketprep/ui-kit.js +16490 -18228
- package/dist/@pocketprep/ui-kit.js.map +1 -1
- package/dist/@pocketprep/ui-kit.umd.cjs +11 -11
- package/dist/@pocketprep/ui-kit.umd.cjs.map +1 -1
- package/eslint.config.ts +111 -0
- package/lib/components/Banners/Banner.vue +2 -2
- package/lib/components/Bundles/BundleList.vue +1 -1
- package/lib/components/Bundles/BundleSearch.vue +43 -12
- package/lib/components/Bundles/PremiumPill.vue +2 -2
- package/lib/components/Buttons/Button.vue +19 -18
- package/lib/components/Buttons/Link.vue +9 -8
- package/lib/components/Buttons/Tab.vue +4 -3
- package/lib/components/Calendar/Calendar.vue +14 -2
- package/lib/components/Charts/Bar.vue +3 -3
- package/lib/components/Charts/Pie.vue +4 -4
- package/lib/components/Controls/SegmentControl.vue +8 -7
- package/lib/components/Controls/Slider.vue +2 -3
- package/lib/components/Controls/ToggleSwitch.vue +3 -2
- package/lib/components/EmptyStates/EmptyState.vue +3 -2
- package/lib/components/Exams/ExamCard.vue +3 -3
- package/lib/components/Exams/ExamMenuCard.vue +2 -2
- package/lib/components/Filters/FilterDropdown.vue +2 -2
- package/lib/components/Filters/FilterOptions.vue +2 -2
- package/lib/components/Forms/Checkbox.vue +2 -2
- package/lib/components/Forms/CheckboxOption.vue +2 -2
- package/lib/components/Forms/Errors.vue +2 -2
- package/lib/components/Forms/Input.vue +2 -2
- package/lib/components/Forms/Radio.vue +37 -39
- package/lib/components/Forms/RadioButton.vue +1 -1
- package/lib/components/Forms/Select.vue +7 -6
- package/lib/components/Forms/Textarea.vue +2 -2
- package/lib/components/Icons/Icon.vue +1 -0
- package/lib/components/Icons/IconEdit.vue +4 -2
- package/lib/components/Icons/IconFullViewActive.vue +1 -1
- package/lib/components/Icons/IconLoading2.vue +1 -3
- package/lib/components/Loaders/SkeletonLoader.vue +2 -2
- package/lib/components/Messaging/InfoMessage.vue +2 -2
- package/lib/components/Modal/Modal.vue +2 -2
- package/lib/components/Modal/ModalContainer.vue +2 -2
- package/lib/components/Onboarding/EmailAuth.vue +5 -5
- package/lib/components/Onboarding/MagicCodeEntry.vue +3 -4
- package/lib/components/Pagination/QuestionReviewPagination.vue +23 -21
- package/lib/components/Pagination/TablePagination.vue +2 -2
- package/lib/components/Quiz/FlagToggle.vue +2 -2
- package/lib/components/Quiz/GlobalMetricsToggle.vue +3 -2
- package/lib/components/Quiz/KeyboardShortcutsButton.vue +1 -1
- package/lib/components/Quiz/KeyboardShortcutsModal.vue +1 -1
- package/lib/components/Quiz/Question/ChoicesContainer.vue +99 -132
- package/lib/components/Quiz/Question/DropdownExplanation.vue +41 -55
- package/lib/components/Quiz/Question/Explanation.vue +49 -59
- package/lib/components/Quiz/Question/MatrixChoicesContainer.vue +208 -226
- package/lib/components/Quiz/Question/MatrixRadioGroup.vue +7 -6
- package/lib/components/Quiz/Question/MobileMatrixChoicesContainer.vue +315 -320
- package/lib/components/Quiz/Question/MobileMatrixRadioGroup.vue +14 -11
- package/lib/components/Quiz/Question/PassageAndImage.vue +34 -45
- package/lib/components/Quiz/Question/PassageAndImageDropdown.vue +39 -49
- package/lib/components/Quiz/Question/Paywall.vue +30 -41
- package/lib/components/Quiz/Question/QuestionContext.vue +24 -33
- package/lib/components/Quiz/Question/StatsSummary.vue +12 -22
- package/lib/components/Quiz/Question/Summary.vue +56 -66
- package/lib/components/Quiz/Question/composables.ts +71 -0
- package/lib/components/Quiz/Question/injectionSymbols.ts +69 -0
- package/lib/components/Quiz/Question.vue +810 -1009
- package/lib/components/Quiz/QuizContainer.vue +63 -67
- package/lib/components/Quiz/QuizProgress.vue +73 -77
- package/lib/components/Quiz/QuizProgressBar.vue +3 -2
- package/lib/components/Quiz/question.d.ts +4 -4
- package/lib/components/Search/Pill.vue +2 -2
- package/lib/components/Search/Search.vue +2 -2
- package/lib/components/SidePanels/SidePanel.vue +8 -3
- package/lib/components/Tables/Table.vue +4 -3
- package/lib/components/Tables/TableActions.vue +3 -3
- package/lib/components/Tags/Tag.vue +2 -2
- package/lib/components/Toasts/Toast.vue +5 -3
- package/lib/components/Tooltips/OverflowTooltip.vue +2 -2
- package/lib/components/Tooltips/Tooltip.vue +2 -2
- package/lib/directives.ts +28 -23
- package/lib/pocketprep-export.module.scss +3 -2
- package/lib/pocketprep.scss +2 -2
- package/lib/styles/_breakpoints.scss +12 -24
- package/lib/styles/_colors.scss +0 -1
- package/package.json +38 -29
- package/stylelint.config.js +38 -0
- package/.eslintrc.cjs +0 -74
- package/dist/style.css +0 -1
- package/stylelint.config.cjs +0 -22
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div
|
|
3
3
|
v-dark="isDarkMode"
|
|
4
|
-
v-breakpoint
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 {
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
181
|
-
toggleSummaryExplanation
|
|
182
|
-
|
|
183
|
-
}
|
|
173
|
+
const toggleSummaryExplanation = () => {
|
|
174
|
+
emit('toggleSummaryExplanation')
|
|
175
|
+
}
|
|
184
176
|
|
|
185
|
-
|
|
186
|
-
toggleSummaryExplanationImageLongAlt
|
|
187
|
-
return
|
|
188
|
-
}
|
|
177
|
+
const toggleSummaryExplanationImageLongAlt = () => {
|
|
178
|
+
emit('toggleSummaryExplanationImageLongAlt')
|
|
189
179
|
}
|
|
190
180
|
</script>
|
|
191
181
|
|
|
192
182
|
<style lang="scss">
|
|
193
|
-
@
|
|
194
|
-
@
|
|
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>>
|