@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
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import { useT } from '../../i18n';
2
3
 
3
4
  import MeritBadgeCornerIcon from './MeritBadgeCornerIcon';
4
5
  import MeritBadgeImageDisplay from './MeritBadgeImageDisplay';
@@ -66,6 +67,7 @@ export const MeritBadgeFrontFace: React.FC<MeritBadgeFrontFaceProps> = ({
66
67
  hideFrontFaceDetails,
67
68
  onVerifierClick,
68
69
  }) => {
70
+ const t = useT();
69
71
  const {
70
72
  title = '',
71
73
  createdAt,
@@ -73,7 +75,10 @@ export const MeritBadgeFrontFace: React.FC<MeritBadgeFrontFaceProps> = ({
73
75
  issuee: _issuee = '',
74
76
  credentialSubject,
75
77
  imageUrl,
76
- } = getInfoFromCredential(credential, 'MMM dd, yyyy', { uppercaseDate: false });
78
+ } = getInfoFromCredential(credential, 'MMM dd, yyyy', {
79
+ uppercaseDate: false,
80
+ dateType: 'awarded',
81
+ });
77
82
 
78
83
  const issuee = issueeOverride || _issuee;
79
84
  const issuer = issuerOverride || _issuer;
@@ -155,7 +160,7 @@ export const MeritBadgeFrontFace: React.FC<MeritBadgeFrontFaceProps> = ({
155
160
  </div>
156
161
 
157
162
  <div
158
- className={`flex flex-col gap-[15px] items-center px-[20px] pt-[92px] pb-[19px] border-solid border-[4px] ${borderColor} rounded-[30px]`}
163
+ className={`flex flex-col gap-[15px] items-center px-[20px] pt-[92px] pb-[19px] border-solid border-4 ${borderColor} rounded-[30px]`}
159
164
  >
160
165
  <div className="flex flex-col gap-[5px] w-full">
161
166
  <div className="flex flex-col items-center text-grayscale-900">
@@ -204,12 +209,12 @@ export const MeritBadgeFrontFace: React.FC<MeritBadgeFrontFaceProps> = ({
204
209
  )}
205
210
  <div className="flex flex-col w-full">
206
211
  <div className="text-[14px] text-grayscale-900 flex flex-col items-center w-full mb-[10px]">
207
- <span className="font-jacques flex gap-[5px] items-center w-full overflow-ellipsis whitespace-nowrap overflow-hidden justify-center">
208
- {issueeName === '0 person' ? (
209
- 'Not yet awarded'
210
- ) : (
211
- <>Awarded on {createdAt} by</>
212
- )}
212
+ <span className="font-jacques flex gap-[5px] items-center w-full text-ellipsis whitespace-nowrap overflow-hidden justify-center">
213
+ {issueeName === '0 person'
214
+ ? 'Not yet awarded'
215
+ : createdAt
216
+ ? t('credential.awardedOnBy', { date: createdAt })
217
+ : t('credential.by')}
213
218
  </span>
214
219
  </div>
215
220
 
@@ -231,9 +236,9 @@ export const MeritBadgeFrontFace: React.FC<MeritBadgeFrontFaceProps> = ({
231
236
  </div> */}
232
237
 
233
238
  <div className="flex flex-col gap-[5px] items-center w-full">
234
- <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">
239
+ <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">
235
240
  {issuerDisplay.isDidValue ? (
236
- <span className="mb-[3px] pt-[3px] text-grayscale-900 text-[14px] leading-[90%] font-jacques tracking-[0.25px] w-full text-center line-clamp-2 break-words">
241
+ <span className="mb-[3px] pt-[3px] text-grayscale-900 text-[14px] leading-[90%] font-jacques tracking-[0.25px] w-full text-center line-clamp-2 wrap-break-word">
237
242
  <span className="font-[600]">Digital ID:</span>
238
243
  <span className="text-grayscale-600">{issuerName}</span>
239
244
  </span>
@@ -27,7 +27,7 @@ const MeritBadgeProfileImageDisplay: React.FC<MeritBadgeProfileImageDisplayProps
27
27
  }) => {
28
28
  const imageClassName = `${
29
29
  size === 'big' ? 'h-[60px] w-[60px]' : 'h-[39px] w-[39px]'
30
- } rounded-full overflow-hidden border-[2px] border-solid border-grayscale-200`;
30
+ } rounded-full overflow-hidden border-2 border-solid border-grayscale-200`;
31
31
  const silhouetteClassName = size === 'big' ? 'h-[43px] w-[43px]' : 'h-[28px] w-[28px]';
32
32
 
33
33
  const profileImage = imageComponent ? (
@@ -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 }}
@@ -57,7 +57,7 @@ export const MiniVCThumbnail: React.FC<MiniVCThumbnailProps> = ({
57
57
  className="flex item-center justify-center w-full -mt-3"
58
58
  data-testid="mini-vc-thumbnail-badge"
59
59
  >
60
- <div className="max-h-[80px] max-w-[80px] xxsm:h-[60px] xxsm:w-[60px] border-solid border-1 border-black bg-white z-10">
60
+ <div className="max-h-[80px] max-w-[80px] xxsm:h-[60px] xxsm:w-[60px] border-solid border border-black bg-white z-10">
61
61
  <img
62
62
  className="h-full w-full object-cover"
63
63
  src={badgeImage}
@@ -98,7 +98,7 @@ export const NotificationBoostCard: React.FC<NotificationBoostCardProps> = ({
98
98
 
99
99
  {showIssuerInfo && (
100
100
  <div className="notification-card-issuer-info flex items-center mt-[10px]">
101
- <div className="profile-thumb-img border-[2px] border-white border-solid vc-issuee-image h-[35px] w-[35px] rounded-full overflow-hidden mx-[-5px]">
101
+ <div className="profile-thumb-img border-2 border-white border-solid vc-issuee-image h-[35px] w-[35px] rounded-full overflow-hidden mx-[-5px]">
102
102
  <UserProfilePicture
103
103
  customContainerClass={`h-full w-full object-cover text-xl ${
104
104
  !issuerInfo?.image ? 'pt-[3px]' : ''
@@ -128,7 +128,7 @@ export const NotificationBoostCard: React.FC<NotificationBoostCardProps> = ({
128
128
 
129
129
  <button
130
130
  onClick={handleCancelClick}
131
- className={`rounded-[24px] flex items-center justify-center h-[42px] w-[42px] shadow-bottom bg-white font-semibold mr-2 p-[0px] tracking-wide ${viewButtonStyles}`}
131
+ className={`rounded-[24px] flex items-center justify-center h-[42px] w-[42px] shadow-bottom bg-white font-semibold mr-2 p-0 tracking-wide ${viewButtonStyles}`}
132
132
  role="button"
133
133
  name="notification-view-button"
134
134
  >
@@ -71,7 +71,7 @@ export const NotificationUserAcceptedBoostCard: React.FC<
71
71
  <div className="flex items-center justify-end w-full mt-3">
72
72
  <button
73
73
  onClick={handleCancelClick}
74
- className={`rounded-[24px] flex items-center justify-center h-[42px] w-[42px] shadow-bottom bg-white font-semibold mr-2 p-[0px] tracking-wide ${viewButtonStyles}`}
74
+ className={`rounded-[24px] flex items-center justify-center h-[42px] w-[42px] shadow-bottom bg-white font-semibold mr-2 p-0 tracking-wide ${viewButtonStyles}`}
75
75
  role="button"
76
76
  name="notification-view-button"
77
77
  >
@@ -96,7 +96,7 @@ export const NotificationUserCard: React.FC<NotificationUserCardProps> = ({
96
96
 
97
97
  <button
98
98
  onClick={handleCancelClick}
99
- className={`rounded-[24px] flex items-center justify-center h-[42px] w-[42px] shadow-bottom bg-white font-semibold mr-2 p-[0px] tracking-wide ${viewButtonStyles}`}
99
+ className={`rounded-[24px] flex items-center justify-center h-[42px] w-[42px] shadow-bottom bg-white font-semibold mr-2 p-0 tracking-wide ${viewButtonStyles}`}
100
100
  role="button"
101
101
  name="notification-view-button"
102
102
  >
@@ -87,7 +87,7 @@ export const RoundedPill: React.FC<RoundedPillProps> = ({
87
87
  }) => {
88
88
  const backgroundColor = `bg-${TYPE_TO_BG_COLOR_CLASS[type]}`;
89
89
  const iconBgColor = `bg-${TYPE_TO_FOREGROUND_COLOR[type]}`;
90
- const circleClass = `flex w-full items-center justify-center icon-display h-[40px] w-[40px] rounded-full ${iconBgColor} absolute flex-shrink-0 `;
90
+ const circleClass = `flex w-full items-center justify-center icon-display h-[40px] w-[40px] rounded-full ${iconBgColor} absolute shrink-0 `;
91
91
 
92
92
  const handleClick = () => {
93
93
  onClick?.();
@@ -108,7 +108,7 @@ export const RoundedPill: React.FC<RoundedPillProps> = ({
108
108
  {!locked && (
109
109
  <div className={circleClass}>
110
110
  <img
111
- className="h-full w-full object-cover max-h-[24px] max-w-[24px] flex-shrink-0 "
111
+ className="h-full w-full object-cover max-h-[24px] max-w-[24px] shrink-0 "
112
112
  src={iconSrc ?? ''}
113
113
  alt="Icon image"
114
114
  />
@@ -29,7 +29,7 @@ export const SchoolIDCard: React.FC<SchoolIDCardProps> = ({
29
29
  if (userImage && userImage?.trim() !== '') {
30
30
  issueeImageEl = (
31
31
  <div
32
- className="h-[80px] w-[80px] rounded-full overflow-hidden bg-no-repeat bg-cover bg-center border-solid border-[2px] border-white mr-2"
32
+ className="h-[80px] w-[80px] rounded-full overflow-hidden bg-no-repeat bg-cover bg-center border-solid border-2 border-white mr-2"
33
33
  style={{ backgroundImage: `url(${userImage})` }}
34
34
  />
35
35
  );
@@ -42,7 +42,7 @@ export const VCDisplayBackFace: React.FC<VCDisplayCardProps> = ({
42
42
  <h6 className="line-clamp-1 text-grayscale-900 font-bold uppercase text-xs tracking-wider subpixel-antialiased">
43
43
  Issuer
44
44
  </h6>
45
- <p className="max-w-[344px] line-clamp-1 subpixel-antialiased text-grayscale-600 text-[14px] block overflow-ellipsis break-all">
45
+ <p className="max-w-[344px] line-clamp-1 subpixel-antialiased text-grayscale-600 text-[14px] block text-ellipsis break-all">
46
46
  {issuerName}
47
47
  </p>
48
48
  </div>
@@ -59,10 +59,10 @@ export const VCDisplayBackFace: React.FC<VCDisplayCardProps> = ({
59
59
 
60
60
  return (
61
61
  <div
62
- className={`z-[9] vc-display-main-card-back flex overflow-hidden flex-col items-center justify-between relative max-w-[400px] h-[100%] max-h-[1100px] min-h-[600px] p-7 rounded-3xl shadow-3xl bg-emerald-700 vc-display-card-full-container ${className}`}
62
+ className={`z-[9] vc-display-main-card-back flex overflow-hidden flex-col items-center justify-between relative max-w-[400px] h-full max-h-[1100px] min-h-[600px] p-7 rounded-3xl shadow-3xl bg-emerald-700 vc-display-card-full-container ${className}`}
63
63
  >
64
64
  <section className="flex max-h-[150px] items-end bg-white rounded-bl-[50%] rounded-br-[50%] absolute top-0 w-[110%] h-[55%] min-h-[400px]"></section>
65
- <section className="flex flex-col items-center justify-center w-full z-10 text-left credential-details-container max-w-[100%] relative">
65
+ <section className="flex flex-col items-center justify-center w-full z-10 text-left credential-details-container max-w-full relative">
66
66
  <section className="flex flex-row items-start justify-start w-full line-clamp-2">
67
67
  <h3
68
68
  className="text-2xl line-clamp-2 tracking-wide leading-snug text-left text-emerald-700"
@@ -91,7 +91,7 @@ export const VCDisplayBackFace: React.FC<VCDisplayCardProps> = ({
91
91
  </span>
92
92
  </button>
93
93
 
94
- <section className="flex-col items-center justify-center checklist-container justify-center w-[100%] width-full mt-[20px]">
94
+ <section className="flex-col items-center justify-center checklist-container justify-center w-full width-full mt-[20px]">
95
95
  <VCVerificationCheckWithText loading={loading} />
96
96
  <section>
97
97
  {verification.map(item => (
@@ -47,7 +47,7 @@ const DetailsOverrideTest = (
47
47
  <h6 className="line-clamp-1 text-grayscale-900 font-bold uppercase text-xs tracking-wider subpixel-antialiased">
48
48
  Issuer
49
49
  </h6>
50
- <p className="max-w-[344px] line-clamp-1 subpixel-antialiased text-grayscale-600 text-[14px] block overflow-ellipsis break-all">
50
+ <p className="max-w-[344px] line-clamp-1 subpixel-antialiased text-grayscale-600 text-[14px] block text-ellipsis break-all">
51
51
  override details issuer override details issuer override details issuer override
52
52
  details issuer override details issuer override details issuer
53
53
  </p>
@@ -57,7 +57,7 @@ const DetailsOverrideTest = (
57
57
  <h6 className="line-clamp-1 text-grayscale-900 font-bold uppercase text-xs tracking-wider subpixel-antialiased">
58
58
  other field
59
59
  </h6>
60
- <p className="max-w-[344px] line-clamp-1 subpixel-antialiased text-grayscale-600 text-[14px] block overflow-ellipsis break-all">
60
+ <p className="max-w-[344px] line-clamp-1 subpixel-antialiased text-grayscale-600 text-[14px] block text-ellipsis break-all">
61
61
  override details
62
62
  </p>
63
63
  </div>
@@ -15,7 +15,7 @@ const IssueHistoryBox: React.FC<SkillsBoxProps> = ({
15
15
  let renderIssueHistory = issueHistory?.map(issueItem => {
16
16
  return (
17
17
  <div
18
- className="flex items-center issue-log-item border-b-[1px] last:border-b-0 py-[5px] border-grayscale-200 border-solid w-full"
18
+ className="flex items-center issue-log-item border-b last:border-b-0 py-[5px] border-grayscale-200 border-solid w-full"
19
19
  key={issueItem?.id}
20
20
  >
21
21
  <div className="profile-thumb-img vc-issuee-image h-[35px] w-[35px] rounded-full overflow-hidden">
@@ -157,8 +157,9 @@ const MediaAttachmentsBox: React.FC<MediaAttachmentsBoxProps> = ({
157
157
  className="absolute top-0 left-0 right-0 bottom-0 bg-cover bg-no-repeat font-poppins text-white text-[12px] font-[400] leading-[17px] flex flex-col justify-end items-start p-[10px] text-left bg-rose-600 rounded-[15px]"
158
158
  style={{
159
159
  backgroundImage: metadata?.imageUrl
160
- ? `linear-gradient(180deg, rgba(0, 0, 0, 0) 44.20%, rgba(0, 0, 0, 0.6) 69%), url(${metadata?.imageUrl ?? ''
161
- })`
160
+ ? `linear-gradient(180deg, rgba(0, 0, 0, 0) 44.20%, rgba(0, 0, 0, 0.6) 69%), url(${
161
+ metadata?.imageUrl ?? ''
162
+ })`
162
163
  : undefined,
163
164
  }}
164
165
  >
@@ -166,8 +167,9 @@ const MediaAttachmentsBox: React.FC<MediaAttachmentsBoxProps> = ({
166
167
  <VideoIcon size="60" className="m-auto" />
167
168
  )}
168
169
  <div
169
- className={`absolute ${iconTop ? 'top-[10px]' : 'bottom-[10px]'
170
- } left-[10px] z-10 flex items-center gap-[5px]`}
170
+ className={`absolute ${
171
+ iconTop ? 'top-[10px]' : 'bottom-[10px]'
172
+ } left-[10px] z-10 flex items-center gap-[5px]`}
171
173
  >
172
174
  {metadata?.imageUrl && <VideoIcon />}
173
175
  {metadata?.videoLength && (
@@ -183,7 +185,10 @@ const MediaAttachmentsBox: React.FC<MediaAttachmentsBoxProps> = ({
183
185
  } else {
184
186
  innerContent = (
185
187
  <div className="absolute top-0 left-0 right-0 bottom-0 h-full w-full flex items-center justify-center">
186
- <img className="rounded-[15px] object-cover h-full w-full" src={media.url} />
188
+ <img
189
+ className="rounded-[15px] object-cover h-full w-full"
190
+ src={media.url}
191
+ />
187
192
  <Camera className="absolute bottom-[10px] left-[10px] z-10" />
188
193
  </div>
189
194
  );
@@ -134,7 +134,7 @@ const VC2FrontFaceInfo: React.FC<VC2FrontFaceInfoProps> = ({
134
134
  avatarIconClassName={avatarSilhouetteClassName}
135
135
  avatarSilhouetteClassName={avatarSilhouetteClassName}
136
136
  avatarFallbackVariant={avatarFallbackVariant}
137
- customContainerClass={`h-full w-full ${bigText ? '!text-4xl' : ''}`}
137
+ customContainerClass={`h-full w-full ${bigText ? 'text-4xl!' : ''}`}
138
138
  />
139
139
  );
140
140
  };
@@ -205,7 +205,7 @@ const VC2FrontFaceInfo: React.FC<VC2FrontFaceInfoProps> = ({
205
205
  <>
206
206
  <h3 className="flex flex-col text-center leading-[130%] w-full">
207
207
  {!issueeDisplay.isMissing && issueeDisplay.isDidValue && (
208
- <span className="flex flex-wrap items-baseline justify-center gap-x-1 text-[17px] leading-normal font-[600] font-poppins max-w-full break-words">
208
+ <span className="flex flex-wrap items-baseline justify-center gap-x-1 text-[17px] leading-normal font-semibold font-poppins max-w-full wrap-break-word">
209
209
  <span className="text-grayscale-900">Digital ID:</span>
210
210
  <span className="text-grayscale-500 underline">
211
211
  {issueeDisplay.displayName}
@@ -213,7 +213,7 @@ const VC2FrontFaceInfo: React.FC<VC2FrontFaceInfoProps> = ({
213
213
  </span>
214
214
  )}
215
215
  {!issueeDisplay.isMissing && !issueeDisplay.isDidValue && (
216
- <span className="font-poppins font-semibold text-[20px] leading-[130%] max-w-full line-clamp-2 break-words text-grayscale-900">
216
+ <span className="font-poppins font-semibold text-[20px] leading-[130%] max-w-full line-clamp-2 wrap-break-word text-grayscale-900">
217
217
  {issueeDisplay.displayName}
218
218
  </span>
219
219
  )}
@@ -239,12 +239,12 @@ const VC2FrontFaceInfo: React.FC<VC2FrontFaceInfoProps> = ({
239
239
  {createdAt}
240
240
  </span>
241
241
  {!issuerDisplay.isMissing && (
242
- <span className="issued-by max-w-full break-words text-center line-clamp-2 text-[14px]">
242
+ <span className="issued-by max-w-full wrap-break-word text-center line-clamp-2 text-[14px]">
243
243
  <span className="font-medium text-grayscale-900">
244
244
  {t('credential.by')}
245
245
  </span>{' '}
246
246
  {issuerDisplay.isDidValue ? (
247
- <span className="font-[600] font-poppins break-words">
247
+ <span className="font-semibold font-poppins wrap-break-word">
248
248
  <span className="text-grayscale-900">
249
249
  Digital ID:
250
250
  </span>{' '}
@@ -253,7 +253,7 @@ const VC2FrontFaceInfo: React.FC<VC2FrontFaceInfoProps> = ({
253
253
  </span>
254
254
  </span>
255
255
  ) : (
256
- <strong className="font-bold text-grayscale-900 break-words">
256
+ <strong className="font-bold text-grayscale-900 wrap-break-word">
257
257
  {issuerDisplay.displayName}
258
258
  </strong>
259
259
  )}
@@ -351,7 +351,7 @@ export const VCDisplayCard2: React.FC<VCDisplayCard2Props> = ({
351
351
 
352
352
  // these are constants so that the real header and the hidden-for-spacing header are identical
353
353
  const headerClassName =
354
- 'vc-card-header px-[20px] pb-[10px] pt-[3px] overflow-visible mt-[40px] text-center bg-white border-y-[5px] border-[#EEF2FF] w-[calc(100%_+_16px)] rounded-t-[8px] z-50';
354
+ 'vc-card-header px-[20px] pb-[10px] pt-[3px] overflow-visible mt-[40px] text-center bg-white border-y-[5px] border-[#EEF2FF] w-[calc(100%+16px)] rounded-t-[8px] z-50';
355
355
  const headerFitTextClassName =
356
356
  'vc-card-header-main-title text-[#18224E] pt-[3px] leading-[80%] text-[32px]';
357
357
 
@@ -252,8 +252,8 @@ const AvatarFallbackMatrix: React.FC<{ matrixType: AvatarFallbackMatrixType }> =
252
252
 
253
253
  return (
254
254
  <div className="bg-grayscale-100 min-h-screen p-8">
255
- <div className="mx-auto max-w-[1200px] space-y-8">
256
- <div className="space-y-2">
255
+ <div className="mx-auto max-w-[1200px] space-y-v3-8">
256
+ <div className="space-y-v3-2">
257
257
  <h1 className="text-xl font-semibold text-grayscale-900 font-poppins">
258
258
  {heading}
259
259
  </h1>
@@ -267,9 +267,9 @@ const AvatarFallbackMatrix: React.FC<{ matrixType: AvatarFallbackMatrixType }> =
267
267
  {matrixCases.map(testCase => (
268
268
  <section
269
269
  key={testCase.title}
270
- className="rounded-[28px] bg-white p-6 shadow-[0_18px_50px_rgba(24,34,78,0.12)] space-y-4"
270
+ className="rounded-[28px] bg-white p-6 shadow-[0_18px_50px_rgba(24,34,78,0.12)] space-y-v3-4"
271
271
  >
272
- <div className="space-y-1">
272
+ <div className="space-y-v3-1">
273
273
  <h2 className="text-lg font-semibold text-grayscale-900 font-poppins">
274
274
  {testCase.title}
275
275
  </h2>
@@ -141,8 +141,8 @@ const VCIDDisplayFrontFace: React.FC<VCIDDisplayFrontFaceProps> = ({
141
141
  <TruncateTextBox
142
142
  text={description}
143
143
  className="description-box"
144
- containerClassName="!p-0 !shadow-none !text-center !w-full"
145
- textClassName="!font-poppins !text-base !text-grayscale-700 !text-center !w-full"
144
+ containerClassName="p-0! shadow-none! text-center! w-full!"
145
+ textClassName="font-poppins! text-base! text-grayscale-700! text-center! w-full!"
146
146
  truncateThreshold={204}
147
147
  />
148
148
  </>
@@ -178,31 +178,31 @@ const VCIDDisplayFrontFace: React.FC<VCIDDisplayFrontFaceProps> = ({
178
178
  }`}
179
179
  >
180
180
  {isSelfVerified && (
181
- <span className="uppercase font-poppins text-base font-[500] text-green-dark flex gap-[3px] items-center">
181
+ <span className="uppercase font-poppins text-base font-medium text-green-dark flex gap-[3px] items-center">
182
182
  <PersonBadge className="w-[20px] h-[20px]" />
183
183
  Self Issued
184
184
  </span>
185
185
  )}
186
186
  {verifierState === VERIFIER_STATES.trustedVerifier && (
187
- <span className="uppercase font-poppins text-base font-[500] text-blue-light flex gap-[3px] items-center text-center">
187
+ <span className="uppercase font-poppins text-base font-medium text-blue-light flex gap-[3px] items-center text-center">
188
188
  <VerifiedBadge className="w-[20px] h-[20px]" />
189
189
  {unknownVerifierTitle ?? 'Trusted Issuer'}
190
190
  </span>
191
191
  )}
192
192
  {verifierState === VERIFIER_STATES.unknownVerifier && (
193
- <span className="uppercase font-poppins text-base font-[500] text-orange-500 flex gap-[3px] items-center">
193
+ <span className="uppercase font-poppins text-base font-medium text-orange-500 flex gap-[3px] items-center">
194
194
  <UnknownVerifierBadge className="w-[20px] h-[20px]" />
195
195
  Unknown Issuer
196
196
  </span>
197
197
  )}
198
198
  {verifierState === VERIFIER_STATES.appIssuer && (
199
- <span className="uppercase font-poppins text-base font-[500] text-cyan-600 flex gap-[3px] items-center">
199
+ <span className="uppercase font-poppins text-base font-medium text-cyan-600 flex gap-[3px] items-center">
200
200
  <VerifiedBadge className="w-[20px] h-[20px]" />
201
201
  App Issuer
202
202
  </span>
203
203
  )}
204
204
  {verifierState === VERIFIER_STATES.untrustedVerifier && (
205
- <span className="uppercase font-poppins text-base font-[500] text-red-mastercard flex gap-[3px] items-center">
205
+ <span className="uppercase font-poppins text-base font-medium text-red-mastercard flex gap-[3px] items-center">
206
206
  <RedFlag className="w-[20px] h-[20px]" />
207
207
  Untrusted Issuer
208
208
  </span>
@@ -63,7 +63,7 @@ const VerificationRow: React.FC<VerificationRowProps> = ({ verification }) => {
63
63
  const infoText = ''; // if we want certain verifications to have extra explanation, we can set this variable
64
64
 
65
65
  return (
66
- <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">
66
+ <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">
67
67
  <span
68
68
  className="font-[700] text-[11px] leading-[16px] uppercase flex items-center gap-[3px] select-none"
69
69
  style={{ color: statusColor }}
@@ -124,7 +124,7 @@ describe('VC2FrontFaceInfo', () => {
124
124
  expect(issuedBy).not.toBeNull();
125
125
  // The bug was whitespace-nowrap forcing one line that overflowed the card.
126
126
  expect(issuedBy?.className).not.toContain('whitespace-nowrap');
127
- expect(issuedBy?.className).toContain('break-words');
127
+ expect(issuedBy?.className).toContain('wrap-break-word');
128
128
  // line-clamp-2 only clamps on a block/-webkit-box, not a flex container,
129
129
  // so the container must NOT be `flex` (the original review-miss).
130
130
  expect(issuedBy?.className).toContain('line-clamp-2');
@@ -75,7 +75,7 @@ const VCDisplayFrontFace: React.FC<VCDisplayCardProps> = ({
75
75
 
76
76
  return (
77
77
  <div
78
- className={`z-[9] vc-display-main-card-front flex overflow-hidden flex-col items-center justify-between relative max-w-[400px] h-[100%] min-h-[600px] p-7 rounded-3xl shadow-3xl bg-emerald-700 vc-display-card-full-container ${className}`}
78
+ className={`z-[9] vc-display-main-card-front flex overflow-hidden flex-col items-center justify-between relative max-w-[400px] h-full min-h-[600px] p-7 rounded-3xl shadow-3xl bg-emerald-700 vc-display-card-full-container ${className}`}
79
79
  >
80
80
  <section className="bg-white rounded-bl-[50%] rounded-br-[50%] absolute top-0 w-[110%] h-[77%]"></section>
81
81
  <section className="flex flex-col items-center justify-center z-10 text-center credential-thumb-img">
@@ -45,7 +45,7 @@ export const ValidationStateIndicator: React.FC<VerifiableStateIndicatorProps> =
45
45
 
46
46
  return (
47
47
  <div className={`relative rounded-full w-[30px] h-[30px] ${bgColor}`}>
48
- <div className="relative w-[100%] h-[100%] flex items-center justify-center rounded-[50%] bg-white rounded-full overflow-hidden">
48
+ <div className="relative w-full h-full flex items-center justify-center rounded-[50%] bg-white rounded-full overflow-hidden">
49
49
  <img
50
50
  className="h-full w-full object-contain p-1"
51
51
  src={source ?? ''}
@@ -4,9 +4,9 @@ const PuzzlePiece: React.FC<{
4
4
  className?: string;
5
5
  size?: string;
6
6
  fill?: string;
7
- version?: 'outline' | 'filled' | 'with-plus';
8
- }> = ({ className = '', size = '21', fill = 'none', version = 'outline' }) => {
9
- if (version === 'outline') {
7
+ version?: 'outline-solid' | 'filled' | 'with-plus';
8
+ }> = ({ className = '', size = '21', fill = 'none', version = 'outline-solid' }) => {
9
+ if (version === 'outline-solid') {
10
10
  return (
11
11
  <svg
12
12
  width={size}
@@ -106,3 +106,99 @@ describe('Credential Helpers', () => {
106
106
  });
107
107
  });
108
108
  });
109
+
110
+ describe('award-date formatting', () => {
111
+ it.each(['awarded', 'issuance'] as const)(
112
+ 'falls back safely for a large malformed award date in %s mode',
113
+ dateType => {
114
+ const options = { uppercaseDate: false, dateType } as const;
115
+ const malformed = ' '.repeat(100_000);
116
+ expect(
117
+ getInfoFromCredential(
118
+ { ...VC2CredentialWithValidFrom, awardedDate: malformed } as never,
119
+ 'MMM dd, yyyy',
120
+ options
121
+ ).createdAt
122
+ ).toBe(
123
+ getInfoFromCredential(VC2CredentialWithValidFrom as never, 'MMM dd, yyyy', options)
124
+ .createdAt
125
+ );
126
+ }
127
+ );
128
+ it.each(['2027-10-01T00:30+02', '2027-10-01T00:30+0200', '2027-10-01T00:30+02:00'])(
129
+ 'recognizes an explicit award timezone in %s',
130
+ awardedDate => {
131
+ expect(
132
+ getInfoFromCredential(
133
+ { ...VC2CredentialWithValidFrom, awardedDate } as never,
134
+ 'MMM dd, yyyy',
135
+ { uppercaseDate: false, dateType: 'awarded' }
136
+ ).createdAt
137
+ ).toBe('Sep 30, 2027');
138
+ }
139
+ );
140
+ it.each(['20271001', '2027-10-01T00:00', '2027-10-01T00:00:00', '2027-10-01T20:00:00'])(
141
+ 'shows a consistent calendar award day for %s',
142
+ awardedDate => {
143
+ expect(
144
+ getInfoFromCredential(
145
+ { ...VC2CredentialWithValidFrom, awardedDate } as never,
146
+ 'MMM dd, yyyy',
147
+ { uppercaseDate: false, dateType: 'awarded' }
148
+ ).createdAt
149
+ ).toBe('Oct 01, 2027');
150
+ }
151
+ );
152
+ it('uses the standard award date only when requested and retains issuance metadata', () => {
153
+ const credential = { ...VC2CredentialWithValidFrom, awardedDate: '2027-10-01T00:00:00Z' };
154
+ expect(
155
+ getInfoFromCredential(credential as never, 'MMM dd, yyyy', {
156
+ uppercaseDate: false,
157
+ dateType: 'awarded',
158
+ }).createdAt
159
+ ).toBe('Oct 01, 2027');
160
+ expect(getInfoFromCredential(credential as never).createdAt).toBe(
161
+ getInfoFromCredential(VC2CredentialWithValidFrom as never).createdAt
162
+ );
163
+ });
164
+ it('falls back for missing or invalid award dates without inventing a date for an undated draft', () => {
165
+ expect(
166
+ getInfoFromCredential(
167
+ { ...VC2CredentialWithValidFrom, awardedDate: 'not-a-date' } as never,
168
+ 'MMM dd, yyyy',
169
+ { uppercaseDate: false, dateType: 'awarded' }
170
+ ).createdAt
171
+ ).toBe(
172
+ getInfoFromCredential(VC2CredentialWithValidFrom as never, 'MMM dd, yyyy', {
173
+ uppercaseDate: false,
174
+ }).createdAt
175
+ );
176
+ expect(
177
+ getInfoFromCredential(VC2CredentialNoDate as never, 'MMM dd, yyyy', {
178
+ dateType: 'awarded',
179
+ }).createdAt
180
+ ).toBe('');
181
+ });
182
+ it('keeps the UTC award day stable at a timezone boundary', () => {
183
+ expect(
184
+ getInfoFromCredential(
185
+ {
186
+ ...VC2CredentialWithValidFrom,
187
+ awardedDate: '2027-10-01T23:30:00-02:00',
188
+ } as never,
189
+ 'MMM dd, yyyy',
190
+ { uppercaseDate: false, dateType: 'awarded' }
191
+ ).createdAt
192
+ ).toBe('Oct 02, 2027');
193
+ });
194
+ });
195
+
196
+ it('treats a date-only award as a UTC calendar day', () => {
197
+ expect(
198
+ getInfoFromCredential(
199
+ { ...VC2CredentialWithValidFrom, awardedDate: '2027-10-01' } as never,
200
+ 'MMM dd, yyyy',
201
+ { uppercaseDate: false, dateType: 'awarded' }
202
+ ).createdAt
203
+ ).toBe('Oct 01, 2027');
204
+ });
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { format } from 'date-fns';
2
+ import { format, isValid, parseISO } from 'date-fns';
3
3
 
4
4
  import {
5
5
  Image,
@@ -43,7 +43,9 @@ export const getImageFromProfile = (profile: Profile): string => {
43
43
  export const getInfoFromCredential = (
44
44
  credential: VC | AchievementCredential,
45
45
  dateFormat: string = 'dd MMM yyyy',
46
- options: { uppercaseDate?: boolean } = { uppercaseDate: true }
46
+ options: { uppercaseDate?: boolean; dateType?: 'issuance' | 'awarded' } = {
47
+ uppercaseDate: true,
48
+ }
47
49
  ): CredentialInfo => {
48
50
  const { issuer, issuanceDate, validFrom } = credential;
49
51
 
@@ -57,12 +59,29 @@ export const getInfoFromCredential = (
57
59
 
58
60
  // Support both VC 2.0 (validFrom) and VC 1.0 (issuanceDate)
59
61
  // Gracefully handle missing dates
60
- const dateValue = validFrom || issuanceDate;
62
+ const awardDateText = typeof credential.awardedDate === 'string' ? credential.awardedDate : '';
63
+ const awardedDate =
64
+ options.dateType === 'awarded' && awardDateText ? parseISO(awardDateText) : undefined;
65
+ const validAwardedDate = awardedDate && isValid(awardedDate) ? awardedDate : undefined;
66
+ const dateValue = validAwardedDate ?? (validFrom || issuanceDate);
61
67
  let createdAt = '';
62
68
 
63
69
  if (dateValue) {
64
70
  try {
65
- createdAt = format(new Date(dateValue), dateFormat);
71
+ const date = dateValue instanceof Date ? dateValue : new Date(dateValue);
72
+ // Offset-less ISO values describe a calendar day. Only explicit
73
+ // instants need UTC conversion, matching the Details date helper.
74
+ // Inspect at most six suffix characters; never scan arbitrary input
75
+ // with a backtracking wildcard when looking for a timezone.
76
+ const hasAwardOffset =
77
+ validAwardedDate &&
78
+ (awardDateText.includes('T') || awardDateText.includes(' ')) &&
79
+ /(?:Z|[+-]\d{2}(?::?\d{2})?)$/i.test(awardDateText.slice(-6));
80
+ const displayDate =
81
+ validAwardedDate && hasAwardOffset
82
+ ? new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())
83
+ : date;
84
+ createdAt = format(displayDate, dateFormat);
66
85
  if (options.uppercaseDate) {
67
86
  createdAt = createdAt.toUpperCase();
68
87
  }
@@ -2,9 +2,9 @@ import React, { useEffect, type RefObject } from 'react';
2
2
 
3
3
  export const useScrollBorders = <Ref extends HTMLElement>({
4
4
  ref,
5
- topShowClassName = 'border-t border-t-[--color-grayscale-line]',
5
+ topShowClassName = 'border-t border-t-(--color-grayscale-line)',
6
6
  topHideClassName = 'border-t border-t-transparent',
7
- bottomShowClassName = 'border-b border-b-[--color-grayscale-line]',
7
+ bottomShowClassName = 'border-b border-b-(--color-grayscale-line)',
8
8
  bottomHideClassName = 'border-b border-b-transparent',
9
9
  }: {
10
10
  ref?: RefObject<Ref>;