@pocketprep/ui-kit 2.0.40 → 3.0.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 (305) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +16 -17
  2. package/dist/@pocketprep/ui-kit.js +18856 -0
  3. package/dist/@pocketprep/ui-kit.js.map +1 -0
  4. package/dist/@pocketprep/ui-kit.umd.cjs +28 -0
  5. package/dist/@pocketprep/ui-kit.umd.cjs.map +1 -0
  6. package/dist/style.css +1 -0
  7. package/lib/SVGDefinitions.vue +85 -0
  8. package/lib/assets/emojis/tada.png +0 -0
  9. package/lib/assets/halftones/halftone-black.png +0 -0
  10. package/lib/assets/halftones/halftone-blue.png +0 -0
  11. package/lib/assets/halftones/halftone-green.png +0 -0
  12. package/lib/assets/halftones/halftone-purple.png +0 -0
  13. package/lib/assets/halftones/halftone-red.png +0 -0
  14. package/lib/assets/halftones/halftone-yellow.png +0 -0
  15. package/lib/assets/question/paywall-dark.png +0 -0
  16. package/lib/assets/question/paywall-light.png +0 -0
  17. package/lib/components/Banners/Banner.md +41 -0
  18. package/lib/components/Banners/Banner.vue +87 -0
  19. package/lib/components/BundleIcons/AMTA.vue +134 -0
  20. package/lib/components/BundleIcons/BundleIcon.md +60 -0
  21. package/lib/components/BundleIcons/BundleIcon.vue +111 -0
  22. package/lib/components/Bundles/BundleList.md +63 -0
  23. package/lib/components/Bundles/BundleList.vue +170 -0
  24. package/lib/components/Bundles/BundleSearch.md +195 -0
  25. package/lib/components/Bundles/BundleSearch.vue +573 -0
  26. package/lib/components/Bundles/PremiumPill.md +23 -0
  27. package/lib/components/Bundles/PremiumPill.vue +43 -0
  28. package/lib/components/Buttons/Button.md +99 -0
  29. package/lib/components/Buttons/Button.vue +496 -0
  30. package/lib/components/Buttons/Link.md +58 -0
  31. package/lib/components/Buttons/Link.vue +192 -0
  32. package/lib/components/Buttons/Tab.md +35 -0
  33. package/lib/components/Buttons/Tab.vue +103 -0
  34. package/lib/components/Calendar/Calendar.md +18 -0
  35. package/lib/components/Calendar/Calendar.vue +162 -0
  36. package/lib/components/Charts/Bar.md +123 -0
  37. package/lib/components/Charts/Bar.vue +364 -0
  38. package/lib/components/Charts/Pie.md +23 -0
  39. package/lib/components/Charts/Pie.vue +105 -0
  40. package/lib/components/Controls/SegmentControl.md +47 -0
  41. package/lib/components/Controls/SegmentControl.vue +117 -0
  42. package/lib/components/Controls/Slider.md +67 -0
  43. package/lib/components/Controls/Slider.vue +358 -0
  44. package/lib/components/Controls/ToggleSwitch.md +56 -0
  45. package/lib/components/Controls/ToggleSwitch.vue +160 -0
  46. package/lib/components/Exams/ExamCard.md +45 -0
  47. package/lib/components/Exams/ExamCard.vue +257 -0
  48. package/lib/components/Exams/ExamMenuCard.md +90 -0
  49. package/lib/components/Exams/ExamMenuCard.vue +218 -0
  50. package/lib/components/Filters/FilterDropdown.md +59 -0
  51. package/lib/components/Filters/FilterDropdown.vue +176 -0
  52. package/lib/components/Filters/FilterOptions.md +65 -0
  53. package/lib/components/Filters/FilterOptions.vue +265 -0
  54. package/lib/components/Filters/filterOptions.d.ts +10 -0
  55. package/lib/components/Forms/Checkbox.md +52 -0
  56. package/lib/components/Forms/Checkbox.vue +184 -0
  57. package/lib/components/Forms/CheckboxOption.md +37 -0
  58. package/lib/components/Forms/CheckboxOption.vue +173 -0
  59. package/lib/components/Forms/Errors.md +23 -0
  60. package/lib/components/Forms/Errors.vue +109 -0
  61. package/lib/components/Forms/Input.md +63 -0
  62. package/lib/components/Forms/Input.vue +310 -0
  63. package/lib/components/Forms/Radio.md +66 -0
  64. package/lib/components/Forms/Radio.vue +312 -0
  65. package/lib/components/Forms/Select.md +133 -0
  66. package/lib/components/Forms/Select.vue +670 -0
  67. package/lib/components/Forms/Textarea.md +57 -0
  68. package/lib/components/Forms/Textarea.vue +157 -0
  69. package/lib/components/Icons/Icon.md +146 -0
  70. package/lib/components/Icons/Icon.vue +192 -0
  71. package/lib/components/Icons/IconAccordionArrow.md +7 -0
  72. package/lib/components/Icons/IconAccordionArrow.vue +23 -0
  73. package/lib/components/Icons/IconActivity.md +7 -0
  74. package/lib/components/Icons/IconActivity.vue +21 -0
  75. package/lib/components/Icons/IconAdd.md +7 -0
  76. package/lib/components/Icons/IconAdd.vue +19 -0
  77. package/lib/components/Icons/IconAddCircle.md +7 -0
  78. package/lib/components/Icons/IconAddCircle.vue +22 -0
  79. package/lib/components/Icons/IconArrow.md +7 -0
  80. package/lib/components/Icons/IconArrow.vue +21 -0
  81. package/lib/components/Icons/IconBarChart.md +7 -0
  82. package/lib/components/Icons/IconBarChart.vue +23 -0
  83. package/lib/components/Icons/IconCalendar.md +7 -0
  84. package/lib/components/Icons/IconCalendar.vue +19 -0
  85. package/lib/components/Icons/IconCheck.md +7 -0
  86. package/lib/components/Icons/IconCheck.vue +21 -0
  87. package/lib/components/Icons/IconClose.md +7 -0
  88. package/lib/components/Icons/IconClose.vue +23 -0
  89. package/lib/components/Icons/IconCorrect.md +7 -0
  90. package/lib/components/Icons/IconCorrect.vue +19 -0
  91. package/lib/components/Icons/IconEdit.md +7 -0
  92. package/lib/components/Icons/IconEdit.vue +21 -0
  93. package/lib/components/Icons/IconExam.md +7 -0
  94. package/lib/components/Icons/IconExam.vue +34 -0
  95. package/lib/components/Icons/IconExternalLink.md +7 -0
  96. package/lib/components/Icons/IconExternalLink.vue +30 -0
  97. package/lib/components/Icons/IconEyeHide.md +7 -0
  98. package/lib/components/Icons/IconEyeHide.vue +21 -0
  99. package/lib/components/Icons/IconEyeShow.md +7 -0
  100. package/lib/components/Icons/IconEyeShow.vue +21 -0
  101. package/lib/components/Icons/IconFilter.md +7 -0
  102. package/lib/components/Icons/IconFilter.vue +19 -0
  103. package/lib/components/Icons/IconFilterActive.md +7 -0
  104. package/lib/components/Icons/IconFilterActive.vue +20 -0
  105. package/lib/components/Icons/IconFlag.md +7 -0
  106. package/lib/components/Icons/IconFlag.vue +25 -0
  107. package/lib/components/Icons/IconFlagFeedback.md +11 -0
  108. package/lib/components/Icons/IconFlagFeedback.vue +24 -0
  109. package/lib/components/Icons/IconFlagFilled.md +7 -0
  110. package/lib/components/Icons/IconFlagFilled.vue +22 -0
  111. package/lib/components/Icons/IconFullView.md +7 -0
  112. package/lib/components/Icons/IconFullView.vue +30 -0
  113. package/lib/components/Icons/IconFullViewActive.md +7 -0
  114. package/lib/components/Icons/IconFullViewActive.vue +28 -0
  115. package/lib/components/Icons/IconHandle.md +7 -0
  116. package/lib/components/Icons/IconHandle.vue +23 -0
  117. package/lib/components/Icons/IconHeart.md +7 -0
  118. package/lib/components/Icons/IconHeart.vue +19 -0
  119. package/lib/components/Icons/IconHelp.md +7 -0
  120. package/lib/components/Icons/IconHelp.vue +25 -0
  121. package/lib/components/Icons/IconHourglass.md +7 -0
  122. package/lib/components/Icons/IconHourglass.vue +22 -0
  123. package/lib/components/Icons/IconImage.md +7 -0
  124. package/lib/components/Icons/IconImage.vue +21 -0
  125. package/lib/components/Icons/IconIncorrect.md +7 -0
  126. package/lib/components/Icons/IconIncorrect.vue +21 -0
  127. package/lib/components/Icons/IconInfo.md +7 -0
  128. package/lib/components/Icons/IconInfo.vue +24 -0
  129. package/lib/components/Icons/IconKeyboard.md +7 -0
  130. package/lib/components/Icons/IconKeyboard.vue +25 -0
  131. package/lib/components/Icons/IconLaunch.md +7 -0
  132. package/lib/components/Icons/IconLaunch.vue +25 -0
  133. package/lib/components/Icons/IconLightning.md +7 -0
  134. package/lib/components/Icons/IconLightning.vue +21 -0
  135. package/lib/components/Icons/IconList.md +7 -0
  136. package/lib/components/Icons/IconList.vue +26 -0
  137. package/lib/components/Icons/IconLoading.md +7 -0
  138. package/lib/components/Icons/IconLoading.vue +65 -0
  139. package/lib/components/Icons/IconLoading2.md +7 -0
  140. package/lib/components/Icons/IconLoading2.vue +52 -0
  141. package/lib/components/Icons/IconLock.md +7 -0
  142. package/lib/components/Icons/IconLock.vue +23 -0
  143. package/lib/components/Icons/IconMissedQuestions.md +7 -0
  144. package/lib/components/Icons/IconMissedQuestions.vue +22 -0
  145. package/lib/components/Icons/IconMoon.md +7 -0
  146. package/lib/components/Icons/IconMoon.vue +25 -0
  147. package/lib/components/Icons/IconPaginationArrow.md +7 -0
  148. package/lib/components/Icons/IconPaginationArrow.vue +23 -0
  149. package/lib/components/Icons/IconPassage.md +7 -0
  150. package/lib/components/Icons/IconPassage.vue +22 -0
  151. package/lib/components/Icons/IconPencil.md +7 -0
  152. package/lib/components/Icons/IconPencil.vue +19 -0
  153. package/lib/components/Icons/IconPeople.md +7 -0
  154. package/lib/components/Icons/IconPeople.vue +25 -0
  155. package/lib/components/Icons/IconQuestions.md +7 -0
  156. package/lib/components/Icons/IconQuestions.vue +25 -0
  157. package/lib/components/Icons/IconQuick10.md +7 -0
  158. package/lib/components/Icons/IconQuick10.vue +23 -0
  159. package/lib/components/Icons/IconRemoveCircle.md +7 -0
  160. package/lib/components/Icons/IconRemoveCircle.vue +22 -0
  161. package/lib/components/Icons/IconReviewFlag.md +7 -0
  162. package/lib/components/Icons/IconReviewFlag.vue +32 -0
  163. package/lib/components/Icons/IconSearch.md +7 -0
  164. package/lib/components/Icons/IconSearch.vue +23 -0
  165. package/lib/components/Icons/IconShare.md +7 -0
  166. package/lib/components/Icons/IconShare.vue +31 -0
  167. package/lib/components/Icons/IconSideBar.md +7 -0
  168. package/lib/components/Icons/IconSideBar.vue +26 -0
  169. package/lib/components/Icons/IconSideBarActive.md +7 -0
  170. package/lib/components/Icons/IconSideBarActive.vue +28 -0
  171. package/lib/components/Icons/IconStopwatch.md +7 -0
  172. package/lib/components/Icons/IconStopwatch.vue +22 -0
  173. package/lib/components/Icons/IconStrike.md +60 -0
  174. package/lib/components/Icons/IconStrike.vue +23 -0
  175. package/lib/components/Icons/IconSubject.md +7 -0
  176. package/lib/components/Icons/IconSubject.vue +22 -0
  177. package/lib/components/Icons/IconText.md +7 -0
  178. package/lib/components/Icons/IconText.vue +22 -0
  179. package/lib/components/Icons/IconWarning.md +7 -0
  180. package/lib/components/Icons/IconWarning.vue +22 -0
  181. package/lib/components/Modal/Modal.md +31 -0
  182. package/lib/components/Modal/Modal.vue +133 -0
  183. package/lib/components/Modal/ModalContainer.md +96 -0
  184. package/lib/components/Modal/ModalContainer.vue +208 -0
  185. package/lib/components/Onboarding/EmailAuth.md +40 -0
  186. package/lib/components/Onboarding/EmailAuth.vue +218 -0
  187. package/lib/components/Onboarding/MagicCodeEntry.md +20 -0
  188. package/lib/components/Onboarding/MagicCodeEntry.vue +189 -0
  189. package/lib/components/PhonePerson/PhonePerson.md +36 -0
  190. package/lib/components/PhonePerson/PhonePerson.vue +48 -0
  191. package/lib/components/PhonePerson/phoneperson-IT@2x.png +0 -0
  192. package/lib/components/PhonePerson/phoneperson-auto@2x.png +0 -0
  193. package/lib/components/PhonePerson/phoneperson-behavioralhealth@2x.png +0 -0
  194. package/lib/components/PhonePerson/phoneperson-emt@2x.png +0 -0
  195. package/lib/components/PhonePerson/phoneperson-essentials@2x.png +0 -0
  196. package/lib/components/PhonePerson/phoneperson-finance@2x.png +0 -0
  197. package/lib/components/PhonePerson/phoneperson-fitness@2x.png +0 -0
  198. package/lib/components/PhonePerson/phoneperson-medical@2x.png +0 -0
  199. package/lib/components/PhonePerson/phoneperson-nursing@2x.png +0 -0
  200. package/lib/components/PhonePerson/phoneperson-nursingschool@2x.png +0 -0
  201. package/lib/components/PhonePerson/phoneperson-professional@2x.png +0 -0
  202. package/lib/components/PhonePerson/phoneperson-skilledtrades@2x.png +0 -0
  203. package/lib/components/Quiz/FlagToggle.md +37 -0
  204. package/lib/components/Quiz/FlagToggle.vue +124 -0
  205. package/lib/components/Quiz/GlobalMetricsToggle.md +46 -0
  206. package/lib/components/Quiz/GlobalMetricsToggle.vue +124 -0
  207. package/lib/components/Quiz/KeyboardShortcutsButton.md +18 -0
  208. package/lib/components/Quiz/KeyboardShortcutsButton.vue +102 -0
  209. package/lib/components/Quiz/KeyboardShortcutsModal.md +71 -0
  210. package/lib/components/Quiz/KeyboardShortcutsModal.vue +261 -0
  211. package/lib/components/Quiz/Question.md +579 -0
  212. package/lib/components/Quiz/Question.vue +3262 -0
  213. package/lib/components/Quiz/QuizContainer.md +91 -0
  214. package/lib/components/Quiz/QuizContainer.vue +207 -0
  215. package/lib/components/Quiz/QuizProgress.md +122 -0
  216. package/lib/components/Quiz/QuizProgress.vue +188 -0
  217. package/lib/components/Quiz/QuizProgressBar.md +131 -0
  218. package/lib/components/Quiz/QuizProgressBar.vue +96 -0
  219. package/lib/components/Search/Pill.md +37 -0
  220. package/lib/components/Search/Pill.vue +117 -0
  221. package/lib/components/Search/Search.md +44 -0
  222. package/lib/components/Search/Search.vue +341 -0
  223. package/lib/components/SidePanels/SidePanel.md +126 -0
  224. package/lib/components/SidePanels/SidePanel.vue +592 -0
  225. package/lib/components/Tables/StudyTable.md +136 -0
  226. package/lib/components/Tables/Table.vue +497 -0
  227. package/lib/components/Tables/TableActions.vue +199 -0
  228. package/lib/components/Tables/TablePagination.md +19 -0
  229. package/lib/components/Tables/TablePagination.vue +109 -0
  230. package/lib/components/Tables/TeachTable.md +696 -0
  231. package/lib/components/Toasts/Toast.md +35 -0
  232. package/lib/components/Toasts/Toast.vue +213 -0
  233. package/lib/components/Tooltips/OverflowTooltip.md +14 -0
  234. package/lib/components/Tooltips/OverflowTooltip.vue +68 -0
  235. package/lib/components/Tooltips/Tooltip.md +72 -0
  236. package/lib/components/Tooltips/Tooltip.vue +143 -0
  237. package/lib/directives.ts +213 -0
  238. package/lib/index.ts +108 -0
  239. package/{pocketprep-export.module.scss → lib/pocketprep-export.module.scss} +2 -2
  240. package/{pocketprep.scss → lib/pocketprep.scss} +16 -18
  241. package/{styles → lib/styles}/_colors.scss +1 -1
  242. package/lib/styles/fonts.css +149 -0
  243. package/lib/utils.ts +53 -0
  244. package/package.json +75 -56
  245. package/{stylelint.config.js → stylelint.config.cjs} +6 -3
  246. package/assets/Fonts.md +0 -114
  247. package/assets/Images.md +0 -2
  248. package/assets/Styleguidist.vue +0 -11
  249. package/dist/@pocketprep/ui-kit.common.js +0 -29726
  250. package/dist/@pocketprep/ui-kit.common.js.map +0 -1
  251. package/dist/@pocketprep/ui-kit.umd.js +0 -29745
  252. package/dist/@pocketprep/ui-kit.umd.js.map +0 -1
  253. package/dist/@pocketprep/ui-kit.umd.min.js +0 -33
  254. package/dist/@pocketprep/ui-kit.umd.min.js.map +0 -1
  255. package/dist/demo.html +0 -1
  256. package/index.d.ts +0 -63
  257. package/src/directives.d.ts +0 -2
  258. package/src/shims.d.ts +0 -19
  259. package/src/utils.d.ts +0 -51
  260. package/styles/Colors.md +0 -53
  261. package/styles/Styles.md +0 -4
  262. package/styles/_fonts.scss +0 -149
  263. package/tests/shims-test.d.ts +0 -9
  264. /package/{assets → lib/assets}/fonts/muli/muli-400.eot +0 -0
  265. /package/{assets → lib/assets}/fonts/muli/muli-400.svg +0 -0
  266. /package/{assets → lib/assets}/fonts/muli/muli-400.ttf +0 -0
  267. /package/{assets → lib/assets}/fonts/muli/muli-400.woff +0 -0
  268. /package/{assets → lib/assets}/fonts/muli/muli-400.woff2 +0 -0
  269. /package/{assets → lib/assets}/fonts/muli/muli-400italic.eot +0 -0
  270. /package/{assets → lib/assets}/fonts/muli/muli-400italic.svg +0 -0
  271. /package/{assets → lib/assets}/fonts/muli/muli-400italic.ttf +0 -0
  272. /package/{assets → lib/assets}/fonts/muli/muli-400italic.woff +0 -0
  273. /package/{assets → lib/assets}/fonts/muli/muli-400italic.woff2 +0 -0
  274. /package/{assets → lib/assets}/fonts/muli/muli-600.eot +0 -0
  275. /package/{assets → lib/assets}/fonts/muli/muli-600.svg +0 -0
  276. /package/{assets → lib/assets}/fonts/muli/muli-600.ttf +0 -0
  277. /package/{assets → lib/assets}/fonts/muli/muli-600.woff +0 -0
  278. /package/{assets → lib/assets}/fonts/muli/muli-600.woff2 +0 -0
  279. /package/{assets → lib/assets}/fonts/muli/muli-600italic.eot +0 -0
  280. /package/{assets → lib/assets}/fonts/muli/muli-600italic.svg +0 -0
  281. /package/{assets → lib/assets}/fonts/muli/muli-600italic.ttf +0 -0
  282. /package/{assets → lib/assets}/fonts/muli/muli-600italic.woff +0 -0
  283. /package/{assets → lib/assets}/fonts/muli/muli-600italic.woff2 +0 -0
  284. /package/{assets → lib/assets}/fonts/muli/muli-700.eot +0 -0
  285. /package/{assets → lib/assets}/fonts/muli/muli-700.svg +0 -0
  286. /package/{assets → lib/assets}/fonts/muli/muli-700.ttf +0 -0
  287. /package/{assets → lib/assets}/fonts/muli/muli-700.woff +0 -0
  288. /package/{assets → lib/assets}/fonts/muli/muli-700.woff2 +0 -0
  289. /package/{assets → lib/assets}/fonts/muli/muli-700italic.eot +0 -0
  290. /package/{assets → lib/assets}/fonts/muli/muli-700italic.svg +0 -0
  291. /package/{assets → lib/assets}/fonts/muli/muli-700italic.ttf +0 -0
  292. /package/{assets → lib/assets}/fonts/muli/muli-700italic.woff +0 -0
  293. /package/{assets → lib/assets}/fonts/muli/muli-700italic.woff2 +0 -0
  294. /package/{assets → lib/assets}/images/amta.svg +0 -0
  295. /package/{assets → lib/assets}/images/favicon.ico +0 -0
  296. /package/{assets → lib/assets}/images/thumb-large-dark.svg +0 -0
  297. /package/{assets → lib/assets}/images/thumb-large.svg +0 -0
  298. /package/{assets → lib/assets}/images/thumb-small-dark.svg +0 -0
  299. /package/{assets → lib/assets}/images/thumb-small.svg +0 -0
  300. /package/{src → lib}/components/BundleIcons/bundleIcon.d.ts +0 -0
  301. /package/{src → lib}/components/Icons/icon.d.ts +0 -0
  302. /package/{src → lib}/components/PhonePerson/phonePerson.d.ts +0 -0
  303. /package/{src → lib}/components/Tables/table.d.ts +0 -0
  304. /package/{styles → lib/styles}/_breakpoints.scss +0 -0
  305. /package/{styles/_normalize.scss → lib/styles/normalize.css} +0 -0
