@learncard/react 2.12.11 → 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 (285) hide show
  1. package/README.md +23 -5
  2. package/dist/base.css +2 -1
  3. package/dist/base.js +1 -1
  4. package/dist/cjs/{AchievementCard-f6bdb95c.js → AchievementCard-6ef39c2b.js} +3 -3
  5. package/dist/cjs/{AchievementCard-f6bdb95c.js.map → AchievementCard-6ef39c2b.js.map} +1 -1
  6. package/dist/cjs/{BoostGenericCard-e3fd4feb.js → BoostGenericCard-87cd2091.js} +8 -8
  7. package/dist/cjs/BoostGenericCard-87cd2091.js.map +1 -0
  8. package/dist/cjs/{BoostSmallCard-507de790.js → BoostSmallCard-214f91a5.js} +3 -3
  9. package/dist/cjs/BoostSmallCard-214f91a5.js.map +1 -0
  10. package/dist/cjs/{Button-9ebe120c.js → Button-d3a8a860.js} +2 -2
  11. package/dist/cjs/Button-d3a8a860.js.map +1 -0
  12. package/dist/cjs/{CertificateDisplayCard-9a7ced55.js → CertificateDisplayCard-d4300c7d.js} +32 -21
  13. package/dist/cjs/CertificateDisplayCard-d4300c7d.js.map +1 -0
  14. package/dist/cjs/{CircleCheckButton-05f58196.js → CircleCheckButton-1d10936b.js} +2 -2
  15. package/dist/cjs/{CircleCheckButton-05f58196.js.map → CircleCheckButton-1d10936b.js.map} +1 -1
  16. package/dist/cjs/{CourseVerticalCard-0d046145.js → CourseVerticalCard-3c538a36.js} +3 -3
  17. package/dist/cjs/{CourseVerticalCard-0d046145.js.map → CourseVerticalCard-3c538a36.js.map} +1 -1
  18. package/dist/cjs/{GenericCard-e2faac81.js → GenericCard-f962750a.js} +2 -2
  19. package/dist/cjs/{GenericCard-e2faac81.js.map → GenericCard-f962750a.js.map} +1 -1
  20. package/dist/cjs/{JobHistoryCard-e9ac7a1a.js → JobHistoryCard-54f40e2b.js} +3 -3
  21. package/dist/cjs/JobHistoryCard-54f40e2b.js.map +1 -0
  22. package/dist/cjs/{JobListCard-a90be136.js → JobListCard-a48c6cac.js} +3 -3
  23. package/dist/cjs/{JobListCard-a90be136.js.map → JobListCard-a48c6cac.js.map} +1 -1
  24. package/dist/cjs/{LearnCardCreditCardBackFace-62330eea.js → LearnCardCreditCardBackFace-92a1818e.js} +2 -2
  25. package/dist/{esm/LearnCardCreditCardBackFace-56642837.js.map → cjs/LearnCardCreditCardBackFace-92a1818e.js.map} +1 -1
  26. package/dist/cjs/{LearnCardCreditCardFrontFace-75fb4e44.js → LearnCardCreditCardFrontFace-a4c209e3.js} +2 -2
  27. package/dist/cjs/LearnCardCreditCardFrontFace-a4c209e3.js.map +1 -0
  28. package/dist/cjs/{MeritBadgeDisplayCard-a45003f4.js → MeritBadgeDisplayCard-30ef639d.js} +25 -19
  29. package/dist/cjs/MeritBadgeDisplayCard-30ef639d.js.map +1 -0
  30. package/dist/cjs/{MeritBadgeSkillsCount-1baf2200.js → MeritBadgeSkillsCount-a6127a40.js} +3 -3
  31. package/dist/cjs/{MeritBadgeSkillsCount-1baf2200.js.map → MeritBadgeSkillsCount-a6127a40.js.map} +1 -1
  32. package/dist/cjs/{MiniVCThumbnail-9c510f51.js → MiniVCThumbnail-39058b8e.js} +2 -2
  33. package/dist/cjs/MiniVCThumbnail-39058b8e.js.map +1 -0
  34. package/dist/cjs/{Notification-24d4de25.js → Notification-09bf74b7.js} +2 -2
  35. package/dist/cjs/{Notification-24d4de25.js.map → Notification-09bf74b7.js.map} +1 -1
  36. package/dist/cjs/{NotificationBoostCard-04dd2405.js → NotificationBoostCard-e6a2824f.js} +4 -4
  37. package/dist/cjs/NotificationBoostCard-e6a2824f.js.map +1 -0
  38. package/dist/cjs/{NotificationUserAcceptedBoostCard-1c6d1e33.js → NotificationUserAcceptedBoostCard-e88fc1af.js} +2 -2
  39. package/dist/cjs/{NotificationUserAcceptedBoostCard-1c6d1e33.js.map → NotificationUserAcceptedBoostCard-e88fc1af.js.map} +1 -1
  40. package/dist/cjs/{NotificationUserCard-4364506c.js → NotificationUserCard-89a0b8ba.js} +2 -2
  41. package/dist/cjs/{NotificationUserCard-4364506c.js.map → NotificationUserCard-89a0b8ba.js.map} +1 -1
  42. package/dist/cjs/{PuzzlePiece-e64f4596.js → PuzzlePiece-48ee8924.js} +3 -3
  43. package/dist/cjs/PuzzlePiece-48ee8924.js.map +1 -0
  44. package/dist/cjs/{RoundedPill-542ecd7a.js → RoundedPill-5862fa48.js} +3 -3
  45. package/dist/cjs/RoundedPill-5862fa48.js.map +1 -0
  46. package/dist/cjs/{SchoolIDCard-10796199.js → SchoolIDCard-0462e21c.js} +2 -2
  47. package/dist/cjs/{SchoolIDCard-10796199.js.map → SchoolIDCard-0462e21c.js.map} +1 -1
  48. package/dist/cjs/{SkillTabCard-353cc2d1.js → SkillTabCard-f913aaf7.js} +3 -3
  49. package/dist/cjs/{SkillTabCard-353cc2d1.js.map → SkillTabCard-f913aaf7.js.map} +1 -1
  50. package/dist/cjs/{VCCard-6462d6c7.js → VCCard-6298f49f.js} +3 -3
  51. package/dist/cjs/{VCCard-6462d6c7.js.map → VCCard-6298f49f.js.map} +1 -1
  52. package/dist/cjs/{VCDisplayBackFace-47066c07.js → VCDisplayBackFace-65e36d2b.js} +7 -7
  53. package/dist/cjs/VCDisplayBackFace-65e36d2b.js.map +1 -0
  54. package/dist/cjs/{VCDisplayCard-ac1d4efb.js → VCDisplayCard-51e917ab.js} +4 -4
  55. package/dist/cjs/VCDisplayCard-51e917ab.js.map +1 -0
  56. package/dist/cjs/{VCDisplayCard2-d7d3288b.js → VCDisplayCard2-156a6584.js} +28 -22
  57. package/dist/cjs/VCDisplayCard2-156a6584.js.map +1 -0
  58. package/dist/cjs/{VCVerificationPill-7d4dd936.js → VCVerificationPill-d4ee15ca.js} +3 -3
  59. package/dist/cjs/VCVerificationPill-d4ee15ca.js.map +1 -0
  60. package/dist/cjs/{VerifierStateBadgeAndText-3d7977c9.js → VerifierStateBadgeAndText-04c90074.js} +3 -3
  61. package/dist/cjs/{VerifierStateBadgeAndText-3d7977c9.js.map → VerifierStateBadgeAndText-04c90074.js.map} +1 -1
  62. package/dist/cjs/{credential.helpers-e6e353a6.js → credential.helpers-14544e48.js} +241 -7
  63. package/dist/cjs/credential.helpers-14544e48.js.map +1 -0
  64. package/dist/cjs/{i18n-ddbb18e7.js → i18n-0648eec1.js} +3 -1
  65. package/dist/cjs/i18n-0648eec1.js.map +1 -0
  66. package/dist/cjs/{index-da255c9a.js → index-a03dec43.js} +3 -1
  67. package/dist/{esm/index-cb3a593b.js.map → cjs/index-a03dec43.js.map} +1 -1
  68. package/dist/cjs/index.js +36 -36
  69. package/dist/cjs/index.js.map +1 -1
  70. package/dist/cjs/index11.js +3 -3
  71. package/dist/cjs/index13.js +3 -3
  72. package/dist/cjs/index14.js +34 -34
  73. package/dist/cjs/index15.js +1 -1
  74. package/dist/cjs/index16.js +1 -1
  75. package/dist/cjs/index17.js +1 -1
  76. package/dist/cjs/index18.js +1 -1
  77. package/dist/cjs/index2.js +3 -3
  78. package/dist/cjs/index22.js +8 -8
  79. package/dist/cjs/index23.js +1 -1
  80. package/dist/cjs/index24.js +3 -3
  81. package/dist/cjs/index25.js +3 -3
  82. package/dist/cjs/index26.js +1 -1
  83. package/dist/cjs/index27.js +1 -1
  84. package/dist/cjs/index29.js +1 -1
  85. package/dist/cjs/index31.js +1 -1
  86. package/dist/cjs/index34.js +3 -3
  87. package/dist/cjs/index39.js +13 -13
  88. package/dist/cjs/index4.js +8 -8
  89. package/dist/cjs/index40.js +6 -6
  90. package/dist/cjs/index41.js +7 -7
  91. package/dist/cjs/index42.js +9 -9
  92. package/dist/cjs/index43.js +2 -2
  93. package/dist/cjs/index46.js +2 -2
  94. package/dist/cjs/index5.js +3 -3
  95. package/dist/cjs/index6.js +1 -1
  96. package/dist/cjs/index7.js +7 -7
  97. package/dist/cjs/index8.js +2 -2
  98. package/dist/cjs/{types-91d0677b.js → types-8a7d08fe.js} +2 -2
  99. package/dist/cjs/{types-91d0677b.js.map → types-8a7d08fe.js.map} +1 -1
  100. package/dist/cjs/{types.esm-57b8934f.js → types.esm-55f8d7fb.js} +3642 -1570
  101. package/dist/cjs/types.esm-55f8d7fb.js.map +1 -0
  102. package/dist/esm/{AchievementCard-d0cf882f.js → AchievementCard-c8df0ca4.js} +3 -3
  103. package/dist/esm/{AchievementCard-d0cf882f.js.map → AchievementCard-c8df0ca4.js.map} +1 -1
  104. package/dist/esm/{BoostGenericCard-3481b47c.js → BoostGenericCard-dd2b515a.js} +8 -8
  105. package/dist/esm/BoostGenericCard-dd2b515a.js.map +1 -0
  106. package/dist/esm/{BoostSmallCard-3f5d83b9.js → BoostSmallCard-538e22e7.js} +3 -3
  107. package/dist/esm/BoostSmallCard-538e22e7.js.map +1 -0
  108. package/dist/esm/{Button-70eedbf6.js → Button-866044a8.js} +2 -2
  109. package/dist/esm/Button-866044a8.js.map +1 -0
  110. package/dist/esm/{CertificateDisplayCard-fbd123d1.js → CertificateDisplayCard-46c13c49.js} +32 -21
  111. package/dist/esm/CertificateDisplayCard-46c13c49.js.map +1 -0
  112. package/dist/esm/{CircleCheckButton-50702ec6.js → CircleCheckButton-cb929fad.js} +2 -2
  113. package/dist/esm/{CircleCheckButton-50702ec6.js.map → CircleCheckButton-cb929fad.js.map} +1 -1
  114. package/dist/esm/{CourseVerticalCard-2544cfbb.js → CourseVerticalCard-34d0cc89.js} +3 -3
  115. package/dist/esm/{CourseVerticalCard-2544cfbb.js.map → CourseVerticalCard-34d0cc89.js.map} +1 -1
  116. package/dist/esm/{GenericCard-31644ac4.js → GenericCard-dfa014c7.js} +2 -2
  117. package/dist/esm/{GenericCard-31644ac4.js.map → GenericCard-dfa014c7.js.map} +1 -1
  118. package/dist/esm/{JobHistoryCard-e71ab2c7.js → JobHistoryCard-74f98642.js} +3 -3
  119. package/dist/esm/JobHistoryCard-74f98642.js.map +1 -0
  120. package/dist/esm/{JobListCard-4fc7fbe4.js → JobListCard-498d59b7.js} +3 -3
  121. package/dist/esm/{JobListCard-4fc7fbe4.js.map → JobListCard-498d59b7.js.map} +1 -1
  122. package/dist/esm/{LearnCardCreditCardBackFace-56642837.js → LearnCardCreditCardBackFace-8e2f494a.js} +2 -2
  123. package/dist/{cjs/LearnCardCreditCardBackFace-62330eea.js.map → esm/LearnCardCreditCardBackFace-8e2f494a.js.map} +1 -1
  124. package/dist/esm/{LearnCardCreditCardFrontFace-13d29504.js → LearnCardCreditCardFrontFace-73c3d537.js} +2 -2
  125. package/dist/esm/LearnCardCreditCardFrontFace-73c3d537.js.map +1 -0
  126. package/dist/esm/{MeritBadgeDisplayCard-2621d029.js → MeritBadgeDisplayCard-9f95dd08.js} +25 -19
  127. package/dist/esm/MeritBadgeDisplayCard-9f95dd08.js.map +1 -0
  128. package/dist/esm/{MeritBadgeSkillsCount-b3e3985a.js → MeritBadgeSkillsCount-c20f9f60.js} +3 -3
  129. package/dist/esm/{MeritBadgeSkillsCount-b3e3985a.js.map → MeritBadgeSkillsCount-c20f9f60.js.map} +1 -1
  130. package/dist/esm/{MiniVCThumbnail-cc05e1f8.js → MiniVCThumbnail-3800ee40.js} +2 -2
  131. package/dist/esm/MiniVCThumbnail-3800ee40.js.map +1 -0
  132. package/dist/esm/{Notification-279ba207.js → Notification-39590182.js} +2 -2
  133. package/dist/esm/{Notification-279ba207.js.map → Notification-39590182.js.map} +1 -1
  134. package/dist/esm/{NotificationBoostCard-73efea2d.js → NotificationBoostCard-ff5ec0d7.js} +4 -4
  135. package/dist/esm/NotificationBoostCard-ff5ec0d7.js.map +1 -0
  136. package/dist/esm/{NotificationUserAcceptedBoostCard-89fe2317.js → NotificationUserAcceptedBoostCard-f515321d.js} +2 -2
  137. package/dist/esm/{NotificationUserAcceptedBoostCard-89fe2317.js.map → NotificationUserAcceptedBoostCard-f515321d.js.map} +1 -1
  138. package/dist/esm/{NotificationUserCard-2c29c86a.js → NotificationUserCard-d4fd260e.js} +2 -2
  139. package/dist/esm/{NotificationUserCard-2c29c86a.js.map → NotificationUserCard-d4fd260e.js.map} +1 -1
  140. package/dist/esm/{PuzzlePiece-a3d9cc62.js → PuzzlePiece-9c313d93.js} +3 -3
  141. package/dist/esm/PuzzlePiece-9c313d93.js.map +1 -0
  142. package/dist/esm/{RoundedPill-8e97b9e3.js → RoundedPill-ef06f4b8.js} +3 -3
  143. package/dist/esm/RoundedPill-ef06f4b8.js.map +1 -0
  144. package/dist/esm/{SchoolIDCard-f82e40bc.js → SchoolIDCard-de65b2bd.js} +2 -2
  145. package/dist/esm/{SchoolIDCard-f82e40bc.js.map → SchoolIDCard-de65b2bd.js.map} +1 -1
  146. package/dist/esm/{SkillTabCard-a3f601e8.js → SkillTabCard-4c7bb40f.js} +3 -3
  147. package/dist/esm/{SkillTabCard-a3f601e8.js.map → SkillTabCard-4c7bb40f.js.map} +1 -1
  148. package/dist/esm/{VCCard-cd14261b.js → VCCard-1e6261ea.js} +3 -3
  149. package/dist/esm/{VCCard-cd14261b.js.map → VCCard-1e6261ea.js.map} +1 -1
  150. package/dist/esm/{VCDisplayBackFace-d8bdf84b.js → VCDisplayBackFace-eb2cad59.js} +7 -7
  151. package/dist/esm/VCDisplayBackFace-eb2cad59.js.map +1 -0
  152. package/dist/esm/{VCDisplayCard-213afce8.js → VCDisplayCard-1400714d.js} +4 -4
  153. package/dist/esm/VCDisplayCard-1400714d.js.map +1 -0
  154. package/dist/esm/{VCDisplayCard2-f6beca34.js → VCDisplayCard2-e4164d30.js} +28 -22
  155. package/dist/esm/VCDisplayCard2-e4164d30.js.map +1 -0
  156. package/dist/esm/{VCVerificationPill-f4a587a5.js → VCVerificationPill-65f7901a.js} +3 -3
  157. package/dist/esm/VCVerificationPill-65f7901a.js.map +1 -0
  158. package/dist/esm/{VerifierStateBadgeAndText-f2bbd9fd.js → VerifierStateBadgeAndText-1588afeb.js} +3 -3
  159. package/dist/esm/{VerifierStateBadgeAndText-f2bbd9fd.js.map → VerifierStateBadgeAndText-1588afeb.js.map} +1 -1
  160. package/dist/esm/{credential.helpers-30adeb2d.js → credential.helpers-4c72d304.js} +241 -7
  161. package/dist/esm/credential.helpers-4c72d304.js.map +1 -0
  162. package/dist/esm/{i18n-35209bfa.js → i18n-b142d48e.js} +3 -1
  163. package/dist/esm/i18n-b142d48e.js.map +1 -0
  164. package/dist/esm/{index-cb3a593b.js → index-75c5b01c.js} +2 -2
  165. package/dist/{cjs/index-da255c9a.js.map → esm/index-75c5b01c.js.map} +1 -1
  166. package/dist/esm/index.js +36 -36
  167. package/dist/esm/index.js.map +1 -1
  168. package/dist/esm/index11.js +3 -3
  169. package/dist/esm/index13.js +3 -3
  170. package/dist/esm/index14.js +34 -34
  171. package/dist/esm/index15.js +1 -1
  172. package/dist/esm/index16.js +1 -1
  173. package/dist/esm/index17.js +1 -1
  174. package/dist/esm/index18.js +1 -1
  175. package/dist/esm/index2.js +3 -3
  176. package/dist/esm/index22.js +8 -8
  177. package/dist/esm/index23.js +1 -1
  178. package/dist/esm/index24.js +3 -3
  179. package/dist/esm/index25.js +3 -3
  180. package/dist/esm/index26.js +1 -1
  181. package/dist/esm/index27.js +1 -1
  182. package/dist/esm/index29.js +1 -1
  183. package/dist/esm/index31.js +1 -1
  184. package/dist/esm/index34.js +3 -3
  185. package/dist/esm/index39.js +13 -13
  186. package/dist/esm/index4.js +8 -8
  187. package/dist/esm/index40.js +6 -6
  188. package/dist/esm/index41.js +7 -7
  189. package/dist/esm/index42.js +9 -9
  190. package/dist/esm/index43.js +2 -2
  191. package/dist/esm/index46.js +2 -2
  192. package/dist/esm/index5.js +3 -3
  193. package/dist/esm/index6.js +1 -1
  194. package/dist/esm/index7.js +7 -7
  195. package/dist/esm/index8.js +2 -2
  196. package/dist/esm/{types-c765e2a4.js → types-23b696f1.js} +2 -2
  197. package/dist/esm/{types-c765e2a4.js.map → types-23b696f1.js.map} +1 -1
  198. package/dist/esm/{types.esm-9d538f63.js → types.esm-a70402df.js} +3642 -1570
  199. package/dist/esm/types.esm-a70402df.js.map +1 -0
  200. package/dist/main.css +2 -1
  201. package/dist/main.js +1 -1
  202. package/package.json +13 -13
  203. package/src/assets/styles/base.css +18 -2
  204. package/src/assets/styles/main.css +1 -3
  205. package/src/assets/styles/theme.css +94 -0
  206. package/src/assets/styles/theme.test.ts +67 -0
  207. package/src/components/BoostGenericCard/BoostGenericCard.tsx +3 -3
  208. package/src/components/BoostSmallCard/BoostSmallCard.tsx +1 -1
  209. package/src/components/Button/Button.tsx +1 -1
  210. package/src/components/CertificateDisplayCard/CertificateAwardDate.test.tsx +67 -0
  211. package/src/components/CertificateDisplayCard/CertificateBackFace.tsx +14 -9
  212. package/src/components/CertificateDisplayCard/CertificateCornerIcon.tsx +1 -1
  213. package/src/components/CertificateDisplayCard/CertificateFrontFace.tsx +19 -8
  214. package/src/components/CertificateDisplayCard/CertificateProfileImageDisplay.tsx +1 -1
  215. package/src/components/CertificateDisplayCard/MediaAttachmentsBox.tsx +1 -1
  216. package/src/components/CertificateDisplayCard/VerificationRow.tsx +1 -1
  217. package/src/components/JobHistoryCard/JobHistoryCard.tsx +2 -2
  218. package/src/components/JobListCard/JobListCard.tsx +2 -5
  219. package/src/components/LearnCardCreditCardBackFace/LearnCardCreditCardBackFace.tsx +1 -1
  220. package/src/components/LearnCardCreditCardFrontFace/LearnCardCreditCardFrontFace.tsx +1 -1
  221. package/src/components/MeritBadgeDisplayCard/MediaAttachmentsBox.tsx +1 -1
  222. package/src/components/MeritBadgeDisplayCard/MeritBadgeBackFace.tsx +14 -9
  223. package/src/components/MeritBadgeDisplayCard/MeritBadgeCornerIcon.tsx +4 -4
  224. package/src/components/MeritBadgeDisplayCard/MeritBadgeFrontFace.tsx +15 -10
  225. package/src/components/MeritBadgeDisplayCard/MeritBadgeProfileImageDisplay.tsx +1 -1
  226. package/src/components/MeritBadgeDisplayCard/VerificationRow.tsx +1 -1
  227. package/src/components/MiniVCThumbnail/MiniVCThumbnail.tsx +1 -1
  228. package/src/components/NotificationBoostCard/NotificationBoostCard.tsx +2 -2
  229. package/src/components/NotificationUserAcceptedBoostCard/NotificationUserAcceptedBoostCard.tsx +1 -1
  230. package/src/components/NotificationUserCard/NotificationUserCard.tsx +1 -1
  231. package/src/components/RoundedPill/RoundedPill.tsx +2 -2
  232. package/src/components/SchoolIdCard/SchoolIDCard.tsx +1 -1
  233. package/src/components/VCDisplayBackFace/VCDisplayBackFace.tsx +4 -4
  234. package/src/components/VCDisplayCard/VCDisplayCard.stories.tsx +2 -2
  235. package/src/components/VCDisplayCard2/IssueHistoryBox.tsx +1 -1
  236. package/src/components/VCDisplayCard2/MediaAttachmentsBox.tsx +10 -5
  237. package/src/components/VCDisplayCard2/VC2FrontFaceInfo.tsx +6 -6
  238. package/src/components/VCDisplayCard2/VCDisplayCard2.tsx +1 -1
  239. package/src/components/VCDisplayCard2/VCDisplayCard2AvatarFallbacks.stories.tsx +4 -4
  240. package/src/components/VCDisplayCard2/VCIDDisplayFrontFace.tsx +7 -7
  241. package/src/components/VCDisplayCard2/VerificationRow.tsx +1 -1
  242. package/src/components/VCDisplayCard2/__tests__/VC2FrontFaceInfo.test.tsx +1 -1
  243. package/src/components/VCDisplayFrontFace/VCDisplayFrontFace.tsx +1 -1
  244. package/src/components/VCVerificationPill/VCVerificationPill.tsx +1 -1
  245. package/src/components/svgs/PuzzlePiece.tsx +3 -3
  246. package/src/helpers/credential.helpers.test.ts +96 -0
  247. package/src/helpers/credential.helpers.tsx +23 -4
  248. package/src/helpers/useScrollBorders.ts +2 -2
  249. package/src/i18n/index.tsx +2 -0
  250. package/dist/cjs/BoostGenericCard-e3fd4feb.js.map +0 -1
  251. package/dist/cjs/BoostSmallCard-507de790.js.map +0 -1
  252. package/dist/cjs/Button-9ebe120c.js.map +0 -1
  253. package/dist/cjs/CertificateDisplayCard-9a7ced55.js.map +0 -1
  254. package/dist/cjs/JobHistoryCard-e9ac7a1a.js.map +0 -1
  255. package/dist/cjs/LearnCardCreditCardFrontFace-75fb4e44.js.map +0 -1
  256. package/dist/cjs/MeritBadgeDisplayCard-a45003f4.js.map +0 -1
  257. package/dist/cjs/MiniVCThumbnail-9c510f51.js.map +0 -1
  258. package/dist/cjs/NotificationBoostCard-04dd2405.js.map +0 -1
  259. package/dist/cjs/PuzzlePiece-e64f4596.js.map +0 -1
  260. package/dist/cjs/RoundedPill-542ecd7a.js.map +0 -1
  261. package/dist/cjs/VCDisplayBackFace-47066c07.js.map +0 -1
  262. package/dist/cjs/VCDisplayCard-ac1d4efb.js.map +0 -1
  263. package/dist/cjs/VCDisplayCard2-d7d3288b.js.map +0 -1
  264. package/dist/cjs/VCVerificationPill-7d4dd936.js.map +0 -1
  265. package/dist/cjs/credential.helpers-e6e353a6.js.map +0 -1
  266. package/dist/cjs/i18n-ddbb18e7.js.map +0 -1
  267. package/dist/cjs/types.esm-57b8934f.js.map +0 -1
  268. package/dist/esm/BoostGenericCard-3481b47c.js.map +0 -1
  269. package/dist/esm/BoostSmallCard-3f5d83b9.js.map +0 -1
  270. package/dist/esm/Button-70eedbf6.js.map +0 -1
  271. package/dist/esm/CertificateDisplayCard-fbd123d1.js.map +0 -1
  272. package/dist/esm/JobHistoryCard-e71ab2c7.js.map +0 -1
  273. package/dist/esm/LearnCardCreditCardFrontFace-13d29504.js.map +0 -1
  274. package/dist/esm/MeritBadgeDisplayCard-2621d029.js.map +0 -1
  275. package/dist/esm/MiniVCThumbnail-cc05e1f8.js.map +0 -1
  276. package/dist/esm/NotificationBoostCard-73efea2d.js.map +0 -1
  277. package/dist/esm/PuzzlePiece-a3d9cc62.js.map +0 -1
  278. package/dist/esm/RoundedPill-8e97b9e3.js.map +0 -1
  279. package/dist/esm/VCDisplayBackFace-d8bdf84b.js.map +0 -1
  280. package/dist/esm/VCDisplayCard-213afce8.js.map +0 -1
  281. package/dist/esm/VCDisplayCard2-f6beca34.js.map +0 -1
  282. package/dist/esm/VCVerificationPill-f4a587a5.js.map +0 -1
  283. package/dist/esm/credential.helpers-30adeb2d.js.map +0 -1
  284. package/dist/esm/i18n-35209bfa.js.map +0 -1
  285. package/dist/esm/types.esm-9d538f63.js.map +0 -1
