profile-pane 3.2.0 → 3.2.2-test.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/README.md +50 -0
  2. package/icons-png/discord.png +0 -0
  3. package/icons-png/dribbble.png +0 -0
  4. package/icons-png/facebook.png +0 -0
  5. package/icons-png/instagram.png +0 -0
  6. package/icons-png/linkedin.png +0 -0
  7. package/icons-png/pinterest.png +0 -0
  8. package/icons-png/sharechat.png +0 -0
  9. package/icons-png/signup.png +0 -0
  10. package/icons-png/snapchat.png +0 -0
  11. package/icons-png/spotify.png +0 -0
  12. package/icons-png/telegram.png +0 -0
  13. package/icons-png/tiktok.png +0 -0
  14. package/icons-png/whatsapp.png +0 -0
  15. package/icons-png/x.png +0 -0
  16. package/icons-png/youtube.png +0 -0
  17. package/lib/303.profile-pane.js +1362 -0
  18. package/lib/303.profile-pane.js.map +1 -0
  19. package/lib/303.profile-pane.min.js +2 -0
  20. package/lib/303.profile-pane.min.js.map +1 -0
  21. package/lib/ProfileView.css +1090 -0
  22. package/lib/ProfileView.d.ts +2 -1
  23. package/lib/ProfileView.d.ts.map +1 -1
  24. package/lib/ProfileView.js +64 -36
  25. package/lib/buttonsHelper.d.ts +1 -1
  26. package/lib/buttonsHelper.d.ts.map +1 -1
  27. package/lib/buttonsHelper.js +2 -1
  28. package/lib/editProfilePane/EditCVCard.js +1 -1
  29. package/lib/editProfilePane/EditCommunitiesCard.js +1 -1
  30. package/lib/editProfilePane/EditFriendsCard.js +1 -1
  31. package/lib/editProfilePane/EditProfileView.d.ts +1 -1
  32. package/lib/editProfilePane/EditProfileView.d.ts.map +1 -1
  33. package/lib/editProfilePane/EditProfileView.js +4 -5
  34. package/lib/editProfilePane/editProfilePresenter.d.ts.map +1 -1
  35. package/lib/editProfilePane/editProfilePresenter.js +5 -4
  36. package/lib/icons-svg/profileIcons.d.ts +1 -1
  37. package/lib/icons-svg/profileIcons.d.ts.map +1 -1
  38. package/lib/icons-svg/profileIcons.js +9 -17
  39. package/lib/index.d.ts +1 -8
  40. package/lib/index.d.ts.map +1 -1
  41. package/lib/index.js +74 -40
  42. package/lib/ontology/otherPreferencesForm.ttl +32 -0
  43. package/lib/ontology/resumeForm.ttl +349 -0
  44. package/lib/ontology/socialMedia.ttl +433 -0
  45. package/lib/profile-pane.js +32266 -13247
  46. package/lib/profile-pane.js.map +1 -1
  47. package/lib/profile-pane.min.js +2315 -935
  48. package/lib/profile-pane.min.js.map +1 -1
  49. package/lib/rdfFormsHelper.d.ts +13 -1
  50. package/lib/rdfFormsHelper.d.ts.map +1 -1
  51. package/lib/rdfFormsHelper.js +13 -1
  52. package/lib/sections/bio/BioEditDialog.d.ts.map +1 -1
  53. package/lib/sections/bio/BioEditDialog.js +7 -7
  54. package/lib/sections/bio/BioSection.css +300 -0
  55. package/lib/sections/bio/BioSection.d.ts +3 -2
  56. package/lib/sections/bio/BioSection.d.ts.map +1 -1
  57. package/lib/sections/bio/BioSection.js +26 -19
  58. package/lib/sections/bio/mutations.d.ts.map +1 -1
  59. package/lib/sections/bio/mutations.js +14 -3
  60. package/lib/sections/contactInfo/ContactInfoEditDialog.css +354 -0
  61. package/lib/sections/contactInfo/ContactInfoEditDialog.d.ts +3 -1
  62. package/lib/sections/contactInfo/ContactInfoEditDialog.d.ts.map +1 -1
  63. package/lib/sections/contactInfo/ContactInfoEditDialog.js +183 -98
  64. package/lib/sections/contactInfo/ContactInfoSection.css +125 -0
  65. package/lib/sections/contactInfo/ContactInfoSection.d.ts +2 -0
  66. package/lib/sections/contactInfo/ContactInfoSection.d.ts.map +1 -1
  67. package/lib/sections/contactInfo/ContactInfoSection.js +64 -41
  68. package/lib/sections/contactInfo/mutations.d.ts.map +1 -1
  69. package/lib/sections/contactInfo/mutations.js +51 -16
  70. package/lib/sections/education/EducationEditDialog.d.ts +3 -1
  71. package/lib/sections/education/EducationEditDialog.d.ts.map +1 -1
  72. package/lib/sections/education/EducationEditDialog.js +170 -92
  73. package/lib/sections/education/EducationSection.css +133 -0
  74. package/lib/sections/education/EducationSection.d.ts +3 -2
  75. package/lib/sections/education/EducationSection.d.ts.map +1 -1
  76. package/lib/sections/education/EducationSection.js +32 -25
  77. package/lib/sections/education/mutations.d.ts.map +1 -1
  78. package/lib/sections/education/mutations.js +14 -3
  79. package/lib/sections/heading/HeadingEditDialog.d.ts +4 -1
  80. package/lib/sections/heading/HeadingEditDialog.d.ts.map +1 -1
  81. package/lib/sections/heading/HeadingEditDialog.js +287 -162
  82. package/lib/sections/heading/HeadingSection.css +862 -0
  83. package/lib/sections/heading/HeadingSection.d.ts +3 -2
  84. package/lib/sections/heading/HeadingSection.d.ts.map +1 -1
  85. package/lib/sections/heading/HeadingSection.js +63 -32
  86. package/lib/sections/heading/imageHelpers.d.ts +1 -0
  87. package/lib/sections/heading/imageHelpers.d.ts.map +1 -1
  88. package/lib/sections/heading/imageHelpers.js +40 -1
  89. package/lib/sections/heading/mutations.d.ts.map +1 -1
  90. package/lib/sections/heading/mutations.js +86 -23
  91. package/lib/sections/heading/selectors.d.ts.map +1 -1
  92. package/lib/sections/heading/selectors.js +14 -3
  93. package/lib/sections/heading/types.d.ts +1 -2
  94. package/lib/sections/heading/types.d.ts.map +1 -1
  95. package/lib/sections/languages/LanguageEditDialog.d.ts +3 -1
  96. package/lib/sections/languages/LanguageEditDialog.d.ts.map +1 -1
  97. package/lib/sections/languages/LanguageEditDialog.js +202 -119
  98. package/lib/sections/languages/LanguageSection.css +53 -0
  99. package/lib/sections/languages/LanguageSection.d.ts +2 -0
  100. package/lib/sections/languages/LanguageSection.d.ts.map +1 -1
  101. package/lib/sections/languages/LanguageSection.js +42 -31
  102. package/lib/sections/languages/mutations.d.ts.map +1 -1
  103. package/lib/sections/languages/mutations.js +60 -161
  104. package/lib/sections/languages/selectors.d.ts.map +1 -1
  105. package/lib/sections/languages/selectors.js +1 -2
  106. package/lib/sections/projects/ProjectEditDialog.d.ts +2 -1
  107. package/lib/sections/projects/ProjectEditDialog.d.ts.map +1 -1
  108. package/lib/sections/projects/ProjectEditDialog.js +13 -24
  109. package/lib/sections/projects/ProjectSection.css +368 -0
  110. package/lib/sections/projects/ProjectSection.d.ts +2 -1
  111. package/lib/sections/projects/ProjectSection.d.ts.map +1 -1
  112. package/lib/sections/projects/ProjectSection.js +116 -34
  113. package/lib/sections/projects/mutations.d.ts.map +1 -1
  114. package/lib/sections/projects/mutations.js +109 -132
  115. package/lib/sections/projects/selectors.d.ts.map +1 -1
  116. package/lib/sections/projects/selectors.js +4 -45
  117. package/lib/{QRCodeCard.d.ts → sections/qrcode/QRCodeCard.d.ts} +2 -1
  118. package/lib/sections/qrcode/QRCodeCard.d.ts.map +1 -0
  119. package/lib/{QRCodeCard.js → sections/qrcode/QRCodeCard.js} +59 -11
  120. package/lib/sections/qrcode/QRCodeSection.css +108 -0
  121. package/lib/sections/qrcode/QRCodeSection.d.ts +4 -0
  122. package/lib/sections/qrcode/QRCodeSection.d.ts.map +1 -0
  123. package/lib/sections/qrcode/QRCodeSection.js +17 -0
  124. package/lib/sections/resume/ResumeEditDialog.d.ts +10 -1
  125. package/lib/sections/resume/ResumeEditDialog.d.ts.map +1 -1
  126. package/lib/sections/resume/ResumeEditDialog.js +531 -149
  127. package/lib/sections/resume/ResumeSection.css +350 -0
  128. package/lib/sections/resume/ResumeSection.d.ts +3 -2
  129. package/lib/sections/resume/ResumeSection.d.ts.map +1 -1
  130. package/lib/sections/resume/ResumeSection.js +78 -49
  131. package/lib/sections/resume/mutations.d.ts.map +1 -1
  132. package/lib/sections/resume/mutations.js +17 -3
  133. package/lib/sections/resume/selectors.d.ts.map +1 -1
  134. package/lib/sections/resume/selectors.js +1 -0
  135. package/lib/sections/resume/types.d.ts +1 -0
  136. package/lib/sections/resume/types.d.ts.map +1 -1
  137. package/lib/sections/shared/collapsibleSection.d.ts.map +1 -1
  138. package/lib/sections/shared/collapsibleSection.js +1 -0
  139. package/lib/sections/shared/phoneCountries.d.ts +1 -1
  140. package/lib/sections/shared/phoneCountries.d.ts.map +1 -1
  141. package/lib/sections/shared/phoneCountries.js +2 -2
  142. package/lib/sections/shared/projectCommunityNodes.d.ts +6 -0
  143. package/lib/sections/shared/projectCommunityNodes.d.ts.map +1 -0
  144. package/lib/sections/shared/projectCommunityNodes.js +56 -0
  145. package/lib/sections/shared/rdfMutationHelpers.d.ts +35 -2
  146. package/lib/sections/shared/rdfMutationHelpers.d.ts.map +1 -1
  147. package/lib/sections/shared/rdfMutationHelpers.js +290 -14
  148. package/lib/sections/shared/sectionCardHelpers.d.ts.map +1 -1
  149. package/lib/sections/shared/sectionCardHelpers.js +80 -11
  150. package/lib/sections/shared/types.d.ts +24 -0
  151. package/lib/sections/shared/types.d.ts.map +1 -1
  152. package/lib/sections/skills/SkillsEditDialog.d.ts +3 -1
  153. package/lib/sections/skills/SkillsEditDialog.d.ts.map +1 -1
  154. package/lib/sections/skills/SkillsEditDialog.js +136 -115
  155. package/lib/sections/skills/SkillsSection.css +173 -0
  156. package/lib/sections/skills/SkillsSection.d.ts +2 -0
  157. package/lib/sections/skills/SkillsSection.d.ts.map +1 -1
  158. package/lib/sections/skills/SkillsSection.js +107 -47
  159. package/lib/sections/skills/mutations.d.ts.map +1 -1
  160. package/lib/sections/skills/mutations.js +25 -21
  161. package/lib/sections/skills/selectors.d.ts.map +1 -1
  162. package/lib/sections/skills/selectors.js +5 -3
  163. package/lib/sections/social/SocialEditDialog.d.ts +3 -1
  164. package/lib/sections/social/SocialEditDialog.d.ts.map +1 -1
  165. package/lib/sections/social/SocialEditDialog.js +170 -62
  166. package/lib/sections/social/SocialSection.css +194 -0
  167. package/lib/sections/social/SocialSection.d.ts +4 -3
  168. package/lib/sections/social/SocialSection.d.ts.map +1 -1
  169. package/lib/sections/social/SocialSection.js +59 -43
  170. package/lib/sections/social/mutations.d.ts.map +1 -1
  171. package/lib/sections/social/mutations.js +23 -132
  172. package/lib/specialButtons/AddMeToYourFriends.css +54 -0
  173. package/lib/specialButtons/addContact/AddMeToYourContacts.css +1118 -0
  174. package/lib/specialButtons/addContact/ContactCreationDialog.d.ts +10 -0
  175. package/lib/specialButtons/addContact/ContactCreationDialog.d.ts.map +1 -0
  176. package/lib/specialButtons/addContact/ContactCreationDialog.js +1123 -0
  177. package/lib/specialButtons/addContact/addMeToYourContacts.d.ts +16 -0
  178. package/lib/specialButtons/addContact/addMeToYourContacts.d.ts.map +1 -0
  179. package/lib/specialButtons/addContact/addMeToYourContacts.js +136 -0
  180. package/lib/specialButtons/addContact/contactsErrors.d.ts +8 -0
  181. package/lib/specialButtons/addContact/contactsErrors.d.ts.map +1 -0
  182. package/lib/specialButtons/addContact/contactsErrors.js +106 -0
  183. package/lib/specialButtons/addContact/contactsTypes.d.ts +43 -0
  184. package/lib/specialButtons/addContact/contactsTypes.d.ts.map +1 -0
  185. package/lib/specialButtons/addContact/contactsTypes.js +5 -0
  186. package/lib/specialButtons/addContact/helpers.d.ts +7 -0
  187. package/lib/specialButtons/addContact/helpers.d.ts.map +1 -0
  188. package/lib/specialButtons/addContact/helpers.js +103 -0
  189. package/lib/specialButtons/addContact/mutations.d.ts +16 -0
  190. package/lib/specialButtons/addContact/mutations.d.ts.map +1 -0
  191. package/lib/specialButtons/addContact/mutations.js +300 -0
  192. package/lib/specialButtons/addContact/selectors.d.ts +10 -0
  193. package/lib/specialButtons/addContact/selectors.d.ts.map +1 -0
  194. package/lib/specialButtons/addContact/selectors.js +163 -0
  195. package/lib/{addMeToYourFriends.d.ts → specialButtons/addMeToYourFriends.d.ts} +6 -4
  196. package/lib/specialButtons/addMeToYourFriends.d.ts.map +1 -0
  197. package/lib/{addMeToYourFriends.js → specialButtons/addMeToYourFriends.js} +46 -11
  198. package/lib/styles/CollapsibleSection.css +519 -0
  199. package/lib/styles/EditDialogs.css +506 -686
  200. package/lib/styles/EditDialogs.responsive.css +989 -0
  201. package/lib/texts/buttonTexts.d.ts +9 -0
  202. package/lib/texts/buttonTexts.d.ts.map +1 -0
  203. package/lib/texts/buttonTexts.js +14 -0
  204. package/lib/texts/dialogTexts.d.ts +14 -0
  205. package/lib/texts/dialogTexts.d.ts.map +1 -0
  206. package/lib/texts/dialogTexts.js +19 -0
  207. package/lib/texts/messageTexts.d.ts +42 -0
  208. package/lib/texts/messageTexts.d.ts.map +1 -0
  209. package/lib/texts/messageTexts.js +47 -0
  210. package/lib/texts/profileTexts.d.ts +14 -0
  211. package/lib/texts/profileTexts.d.ts.map +1 -0
  212. package/lib/texts/profileTexts.js +19 -0
  213. package/lib/texts/qrCodeTexts.d.ts +2 -0
  214. package/lib/texts/qrCodeTexts.d.ts.map +1 -0
  215. package/lib/texts/qrCodeTexts.js +7 -0
  216. package/lib/texts.d.ts +5 -60
  217. package/lib/texts.d.ts.map +1 -1
  218. package/lib/texts.js +55 -70
  219. package/lib/ui/dialog.css +233 -0
  220. package/lib/ui/dialog.d.ts +15 -1
  221. package/lib/ui/dialog.d.ts.map +1 -1
  222. package/lib/ui/dialog.js +245 -45
  223. package/lib/ui/dialog.responsive.css +195 -0
  224. package/lib/ui/errors.d.ts.map +1 -1
  225. package/lib/ui/errors.js +2 -1
  226. package/lib/ui/spinner.d.ts +3 -0
  227. package/lib/ui/spinner.d.ts.map +1 -0
  228. package/lib/ui/spinner.js +13 -0
  229. package/lib/utils/debug.d.ts +5 -0
  230. package/lib/utils/debug.d.ts.map +1 -0
  231. package/lib/utils/debug.js +23 -0
  232. package/lib/utils/errorDisplay.d.ts +2 -0
  233. package/lib/utils/errorDisplay.d.ts.map +1 -0
  234. package/lib/utils/errorDisplay.js +19 -0
  235. package/package.json +34 -26
  236. package/lib/ChatWithMe.d.ts +0 -7
  237. package/lib/ChatWithMe.d.ts.map +0 -1
  238. package/lib/ChatWithMe.js +0 -90
  239. package/lib/QRCodeCard.d.ts.map +0 -1
  240. package/lib/addMeToYourFriends.d.ts.map +0 -1
  241. package/lib/sections/heading/camera.d.ts +0 -19
  242. package/lib/sections/heading/camera.d.ts.map +0 -1
  243. package/lib/sections/heading/camera.js +0 -199
  244. package/lib/styles/BioSection.css +0 -77
  245. package/lib/styles/CVCard.css +0 -142
  246. package/lib/styles/ChatWithMe.css +0 -6
  247. package/lib/styles/ContactInfoEditDialog.css +0 -153
  248. package/lib/styles/EducationCard.css +0 -103
  249. package/lib/styles/HeadingSection.css +0 -309
  250. package/lib/styles/ProfileCard.css +0 -66
  251. package/lib/styles/ProfileView.css +0 -65
  252. package/lib/styles/ProjectsCard.css +0 -206
  253. package/lib/styles/QRCodeCard.css +0 -43
  254. package/lib/styles/SocialCard.css +0 -89
  255. package/lib/styles/dialog.css +0 -209
  256. package/lib/styles/utilities.css +0 -740