@@ -0,0 +1,257 @@
1
+ <template>
2
+ <div
3
+ v-dark="isDarkMode"
4
+ class="uikit-exam-card"
5
+ :class="{
6
+ 'uikit-exam-card--cancel': showCancelButton,
7
+ 'uikit-exam-card--disable-interaction': disableInteraction,
8
+ 'uikit-exam-card--exam-selected': !showCancelButton && !disableInteraction && isSelected
9
+ }"
10
+ :tabindex="showCancelButton ? -1 : 0"
11
+ @click="emitSelect"
12
+ @keypress.enter.prevent="emitSelect"
13
+ @mousedown.prevent
14
+ >
15
+ <div
16
+ v-if="showCancelButton"
17
+ class="uikit-exam-card__cancel"
18
+ tabindex="0"
19
+ aria-label="Clear exam selection"
20
+ @click="emitCancel"
21
+ @keypress.enter.prevent="emitCancel"
22
+ >
23
+ <Icon type="close" />
24
+ </div>
25
+ <div class="uikit-exam-card__name-short">
26
+ {{ exam.nativeAppName }}
27
+ <PremiumPill
28
+ v-if="isPremium"
29
+ v-dark="isDarkMode"
30
+ />
31
+ </div>
32
+ <div v-dark="isDarkMode" class="uikit-exam-card__name-long">
33
+ {{ exam.descriptiveName }}
34
+ </div>
35
+ <div v-dark="isDarkMode" class="uikit-exam-card__detail-counts">
36
+ <span class="uikit-exam-card__question-count">
37
+ {{ exam.itemCount - exam.archivedCount }}
38
+ </span> Questions,
39
+ <span class="uikit-exam-card__subject-count">
40
+ {{ Object.keys(exam.knowledgeAreas).length }}
41
+ </span> Subjects
42
+ </div>
43
+ <span
44
+ class="uikit-exam-card__label"
45
+ aria-hidden="true"
46
+ :style="{ color: bundleColor || '' }"
47
+ >
48
+ <BundleIcon
49
+ ref="bundleIcon"
50
+ class="uikit-exam-card__label-icon"
51
+ :theme="isDarkMode ? 'silver' : 'color'"
52
+ :bundle-id="bundle.objectId"
53
+ />
54
+ {{ bundle.name }}
55
+ </span>
56
+ </div>
57
+ </template>
58
+
59
+ <script lang="ts">
60
+ import type { ComponentPublicInstance } from 'vue'
61
+ import { Vue, Component, Prop, Emit } from 'vue-facing-decorator'
62
+ import BundleIcon from '../BundleIcons/BundleIcon.vue'
63
+ import Icon from '../Icons/Icon.vue'
64
+ import type { Study } from '@pocketprep/types'
65
+ import { dark } from '../../directives'
66
+ import PremiumPill from '../Bundles/PremiumPill.vue'
67
+
68
+ @Component({
69
+ directives: {
70
+ dark,
71
+ },
72
+ components: {
73
+ BundleIcon,
74
+ Icon,
75
+ PremiumPill,
76
+ },
77
+ })
78
+ export default class ExamCard extends Vue {
79
+ @Prop() exam!: Study.Class.ExamMetadataJSON
80
+ @Prop() bundle!: Study.Class.BundleJSON
81
+ @Prop({ default: false }) showCancelButton!: boolean
82
+ @Prop({ default: false }) disableInteraction!: boolean
83
+ @Prop({ default: false }) isPremium!: boolean
84
+ @Prop({ default: false }) isSelected!: boolean
85
+ @Prop({ default: false }) isDarkMode!: boolean
86
+
87
+ bundleColor: string | null = null
88
+
89
+ mounted () {
90
+ try {
91
+ const bundleIcon = this.$refs.bundleIcon as ComponentPublicInstance
92
+ const gId = bundleIcon.$el?.querySelector('path')?.getAttribute('fill')?.split('#')[1].split(')')[0]
93
+ const stopColor = document.querySelectorAll(`#${gId} stop`)[1]?.getAttribute('stop-color')
94
+ this.bundleColor = stopColor || null
95
+ } catch (e) {
96
+ // noop
97
+ }
98
+ }
99
+
100
+ @Emit('select')
101
+ emitSelect () {
102
+ return true
103
+ }
104
+
105
+ @Emit('cancel')
106
+ emitCancel () {
107
+ return true
108
+ }
109
+ }
110
+ </script>
111
+
112
+ <style lang="scss">
113
+ @import '../../styles/colors';
114
+ @import '../../styles/breakpoints';
115
+
116
+ .uikit-exam-card {
117
+ position: relative;
118
+ background-color: white;
119
+ border-radius: 4px;
120
+ box-shadow: 0 2px 6px 0 rgba($brand-black, 0.15), 0 1px 2px 0 rgba($brand-black, 0.06);
121
+ box-sizing: border-box;
122
+ width: 305px;
123
+ min-height: 107px;
124
+ padding: 11px 13px;
125
+ margin: 8px 8px 5px;
126
+ outline: none;
127
+
128
+ &--dark {
129
+ background-color: $brand-black;
130
+ border: 1px solid $slate;
131
+ box-shadow: 0 1px 6px 0 rgba($charcoal, 0.3);
132
+ }
133
+
134
+ @include breakpoint(black-bear) {
135
+ width: 340px;
136
+ }
137
+
138
+ &:not(&--cancel):not(&--disable-interaction) {
139
+ cursor: pointer;
140
+
141
+ &:hover,
142
+ &:focus {
143
+ &::before {
144
+ content: '';
145
+ position: absolute;
146
+ border-radius: 4px;
147
+ border: 2px solid $pewter;
148
+ top: -2px;
149
+ bottom: -2px;
150
+ left: -2px;
151
+ right: -2px;
152
+ }
153
+ }
154
+ }
155
+
156
+ &--exam-selected {
157
+ &::before {
158
+ content: '';
159
+ position: absolute;
160
+ border-radius: 4px;
161
+ border: 2px solid $brand-blue !important;
162
+ top: -2px;
163
+ bottom: -2px;
164
+ left: -2px;
165
+ right: -2px;
166
+ }
167
+
168
+ &--dark::before {
169
+ border-color: $banana-bread !important;
170
+ }
171
+ }
172
+
173
+ &__cancel {
174
+ position: absolute;
175
+ right: 7px;
176
+ top: 8px;
177
+ width: 22px;
178
+ height: 22px;
179
+ color: $steel;
180
+ cursor: pointer;
181
+ outline: none;
182
+
183
+ &:hover,
184
+ &:focus {
185
+ color: $brand-black;
186
+ }
187
+
188
+ &:focus::before {
189
+ content: '';
190
+ position: absolute;
191
+ left: -1px;
192
+ top: -1px;
193
+ border-radius: 4px;
194
+ width: 100%;
195
+ height: 100%;
196
+ border: 1px solid $brand-blue;
197
+ }
198
+
199
+ svg {
200
+ width: 100%;
201
+ height: 100%;
202
+ }
203
+ }
204
+
205
+ &__name-short {
206
+ font-weight: 600;
207
+ font-size: 15px;
208
+ letter-spacing: 0.47px;
209
+ line-height: 20px;
210
+ margin-bottom: 6px;
211
+ }
212
+
213
+ &__name-long {
214
+ color: $pickled-bluewood;
215
+ font-weight: 400;
216
+ font-size: 13px;
217
+ line-height: 16px;
218
+ margin-bottom: 3px;
219
+
220
+ &--dark {
221
+ color: $fog;
222
+ }
223
+ }
224
+
225
+ &__detail-counts {
226
+ font-size: 13px;
227
+ line-height: 17.76px;
228
+ color: $pickled-bluewood;
229
+ font-weight: 400;
230
+ margin-bottom: 26px;
231
+
232
+ &--dark {
233
+ color: $fog;
234
+ }
235
+ }
236
+
237
+ &__question-count,
238
+ &__subject-count {
239
+ font-weight: 500;
240
+ }
241
+
242
+ &__label {
243
+ position: absolute;
244
+ bottom: 9px;
245
+ display: flex;
246
+ align-items: center;
247
+ font-size: 12px;
248
+ line-height: 14px;
249
+ }
250
+
251
+ &__label-icon {
252
+ width: 20px;
253
+ height: 20px;
254
+ margin-right: 4px;
255
+ }
256
+ }
257
+ </style>
@@ -0,0 +1,90 @@
1
+ ```vue
2
+ <template>
3
+ <div class="docs-exam-menu-card">
4
+ <div>
5
+ <Button @click="canClick = !canClick">
6
+ {{ canClick ? 'Prevent' : 'Allow' }} Click
7
+ </Button>
8
+ <Button @click="showMenuArrow = !showMenuArrow">
9
+ {{ showMenuArrow ? 'Hide' : 'Show' }} Menu Arrow
10
+ </Button>
11
+ <Button @click="isPremium = !isPremium">
12
+ {{ isPremium ? 'Hide' : 'Show' }} Premium Badge
13
+ </Button>
14
+ </div>
15
+ <SVGDefinitions />
16
+ <ExamMenuCard
17
+ class="docs-exam-menu-card__color"
18
+ :exam="exam"
19
+ :bundle-id="bundleId"
20
+ :is-clickable="canClick"
21
+ :show-menu-arrow="showMenuArrow"
22
+ :menu-arrow-direction="menuArrowDirection"
23
+ :is-premium="isPremium"
24
+ @click="menuArrowDirection = menuArrowDirection === 'up' ? 'down' : 'up'"
25
+ @keydown.enter="handleKeydown"
26
+ />
27
+ <ExamMenuCard
28
+ class="docs-exam-menu-card__grayscale"
29
+ :exam="exam"
30
+ :bundle-id="bundleId"
31
+ theme="grayscale"
32
+ :is-clickable="canClick"
33
+ :show-menu-arrow="showMenuArrow"
34
+ :menu-arrow-direction="menuArrowDirection"
35
+ :is-premium="isPremium"
36
+ @click="menuArrowDirection = menuArrowDirection === 'up' ? 'down' : 'up'"
37
+ @keydown.enter="handleKeydown"
38
+ />
39
+ <ExamMenuCard
40
+ class="docs-exam-menu-card__silver"
41
+ :exam="exam"
42
+ :bundle-id="bundleId"
43
+ theme="silver"
44
+ :is-clickable="canClick"
45
+ :show-menu-arrow="showMenuArrow"
46
+ :menu-arrow-direction="menuArrowDirection"
47
+ :is-premium="isPremium"
48
+ @click="menuArrowDirection = menuArrowDirection === 'up' ? 'down' : 'up'"
49
+ @keydown.enter="handleKeydown"
50
+ />
51
+ </div>
52
+ </template>
53
+
54
+ <script>
55
+ export default {
56
+ data () {
57
+ const exam = {
58
+ objectId: 'o98Hn8iUO4',
59
+ descriptiveName: 'College-level Biology Practice',
60
+ nativeAppName: 'College Biology',
61
+ }
62
+ const bundleId = '9970muCFGV'
63
+ const canClick = false
64
+ const showMenuArrow = false
65
+ const menuArrowDirection = 'down'
66
+ const isPremium = false
67
+
68
+ return {
69
+ exam,
70
+ bundleId,
71
+ canClick,
72
+ showMenuArrow,
73
+ menuArrowDirection,
74
+ isPremium,
75
+ }
76
+ },
77
+ methods: {
78
+ handleKeydown () {
79
+ this.menuArrowDirection = this.menuArrowDirection === 'up' ? 'down' : 'up'
80
+ }
81
+ }
82
+ }
83
+ </script>
84
+ ```
85
+
86
+ <style>
87
+ .docs-exam-menu-card__silver {
88
+ background-color: #1c2f3c;
89
+ }
90
+ </style>
@@ -0,0 +1,218 @@
1
+ <template>
2
+ <div
3
+ v-if="bundleId"
4
+ class="uikit-exam-menu-card"
5
+ :class="{
6
+ [`uikit-exam-menu-card--${theme}`]: true,
7
+ 'uikit-exam-menu-card--clickable': isClickable,
8
+ }"
9
+ :tabindex="isClickable ? '0' : '-1'"
10
+ @mousedown.prevent
11
+ @click="isClickable && emitClick()"
12
+ @keydown="isClickable && emitKeydown($event)"
13
+ >
14
+ <div class="uikit-exam-menu-card__icon">
15
+ <BundleIcon
16
+ :theme="theme"
17
+ :bundle-id="bundleId"
18
+ />
19
+ </div>
20
+ <div class="uikit-exam-menu-card__right">
21
+ <div class="uikit-exam-menu-card__top">
22
+ <div
23
+ class="uikit-exam-menu-card__name"
24
+ :class="{ 'uikit-exam-menu-card__name--is-premium': isPremium }"
25
+ >
26
+ {{ exam.nativeAppName }}
27
+ </div>
28
+ <PremiumPill v-if="isPremium" class="uikit-exam-menu-card__premium-pill" />
29
+ </div>
30
+ <div class="uikit-exam-menu-card__fullname">
31
+ <span>{{ exam.descriptiveName }}</span>
32
+ <Icon
33
+ v-if="showMenuArrow"
34
+ :style="{ transform: `rotate(${menuArrowDirection === 'up' ? '180' : '0'}deg)` }"
35
+ type="accordionArrow"
36
+ class="uikit-exam-menu-card__arrow"
37
+ />
38
+ </div>
39
+ </div>
40
+ </div>
41
+ </template>
42
+
43
+ <script lang="ts">
44
+ import { Vue, Component, Prop, Emit } from 'vue-facing-decorator'
45
+ import Icon from '../Icons/Icon.vue'
46
+ import BundleIcon from '../BundleIcons/BundleIcon.vue'
47
+ import type { Study } from '@pocketprep/types'
48
+
49
+ @Component({
50
+ components: {
51
+ BundleIcon,
52
+ Icon,
53
+ },
54
+ })
55
+ export default class ExamMenuCard extends Vue {
56
+ @Prop() exam!: Study.Class.ExamMetadataJSON
57
+ @Prop() bundleId!: string
58
+ @Prop({ default: 'color' }) theme!: 'color' | 'grayscale' | 'silver'
59
+ @Prop({ default: false }) isPremium!: boolean
60
+ @Prop({ default: false }) showMenuArrow!: boolean
61
+ @Prop({ default: 'down' }) menuArrowDirection!: 'up' | 'down'
62
+ @Prop({ default: true }) isClickable!: boolean
63
+
64
+ @Emit('click')
65
+ emitClick () {
66
+ return true
67
+ }
68
+
69
+ @Emit('keydown')
70
+ emitKeydown (keyEvent: KeyboardEvent) {
71
+ return keyEvent
72
+ }
73
+ }
74
+ </script>
75
+
76
+ <style lang="scss">
77
+ @import '../../styles/colors';
78
+ @import '../../styles/breakpoints';
79
+
80
+ .uikit-exam-menu-card {
81
+ display: flex;
82
+ align-items: center;
83
+ padding: 8px 3px 10px;
84
+ box-sizing: border-box;
85
+ height: 54px;
86
+ user-select: none;
87
+ width: 320px;
88
+ position: relative;
89
+ outline: none;
90
+
91
+ @include breakpoint(black-bear) {
92
+ width: 100%;
93
+ }
94
+
95
+ &:not(&--silver) {
96
+ color: $brand-black;
97
+
98
+ .uikit-exam-menu-card__arrow {
99
+ color: $slate-03;
100
+ }
101
+ }
102
+
103
+ &--silver {
104
+ color: $white;
105
+
106
+ .uikit-exam-menu-card__premium-pill {
107
+ background-color: rgba($cream-puff, 0.19);
108
+ color: $banana-bread;
109
+ }
110
+ }
111
+
112
+ &--clickable {
113
+ cursor: pointer;
114
+
115
+ &:focus::before {
116
+ content: '';
117
+ left: 0;
118
+ top: 3px;
119
+ position: absolute;
120
+ width: calc(100% - 2px);
121
+ height: calc(100% - 8px);
122
+ border-radius: 6px;
123
+ border: 1px solid $brand-blue;
124
+ }
125
+
126
+ &:not(.uikit-exam-menu--silver):hover {
127
+ background-color: $gray-background;
128
+ }
129
+
130
+ &.uikit-exam-menu-card--silver:hover {
131
+ background-color: $black-feather;
132
+ }
133
+
134
+ &.uikit-exam-menu-card--silver:focus::before {
135
+ border-color: $banana-bread;
136
+ }
137
+ }
138
+
139
+ &__right {
140
+ position: relative;
141
+ max-width: calc(100% - 52px);
142
+ width: 100%;
143
+ margin-top: 5px;
144
+ }
145
+
146
+ &__arrow {
147
+ width: 10px;
148
+ color: $white;
149
+ display: inline-block;
150
+ vertical-align: top;
151
+ margin-top: 4px;
152
+ margin-left: 5px;
153
+ }
154
+
155
+ &__icon {
156
+ width: 52px;
157
+ height: 52px;
158
+ margin-right: 5px;
159
+
160
+ svg {
161
+ width: 100%;
162
+ height: 100%;
163
+ }
164
+ }
165
+
166
+ &__top {
167
+ font-size: 15px;
168
+ line-height: 20px;
169
+ font-weight: 600;
170
+ height: 20px;
171
+ }
172
+
173
+ &__name {
174
+ display: inline-block;
175
+ text-overflow: ellipsis;
176
+ white-space: nowrap;
177
+ overflow: hidden;
178
+
179
+ &--is-premium {
180
+ max-width: calc(100% - 86px);
181
+ }
182
+ }
183
+
184
+ &__premium-pill {
185
+ font-size: 12px;
186
+ line-height: 16px;
187
+ background-color: $beach-sand;
188
+ width: 55px;
189
+ height: 16px;
190
+ vertical-align: top;
191
+ margin-top: 2px;
192
+ margin-left: 8px;
193
+ padding: 0;
194
+ }
195
+
196
+ &__fullname {
197
+ font-size: 12px;
198
+ line-height: 16px;
199
+ opacity: 0.8;
200
+ max-width: 244px;
201
+
202
+ @include breakpoint(black-bear) {
203
+ max-width: none;
204
+ width: 100%;
205
+ display: inline-block;
206
+ position: relative;
207
+ }
208
+
209
+ span {
210
+ display: inline-block;
211
+ max-width: calc(100% - 50px);
212
+ text-overflow: ellipsis;
213
+ white-space: nowrap;
214
+ overflow: hidden;
215
+ }
216
+ }
217
+ }
218
+ </style>
@@ -0,0 +1,59 @@
1
+ ```vue
2
+ <template>
3
+ <div>
4
+ <FilterDropdown
5
+ filterLabel="Filter"
6
+ :radioEntries="radioOptions"
7
+ :checkboxEntries="checkboxOptions"
8
+ />
9
+ </div>
10
+ </template>
11
+
12
+ <script>
13
+ export default {
14
+ data () {
15
+ return {
16
+ radioOptions: [],
17
+ checkboxOptions: [
18
+ {
19
+ id: 'airway',
20
+ label: 'Airway, Respiration, & Ventilation (18)',
21
+ enabled: false,
22
+ },
23
+ {
24
+ id: 'cardio',
25
+ label: 'Cardiology & Resuscitation (9)',
26
+ enabled: false,
27
+ },
28
+ {
29
+ id: 'ems',
30
+ label: 'EMS Operations (5)',
31
+ enabled: false,
32
+ },
33
+ {
34
+ id: 'medical',
35
+ label: 'Medical; Obstetrics & Gynecology (6)',
36
+ enabled: false,
37
+ },
38
+ {
39
+ id: 'trauma',
40
+ label: 'Trauma (10)',
41
+ enabled: false,
42
+ },
43
+ ]
44
+ }
45
+ }
46
+ }
47
+ </script>
48
+
49
+ <style>
50
+ .light,
51
+ .dark {
52
+ padding: 30px;
53
+ }
54
+
55
+ .dark {
56
+ background-color: #1f3545;
57
+ }
58
+ </style>
59
+ ```