@@ -0,0 +1,94 @@
1
+ /* Keep utilities unlayered to preserve the existing Ionic/Sass cascade. */
2
+ @import 'tailwindcss/theme.css' layer(theme);
3
+ @import 'tailwindcss/utilities.css' source(none);
4
+ @import '../../../../learn-card-base/src/assets/styles/tailwind-v3-theme.css';
5
+ @import '../../../../learn-card-base/src/assets/styles/tailwind-v3-colors.css'
6
+ theme(inline reference);
7
+ @source "../../**/*.{js,jsx,ts,tsx}";
8
+ @source inline("bg-orange-200");
9
+ @source inline("bg-orange-300");
10
+ @source inline("bg-orange-700");
11
+ @source inline("border-orange-700");
12
+ @source inline("text-orange-700");
13
+ @source inline("text-orange-900");
14
+
15
+ @theme inline reference {
16
+ --color-grayscale-50: #fbfbfc;
17
+ --color-grayscale-100: #eff0f5;
18
+ --color-grayscale-200: #e2e3e9;
19
+ --color-grayscale-300: #c5c8d3;
20
+ --color-grayscale-400: #a8acbd;
21
+ --color-grayscale-500: #8b91a7;
22
+ --color-grayscale-600: #6f7590;
23
+ --color-grayscale-700: #52597a;
24
+ --color-grayscale-800: #353e64;
25
+ --color-grayscale-900: #18224e;
26
+ --color-emerald-50: #d6faf0;
27
+ --color-emerald-100: #bfeee1;
28
+ --color-emerald-200: #9fe5d2;
29
+ --color-emerald-300: #80e0c6;
30
+ --color-emerald-400: #34eab9;
31
+ --color-emerald-500: #40cba6;
32
+ --color-emerald-600: #20c397;
33
+ --color-emerald-700: #00ba88;
34
+ --color-emerald-800: #008b66;
35
+ --color-emerald-900: #004633;
36
+ --color-cyan-50: #e7f9fd;
37
+ --color-cyan-100: #d0f3fc;
38
+ --color-cyan-200: #a0e7f8;
39
+ --color-cyan-300: #a0e7f8;
40
+ --color-cyan-400: #88e0f7;
41
+ --color-cyan-500: #71daf5;
42
+ --color-cyan-600: #59d4f4;
43
+ --color-cyan-700: #41cef2;
44
+ --color-cyan-800: #319bb5;
45
+ --color-cyan-900: #184d5b;
46
+ --color-spice-50: #ffede7;
47
+ --color-spice-100: #ffdbcf;
48
+ --color-spice-200: #ffb7a0;
49
+ --color-spice-300: #ff9470;
50
+ --color-spice-400: #ff7040;
51
+ --color-spice-500: #ff5820;
52
+ --color-spice-600: #ff4000;
53
+ --color-spice-700: #df3800;
54
+ --color-spice-800: #bf3000;
55
+ --color-spice-900: #802000;
56
+ --color-indigo-50: #eef2ff;
57
+ --color-indigo-100: #e0e7ff;
58
+ --color-indigo-200: #c7d2fe;
59
+ --color-indigo-300: #a5b4fc;
60
+ --color-indigo-400: #818cf8;
61
+ --color-indigo-500: #6366f1;
62
+ --color-indigo-600: #4f46e5;
63
+ --color-indigo-700: #4338ca;
64
+ --color-indigo-800: #3730a3;
65
+ --color-indigo-900: #312e81;
66
+ --color-blue-light: #026bff;
67
+ --color-green-dark: #05b65d;
68
+ --color-orange-500: #ef5d35;
69
+ --color-orange-800: #9a3412;
70
+ --color-red-mastercard: #eb001b;
71
+ }
72
+
73
+ @theme static {
74
+ --shadow-bottom: 0px 4px 0px rgba(0, 0, 0, 0.25);
75
+ --shadow-3xl: 0px 0px 8px rgba(0, 0, 0, 0.25);
76
+ --shadow-card-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.25);
77
+ --spacing-25pct: 25%;
78
+ }
79
+
80
+ /* Emit literal card font families, as V3 did. Host app tokens use the same
81
+ names and must not retroactively change utilities compiled by this package. */
82
+ @theme inline {
83
+ --font-mouse: 'Mouse Memoirs';
84
+ --font-montserrat: Montserrat, Helvetica, Serif;
85
+ --font-poppins: Poppins;
86
+ --font-jacques: 'Jacques Francois';
87
+ --font-sacramento: Sacramento;
88
+ }
89
+
90
+ @custom-variant xxsm (@media (max-width: 240px));
91
+ @custom-variant xxxsm (@media (max-width: 200px));
92
+ @utility text-shadow {
93
+ text-shadow: 1px 2px 0px rgb(0 0 0 / 35%);
94
+ }
@@ -0,0 +1,67 @@
1
+ // @vitest-environment node
2
+ import { describe, expect, it } from 'vitest';
3
+ import { compile } from '@tailwindcss/node';
4
+ import { resolve } from 'node:path';
5
+ import { rollup } from 'rollup';
6
+ import configs from '../../../rollup.config.js';
7
+
8
+ describe('published stylesheet theme contract', () => {
9
+ it('keeps palette tokens out of the actual Rollup CSS assets', async () => {
10
+ const config = configs[1];
11
+ const bundle = await rollup(config);
12
+ try {
13
+ const { output } = await bundle.generate(config.output[0]);
14
+ const styles = output.filter(
15
+ asset => asset.type === 'asset' && asset.fileName.endsWith('.css')
16
+ );
17
+ expect(styles.map(asset => asset.fileName).sort()).toEqual(['base.css', 'main.css']);
18
+ for (const asset of styles) {
19
+ if (asset.type !== 'asset') continue;
20
+ const css =
21
+ typeof asset.source === 'string'
22
+ ? asset.source
23
+ : Buffer.from(asset.source).toString('utf8');
24
+ expect(css).not.toMatch(/--color-[\w-]+\s*:/);
25
+ expect(css).not.toMatch(/--tw-border-style:\s*none/);
26
+ if (asset.fileName === 'main.css') {
27
+ expect(css).toContain('#d6faf0');
28
+ expect(css).toContain('#ef5d35');
29
+ }
30
+ }
31
+ } finally {
32
+ await bundle.close();
33
+ }
34
+ });
35
+
36
+ it('inlines the original palette and fonts without exporting host color tokens', async () => {
37
+ const compiler = await compile("@import './src/assets/styles/main.css';", {
38
+ base: resolve('.'),
39
+ onDependency: () => undefined,
40
+ });
41
+ const css = compiler.build([
42
+ 'bg-emerald-50',
43
+ 'text-orange-500',
44
+ 'bg-rose-500',
45
+ 'font-jacques',
46
+ 'text-xs',
47
+ ]);
48
+ expect(css).toMatch(/\.bg-emerald-50\s*\{\s*background-color: #d6faf0;/);
49
+ expect(css).toMatch(/\.text-orange-500\s*\{\s*color: #ef5d35;/);
50
+ expect(css).toMatch(/\.bg-rose-500\s*\{\s*background-color: #f43f5e;/);
51
+ expect(css).toMatch(/font-family: ["']?Jacques Francois["']?;/);
52
+ expect(css).not.toMatch(/--color-[\w-]+\s*:/);
53
+ expect(css).toContain('--text-xs: 0.75rem');
54
+ });
55
+
56
+ it('keeps the optional reset independent of host palette tokens', async () => {
57
+ const compiler = await compile("@import './src/assets/styles/base.css';", {
58
+ base: resolve('.'),
59
+ onDependency: () => undefined,
60
+ });
61
+ const css = compiler.build([]);
62
+ expect(css).not.toMatch(/--color-[\w-]+\s*:/);
63
+ expect(css).toContain('border-color: #e5e7eb');
64
+ expect(css).toContain('color: #9ca3af');
65
+ expect(css).not.toMatch(/--tw-border-style:\s*none/);
66
+ });
67
+ });
@@ -94,7 +94,7 @@ export const BoostGenericCard: React.FC<BoostGenericCardProps> = ({
94
94
 
95
95
  <button
96
96
  type="button"
97
- className="boost-generic-card-button z-10 flex flex-col flex-grow rounded-[20px]"
97
+ className="boost-generic-card-button z-10 flex flex-col grow rounded-[20px]"
98
98
  onClick={handleInnerClick}
99
99
  >
100
100
  {/* Thumbnail — filter on the wrapper so it desaturates a
@@ -127,7 +127,7 @@ export const BoostGenericCard: React.FC<BoostGenericCardProps> = ({
127
127
 
128
128
  {/* Details Section: grows to fill available space */}
129
129
  <section
130
- className={`flex flex-col flex-grow items-center justify-end pt-1 w-full ${
130
+ className={`flex flex-col grow items-center justify-end pt-1 w-full ${
131
131
  linkedCredentialsCount === 0 ? 'pb-[20px]' : ''
132
132
  }`}
133
133
  >
@@ -156,7 +156,7 @@ export const BoostGenericCard: React.FC<BoostGenericCardProps> = ({
156
156
 
157
157
  {/* Verifier & Issuer */}
158
158
  <div className="mt-1 w-full px-4 text-center">
159
- <span className="line-clamp-2 break-words text-[12px] leading-snug text-grayscale-700">
159
+ <span className="line-clamp-2 wrap-break-word text-[12px] leading-snug text-grayscale-700">
160
160
  {verifierBadge && (
161
161
  <span className="mr-1 inline-block align-middle">
162
162
  {verifierBadge}
@@ -52,7 +52,7 @@ export const BoostSmallCard: React.FC<BoostSmallCardProps> = ({
52
52
  return (
53
53
  <div
54
54
  key={issueItem?.id}
55
- className="profile-thumb-img border-[1px] border-white border-solid vc-issuee-image h-[35px] w-[35px] rounded-full overflow-hidden mx-[-5px]"
55
+ className="profile-thumb-img border border-white border-solid vc-issuee-image h-[35px] w-[35px] rounded-full overflow-hidden mx-[-5px]"
56
56
  >
57
57
  <UserProfilePicture
58
58
  customContainerClass={`h-full w-full object-cover ${
@@ -11,7 +11,7 @@ export const Button: React.FC<ButtonProps> = ({ text, onClick, className = '' })
11
11
  <button
12
12
  type="button"
13
13
  onClick={onClick}
14
- className={`p-4 border rounded text-gray-700 ${className}`}
14
+ className={`p-4 border rounded-sm text-gray-700 ${className}`}
15
15
  >
16
16
  {text}
17
17
  </button>
@@ -0,0 +1,67 @@
1
+ // @vitest-environment jsdom
2
+ import React from 'react';
3
+ import { render, screen, cleanup } from '@testing-library/react';
4
+ import { afterEach, describe, expect, it } from 'vitest';
5
+ import CertificateFrontFace from './CertificateFrontFace';
6
+ import CertificateBackFace from './CertificateBackFace';
7
+ import MeritBadgeFrontFace from '../MeritBadgeDisplayCard/MeritBadgeFrontFace';
8
+ import MeritBadgeBackFace from '../MeritBadgeDisplayCard/MeritBadgeBackFace';
9
+ import { I18nProvider } from '../../i18n';
10
+ import type { VC } from '@learncard/types';
11
+
12
+ const credential = {
13
+ '@context': ['https://www.w3.org/ns/credentials/v2'],
14
+ type: ['VerifiableCredential', 'OpenBadgeCredential'],
15
+ issuer: { id: 'did:example:issuer', name: 'Example school' },
16
+ validFrom: '2026-10-26T12:00:00Z',
17
+ awardedDate: '2027-10-01T00:00:00Z',
18
+ credentialSubject: {
19
+ id: 'did:example:learner',
20
+ achievement: { name: 'Web Foundations', description: 'Completed the course.' },
21
+ },
22
+ } as unknown as VC;
23
+
24
+ afterEach(cleanup);
25
+
26
+ describe.each([
27
+ ['certificate front', (value: VC) => <CertificateFrontFace credential={value} />],
28
+ [
29
+ 'certificate back',
30
+ (value: VC) => <CertificateBackFace credential={value} verificationItems={[]} />,
31
+ ],
32
+ ['award front', (value: VC) => <MeritBadgeFrontFace credential={value} />],
33
+ ['award back', (value: VC) => <MeritBadgeBackFace credential={value} verificationItems={[]} />],
34
+ ] as const)('%s award date', (_, renderFace) => {
35
+ it('shows the mapped award day instead of the issuance day', () => {
36
+ render(renderFace(credential));
37
+ expect(screen.getByText(/^Awarded on Oct 01, 2027(?: by)?$/)).toBeTruthy();
38
+ expect(screen.queryByText(/Awarded on Oct 26, 2026/)).toBeNull();
39
+ });
40
+ it('retains the legacy issuance-date fallback', () => {
41
+ render(renderFace({ ...credential, awardedDate: undefined }));
42
+ expect(screen.getByText(/^Awarded on Oct 26, 2026(?: by)?$/)).toBeTruthy();
43
+ });
44
+ it('retains the issuance-date fallback when the award date is invalid', () => {
45
+ render(renderFace({ ...credential, awardedDate: 'not-a-date' }));
46
+ expect(screen.getByText(/^Awarded on Oct 26, 2026(?: by)?$/)).toBeTruthy();
47
+ });
48
+ it('omits the date for an undated draft', () => {
49
+ render(renderFace({ ...credential, awardedDate: undefined, validFrom: undefined }));
50
+ expect(screen.queryByText(/Awarded on/)).toBeNull();
51
+ });
52
+ it('resolves the award label through the host translation adapter', () => {
53
+ render(
54
+ <I18nProvider
55
+ locale="fr"
56
+ resolve={(key, params) =>
57
+ key.startsWith('credential.awardedOn')
58
+ ? `Décernée le ${params?.date}`
59
+ : undefined
60
+ }
61
+ >
62
+ {renderFace(credential)}
63
+ </I18nProvider>
64
+ );
65
+ expect(screen.getByText('Décernée le Oct 01, 2027')).toBeTruthy();
66
+ });
67
+ });
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import { useT } from '../../i18n';
2
3
  import { getCategoryDarkColor, getInfoFromCredential } from '../../helpers/credential.helpers';
3
4
  import { VC, VerificationItem } from '@learncard/types';
4
5
  import {
@@ -44,8 +45,10 @@ export const CertificateBackFace: React.FC<CertificateBackFaceProps> = ({
44
45
  handleViewFrontFace,
45
46
  customLinkedCredentialsComponent,
46
47
  }) => {
48
+ const t = useT();
47
49
  const { createdAt, credentialSubject } = getInfoFromCredential(credential, 'MMM dd, yyyy', {
48
50
  uppercaseDate: false,
51
+ dateType: 'awarded',
49
52
  });
50
53
 
51
54
  const { description } = credentialSubject?.achievement ?? {};
@@ -83,15 +86,17 @@ export const CertificateBackFace: React.FC<CertificateBackFaceProps> = ({
83
86
  )}
84
87
 
85
88
  <TruncateTextBox headerText="About" text={description}>
86
- <span
87
- className={`text-grayscale-600 font-poppins text-[12px] font-[600] w-full ${
88
- description
89
- ? 'pt-[10px] border-t-[1px] border-solid border-grayscale-200'
90
- : ''
91
- }`}
92
- >
93
- Awarded on {createdAt}
94
- </span>
89
+ {createdAt && (
90
+ <span
91
+ className={`text-grayscale-600 font-poppins text-[12px] font-[600] w-full ${
92
+ description
93
+ ? 'pt-[10px] border-t border-solid border-grayscale-200'
94
+ : ''
95
+ }`}
96
+ >
97
+ {t('credential.awardedOn', { date: createdAt })}
98
+ </span>
99
+ )}
95
100
  </TruncateTextBox>
96
101
 
97
102
  {criteria && <TruncateTextBox headerText="Criteria" text={criteria} />}
@@ -27,7 +27,7 @@ const CertificateCornerIcon: React.FC<CertificateCornerIconProps> = ({
27
27
  break;
28
28
  case 'bottom-left':
29
29
  iconPositionClassName = 'bottom-0 left-0';
30
- cornerPositionClassName = 'top-0 right-0 rotate-[270deg]';
30
+ cornerPositionClassName = 'top-0 right-0 rotate-270';
31
31
  break;
32
32
  case 'bottom-right':
33
33
  iconPositionClassName = 'bottom-0 right-0';
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import { useT } from '../../i18n';
2
3
 
3
4
  import CertificateCornerIcon from './CertificateCornerIcon';
4
5
  import CertificateImageDisplay from './CertificateImageDisplay';
@@ -68,6 +69,7 @@ export const CertificateFrontFace: React.FC<CertificateFrontFaceProps> = ({
68
69
  hideFrontFaceDetails,
69
70
  onVerifierClick,
70
71
  }) => {
72
+ const t = useT();
71
73
  const {
72
74
  title = '',
73
75
  createdAt,
@@ -75,7 +77,10 @@ export const CertificateFrontFace: React.FC<CertificateFrontFaceProps> = ({
75
77
  issuee: _issuee = '',
76
78
  credentialSubject,
77
79
  imageUrl,
78
- } = getInfoFromCredential(credential, 'MMM dd, yyyy', { uppercaseDate: false });
80
+ } = getInfoFromCredential(credential, 'MMM dd, yyyy', {
81
+ uppercaseDate: false,
82
+ dateType: 'awarded',
83
+ });
79
84
 
80
85
  const issuee = issueeOverride || _issuee;
81
86
  const issuer = issuerOverride || _issuer;
@@ -166,14 +171,14 @@ export const CertificateFrontFace: React.FC<CertificateFrontFaceProps> = ({
166
171
  </div>
167
172
 
168
173
  <div
169
- className={`flex flex-col gap-[15px] items-center px-[20px] pt-[55px] pb-[20px] border-solid border-[4px] ${borderColor} rounded-[30px]`}
174
+ className={`flex flex-col gap-[15px] items-center px-[20px] pt-[55px] pb-[20px] border-solid border-4 ${borderColor} rounded-[30px]`}
170
175
  >
171
176
  <div className="flex flex-col gap-[5px] items-center">
172
177
  <h1 className="text-grayscale-900 text-center text-[20px] font-jacques">
173
178
  {title}
174
179
  </h1>
175
180
  <div
176
- className={`${textLightColor} uppercase text-[14px] font-notoSans font-[600]`}
181
+ className={`${textLightColor} uppercase text-[14px] font-notoSans font-semibold`}
177
182
  >
178
183
  {formattedDisplayType}
179
184
  </div>
@@ -218,7 +223,11 @@ export const CertificateFrontFace: React.FC<CertificateFrontFaceProps> = ({
218
223
  </>
219
224
  )}
220
225
  </span>
221
- {!hideIssueDate && <span className="font-jacques">Awarded on {createdAt}</span>}
226
+ {!hideIssueDate && createdAt && (
227
+ <span className="font-jacques">
228
+ {t('credential.awardedOn', { date: createdAt })}
229
+ </span>
230
+ )}
222
231
  </div>
223
232
 
224
233
  <div className="flex flex-col gap-[10px] items-center">
@@ -263,14 +272,14 @@ export const CertificateFrontFace: React.FC<CertificateFrontFaceProps> = ({
263
272
  Certified by
264
273
  </span>
265
274
  {issuerDisplay.isDidValue ? (
266
- <span className="mb-[3px] pt-[3px] text-grayscale-900 text-[14px] leading-[90%] font-jacques tracking-[0.25px] border-b-[1px] border-solid border-grayscale-200 w-full text-center line-clamp-2 break-words scrollbar-hide">
267
- <span className="font-[600]">
275
+ <span className="mb-[3px] pt-[3px] text-grayscale-900 text-[14px] leading-[90%] font-jacques tracking-[0.25px] border-b border-solid border-grayscale-200 w-full text-center line-clamp-2 wrap-break-word scrollbar-hide">
276
+ <span className="font-semibold">
268
277
  {issuerDisplay.isDidValue ? 'Digital ID: ' : ''}
269
278
  </span>
270
279
  <span className="text-grayscale-600">{issuerName}</span>
271
280
  </span>
272
281
  ) : (
273
- <span className="mb-[3px] pt-[3px] text-grayscale-900 text-[25px] leading-[90%] font-sacramento border-b-[1px] border-solid border-grayscale-200 w-full text-center line-clamp-2 break-words scrollbar-hide">
282
+ <span className="mb-[3px] pt-[3px] text-grayscale-900 text-[25px] leading-[90%] font-sacramento border-b border-solid border-grayscale-200 w-full text-center line-clamp-2 wrap-break-word scrollbar-hide">
274
283
  {issuerName}
275
284
  </span>
276
285
  )}
@@ -282,7 +291,9 @@ export const CertificateFrontFace: React.FC<CertificateFrontFaceProps> = ({
282
291
  />
283
292
  </div>
284
293
  {customBodyContentSlot && customBodyContentSlot}
285
- <div className={`${textLightColor} uppercase text-[14px] font-notoSans font-[600]`}>
294
+ <div
295
+ className={`${textLightColor} uppercase text-[14px] font-notoSans font-semibold`}
296
+ >
286
297
  {categoryTitle}
287
298
  </div>
288
299
  </div>
@@ -24,7 +24,7 @@ const CertificateProfileImageDisplay: React.FC<CertificateProfileImageDisplayPro
24
24
  avatarFallbackVariant = 'initial',
25
25
  }) => {
26
26
  const imageClassName =
27
- 'h-[50px] w-[50px] rounded-full overflow-hidden border-[2px] border-solid border-grayscale-200';
27
+ 'h-[50px] w-[50px] rounded-full overflow-hidden border-2 border-solid border-grayscale-200';
28
28
  const fingerprintClassName = isIssuer ? 'h-[38px] w-[38px]' : 'h-[36px] w-[36px]';
29
29
  const silhouetteClassName = 'h-[38px] w-[38px]';
30
30
 
@@ -221,7 +221,7 @@ const MediaAttachmentsBox: React.FC<MediaAttachmentsBoxProps> = ({
221
221
  className="flex bg-grayscale-100 items-center rounded-[15px] w-full"
222
222
  >
223
223
  <button
224
- className="relative h-[80px] w-[80px] rounded-[15px] overflow-hidden flex-shrink-0"
224
+ className="relative h-[80px] w-[80px] rounded-[15px] overflow-hidden shrink-0"
225
225
  onClick={e => {
226
226
  e.stopPropagation();
227
227
  handleMediaAttachmentClick(media.url, media.type);
@@ -39,7 +39,7 @@ const VerificationRow: React.FC<VerificationRowProps> = ({ verification }) => {
39
39
  const infoText = ''; // if we want certain verifications to have extra explanation, we can set this variable
40
40
 
41
41
  return (
42
- <div className="verification-row flex flex-col gap-[5px] font-poppins border-b-[1px] border-grayscale-200 border-solid w-full py-[10px] last:border-0 last:pb-0">
42
+ <div className="verification-row flex flex-col gap-[5px] font-poppins border-b border-grayscale-200 border-solid w-full py-[10px] last:border-0 last:pb-0">
43
43
  <span
44
44
  className="font-[700] text-[11px] uppercase flex items-center gap-[3px] select-none"
45
45
  style={{ color: statusColor }}
@@ -21,11 +21,11 @@ export const JobHistoryCard: React.FC<JobHistoryCardProps> = ({
21
21
  className={`job-history-card flex h-[88px] max-w-[335px] justify-between shadow-[0_0_8px_0px_rgba(0,0,0,0.2)] relative $ py-[10px] px-[15px] rounded-[20px] ${className}`}
22
22
  >
23
23
  {dateRange && (
24
- <div className="flex flex-shrink-0 rounded-[20px] bg-emerald-600 pl-[15px] font-bold text-grayscale-50 job-card-date-display w-[108px] h-full items-center">
24
+ <div className="flex shrink-0 rounded-[20px] bg-emerald-600 pl-[15px] font-bold text-grayscale-50 job-card-date-display w-[108px] h-full items-center">
25
25
  <p className="line-clamp-2">{dateRange}</p>
26
26
  </div>
27
27
  )}
28
- <div className="flex flex-grow flex-col job-history-details-display pl-[12px]">
28
+ <div className="flex grow flex-col job-history-details-display pl-[12px]">
29
29
  <p className="text-grayscale-900 font-bold line-clamp-1">{title}</p>
30
30
  <p className="text-grayscale-600 text-sm line-clamp-1">{company}</p>
31
31
  <p className="text-sm text-indigo-700 uppercase font-bold line-clamp-1">
@@ -112,15 +112,12 @@ export const JobListCard: React.FC<JobListCardProps> = ({
112
112
  {topText}
113
113
  </div>
114
114
  </div>
115
- <p className="text-grayscale-500 text-xs line-clamp-1 flex-shrink-0">
116
- {' '}
117
- {postDateDisplay}
118
- </p>
115
+ <p className="text-grayscale-500 text-xs line-clamp-1 shrink-0"> {postDateDisplay}</p>
119
116
 
120
117
  <div className="job-listing-center flex mt-[5px]">
121
118
  {imgThumb && (
122
119
  <img
123
- className="object-cover w-[80px] flex-shrink-0 items-center justify-center rounded-[15px] mr-[10px]"
120
+ className="object-cover w-[80px] shrink-0 items-center justify-center rounded-[15px] mr-[10px]"
124
121
  src={imgThumb}
125
122
  />
126
123
  )}
@@ -86,7 +86,7 @@ export const LearnCardCreditCardBackFace: React.FC<LearnCardCreditCardBackFacePr
86
86
  </div>
87
87
  </div>
88
88
  <div>
89
- <div className="h-[33px] w-[55px] rounded-[60px] bg-gradient-to-r from-[#F4F5F5] to-[#E3E5E8]" />
89
+ <div className="h-[33px] w-[55px] rounded-[60px] bg-linear-to-r/srgb from-[#F4F5F5] to-[#E3E5E8]" />
90
90
  </div>
91
91
  </div>
92
92
 
@@ -43,7 +43,7 @@ export const LearnCardCreditCardFrontFace: React.FC<LearnCardCreditCardFrontFace
43
43
  <div className="absolute top-[-40px] left-0 w-[55%] h-[140%] rounded-tr-[150px] rounded-br-[150px] bg-grayscale-900 credit-card-bubble" />
44
44
  {showActionButton && (
45
45
  <button
46
- className="absolute top-2 right-4 bg-grayscale-500 border-[2px] rounded-3xl border-solid border-color-grayscale-900 min-w-[110px] p-[2px] font-bold text-xs tracking-wide leading-snug text-center text-white"
46
+ className="absolute top-2 right-4 bg-grayscale-500 border-2 rounded-3xl border-solid border-color-grayscale-900 min-w-[110px] p-[2px] font-bold text-xs tracking-wide leading-snug text-center text-white"
47
47
  onClick={onClick}
48
48
  data-testid="credit-card-frontface-button"
49
49
  >
@@ -221,7 +221,7 @@ const MediaAttachmentsBox: React.FC<MediaAttachmentsBoxProps> = ({
221
221
  className="flex media-attachment-box bg-grayscale-100 items-center rounded-[15px] w-full"
222
222
  >
223
223
  <button
224
- className="relative h-[80px] w-[80px] rounded-[15px] overflow-hidden flex-shrink-0"
224
+ className="relative h-[80px] w-[80px] rounded-[15px] overflow-hidden shrink-0"
225
225
  onClick={e => {
226
226
  e.stopPropagation();
227
227
  handleMediaAttachmentClick(media.url, media.type);
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import { useT } from '../../i18n';
2
3
  import { getCategoryDarkColor, getInfoFromCredential } from '../../helpers/credential.helpers';
3
4
  import { VC, VerificationItem } from '@learncard/types';
4
5
  import {
@@ -44,8 +45,10 @@ export const MeritBadgeBackFace: React.FC<MeritBadgeBackFaceProps> = ({
44
45
  handleViewFrontFace,
45
46
  customLinkedCredentialsComponent,
46
47
  }) => {
48
+ const t = useT();
47
49
  const { createdAt, credentialSubject } = getInfoFromCredential(credential, 'MMM dd, yyyy', {
48
50
  uppercaseDate: false,
51
+ dateType: 'awarded',
49
52
  });
50
53
 
51
54
  const { description } = credentialSubject?.achievement ?? {};
@@ -83,15 +86,17 @@ export const MeritBadgeBackFace: React.FC<MeritBadgeBackFaceProps> = ({
83
86
  )}
84
87
 
85
88
  <TruncateTextBox headerText="About" text={description}>
86
- <span
87
- className={`text-grayscale-600 font-poppins text-[12px] font-[600] w-full ${
88
- description
89
- ? 'pt-[10px] border-t-[1px] border-solid border-grayscale-200'
90
- : ''
91
- }`}
92
- >
93
- Awarded on {createdAt}
94
- </span>
89
+ {createdAt && (
90
+ <span
91
+ className={`text-grayscale-600 font-poppins text-[12px] font-[600] w-full ${
92
+ description
93
+ ? 'pt-[10px] border-t border-solid border-grayscale-200'
94
+ : ''
95
+ }`}
96
+ >
97
+ {t('credential.awardedOn', { date: createdAt })}
98
+ </span>
99
+ )}
95
100
  </TruncateTextBox>
96
101
 
97
102
  {criteria && <TruncateTextBox headerText="Criteria" text={criteria} />}
@@ -16,20 +16,20 @@ const MeritBadgeCornerIcon: React.FC<MeritBadgeCornerIconProps> = ({ categoryTyp
16
16
  switch (position) {
17
17
  case 'top-left':
18
18
  iconPositionClassName = 'top-[3px] left-[3px] pb-[10px] pr-[10px] pl-[4px] pt-[4px]';
19
- cornerPositionClassName = 'bottom-[-1px] right-0';
19
+ cornerPositionClassName = '-bottom-px right-0';
20
20
  break;
21
21
  case 'top-right':
22
22
  iconPositionClassName = 'top-[3px] right-[3px] pl-[10px] pb-[10px] pr-[4px] pt-[4px]';
23
- cornerPositionClassName = 'bottom-[-1px] left-0 rotate-90';
23
+ cornerPositionClassName = '-bottom-px left-0 rotate-90';
24
24
  break;
25
25
  case 'bottom-left':
26
26
  iconPositionClassName = 'bottom-[3px] left-[3px] pr-[10px] pt-[10px] pl-[4px] pb-[4px]';
27
- cornerPositionClassName = 'top-0 right-0 rotate-[270deg]';
27
+ cornerPositionClassName = 'top-0 right-0 rotate-270';
28
28
  break;
29
29
  case 'bottom-right':
30
30
  iconPositionClassName =
31
31
  'bottom-[3px] right-[3px] pl-[10px] pt-[10px] pr-[4px] pb-[4px]';
32
- cornerPositionClassName = 'top-[-1px] left-0 rotate-180';
32
+ cornerPositionClassName = '-top-px left-0 rotate-180';
33
33
  break;
34
34
  }
35
35