@pocketprep/ui-kit 2.0.40 → 3.0.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 (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/index.d.ts +6 -62
  8. package/lib/SVGDefinitions.vue +85 -0
  9. package/lib/assets/emojis/tada.png +0 -0
  10. package/lib/assets/halftones/halftone-black.png +0 -0
  11. package/lib/assets/halftones/halftone-blue.png +0 -0
  12. package/lib/assets/halftones/halftone-green.png +0 -0
  13. package/lib/assets/halftones/halftone-purple.png +0 -0
  14. package/lib/assets/halftones/halftone-red.png +0 -0
  15. package/lib/assets/halftones/halftone-yellow.png +0 -0
  16. package/lib/assets/question/paywall-dark.png +0 -0
  17. package/lib/assets/question/paywall-light.png +0 -0
  18. package/lib/components/Banners/Banner.md +41 -0
  19. package/lib/components/Banners/Banner.vue +87 -0
  20. package/lib/components/BundleIcons/AMTA.vue +134 -0
  21. package/lib/components/BundleIcons/BundleIcon.md +60 -0
  22. package/lib/components/BundleIcons/BundleIcon.vue +111 -0
  23. package/lib/components/Bundles/BundleList.md +63 -0
  24. package/lib/components/Bundles/BundleList.vue +170 -0
  25. package/lib/components/Bundles/BundleSearch.md +195 -0
  26. package/lib/components/Bundles/BundleSearch.vue +573 -0
  27. package/lib/components/Bundles/PremiumPill.md +23 -0
  28. package/lib/components/Bundles/PremiumPill.vue +43 -0
  29. package/lib/components/Buttons/Button.md +99 -0
  30. package/lib/components/Buttons/Button.vue +496 -0
  31. package/lib/components/Buttons/Link.md +58 -0
  32. package/lib/components/Buttons/Link.vue +192 -0
  33. package/lib/components/Buttons/Tab.md +35 -0
  34. package/lib/components/Buttons/Tab.vue +103 -0
  35. package/lib/components/Calendar/Calendar.md +18 -0
  36. package/lib/components/Calendar/Calendar.vue +162 -0
  37. package/lib/components/Charts/Bar.md +123 -0
  38. package/lib/components/Charts/Bar.vue +364 -0
  39. package/lib/components/Charts/Pie.md +23 -0
  40. package/lib/components/Charts/Pie.vue +105 -0
  41. package/lib/components/Controls/SegmentControl.md +47 -0
  42. package/lib/components/Controls/SegmentControl.vue +117 -0
  43. package/lib/components/Controls/Slider.md +67 -0
  44. package/lib/components/Controls/Slider.vue +358 -0
  45. package/lib/components/Controls/ToggleSwitch.md +56 -0
  46. package/lib/components/Controls/ToggleSwitch.vue +160 -0
  47. package/lib/components/Exams/ExamCard.md +45 -0
  48. package/lib/components/Exams/ExamCard.vue +257 -0
  49. package/lib/components/Exams/ExamMenuCard.md +90 -0
  50. package/lib/components/Exams/ExamMenuCard.vue +218 -0
  51. package/lib/components/Filters/FilterDropdown.md +59 -0
  52. package/lib/components/Filters/FilterDropdown.vue +176 -0
  53. package/lib/components/Filters/FilterOptions.md +65 -0
  54. package/lib/components/Filters/FilterOptions.vue +265 -0
  55. package/lib/components/Filters/filterOptions.d.ts +10 -0
  56. package/lib/components/Forms/Checkbox.md +52 -0
  57. package/lib/components/Forms/Checkbox.vue +184 -0
  58. package/lib/components/Forms/CheckboxOption.md +37 -0
  59. package/lib/components/Forms/CheckboxOption.vue +173 -0
  60. package/lib/components/Forms/Errors.md +23 -0
  61. package/lib/components/Forms/Errors.vue +109 -0
  62. package/lib/components/Forms/Input.md +63 -0
  63. package/lib/components/Forms/Input.vue +310 -0
  64. package/lib/components/Forms/Radio.md +66 -0
  65. package/lib/components/Forms/Radio.vue +312 -0
  66. package/lib/components/Forms/Select.md +133 -0
  67. package/lib/components/Forms/Select.vue +670 -0
  68. package/lib/components/Forms/Textarea.md +57 -0
  69. package/lib/components/Forms/Textarea.vue +157 -0
  70. package/lib/components/Icons/Icon.md +146 -0
  71. package/lib/components/Icons/Icon.vue +192 -0
  72. package/lib/components/Icons/IconAccordionArrow.md +7 -0
  73. package/lib/components/Icons/IconAccordionArrow.vue +23 -0
  74. package/lib/components/Icons/IconActivity.md +7 -0
  75. package/lib/components/Icons/IconActivity.vue +21 -0
  76. package/lib/components/Icons/IconAdd.md +7 -0
  77. package/lib/components/Icons/IconAdd.vue +19 -0
  78. package/lib/components/Icons/IconAddCircle.md +7 -0
  79. package/lib/components/Icons/IconAddCircle.vue +22 -0
  80. package/lib/components/Icons/IconArrow.md +7 -0
  81. package/lib/components/Icons/IconArrow.vue +21 -0
  82. package/lib/components/Icons/IconBarChart.md +7 -0
  83. package/lib/components/Icons/IconBarChart.vue +23 -0
  84. package/lib/components/Icons/IconCalendar.md +7 -0
  85. package/lib/components/Icons/IconCalendar.vue +19 -0
  86. package/lib/components/Icons/IconCheck.md +7 -0
  87. package/lib/components/Icons/IconCheck.vue +21 -0
  88. package/lib/components/Icons/IconClose.md +7 -0
  89. package/lib/components/Icons/IconClose.vue +23 -0
  90. package/lib/components/Icons/IconCorrect.md +7 -0
  91. package/lib/components/Icons/IconCorrect.vue +19 -0
  92. package/lib/components/Icons/IconEdit.md +7 -0
  93. package/lib/components/Icons/IconEdit.vue +21 -0
  94. package/lib/components/Icons/IconExam.md +7 -0
  95. package/lib/components/Icons/IconExam.vue +34 -0
  96. package/lib/components/Icons/IconExternalLink.md +7 -0
  97. package/lib/components/Icons/IconExternalLink.vue +30 -0
  98. package/lib/components/Icons/IconEyeHide.md +7 -0
  99. package/lib/components/Icons/IconEyeHide.vue +21 -0
  100. package/lib/components/Icons/IconEyeShow.md +7 -0
  101. package/lib/components/Icons/IconEyeShow.vue +21 -0
  102. package/lib/components/Icons/IconFilter.md +7 -0
  103. package/lib/components/Icons/IconFilter.vue +19 -0
  104. package/lib/components/Icons/IconFilterActive.md +7 -0
  105. package/lib/components/Icons/IconFilterActive.vue +20 -0
  106. package/lib/components/Icons/IconFlag.md +7 -0
  107. package/lib/components/Icons/IconFlag.vue +25 -0
  108. package/lib/components/Icons/IconFlagFeedback.md +11 -0
  109. package/lib/components/Icons/IconFlagFeedback.vue +24 -0
  110. package/lib/components/Icons/IconFlagFilled.md +7 -0
  111. package/lib/components/Icons/IconFlagFilled.vue +22 -0
  112. package/lib/components/Icons/IconFullView.md +7 -0
  113. package/lib/components/Icons/IconFullView.vue +30 -0
  114. package/lib/components/Icons/IconFullViewActive.md +7 -0
  115. package/lib/components/Icons/IconFullViewActive.vue +28 -0
  116. package/lib/components/Icons/IconHandle.md +7 -0
  117. package/lib/components/Icons/IconHandle.vue +23 -0
  118. package/lib/components/Icons/IconHeart.md +7 -0
  119. package/lib/components/Icons/IconHeart.vue +19 -0
  120. package/lib/components/Icons/IconHelp.md +7 -0
  121. package/lib/components/Icons/IconHelp.vue +25 -0
  122. package/lib/components/Icons/IconHourglass.md +7 -0
  123. package/lib/components/Icons/IconHourglass.vue +22 -0
  124. package/lib/components/Icons/IconImage.md +7 -0
  125. package/lib/components/Icons/IconImage.vue +21 -0
  126. package/lib/components/Icons/IconIncorrect.md +7 -0
  127. package/lib/components/Icons/IconIncorrect.vue +21 -0
  128. package/lib/components/Icons/IconInfo.md +7 -0
  129. package/lib/components/Icons/IconInfo.vue +24 -0
  130. package/lib/components/Icons/IconKeyboard.md +7 -0
  131. package/lib/components/Icons/IconKeyboard.vue +25 -0
  132. package/lib/components/Icons/IconLaunch.md +7 -0
  133. package/lib/components/Icons/IconLaunch.vue +25 -0
  134. package/lib/components/Icons/IconLightning.md +7 -0
  135. package/lib/components/Icons/IconLightning.vue +21 -0
  136. package/lib/components/Icons/IconList.md +7 -0
  137. package/lib/components/Icons/IconList.vue +26 -0
  138. package/lib/components/Icons/IconLoading.md +7 -0
  139. package/lib/components/Icons/IconLoading.vue +65 -0
  140. package/lib/components/Icons/IconLoading2.md +7 -0
  141. package/lib/components/Icons/IconLoading2.vue +52 -0
  142. package/lib/components/Icons/IconLock.md +7 -0
  143. package/lib/components/Icons/IconLock.vue +23 -0
  144. package/lib/components/Icons/IconMissedQuestions.md +7 -0
  145. package/lib/components/Icons/IconMissedQuestions.vue +22 -0
  146. package/lib/components/Icons/IconMoon.md +7 -0
  147. package/lib/components/Icons/IconMoon.vue +25 -0
  148. package/lib/components/Icons/IconPaginationArrow.md +7 -0
  149. package/lib/components/Icons/IconPaginationArrow.vue +23 -0
  150. package/lib/components/Icons/IconPassage.md +7 -0
  151. package/lib/components/Icons/IconPassage.vue +22 -0
  152. package/lib/components/Icons/IconPencil.md +7 -0
  153. package/lib/components/Icons/IconPencil.vue +19 -0
  154. package/lib/components/Icons/IconPeople.md +7 -0
  155. package/lib/components/Icons/IconPeople.vue +25 -0
  156. package/lib/components/Icons/IconQuestions.md +7 -0
  157. package/lib/components/Icons/IconQuestions.vue +25 -0
  158. package/lib/components/Icons/IconQuick10.md +7 -0
  159. package/lib/components/Icons/IconQuick10.vue +23 -0
  160. package/lib/components/Icons/IconRemoveCircle.md +7 -0
  161. package/lib/components/Icons/IconRemoveCircle.vue +22 -0
  162. package/lib/components/Icons/IconReviewFlag.md +7 -0
  163. package/lib/components/Icons/IconReviewFlag.vue +32 -0
  164. package/lib/components/Icons/IconSearch.md +7 -0
  165. package/lib/components/Icons/IconSearch.vue +23 -0
  166. package/lib/components/Icons/IconShare.md +7 -0
  167. package/lib/components/Icons/IconShare.vue +31 -0
  168. package/lib/components/Icons/IconSideBar.md +7 -0
  169. package/lib/components/Icons/IconSideBar.vue +26 -0
  170. package/lib/components/Icons/IconSideBarActive.md +7 -0
  171. package/lib/components/Icons/IconSideBarActive.vue +28 -0
  172. package/lib/components/Icons/IconStopwatch.md +7 -0
  173. package/lib/components/Icons/IconStopwatch.vue +22 -0
  174. package/lib/components/Icons/IconStrike.md +60 -0
  175. package/lib/components/Icons/IconStrike.vue +23 -0
  176. package/lib/components/Icons/IconSubject.md +7 -0
  177. package/lib/components/Icons/IconSubject.vue +22 -0
  178. package/lib/components/Icons/IconText.md +7 -0
  179. package/lib/components/Icons/IconText.vue +22 -0
  180. package/lib/components/Icons/IconWarning.md +7 -0
  181. package/lib/components/Icons/IconWarning.vue +22 -0
  182. package/lib/components/Modal/Modal.md +31 -0
  183. package/lib/components/Modal/Modal.vue +133 -0
  184. package/lib/components/Modal/ModalContainer.md +96 -0
  185. package/lib/components/Modal/ModalContainer.vue +208 -0
  186. package/lib/components/Onboarding/EmailAuth.md +40 -0
  187. package/lib/components/Onboarding/EmailAuth.vue +218 -0
  188. package/lib/components/Onboarding/MagicCodeEntry.md +20 -0
  189. package/lib/components/Onboarding/MagicCodeEntry.vue +189 -0
  190. package/lib/components/PhonePerson/PhonePerson.md +36 -0
  191. package/lib/components/PhonePerson/PhonePerson.vue +48 -0
  192. package/lib/components/PhonePerson/phoneperson-IT@2x.png +0 -0
  193. package/lib/components/PhonePerson/phoneperson-auto@2x.png +0 -0
  194. package/lib/components/PhonePerson/phoneperson-behavioralhealth@2x.png +0 -0
  195. package/lib/components/PhonePerson/phoneperson-emt@2x.png +0 -0
  196. package/lib/components/PhonePerson/phoneperson-essentials@2x.png +0 -0
  197. package/lib/components/PhonePerson/phoneperson-finance@2x.png +0 -0
  198. package/lib/components/PhonePerson/phoneperson-fitness@2x.png +0 -0
  199. package/lib/components/PhonePerson/phoneperson-medical@2x.png +0 -0
  200. package/lib/components/PhonePerson/phoneperson-nursing@2x.png +0 -0
  201. package/lib/components/PhonePerson/phoneperson-nursingschool@2x.png +0 -0
  202. package/lib/components/PhonePerson/phoneperson-professional@2x.png +0 -0
  203. package/lib/components/PhonePerson/phoneperson-skilledtrades@2x.png +0 -0
  204. package/lib/components/Quiz/FlagToggle.md +37 -0
  205. package/lib/components/Quiz/FlagToggle.vue +124 -0
  206. package/lib/components/Quiz/GlobalMetricsToggle.md +46 -0
  207. package/lib/components/Quiz/GlobalMetricsToggle.vue +124 -0
  208. package/lib/components/Quiz/KeyboardShortcutsButton.md +18 -0
  209. package/lib/components/Quiz/KeyboardShortcutsButton.vue +102 -0
  210. package/lib/components/Quiz/KeyboardShortcutsModal.md +71 -0
  211. package/lib/components/Quiz/KeyboardShortcutsModal.vue +261 -0
  212. package/lib/components/Quiz/Question.md +579 -0
  213. package/lib/components/Quiz/Question.vue +3262 -0
  214. package/lib/components/Quiz/QuizContainer.md +91 -0
  215. package/lib/components/Quiz/QuizContainer.vue +207 -0
  216. package/lib/components/Quiz/QuizProgress.md +122 -0
  217. package/lib/components/Quiz/QuizProgress.vue +188 -0
  218. package/lib/components/Quiz/QuizProgressBar.md +131 -0
  219. package/lib/components/Quiz/QuizProgressBar.vue +96 -0
  220. package/lib/components/Search/Pill.md +37 -0
  221. package/lib/components/Search/Pill.vue +117 -0
  222. package/lib/components/Search/Search.md +44 -0
  223. package/lib/components/Search/Search.vue +341 -0
  224. package/lib/components/SidePanels/SidePanel.md +126 -0
  225. package/lib/components/SidePanels/SidePanel.vue +592 -0
  226. package/lib/components/Tables/StudyTable.md +136 -0
  227. package/lib/components/Tables/Table.vue +497 -0
  228. package/lib/components/Tables/TableActions.vue +199 -0
  229. package/lib/components/Tables/TablePagination.md +19 -0
  230. package/lib/components/Tables/TablePagination.vue +109 -0
  231. package/lib/components/Tables/TeachTable.md +696 -0
  232. package/lib/components/Toasts/Toast.md +35 -0
  233. package/lib/components/Toasts/Toast.vue +213 -0
  234. package/lib/components/Tooltips/OverflowTooltip.md +14 -0
  235. package/lib/components/Tooltips/OverflowTooltip.vue +68 -0
  236. package/lib/components/Tooltips/Tooltip.md +72 -0
  237. package/lib/components/Tooltips/Tooltip.vue +143 -0
  238. package/lib/directives.ts +213 -0
  239. package/lib/index.ts +108 -0
  240. package/{pocketprep-export.module.scss → lib/pocketprep-export.module.scss} +2 -2
  241. package/{pocketprep.scss → lib/pocketprep.scss} +16 -18
  242. package/{styles → lib/styles}/_colors.scss +1 -1
  243. package/lib/styles/fonts.css +149 -0
  244. package/lib/utils.ts +53 -0
  245. package/package.json +76 -56
  246. package/{stylelint.config.js → stylelint.config.cjs} +6 -3
  247. package/assets/Fonts.md +0 -114
  248. package/assets/Images.md +0 -2
  249. package/assets/Styleguidist.vue +0 -11
  250. package/dist/@pocketprep/ui-kit.common.js +0 -29726
  251. package/dist/@pocketprep/ui-kit.common.js.map +0 -1
  252. package/dist/@pocketprep/ui-kit.umd.js +0 -29745
  253. package/dist/@pocketprep/ui-kit.umd.js.map +0 -1
  254. package/dist/@pocketprep/ui-kit.umd.min.js +0 -33
  255. package/dist/@pocketprep/ui-kit.umd.min.js.map +0 -1
  256. package/dist/demo.html +0 -1
  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,573 @@
1
+ <template>
2
+ <div
3
+ ref="uikit-exam-search"
4
+ v-breakpoint="{ small: smallBreakpoint }"
5
+ class="uikit-exam-search"
6
+ :class="{ 'uikit-exam-search--bundle-selected': selectedBundle }"
7
+ >
8
+ <Search
9
+ v-model="examSearchString"
10
+ v-breakpoint:examSearchContainer="{ small: smallBreakpoint }"
11
+ class="uikit-exam-search__search"
12
+ placeholder="Search exams"
13
+ type="white"
14
+ :is-dark-mode="isDarkMode"
15
+ />
16
+ <div
17
+ v-if="examSearchString"
18
+ v-breakpoint:examSearchContainer="{ small: smallBreakpoint }"
19
+ class="uikit-exam-search__search-results"
20
+ >
21
+ <div class="uikit-exam-search__search-results-header">
22
+ <span
23
+ v-dark="isDarkMode"
24
+ class="uikit-exam-search__search-results-count"
25
+ aria-live="polite"
26
+ role="alert"
27
+ >
28
+ {{ filteredExams.length }} Search Result{{ filteredExams.length !== 1 ? 's' : '' }}
29
+ </span>
30
+ <Button
31
+ class="uikit-exam-search__search-reset-btn"
32
+ type="tertiary-small"
33
+ :is-dark-mode="isDarkMode"
34
+ @click="examSearchString = ''"
35
+ >
36
+ Browse Instead
37
+ </Button>
38
+ </div>
39
+ <ul class="uikit-exam-search__search-results-list">
40
+ <ExamCard
41
+ v-for="exam in filteredExams"
42
+ :key="exam.objectId"
43
+ v-breakpoint:examSearchContainer="{ small: smallBreakpoint }"
44
+ :is-premium="premiumExamIds.includes(exam.objectId)"
45
+ :exam="exam"
46
+ :bundle="exam.bundle"
47
+ class="uikit-exam-search__search-results-card"
48
+ :is-selected="selectedExam && selectedExam.objectId === exam.objectId"
49
+ :is-dark-mode="isDarkMode"
50
+ @select="selectExam(exam)"
51
+ />
52
+ <div class="uikit-exam-search__exam-list-padding" />
53
+ </ul>
54
+ </div>
55
+ <div
56
+ v-else
57
+ class="uikit-exam-search__bundle-search"
58
+ :class="{ 'uikit-exam-search__bundle-search--bundle-selected': selectedBundle }"
59
+ >
60
+ <div
61
+ v-breakpoint:examSearchContainer="{ small: smallBreakpoint }"
62
+ class="uikit-exam-search__bundle-list"
63
+ >
64
+ <div class="uikit-exam-search__browse-industry-text">
65
+ <span v-if="!selectedBundle">or </span>browse by industry
66
+ </div>
67
+ <BundleList
68
+ v-model="selectedBundle"
69
+ :bundles="bundles"
70
+ :is-dark-mode="isDarkMode"
71
+ :premium-bundle-ids="!selectedBundle ? premiumBundleIds : []"
72
+ />
73
+ </div>
74
+ <div
75
+ v-if="selectedBundle"
76
+ v-breakpoint:examSearchContainer="{ small: smallBreakpoint }"
77
+ class="uikit-exam-search__bundle-exam-container"
78
+ >
79
+ <div
80
+ v-breakpoint:examSearchContainer="{ small: smallBreakpoint }"
81
+ class="uikit-exam-search__bundle-exam-container-top"
82
+ >
83
+ <PocketButton
84
+ v-breakpoint:examSearchContainer="{ small: smallBreakpoint }"
85
+ class="uikit-exam-search__bundle-exam-back"
86
+ :is-dark-mode="isDarkMode"
87
+ type="tertiary"
88
+ @click="selectedBundle = null"
89
+ >
90
+ <Icon type="arrow" /> Back to Browse
91
+ </PocketButton>
92
+ <span
93
+ v-breakpoint:examSearchContainer="{ small: smallBreakpoint }"
94
+ class="uikit-exam-search__bundle-exam-count"
95
+ tabindex="-1"
96
+ >
97
+ {{ selectedBundleExams.length }}
98
+ {{ selectedBundle.name }}
99
+ Exam{{ selectedBundleExams.length > 1 ? 's' : '' }}
100
+ </span>
101
+ </div>
102
+ <div
103
+ :key="selectedBundle.objectId"
104
+ class="uikit-exam-search__bundle-exam-list-container"
105
+ >
106
+ <div
107
+ :key="selectedBundle.objectId"
108
+ class="uikit-exam-search__bundle-exam-list"
109
+ >
110
+ <ExamCard
111
+ v-for="exam in selectedBundleExams"
112
+ :key="exam.objectId"
113
+ v-breakpoint:examSearchContainer="{ small: smallBreakpoint }"
114
+ :exam="exam"
115
+ :is-dark-mode="isDarkMode"
116
+ :bundle="exam.bundle"
117
+ class="uikit-exam-search__search-results-card"
118
+ :is-premium="premiumExamIds.includes(exam.objectId)"
119
+ :is-selected="selectedExam && selectedExam.objectId === exam.objectId"
120
+ @select="selectExam(exam)"
121
+ />
122
+ <div
123
+ v-breakpoint:examSearchContainer="{ small: smallBreakpoint }"
124
+ class="uikit-exam-search__exam-list-padding"
125
+ />
126
+ </div>
127
+ </div>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ </template>
132
+
133
+ <script lang="ts">
134
+ import { Vue, Component, Prop, Watch, Emit } from 'vue-facing-decorator'
135
+ import BundleIcon from '../BundleIcons/BundleIcon.vue'
136
+ import ExamCard from '../Exams/ExamCard.vue'
137
+ import BundleList from '../Bundles/BundleList.vue'
138
+ import Search from '../Search/Search.vue'
139
+ import Button from '../Buttons/Button.vue'
140
+ import PocketButton from '../Buttons/Button.vue'
141
+ import Icon from '../Icons/Icon.vue'
142
+ import type { Study } from '@pocketprep/types'
143
+ import { breakpoint, dark } from '../../directives'
144
+
145
+ type TBundleExam = Study.Class.ExamMetadataJSON & { bundle: Study.Class.BundleJSON }
146
+
147
+ @Component({
148
+ components: {
149
+ Button,
150
+ BundleIcon,
151
+ BundleList,
152
+ ExamCard,
153
+ Search,
154
+ PocketButton,
155
+ Icon,
156
+ },
157
+ directives: {
158
+ breakpoint,
159
+ dark,
160
+ },
161
+ })
162
+ export default class BundleSearch extends Vue {
163
+ @Prop() bundles!: Study.Class.BundleJSON[]
164
+ @Prop() examMetadataById!: { [id: string]: Study.Class.ExamMetadataJSON | undefined }
165
+ @Prop({ default: () => ([]) }) premiumBundleIds!: string[]
166
+ @Prop({ default: () => ([]) }) premiumExamIds!: string[]
167
+ @Prop({ default: false }) isDarkMode!: boolean
168
+
169
+ selectedExam: TBundleExam | null = null
170
+ selectedBundle: Study.Class.BundleJSON | null = null
171
+ examSearchString = ''
172
+ examDisplayName = ''
173
+ examSearchContainer: null | HTMLElement = null
174
+ smallBreakpoint = 420
175
+
176
+ get filteredExams () {
177
+ return this.bundleExams.filter(exam =>
178
+ `${exam.nativeAppName} ${exam.descriptiveName} ${exam.bundle.name}`.toLowerCase()
179
+ .includes(this.examSearchString.toLowerCase())
180
+ )
181
+ }
182
+
183
+ get selectedBundleExams () {
184
+ const selectedBundle = this.selectedBundle
185
+ if (selectedBundle) {
186
+ return this.bundleExams.filter(exam => exam.bundle.objectId === selectedBundle.objectId)
187
+ } else {
188
+ return []
189
+ }
190
+ }
191
+
192
+ get bundleExams () {
193
+ return Object.values(this.bundles)
194
+ .filter((bundle): bundle is NonNullable<typeof bundle> => !!bundle)
195
+ .flatMap(bundle => bundle.exams.map(exam => {
196
+ const examMetadata = this.examMetadataById[exam.objectId]
197
+ if (examMetadata) {
198
+ return {
199
+ ...examMetadata,
200
+ bundle,
201
+ }
202
+ } else {
203
+ return undefined
204
+ }
205
+ }))
206
+ .filter((exam): exam is NonNullable<typeof exam> => !!exam)
207
+ .sort((a, b) => a.nativeAppName?.localeCompare(b.nativeAppName))
208
+ }
209
+
210
+ mounted () {
211
+ this.examSearchContainer = this.$refs['uikit-exam-search'] as HTMLElement
212
+ }
213
+
214
+ @Watch('examSearchString')
215
+ examSearchStringChanged (newVal: string) {
216
+ this.emitSearch(newVal)
217
+ }
218
+
219
+ @Watch('selectedBundle')
220
+ selectedBundleChanged (selectedBundle: Study.Class.BundleJSON) {
221
+ this.emitSelectBundle(selectedBundle)
222
+
223
+ // automatically select first exam
224
+ setTimeout(() => {
225
+ const firstCard = document.querySelector('.uikit-exam-search__bundle-exam-count');
226
+ (firstCard as HTMLElement | undefined)?.focus()
227
+ }, 1)
228
+ }
229
+
230
+ selectExam (exam: TBundleExam) {
231
+ this.selectedExam = exam
232
+ this.examDisplayName = exam.nativeAppName
233
+ this.emitSelect(exam)
234
+ }
235
+
236
+ @Emit('search')
237
+ emitSearch (searchString: string) {
238
+ return searchString
239
+ }
240
+
241
+ @Emit('selectBundle')
242
+ emitSelectBundle (selectedBundle: Study.Class.BundleJSON) {
243
+ return selectedBundle
244
+ }
245
+
246
+ @Emit('select')
247
+ emitSelect (exam: TBundleExam) {
248
+ return exam
249
+ }
250
+ }
251
+ </script>
252
+
253
+ <style lang="scss">
254
+ @import '../../styles/colors';
255
+
256
+ .uikit-exam-search {
257
+ position: relative;
258
+ display: flex;
259
+ flex-direction: column;
260
+ align-items: center;
261
+ height: 100%;
262
+
263
+ &--bundle-selected {
264
+ .uikit-exam-search__bundle-exam-container {
265
+ &--small,
266
+ &--brown-bear {
267
+ margin-left: 0;
268
+ }
269
+ }
270
+
271
+ .uikit-exam-search__bundle-list {
272
+ &--small,
273
+ &--brown-bear {
274
+ display: none;
275
+ }
276
+ }
277
+ }
278
+
279
+ &__step-text {
280
+ color: $slate-03;
281
+ font-size: 13px;
282
+ line-height: 17.76px;
283
+ margin-bottom: 10px;
284
+ }
285
+
286
+ &__text-big {
287
+ font-size: 26px;
288
+ line-height: 35.52px;
289
+ font-weight: 600;
290
+ margin-bottom: 5px;
291
+ }
292
+
293
+ &__text-small {
294
+ width: 303px;
295
+ font-size: 14px;
296
+ line-height: 19.12px;
297
+ text-align: center;
298
+ color: $slate-03;
299
+ margin-bottom: 22px;
300
+ }
301
+
302
+ &__select-exam-container {
303
+ display: flex;
304
+ flex-direction: column;
305
+ align-items: center;
306
+ }
307
+
308
+ &__search {
309
+ width: 250px;
310
+ margin-bottom: 30px;
311
+
312
+ &--small,
313
+ &--black-bear {
314
+ width: calc(100% - 16px);
315
+ }
316
+ }
317
+
318
+ &__search-results {
319
+ width: 305px;
320
+ height: calc(100% - 66px);
321
+ display: flex;
322
+ flex-direction: column;
323
+
324
+ &--small,
325
+ &--black-bear {
326
+ width: 100%;
327
+ }
328
+ }
329
+
330
+ &__search-results-header {
331
+ box-sizing: border-box;
332
+ display: flex;
333
+ justify-content: space-between;
334
+ align-items: center;
335
+ width: calc(100% - 16px);
336
+ margin-left: 8px;
337
+ }
338
+
339
+ &__search-results-count {
340
+ font-size: 13px;
341
+ line-height: 17.76px;
342
+ color: $slate-03;
343
+
344
+ &--dark {
345
+ color: $white;
346
+ }
347
+ }
348
+
349
+ &__search-reset-btn {
350
+ font-size: 13px !important;
351
+ line-height: 17.76px !important;
352
+ font-weight: 500;
353
+ }
354
+
355
+ &__search-results-list {
356
+ padding: 0;
357
+ margin: 0;
358
+ list-style-type: none;
359
+ display: flex;
360
+ flex-wrap: wrap;
361
+ align-content: flex-start;
362
+ overflow: auto;
363
+ -webkit-overflow-scrolling: touch;
364
+ }
365
+
366
+ &__search-results-card {
367
+ &--small,
368
+ &--black-bear {
369
+ width: 100%;
370
+ }
371
+ }
372
+
373
+ &__browse-industry-text {
374
+ font-weight: 600;
375
+ margin-bottom: 12px;
376
+ font-size: 13px;
377
+ line-height: 18px;
378
+ padding-left: 5px;
379
+ }
380
+
381
+ &__bundle-search {
382
+ display: flex;
383
+ flex: 1;
384
+ height: calc(100% - 66px);
385
+
386
+ &--bundle-selected {
387
+ width: 100%;
388
+ justify-content: space-between;
389
+ }
390
+ }
391
+
392
+ &__bundle-list {
393
+ box-sizing: border-box;
394
+ list-style-type: none;
395
+ padding-right: 20px;
396
+ overflow: auto;
397
+ -webkit-overflow-scrolling: touch;
398
+
399
+ &--small,
400
+ &--black-bear {
401
+ padding-right: 0;
402
+ }
403
+ }
404
+
405
+ &__bundle {
406
+ display: flex;
407
+ align-items: center;
408
+ font-size: 14px;
409
+ letter-spacing: 0.2px;
410
+ line-height: 19px;
411
+ white-space: nowrap;
412
+ outline: none;
413
+ cursor: pointer;
414
+ }
415
+
416
+ &__bundle-icon {
417
+ width: 25px;
418
+ height: 25px;
419
+ margin-right: 9px;
420
+ }
421
+
422
+ &__bundle-exam-container {
423
+ display: flex;
424
+ flex-direction: column;
425
+ width: 657px;
426
+
427
+ &--brown-bear {
428
+ width: 642px;
429
+ }
430
+
431
+ &--small,
432
+ &--black-bear {
433
+ width: 100%;
434
+ display: block;
435
+ }
436
+ }
437
+
438
+ &__bundle-exam-container-top {
439
+ display: flex;
440
+ justify-content: space-between;
441
+ }
442
+
443
+ &__bundle-exam-back {
444
+ margin-left: 8px;
445
+ display: none;
446
+
447
+ &--small,
448
+ &--brown-bear {
449
+ display: block;
450
+ }
451
+
452
+ svg {
453
+ transform: rotate(180deg);
454
+ }
455
+ }
456
+
457
+ &__bundle-exam-count {
458
+ font-size: 15px;
459
+ letter-spacing: 0.23px;
460
+ line-height: 20px;
461
+ margin-left: 13px;
462
+ margin-bottom: 10px;
463
+ font-weight: 600;
464
+ outline: none;
465
+
466
+ &--small,
467
+ &--brown-bear {
468
+ margin-right: 8px;
469
+ margin-bottom: 8px;
470
+ }
471
+
472
+ &--small,
473
+ &--black-bear {
474
+ font-size: 14px;
475
+ }
476
+ }
477
+
478
+ &__bundle-exam-list-container {
479
+ overflow: auto;
480
+ -webkit-overflow-scrolling: touch;
481
+ flex: 1;
482
+
483
+ &--brown-bear {
484
+ width: calc(100% + 15px);
485
+ }
486
+
487
+ &--black-bear {
488
+ width: 100%;
489
+ }
490
+ }
491
+
492
+ &__bundle-exam-list {
493
+ display: flex;
494
+ align-content: flex-start;
495
+ flex-wrap: wrap;
496
+
497
+ &--small,
498
+ &--brown-bear {
499
+ height: auto;
500
+ overflow: visible;
501
+ }
502
+ }
503
+
504
+ &__exam-list-padding {
505
+ width: 100%;
506
+ height: 40px;
507
+
508
+ &--small,
509
+ &--black-bear {
510
+ display: none;
511
+ }
512
+ }
513
+
514
+ &__exam-confirmation {
515
+ display: flex;
516
+ flex-direction: column;
517
+ align-items: center;
518
+ width: 410px;
519
+ }
520
+
521
+ &__selected-exam-container {
522
+ position: relative;
523
+ }
524
+
525
+ &__selected-exam {
526
+ margin-bottom: 43px;
527
+ cursor: auto;
528
+
529
+ &:hover,
530
+ &:focus {
531
+ &::before {
532
+ display: none;
533
+ }
534
+ }
535
+ }
536
+
537
+ &__unselect-exam-icon {
538
+ position: absolute;
539
+ top: 14px;
540
+ right: 21px;
541
+ color: $slate-01;
542
+ cursor: pointer;
543
+
544
+ &:hover {
545
+ color: $brand-black;
546
+ }
547
+ }
548
+
549
+ &__display-name-prompt {
550
+ font-weight: 600;
551
+ font-size: 15px;
552
+ line-height: 20.49px;
553
+ margin-bottom: 10px;
554
+ padding-left: 11px;
555
+ }
556
+
557
+ &__display-name-hint {
558
+ color: $slate-03;
559
+ font-size: 14px;
560
+ line-height: 19px;
561
+ margin-bottom: 27px;
562
+ padding-left: 11px;
563
+ }
564
+
565
+ &__display-name-input {
566
+ margin-bottom: 41px;
567
+ }
568
+
569
+ &__submit {
570
+ margin-bottom: 57px;
571
+ }
572
+ }
573
+ </style>
@@ -0,0 +1,23 @@
1
+ ```vue
2
+ <template>
3
+ <div>
4
+ <div class="light">
5
+ <PremiumPill />
6
+ </div>
7
+ <div class="dark">
8
+ <PremiumPill :isDarkMode="true" />
9
+ </div>
10
+ </div>
11
+ </template>
12
+
13
+ <style>
14
+ .light,
15
+ .dark {
16
+ padding: 30px;
17
+ }
18
+
19
+ .dark {
20
+ background-color: #1f3545;
21
+ }
22
+ </style>
23
+ ```
@@ -0,0 +1,43 @@
1
+ <template>
2
+ <div v-dark="isDarkMode" class="uikit-premium-pill">
3
+ Premium
4
+ </div>
5
+ </template>
6
+
7
+ <script lang="ts">
8
+ import { Vue, Component, Prop } from 'vue-facing-decorator'
9
+ import { dark } from '../../directives'
10
+
11
+ @Component({
12
+ directives: {
13
+ dark,
14
+ },
15
+ })
16
+ export default class PremiumPill extends Vue {
17
+ @Prop({ default: false }) isDarkMode!: boolean
18
+ }
19
+ </script>
20
+
21
+ <style lang="scss">
22
+ @import '../../styles/breakpoints';
23
+ @import '../../styles/colors';
24
+
25
+ .uikit-premium-pill {
26
+ font-size: 14px;
27
+ display: inline-block;
28
+ line-height: 19px;
29
+ background: $buttermilk;
30
+ padding: 0 6px;
31
+ border-radius: 3px;
32
+ text-align: center;
33
+ margin-left: 6px;
34
+ color: $brand-black;
35
+ font-weight: 500;
36
+
37
+ &--dark {
38
+ color: $banana-bread;
39
+ background-color: rgba($buttermilk, 0.2);
40
+ border: 1px solid $banana-bread;
41
+ }
42
+ }
43
+ </style>