@@ -0,0 +1,368 @@
1
+ /* Projects section styles. */
2
+
3
+ .profile__section[data-profile-section='projects'],
4
+ .profile__section--empty[data-profile-section='projects'] {
5
+ --project-card-rail-gap: var(--spacing-md, 1rem);
6
+ --project-card-rail-wrap: nowrap;
7
+ --project-card-rail-overflow-x: auto;
8
+ --project-card-rail-scroll-snap-type: x proximity;
9
+ --project-card-flex-basis: min(420px, 88vw);
10
+ --project-card-flex: 0 0 var(--project-card-flex-basis);
11
+ --project-card-max-width: none;
12
+ --project-card-scrollbar-height: 0.5rem;
13
+ --project-card-thumb-column-width: 88px;
14
+ --project-card-thumb-size: 4.125rem;
15
+ --project-card-follow-label-gap: var(--spacing-xxs, 0.3125rem);
16
+ --project-card-wrapper-gap: var(--spacing-2xs, 0.625rem);
17
+ --project-card-content-gap: var(--spacing-xxs, 0.3125rem);
18
+ --project-card-heading-gap: 0.1875rem;
19
+ --project-card-meta-margin-top: var(--spacing-xs, 0.75rem);
20
+ --project-card-meta-font-size: 0.86rem;
21
+ --project-card-footer-padding: var(--spacing-xs, 0.75rem);
22
+ --project-card-more-button-gap: var(--spacing-xs, 0.375rem);
23
+ --project-card-more-button-width: auto;
24
+ --project-card-more-button-part-width: auto;
25
+ --project-card-mobile-more-button-margin-top: var(--spacing-xs, 0.75rem);
26
+ --project-card-more-button-margin-top: 0;
27
+ --project-card-collapsed-extra-display: flex;
28
+ --project-card-more-icon-transform: rotate(0deg);
29
+ }
30
+
31
+ /* Rail and cards */
32
+ .project-card__rail {
33
+ display: flex;
34
+ gap: var(--project-card-rail-gap);
35
+ overflow-x: var(--project-card-rail-overflow-x, auto);
36
+ padding: 0;
37
+ margin: 0;
38
+ list-style: none;
39
+ flex-wrap: var(--project-card-rail-wrap, nowrap);
40
+ scroll-snap-type: var(--project-card-rail-scroll-snap-type, x proximity);
41
+ }
42
+
43
+ solid-ui-button.project-card__follow-button {
44
+ width: auto;
45
+ min-width: 0;
46
+ max-width: none;
47
+ gap: var(--project-card-follow-label-gap);
48
+ --button-border-width: var(--border-width-sm, 0.1rem);
49
+ --button-font-size-sm: var(--font-size-sm, 0.875rem);
50
+ --button-font-weight: var(--font-weight-md, 500);
51
+ --button-padding-sm: var(--spacing-base, 0.5rem) var(--spacing-2xs, 0.625rem);
52
+ --button-border-radius: var(--border-radius-md, 0.5rem);
53
+ --button-background: var(--color-card-bg, var(--white, #FFF));
54
+ --button-text: var(--color-primary, #7C4DFF);
55
+ --button-border: var(--color-primary, #7C4DFF);
56
+ --button-hover-background: var(--color-primary, #7C4DFF);
57
+ --button-hover-text: var(--color-text-on-action, var(--white, #FFF));
58
+ --button-hover-border: var(--color-primary, #7C4DFF);
59
+ }
60
+
61
+ .project-card__follow-label {
62
+ display: inline-flex;
63
+ align-items: center;
64
+ gap: var(--project-card-follow-label-gap);
65
+ }
66
+
67
+ .project-card__follow-label--hover {
68
+ display: none;
69
+ }
70
+
71
+ .project-card__follow-label--loading {
72
+ display: none;
73
+ align-items: center;
74
+ gap: var(--project-card-follow-label-gap);
75
+ }
76
+
77
+ solid-ui-button.project-card__follow-button:hover .project-card__follow-label--default,
78
+ solid-ui-button.project-card__follow-button:focus-visible .project-card__follow-label--default,
79
+ solid-ui-button.project-card__follow-button:focus-within .project-card__follow-label--default {
80
+ display: none;
81
+ }
82
+
83
+ solid-ui-button.project-card__follow-button:hover .project-card__follow-label--hover,
84
+ solid-ui-button.project-card__follow-button:focus-visible .project-card__follow-label--hover,
85
+ solid-ui-button.project-card__follow-button:focus-within .project-card__follow-label--hover {
86
+ display: inline-flex;
87
+ }
88
+
89
+ solid-ui-button.project-card__follow-button[data-loading='true'] {
90
+ pointer-events: none;
91
+ }
92
+
93
+ solid-ui-button.project-card__follow-button[data-loading='true'] .project-card__follow-label--default,
94
+ solid-ui-button.project-card__follow-button[data-loading='true'] .project-card__follow-label--hover {
95
+ display: none;
96
+ }
97
+
98
+ solid-ui-button.project-card__follow-button[data-loading='true'] .project-card__follow-label--loading {
99
+ display: inline-flex;
100
+ }
101
+
102
+ solid-ui-button.project-card__follow-button[data-loading='true'] .loading-spinner {
103
+ width: var(--icon-xxs, 1rem);
104
+ height: var(--icon-xxs, 1rem);
105
+ border-width: 0.125rem;
106
+ }
107
+
108
+ .project-card__rail::-webkit-scrollbar {
109
+ height: var(--project-card-scrollbar-height);
110
+ }
111
+
112
+ .project-card__rail::-webkit-scrollbar-thumb {
113
+ background: var(--color-icon-muted, #90A1B9);
114
+ border-radius: 999px;
115
+ }
116
+
117
+ .project-card {
118
+ display: flex;
119
+ flex-direction: column;
120
+ flex: var(--project-card-flex, 0 0 var(--project-card-flex-basis));
121
+ width: 100%;
122
+ max-width: var(--project-card-max-width, none);
123
+ min-width: 0;
124
+ box-sizing: border-box;
125
+ scroll-snap-align: start;
126
+ border-radius: var(--border-radius-md, 0.5rem);
127
+ border: var(--border-width-sm, 0.1rem) solid var(--color-border, var(--gray-200, #E5E7EB));
128
+ padding: var(--spacing-md, 1.25rem);
129
+ justify-content: center;
130
+ align-items: flex-start;
131
+ gap: var(--spacing-sm, 0.938rem);
132
+ flex-shrink: 0;
133
+ }
134
+
135
+ .project-card__link {
136
+ display: block;
137
+ width: 100%;
138
+ align-self: stretch;
139
+ color: inherit;
140
+ text-decoration: none;
141
+ }
142
+
143
+ .project-card__link:hover .project-card__title,
144
+ .project-card__link:focus-visible .project-card__title {
145
+ text-decoration: underline;
146
+ }
147
+
148
+ .project-card__wrapper {
149
+ display: grid;
150
+ grid-template-columns: var(--project-card-thumb-column-width) 1fr;
151
+ gap: var(--project-card-wrapper-gap);
152
+ width: 100%;
153
+ align-items: start;
154
+ border-radius: var(--border-radius-md, 0.5rem);
155
+ border-bottom: 1px solid var(--color-border, var(--gray-200, #E5E7EB));
156
+ }
157
+
158
+ .project-card__thumb {
159
+ display: flex;
160
+ align-items: center;
161
+ justify-content: center;
162
+ width: var(--project-card-thumb-size);
163
+ height: var(--project-card-thumb-size);
164
+ overflow: hidden;
165
+ border-radius: var(--border-radius-base, 0.3125rem);
166
+ background: var(--color-surface-placeholder, var(--gray-200, #E5E7EB));
167
+ padding: 0.656rem var(--spacing-2xs, 0.625rem);
168
+ aspect-ratio: 1/1;
169
+ }
170
+
171
+ .project-card__thumb-image {
172
+ width: 100%;
173
+ height: 100%;
174
+ object-fit: cover;
175
+ display: block;
176
+ }
177
+
178
+ .project-card__thumb-fallback {
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: center;
182
+ width: 100%;
183
+ height: 100%;
184
+ font-size: 0.72rem;
185
+ color: var(--color-text-detail, var(--slate-500, #62748E));
186
+ text-transform: uppercase;
187
+ letter-spacing: 0.04rem;
188
+ }
189
+
190
+ .project-card__content {
191
+ display: flex;
192
+ flex-direction: column;
193
+ gap: var(--project-card-content-gap);
194
+ min-width: 0;
195
+ }
196
+
197
+ .project-card__heading-group {
198
+ display: flex;
199
+ flex-direction: column;
200
+ gap: var(--project-card-heading-gap);
201
+ min-width: 0;
202
+ }
203
+
204
+ .project-card__title,
205
+ .project-card__organization,
206
+ .project-card__category,
207
+ .project-card__meta,
208
+ .project-card__description {
209
+ margin: 0;
210
+ }
211
+
212
+ .project-card__title {
213
+ overflow: hidden;
214
+ color: var(--color-text-subheading, var(--gray-900, #101828));
215
+ text-overflow: ellipsis;
216
+ font-size: var(--font-size-lg, 1.125rem);
217
+ font-weight: var(--font-weight-bold, 600);
218
+ display: -webkit-box;
219
+ -webkit-box-orient: vertical;
220
+ -webkit-line-clamp: 1;
221
+ line-clamp: 1;
222
+ align-self: stretch;
223
+ }
224
+
225
+ .project-card__organization {
226
+ color: var(--color-text-primary, var(--gray-700, #364153));
227
+ font-size: var(--font-size-sm, 0.875rem);
228
+ font-weight: var(--font-weight-md, 500);
229
+ overflow: hidden;
230
+ text-overflow: ellipsis;
231
+ display: -webkit-box;
232
+ -webkit-box-orient: vertical;
233
+ -webkit-line-clamp: 2;
234
+ line-clamp: 2;
235
+ line-height: 1.35;
236
+ align-self: stretch;
237
+ }
238
+
239
+ .project-card__category {
240
+ font-size: var(--font-size-xxs, 0.75rem);
241
+ font-weight: var(--font-weight-md, 500);
242
+ }
243
+
244
+ .project-card__category--project {
245
+ color: var(--purple-500, #AD46FF);
246
+ }
247
+
248
+ .project-card__category--community {
249
+ color: var(--yellow-700, #A65F00);
250
+ }
251
+
252
+ .project-card__category--unknown {
253
+ color: var(--color-text-control, var(--slate-700, #314158));
254
+ }
255
+
256
+ .project-card__meta {
257
+ margin-top: var(--project-card-meta-margin-top);
258
+ overflow-wrap: anywhere;
259
+ font-size: var(--project-card-meta-font-size, 0.86rem);
260
+ }
261
+
262
+ .project-card__footer {
263
+ display: flex;
264
+ justify-content: flex-start;
265
+ align-self: stretch;
266
+ margin-top: auto;
267
+ padding: var(--spacing-sm, 0.938rem) 0 0;
268
+ }
269
+
270
+ .profile__section[data-profile-section='projects'] .profile-section-inline-error {
271
+ margin-top: var(--spacing-sm, 0.938rem);
272
+ padding: var(--spacing-xs, 0.75rem);
273
+ border: 1px solid var(--dialog-error-border, var(--pink-700, #ff98b3));
274
+ border-radius: var(--border-radius-base, 0.3125rem);
275
+ background: var(--dialog-error-background, var(--pink-500, #ffdde6));
276
+ color: var(--dialog-error-text, var(--red-600, #B00020));
277
+ text-align: left;
278
+ white-space: pre-wrap;
279
+ overflow-wrap: anywhere;
280
+ }
281
+
282
+ /* Action buttons */
283
+
284
+ solid-ui-button.project-card__more-button {
285
+ width: var(--project-card-more-button-width, auto);
286
+ margin-top: var(--project-card-more-button-margin-top, 0);
287
+ --button-height-sm: 0;
288
+ --button-padding-x-sm: 0;
289
+ --button-background: transparent;
290
+ --button-border: transparent;
291
+ --button-text: var(--color-primary, #7C4DFF);
292
+ --button-hover-background: transparent;
293
+ --button-hover-border: transparent;
294
+ --button-hover-text: var(--color-primary, #7C4DFF);
295
+ }
296
+
297
+ .project-card__more-icon {
298
+ display: inline-flex;
299
+ align-items: center;
300
+ justify-content: center;
301
+ transform: var(--project-card-more-icon-transform, rotate(0deg));
302
+ transition: transform var(--animation-duration, 0.2s) ease;
303
+ }
304
+
305
+ solid-ui-button.project-card__more-button::part(button) {
306
+ align-items: center;
307
+ justify-content: center;
308
+ width: var(--project-card-more-button-part-width, auto);
309
+ gap: var(--project-card-more-button-gap, 0.375rem);
310
+ padding: 0;
311
+ border: 0;
312
+ background: transparent;
313
+ color: var(--color-primary, #7C4DFF);
314
+ font-size: var(--font-size-sm, 0.875rem);
315
+ font-weight: var(--font-weight-bold, 600);
316
+ cursor: var(--profile-interactive-cursor, pointer);
317
+ }
318
+
319
+ /* Compact layout */
320
+ :is(.profile-pane-host, .profile-pane-root)[data-layout='mobile'] .profile__section[data-profile-section='projects'],
321
+ :is(.profile-pane-host, .profile-pane-root)[data-layout='mobile'] .profile__section--empty[data-profile-section='projects'] {
322
+ --project-card-rail-wrap: wrap;
323
+ --project-card-rail-overflow-x: visible;
324
+ --project-card-rail-scroll-snap-type: none;
325
+ --project-card-flex: 1 1 100%;
326
+ --project-card-max-width: 100%;
327
+ --project-card-more-button-width: 100%;
328
+ --project-card-more-button-part-width: 100%;
329
+ --project-card-more-button-margin-top: var(--project-card-mobile-more-button-margin-top, var(--spacing-xs, 0.75rem));
330
+ }
331
+
332
+ .profile-section-collapsible[data-mobile-expanded="false"] .project-card:nth-child(n + 3) {
333
+ display: var(--project-card-collapsed-extra-display, flex);
334
+ }
335
+
336
+ solid-ui-button.project-card__more-button[data-mobile-expanded="true"] .project-card__more-icon {
337
+ --project-card-more-icon-transform: rotate(180deg);
338
+ }
339
+
340
+ @media (max-width: 576px) {
341
+ .profile__section[data-profile-section='projects'],
342
+ .profile__section--empty[data-profile-section='projects'] {
343
+ --project-card-rail-wrap: wrap;
344
+ --project-card-rail-overflow-x: visible;
345
+ --project-card-rail-scroll-snap-type: none;
346
+ --project-card-flex: 1 1 100%;
347
+ --project-card-max-width: 100%;
348
+ --project-card-more-button-width: 100%;
349
+ --project-card-more-button-part-width: 100%;
350
+ --project-card-more-button-margin-top: var(--project-card-mobile-more-button-margin-top, var(--spacing-xs, 0.75rem));
351
+ --project-card-collapsed-extra-display: none;
352
+ }
353
+ }
354
+
355
+ @container profile-pane (max-width: 576px) {
356
+ .profile__section[data-profile-section='projects'],
357
+ .profile__section--empty[data-profile-section='projects'] {
358
+ --project-card-rail-wrap: wrap;
359
+ --project-card-rail-overflow-x: visible;
360
+ --project-card-rail-scroll-snap-type: none;
361
+ --project-card-flex: 1 1 100%;
362
+ --project-card-max-width: 100%;
363
+ --project-card-more-button-width: 100%;
364
+ --project-card-more-button-part-width: 100%;
365
+ --project-card-more-button-margin-top: var(--project-card-mobile-more-button-margin-top, var(--spacing-xs, 0.75rem));
366
+ --project-card-collapsed-extra-display: none;
367
+ }
368
+ }
@@ -1,6 +1,7 @@
1
+ import 'solid-ui/components/actions/button';
1
2
  import { LiveStore, NamedNode } from 'rdflib';
2
3
  import { ViewerMode } from '../../types';
3
4
  import { ProjectDetails } from './types';
4
- import '../../styles/ProjectsCard.css';
5
+ import './ProjectSection.css';
5
6
  export declare function renderProjectSection(store: LiveStore, subject: NamedNode, projects: ProjectDetails[], viewerMode: ViewerMode, onSaved?: () => Promise<void> | void): import("lit-html").TemplateResult<1> | "";
6
7
  //# sourceMappingURL=ProjectSection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectSection.d.ts","sourceRoot":"","sources":["../../../src/sections/projects/ProjectSection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,cAAc,EAAc,MAAM,SAAS,CAAA;AAMpD,OAAO,+BAA+B,CAAA;AAmRtC,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,cAAc,EAAE,EAC1B,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,6CAYrC"}
1
+ {"version":3,"file":"ProjectSection.d.ts","sourceRoot":"","sources":["../../../src/sections/projects/ProjectSection.ts"],"names":[],"mappings":"AACA,OAAO,oCAAoC,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,cAAc,EAAc,MAAM,SAAS,CAAA;AAMpD,OAAO,sBAAsB,CAAA;AAuW7B,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,cAAc,EAAE,EAC1B,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,6CAYrC"}
@@ -5,13 +5,30 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.renderProjectSection = renderProjectSection;
7
7
  var _litHtml = require("lit-html");
8
+ require("solid-ui/components/actions/button");
8
9
  var _texts = require("../../texts");
9
10
  var _ProjectEditDialog = require("./ProjectEditDialog");
10
11
  var _mutations = require("./mutations");
11
12
  var _profileIcons = require("../../icons-svg/profileIcons");
12
- require("../../styles/ProjectsCard.css");
13
+ require("./ProjectSection.css");
13
14
  var _collapsibleSection = require("../shared/collapsibleSection");
15
+ var _spinner = require("../../ui/spinner");
16
+ var _errorDisplay = require("../../utils/errorDisplay");
14
17
  const MAX_VISIBLE_PROJECTS_MOBILE = 2;
18
+ function setProjectsSectionError(section, message) {
19
+ const errorBox = section.querySelector('.profile-section-inline-error');
20
+ if (!errorBox) return;
21
+ if (!message) {
22
+ errorBox.textContent = '';
23
+ errorBox.hidden = true;
24
+ errorBox.setAttribute('aria-hidden', 'true');
25
+ return;
26
+ }
27
+ errorBox.textContent = message;
28
+ errorBox.hidden = false;
29
+ errorBox.setAttribute('aria-hidden', 'false');
30
+ errorBox.focus();
31
+ }
15
32
  function toggleProjectsMobileList(event) {
16
33
  const button = event.currentTarget;
17
34
  const section = button?.closest('.profile-section-collapsible');
@@ -34,7 +51,7 @@ function renderProjectImage(src, altText) {
34
51
  loading="lazy"
35
52
  />
36
53
  ` : (0, _litHtml.html)`
37
- <div class="project-card__thumb-fallback flex-center" role="img" aria-label=${altText} tabindex="0">
54
+ <div class="project-card__thumb-fallback" role="img" aria-label=${altText}>
38
55
  ${altText}
39
56
  </div>
40
57
  `;
@@ -55,22 +72,41 @@ function renderProject(project, store, subject, viewerMode, onSaved) {
55
72
  if (!project) return (0, _litHtml.html)``;
56
73
  const handleUnfollow = async event => {
57
74
  event.preventDefault();
75
+ event.stopPropagation();
58
76
  if (viewerMode !== 'owner') return;
77
+ const unfollowButton = event.currentTarget;
78
+ const section = event.currentTarget?.closest('[data-profile-section="projects"]');
59
79
  const removePlan = {
60
80
  create: [],
61
81
  update: [],
62
82
  remove: [toProjectRow(project, 'deleted')]
63
83
  };
64
- await (0, _mutations.processProjectsMutations)(store, subject, removePlan);
65
- if (onSaved) {
66
- await onSaved();
84
+ try {
85
+ unfollowButton?.setAttribute('disabled', '');
86
+ unfollowButton?.setAttribute('data-loading', 'true');
87
+ unfollowButton?.setAttribute('aria-busy', 'true');
88
+ await (0, _mutations.processProjectsMutations)(store, subject, removePlan);
89
+ if (section) {
90
+ setProjectsSectionError(section, null);
91
+ }
92
+ if (onSaved) {
93
+ await onSaved();
94
+ }
95
+ } catch (error) {
96
+ if (section) {
97
+ setProjectsSectionError(section, (0, _errorDisplay.formatDisplayError)(error, _texts.unfollowProjectFailedMessageText));
98
+ }
99
+ } finally {
100
+ unfollowButton?.removeAttribute('disabled');
101
+ unfollowButton?.removeAttribute('data-loading');
102
+ unfollowButton?.setAttribute('aria-busy', 'false');
67
103
  }
68
104
  };
69
105
  const normalizedCategory = (project.category || '').trim().toLowerCase();
70
106
  const categoryModifier = normalizedCategory === 'project' ? 'project' : normalizedCategory === 'community' ? 'community' : 'unknown';
71
107
  const categoryLabel = normalizedCategory && normalizedCategory !== 'unknown' ? normalizedCategory.charAt(0).toUpperCase() + normalizedCategory.slice(1) : 'Uncategorized';
72
108
  return (0, _litHtml.html)`
73
- <li class="project-card flex-column" role="listitem">
109
+ <li class="project-card" role="listitem">
74
110
  <a
75
111
  class="project-card__link"
76
112
  href=${project.url}
@@ -79,26 +115,33 @@ function renderProject(project, store, subject, viewerMode, onSaved) {
79
115
  aria-label=${project.title ? `Open ${project.title}` : 'Open project link'}
80
116
  >
81
117
  <div class="project-card__wrapper">
82
- <div class="project-card__thumb flex-center">
118
+ <div class="project-card__thumb">
83
119
  ${renderProjectImage(project.imageUrl, project.title || 'Project preview')}
84
120
  </div>
85
121
  <div class="project-card__content">
86
- <p class="project-card__title"><strong>${project.title || project.url}</strong></p>
87
- <p class="project-card__organization">${project.orgName || 'Organization unknown'}</p>
122
+ <div class="project-card__heading-group">
123
+ <h3 class="project-card__title">${project.title || project.url}</h3>
124
+ <p class="project-card__organization">${project.orgName || 'Organization unknown'}</p>
125
+ </div>
88
126
  <p class="project-card__category project-card__category--${categoryModifier}">${categoryLabel}</p>
89
127
  </div>
90
128
  </div>
91
129
  </a>
92
130
  ${viewerMode === 'owner' ? (0, _litHtml.html)`
93
131
  <div class="project-card__footer">
94
- <button
132
+ <solid-ui-button
95
133
  type="button"
96
- class="project-card__follow-button flex-center gap-xxs"
134
+ variant="secondary"
135
+ size="sm"
136
+ label="Following"
137
+ class="project-card__follow-button"
97
138
  aria-label="Unfollow project"
98
139
  @click=${handleUnfollow}
99
140
  >
100
- <span>${_profileIcons.checkMarkIcon} Following</span>
101
- </button>
141
+ <span class="project-card__follow-label project-card__follow-label--default">${_profileIcons.checkMarkIcon} Following</span>
142
+ <span class="project-card__follow-label project-card__follow-label--hover">Unfollow</span>
143
+ <span class="project-card__follow-label project-card__follow-label--loading">${(0, _spinner.createSpinner)()}<span>Unfollowing...</span></span>
144
+ </solid-ui-button>
102
145
  </div>
103
146
  ` : (0, _litHtml.html)``}
104
147
  </li>
@@ -107,14 +150,16 @@ function renderProject(project, store, subject, viewerMode, onSaved) {
107
150
  function renderOwnerEmptyProjectsContent(store, subject, projectData, viewerMode, onSaved) {
108
151
  const projectDetails = projectData;
109
152
  return (0, _litHtml.html)`
110
- <div class="profile__empty-state-content flex-column-center" role="group" aria-label="Empty projects section">
153
+ <div class="profile__empty-state-content" role="group" aria-label="Empty projects section">
111
154
  <h2 id="projects-heading" tabindex="-1">${_texts.projectsHeadingText}</h2>
112
155
  <p class="profile__empty-state-message">
113
156
  You haven't added any projects yet. Consider adding a project to boost your profile.
114
157
  </p>
115
158
  </div>
116
- <button
159
+ <solid-ui-button
117
160
  type="button"
161
+ variant="secondary"
162
+ size="sm"
118
163
  class="profile__action-button--empty"
119
164
  aria-label="Add project details"
120
165
  @click=${event => {
@@ -122,7 +167,7 @@ function renderOwnerEmptyProjectsContent(store, subject, projectData, viewerMode
122
167
  }}
123
168
  >
124
169
  <span class="profile__action-icon" aria-hidden="true">${_profileIcons.plusDarkIcon} Add Project</span>
125
- </button>
170
+ </solid-ui-button>
126
171
 
127
172
  `;
128
173
  }
@@ -131,11 +176,31 @@ function renderOwnerEmptyProjectSection(store, subject, projectData, viewerMode,
131
176
  <section
132
177
  aria-labelledby="projects-heading"
133
178
  data-profile-section="projects"
134
- class="profile__section--empty border-lighter flex-column-center rounded-md gap-lg"
179
+ class="profile__section--empty profile__section--empty-main profile-section-collapsible profile-section-collapsible--inline-mobile-actions profile-section-collapsible--empty-mobile-no-edit"
135
180
  role="region"
136
181
  tabindex="-1"
182
+ data-expanded="false"
137
183
  >
138
- ${renderOwnerEmptyProjectsContent(store, subject, projectData, viewerMode, onSaved)}
184
+ <header class="profile__section-header profile-section-collapsible__header">
185
+ <h2 id="projects-heading" tabindex="-1">${_texts.projectsHeadingText}</h2>
186
+ <div class="profile-section-collapsible__actions">
187
+ <solid-ui-button
188
+ type="button"
189
+ variant="icon"
190
+ size="sm"
191
+ class="profile-section-collapsible__toggle-button"
192
+ aria-label="Toggle projects section"
193
+ aria-controls="projects-panel"
194
+ aria-expanded="false"
195
+ @click=${_collapsibleSection.toggleCollapsibleSection}
196
+ >
197
+ <span slot="icon" class="profile-section-collapsible__chevron" aria-hidden="true">${_profileIcons.chevronDownIcon}</span>
198
+ </solid-ui-button>
199
+ </div>
200
+ </header>
201
+ <div id="projects-panel" class="profile-section-collapsible__content">
202
+ ${renderOwnerEmptyProjectsContent(store, subject, projectData, viewerMode, onSaved)}
203
+ </div>
139
204
  </section>
140
205
  `;
141
206
  }
@@ -149,7 +214,8 @@ function renderProjectSectionDefault(store, subject, projects, viewerMode, onSav
149
214
  const isOwner = viewerMode === 'owner';
150
215
  return (0, _litHtml.html)`
151
216
  <section
152
- class="profile__section border-lighter profile-section-collapsible profile-section-collapsible--inline-mobile-actions"
217
+ class="profile__section profile-section-collapsible profile-section-collapsible--inline-mobile-actions"
218
+ data-profile-section="projects"
153
219
  aria-labelledby="projects-heading"
154
220
  role="region"
155
221
  tabindex="-1"
@@ -158,43 +224,50 @@ function renderProjectSectionDefault(store, subject, projects, viewerMode, onSav
158
224
  >
159
225
  <header class="profile__section-header profile-section-collapsible__header">
160
226
  <h2 id="projects-heading">${_texts.projectsHeadingText}</h2>
161
- <div class="profile-section-collapsible__actions flex-column">
227
+ <div class="profile-section-collapsible__actions">
162
228
  ${isOwner ? (0, _litHtml.html)`
163
- <button
229
+ <solid-ui-button
164
230
  type="button"
165
- class="profile__action-button profile-action-text flex-center profile-section-collapsible__edit-button"
231
+ variant="secondary"
232
+ size="sm"
233
+ class="profile__action-button profile-action-text profile-section-collapsible__edit-button"
166
234
  aria-label="Add or edit projects"
167
235
  @click=${event => {
168
236
  return (0, _ProjectEditDialog.createProjectsEditDialog)(event, store, subject, projects, viewerMode, onSaved);
169
237
  }}
170
238
  >
171
- <span class="profile-section-collapsible__edit-label profile__add-more-content inline-flex-row">
172
- <span class="profile__add-more-icon inline-flex-row" aria-hidden="true">${_profileIcons.addIcon}</span>
173
- Add More
239
+ <span class="profile-section-collapsible__edit-label profile__add-more-content">
240
+ <span class="profile__add-more-icon" aria-hidden="true">${_profileIcons.addIcon}</span>
241
+ <span>Add More</span>
174
242
  </span>
175
- <span class="profile-section-collapsible__edit-icon profile-section-collapsible__edit-icon--add profile-section-collapsible__edit-icon--projects" aria-hidden="true">${_profileIcons.plusDarkIcon}</span>
176
- </button>
243
+ <span class="profile-section-collapsible__edit-icon" aria-hidden="true">${_profileIcons.editIcon}</span>
244
+ </solid-ui-button>
177
245
  ` : (0, _litHtml.html)``}
178
- <button
246
+ <solid-ui-button
179
247
  type="button"
180
- class="inline-flex-row"
248
+ variant="icon"
249
+ size="sm"
250
+ class="profile-section-collapsible__toggle-button"
181
251
  aria-label="Toggle projects section"
182
252
  aria-controls="projects-panel"
183
253
  aria-expanded="false"
184
254
  @click=${_collapsibleSection.toggleCollapsibleSection}
185
255
  >
186
- <span class="profile-section-collapsible__chevron" aria-hidden="true">⌄</span>
187
- </button>
256
+ <span slot="icon" class="profile-section-collapsible__chevron" aria-hidden="true">${_profileIcons.chevronDownIcon}</span>
257
+ </solid-ui-button>
188
258
  </div>
189
259
  </header>
190
- <div id="projects-panel" class="profile-section-collapsible__content" aria-hidden="true">
260
+ <div id="projects-panel" class="profile-section-collapsible__content">
191
261
  ${hasProjects ? (0, _litHtml.html)`
192
262
  <ul id="projects-rail" class="project-card__rail" role="list" aria-label="Known projects">
193
263
  ${renderProjectSectionContent(projects, store, subject, viewerMode, onSaved)}
194
264
  </ul>
195
265
  ${hiddenProjectsCount > 0 ? (0, _litHtml.html)`
196
- <button
266
+ <solid-ui-button
197
267
  type="button"
268
+ variant="secondary"
269
+ size="sm"
270
+ label="View More"
198
271
  class="project-card__more-button"
199
272
  aria-controls="projects-rail"
200
273
  aria-expanded="false"
@@ -203,8 +276,17 @@ function renderProjectSectionDefault(store, subject, projects, viewerMode, onSav
203
276
  >
204
277
  <span class="project-card__more-icon" aria-hidden="true">${_profileIcons.twoDownArrowsIcon}</span>
205
278
  <span class="project-card__more-label">View More</span>
206
- </button>
279
+ </solid-ui-button>
207
280
  ` : (0, _litHtml.html)``}
281
+ <div
282
+ class="profile-section-inline-error"
283
+ role="alert"
284
+ aria-live="assertive"
285
+ aria-atomic="true"
286
+ aria-hidden="true"
287
+ tabindex="-1"
288
+ hidden
289
+ ></div>
208
290
  ` : (0, _litHtml.html)`<p>No projects added yet.</p>`}
209
291
  </div>
210
292
  </section>
@@ -1 +1 @@
1
- {"version":3,"file":"mutations.d.ts","sourceRoot":"","sources":["../../../src/sections/projects/mutations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAW,MAAM,QAAQ,CAAA;AAEtD,OAAO,EAAE,mBAAmB,EAAc,MAAM,SAAS,CAAA;AAiNzD,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,iBAOrH"}
1
+ {"version":3,"file":"mutations.d.ts","sourceRoot":"","sources":["../../../src/sections/projects/mutations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAiB,MAAM,QAAQ,CAAA;AAE5D,OAAO,EAAE,mBAAmB,EAAc,MAAM,SAAS,CAAA;AAqLzD,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,iBAQrH"}