solid-ui 3.1.3-5 → 3.1.3-7

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 (621) hide show
  1. package/dist/_virtual/~icons/lucide/chevron-down.cjs.js +1 -1
  2. package/dist/_virtual/~icons/lucide/chevron-down.esm.js +1 -0
  3. package/dist/_virtual/~icons/lucide/circle-user.cjs.js +1 -1
  4. package/dist/_virtual/~icons/lucide/circle-user.esm.js +1 -0
  5. package/dist/_virtual/~icons/lucide/log-in.cjs.js +1 -1
  6. package/dist/_virtual/~icons/lucide/log-in.esm.js +1 -0
  7. package/dist/_virtual/~icons/lucide/log-out.cjs.js +1 -1
  8. package/dist/_virtual/~icons/lucide/log-out.esm.js +1 -0
  9. package/dist/_virtual/~icons/lucide/user.cjs.js +1 -1
  10. package/dist/_virtual/~icons/lucide/user.esm.js +1 -0
  11. package/dist/_virtual/~icons/lucide/x.cjs.js +1 -1
  12. package/dist/_virtual/~icons/lucide/x.esm.js +1 -0
  13. package/dist/_virtual/~icons/svg-spinners/180-ring.cjs.js +1 -1
  14. package/dist/_virtual/~icons/svg-spinners/180-ring.esm.js +1 -0
  15. package/dist/acl/access-controller.cjs.js +1 -1
  16. package/dist/acl/access-controller.cjs.js.map +1 -1
  17. package/dist/acl/access-controller.esm.js.map +1 -1
  18. package/dist/acl/access-groups.cjs.js.map +1 -1
  19. package/dist/acl/access-groups.esm.js.map +1 -1
  20. package/dist/acl/acl-control.cjs.js +1 -1
  21. package/dist/acl/acl-control.cjs.js.map +1 -1
  22. package/dist/acl/acl-control.esm.js +1 -1
  23. package/dist/acl/acl-control.esm.js.map +1 -1
  24. package/dist/acl/acl.cjs.js.map +1 -1
  25. package/dist/acl/acl.esm.js.map +1 -1
  26. package/dist/acl/add-agent-buttons.cjs.js.map +1 -1
  27. package/dist/acl/add-agent-buttons.esm.js.map +1 -1
  28. package/dist/chat/bookmarks.cjs.js +1 -1
  29. package/dist/chat/bookmarks.cjs.js.map +1 -1
  30. package/dist/chat/bookmarks.esm.js +1 -1
  31. package/dist/chat/bookmarks.esm.js.map +1 -1
  32. package/dist/chat/chatLogic.cjs.js.map +1 -1
  33. package/dist/chat/chatLogic.esm.js.map +1 -1
  34. package/dist/chat/dateFolder.cjs.js +1 -1
  35. package/dist/chat/dateFolder.cjs.js.map +1 -1
  36. package/dist/chat/dateFolder.esm.js +1 -1
  37. package/dist/chat/dateFolder.esm.js.map +1 -1
  38. package/dist/chat/infinite.cjs.js +1 -1
  39. package/dist/chat/infinite.cjs.js.map +1 -1
  40. package/dist/chat/infinite.esm.js +1 -1
  41. package/dist/chat/infinite.esm.js.map +1 -1
  42. package/dist/chat/keys.cjs.js +1 -1
  43. package/dist/chat/keys.cjs.js.map +1 -1
  44. package/dist/chat/keys.esm.js +1 -1
  45. package/dist/chat/keys.esm.js.map +1 -1
  46. package/dist/chat/message.cjs.js +1 -1
  47. package/dist/chat/message.cjs.js.map +1 -1
  48. package/dist/chat/message.esm.js +24 -24
  49. package/dist/chat/message.esm.js.map +1 -1
  50. package/dist/chat/messageTools.cjs.js.map +1 -1
  51. package/dist/chat/messageTools.esm.js.map +1 -1
  52. package/dist/chat/signature.cjs.js +1 -1
  53. package/dist/chat/signature.cjs.js.map +1 -1
  54. package/dist/chat/signature.esm.js +1 -1
  55. package/dist/chunks/{menu-items-DKKcQrb6.js → DialogProvider-Bt65G0Tk.js} +157 -56
  56. package/dist/chunks/DialogProvider-Bt65G0Tk.js.map +1 -0
  57. package/dist/chunks/{account-B4BktCv0.js → account-BZ2rYQhV.js} +23 -26
  58. package/dist/chunks/account-BZ2rYQhV.js.map +1 -0
  59. package/dist/chunks/{auth-BPQUXz9Q.js → auth-RHyQ2iIl.js} +32 -29
  60. package/dist/chunks/auth-RHyQ2iIl.js.map +1 -0
  61. package/dist/chunks/{avatar-B5DCduCy.js → avatar-Jx8xm2Op.js} +8 -8
  62. package/dist/chunks/avatar-Jx8xm2Op.js.map +1 -0
  63. package/dist/chunks/{button-GHRF3psH.js → button-0s0lZdxm.js} +7 -7
  64. package/dist/chunks/{button-GHRF3psH.js.map → button-0s0lZdxm.js.map} +1 -1
  65. package/dist/chunks/chevron-down-ujxRg3MD.js +10 -0
  66. package/dist/chunks/chevron-down-ujxRg3MD.js.map +1 -0
  67. package/dist/chunks/chunk.K442ELDU-TtQSV9g1.js +1516 -0
  68. package/dist/chunks/chunk.K442ELDU-TtQSV9g1.js.map +1 -0
  69. package/dist/chunks/combobox-Cxi8xUMn.js +473 -0
  70. package/dist/chunks/combobox-Cxi8xUMn.js.map +1 -0
  71. package/dist/chunks/{combobox-option-CW1ZwMC7.js → combobox-option-DiR3VpyT.js} +4 -4
  72. package/dist/chunks/{combobox-option-CW1ZwMC7.js.map → combobox-option-DiR3VpyT.js.map} +1 -1
  73. package/dist/chunks/{components-Dlw2zOvI.js → components-C1LEhsaK.js} +85 -21
  74. package/dist/chunks/components-C1LEhsaK.js.map +1 -0
  75. package/dist/chunks/{create-context-IPEkU7ze.js → context-uE5jJlS0.js} +8 -4
  76. package/dist/chunks/context-uE5jJlS0.js.map +1 -0
  77. package/dist/chunks/{decorators-CJJL4XBH.js → decorators-BiCkPd_3.js} +28 -35
  78. package/dist/chunks/decorators-BiCkPd_3.js.map +1 -0
  79. package/dist/chunks/{dialog-DmDA1aY8.js → dialog-BAzrHJ8w.js} +106 -64
  80. package/dist/chunks/dialog-BAzrHJ8w.js.map +1 -0
  81. package/dist/chunks/{dialog-content-C8VhHg5G.js → dialog-content-fdJrkCyB.js} +3 -3
  82. package/dist/chunks/{dialog-content-C8VhHg5G.js.map → dialog-content-fdJrkCyB.js.map} +1 -1
  83. package/dist/chunks/{dialog-footer-CtHFoTZS.js → dialog-footer-Bs_p2Nn9.js} +3 -3
  84. package/dist/chunks/{dialog-footer-CtHFoTZS.js.map → dialog-footer-Bs_p2Nn9.js.map} +1 -1
  85. package/dist/chunks/{dialog-header-D9jjujFf.js → dialog-header-CWIAAoDo.js} +3 -3
  86. package/dist/chunks/{dialog-header-D9jjujFf.js.map → dialog-header-CWIAAoDo.js.map} +1 -1
  87. package/dist/chunks/{dialogs-root-C4igEIk0.js → dialogs-root-Cv932Aqm.js} +10 -9
  88. package/dist/chunks/dialogs-root-Cv932Aqm.js.map +1 -0
  89. package/dist/chunks/{footer-CS8u8ycB.js → footer-D64T6XLO.js} +8 -8
  90. package/dist/chunks/{footer-CS8u8ycB.js.map → footer-D64T6XLO.js.map} +1 -1
  91. package/dist/chunks/{guard-BIc50Lps.js → guard-CjUBGVDk.js} +5 -5
  92. package/dist/chunks/{guard-BIc50Lps.js.map → guard-CjUBGVDk.js.map} +1 -1
  93. package/dist/chunks/{header-0TLBh_PG.js → header-COBaJDdB.js} +41 -41
  94. package/dist/chunks/{header-0TLBh_PG.js.map → header-COBaJDdB.js.map} +1 -1
  95. package/dist/chunks/{headerFooterHelpers-5LYv-0Rt.js → headerFooterHelpers-7O_ln1QD.js} +2 -2
  96. package/dist/chunks/{headerFooterHelpers-5LYv-0Rt.js.map → headerFooterHelpers-7O_ln1QD.js.map} +1 -1
  97. package/dist/chunks/{combobox-eju-wypA.js → input-BF224Jid.js} +114 -113
  98. package/dist/chunks/input-BF224Jid.js.map +1 -0
  99. package/dist/chunks/{jsonld-DZG2v1pE.js → jsonld-DRZuoyoU.js} +54 -54
  100. package/dist/chunks/{jsonld-DZG2v1pE.js.map → jsonld-DRZuoyoU.js.map} +1 -1
  101. package/dist/chunks/{lit-CC2G_f_C.js → lit-C4H1jI4q.js} +110 -95
  102. package/dist/chunks/lit-C4H1jI4q.js.map +1 -0
  103. package/dist/chunks/{login-button-BKp1-O2q.js → login-button-DPeMi00d.js} +10 -7
  104. package/dist/chunks/login-button-DPeMi00d.js.map +1 -0
  105. package/dist/chunks/{logout-button-DlU-q-o5.js → logout-button-CbiLE7jO.js} +10 -7
  106. package/dist/chunks/logout-button-CbiLE7jO.js.map +1 -0
  107. package/dist/chunks/menu-DNcuV-1J.js +1741 -0
  108. package/dist/chunks/menu-DNcuV-1J.js.map +1 -0
  109. package/dist/chunks/{menu-item-DoTy3MUu.js → menu-item-Ck0l-uEI.js} +69 -55
  110. package/dist/chunks/menu-item-Ck0l-uEI.js.map +1 -0
  111. package/dist/chunks/{photo-capture-COoxZRW_.js → photo-capture-tiBsdSbA.js} +20 -20
  112. package/dist/chunks/{photo-capture-COoxZRW_.js.map → photo-capture-tiBsdSbA.js.map} +1 -1
  113. package/dist/chunks/{provider-uRz_fGWb.js → provider-C4eSzopG.js} +7 -7
  114. package/dist/chunks/{provider-uRz_fGWb.js.map → provider-C4eSzopG.js.map} +1 -1
  115. package/dist/chunks/select-D8dW53pr.js +292 -0
  116. package/dist/chunks/select-D8dW53pr.js.map +1 -0
  117. package/dist/chunks/select-option-B-6ULCpQ.js +195 -0
  118. package/dist/chunks/select-option-B-6ULCpQ.js.map +1 -0
  119. package/dist/chunks/{signup-button-BC4LmOXx.js → signup-button-BfIxbpwa.js} +10 -7
  120. package/dist/chunks/signup-button-BfIxbpwa.js.map +1 -0
  121. package/dist/chunks/{solid-logic.esm-7q6hmfIF.js → solid-logic.esm-T70qfHAr.js} +2521 -2504
  122. package/dist/chunks/solid-logic.esm-T70qfHAr.js.map +1 -0
  123. package/dist/chunks/{src-f1UXhE9W.js → src-Bx4GAnWq.js} +16 -17
  124. package/dist/chunks/{src-f1UXhE9W.js.map → src-Bx4GAnWq.js.map} +1 -1
  125. package/dist/components/account/Account.cjs.js +9 -11
  126. package/dist/components/account/Account.cjs.js.map +1 -1
  127. package/dist/components/account/Account.d.ts.map +1 -1
  128. package/dist/components/account/Account.esm.js +8 -11
  129. package/dist/components/account/Account.esm.js.map +1 -1
  130. package/dist/components/account/Account.styles.cjs.js +1 -1
  131. package/dist/components/account/Account.styles.cjs.js.map +1 -1
  132. package/dist/components/account/Account.styles.esm.js +1 -1
  133. package/dist/components/account/Account.styles.esm.js.map +1 -1
  134. package/dist/components/account/index.cjs.js +1 -1
  135. package/dist/components/account/index.esm.js +1 -1
  136. package/dist/components/account.js +1 -1
  137. package/dist/components/avatar/Avatar.cjs.js +1 -1
  138. package/dist/components/avatar/Avatar.cjs.js.map +1 -1
  139. package/dist/components/avatar/Avatar.esm.js +1 -1
  140. package/dist/components/avatar/Avatar.styles.cjs.js +1 -1
  141. package/dist/components/avatar/Avatar.styles.cjs.js.map +1 -1
  142. package/dist/components/avatar/Avatar.styles.esm.js +1 -1
  143. package/dist/components/avatar/Avatar.styles.esm.js.map +1 -1
  144. package/dist/components/avatar/index.cjs.js +1 -1
  145. package/dist/components/avatar/index.esm.js +1 -1
  146. package/dist/components/avatar.js +1 -1
  147. package/dist/components/button/Button.cjs.js +1 -1
  148. package/dist/components/button/Button.cjs.js.map +1 -1
  149. package/dist/components/button/Button.esm.js +1 -1
  150. package/dist/components/button/Button.esm.js.map +1 -1
  151. package/dist/components/button/index.cjs.js +1 -1
  152. package/dist/components/button/index.esm.js +3 -3
  153. package/dist/components/button.js +1 -1
  154. package/dist/components/combobox/Combobox.cjs.js +56 -15
  155. package/dist/components/combobox/Combobox.cjs.js.map +1 -1
  156. package/dist/components/combobox/Combobox.d.ts +27 -6
  157. package/dist/components/combobox/Combobox.d.ts.map +1 -1
  158. package/dist/components/combobox/Combobox.esm.js +257 -87
  159. package/dist/components/combobox/Combobox.esm.js.map +1 -1
  160. package/dist/components/combobox/Combobox.styles.cjs.js +1 -1
  161. package/dist/components/combobox/Combobox.styles.cjs.js.map +1 -1
  162. package/dist/components/combobox/Combobox.styles.esm.js +1 -1
  163. package/dist/components/combobox/Combobox.styles.esm.js.map +1 -1
  164. package/dist/components/combobox/index.cjs.js +1 -1
  165. package/dist/components/combobox/index.esm.js +1 -1
  166. package/dist/components/combobox-option/ComboboxOption.cjs.js +1 -1
  167. package/dist/components/combobox-option/ComboboxOption.cjs.js.map +1 -1
  168. package/dist/components/combobox-option/ComboboxOption.esm.js +1 -1
  169. package/dist/components/combobox-option/index.cjs.js +1 -1
  170. package/dist/components/combobox-option/index.esm.js +1 -1
  171. package/dist/components/combobox-option.js +1 -1
  172. package/dist/components/combobox.js +1 -1
  173. package/dist/components/dialog/Dialog.cjs.js +2 -2
  174. package/dist/components/dialog/Dialog.cjs.js.map +1 -1
  175. package/dist/components/dialog/Dialog.d.ts +3 -1
  176. package/dist/components/dialog/Dialog.d.ts.map +1 -1
  177. package/dist/components/dialog/Dialog.esm.js +60 -61
  178. package/dist/components/dialog/Dialog.esm.js.map +1 -1
  179. package/dist/components/dialog/index.cjs.js +1 -1
  180. package/dist/components/dialog/index.esm.js +1 -1
  181. package/dist/components/dialog-content/DialogContent.cjs.js +1 -1
  182. package/dist/components/dialog-content/DialogContent.cjs.js.map +1 -1
  183. package/dist/components/dialog-content/DialogContent.esm.js +1 -1
  184. package/dist/components/dialog-content/DialogContent.esm.js.map +1 -1
  185. package/dist/components/dialog-content/index.cjs.js +1 -1
  186. package/dist/components/dialog-content/index.esm.js +1 -1
  187. package/dist/components/dialog-content.js +1 -1
  188. package/dist/components/dialog-footer/DialogFooter.cjs.js +1 -1
  189. package/dist/components/dialog-footer/DialogFooter.cjs.js.map +1 -1
  190. package/dist/components/dialog-footer/DialogFooter.esm.js +1 -1
  191. package/dist/components/dialog-footer/DialogFooter.esm.js.map +1 -1
  192. package/dist/components/dialog-footer/index.cjs.js +1 -1
  193. package/dist/components/dialog-footer/index.esm.js +1 -1
  194. package/dist/components/dialog-footer.js +1 -1
  195. package/dist/components/dialog-header/DialogHeader.cjs.js +1 -1
  196. package/dist/components/dialog-header/DialogHeader.cjs.js.map +1 -1
  197. package/dist/components/dialog-header/DialogHeader.esm.js +1 -1
  198. package/dist/components/dialog-header/DialogHeader.esm.js.map +1 -1
  199. package/dist/components/dialog-header/index.cjs.js +1 -1
  200. package/dist/components/dialog-header/index.esm.js +1 -1
  201. package/dist/components/dialog-header.js +1 -1
  202. package/dist/components/dialog-provider/DialogProvider.cjs.js +1 -1
  203. package/dist/components/dialog-provider/DialogProvider.cjs.js.map +1 -1
  204. package/dist/components/dialog-provider/DialogProvider.esm.js +2 -2
  205. package/dist/components/dialog-provider/DialogProvider.esm.js.map +1 -1
  206. package/dist/components/dialog-provider/index.cjs.js +1 -1
  207. package/dist/components/dialog-provider/index.esm.js +1 -1
  208. package/dist/components/dialog-provider.js +1 -1
  209. package/dist/components/dialog.js +1 -1
  210. package/dist/components/dialogs-root/DialogsRoot.cjs.js +2 -2
  211. package/dist/components/dialogs-root/DialogsRoot.cjs.js.map +1 -1
  212. package/dist/components/dialogs-root/DialogsRoot.d.ts.map +1 -1
  213. package/dist/components/dialogs-root/DialogsRoot.esm.js +5 -3
  214. package/dist/components/dialogs-root/DialogsRoot.esm.js.map +1 -1
  215. package/dist/components/dialogs-root/index.cjs.js +1 -1
  216. package/dist/components/dialogs-root/index.esm.js +1 -1
  217. package/dist/components/dialogs-root.js +1 -1
  218. package/dist/components/footer.js +1 -1
  219. package/dist/components/guard/Guard.cjs.js +1 -1
  220. package/dist/components/guard/Guard.cjs.js.map +1 -1
  221. package/dist/components/guard/Guard.esm.js +1 -1
  222. package/dist/components/guard/index.cjs.js +1 -1
  223. package/dist/components/guard/index.esm.js +1 -1
  224. package/dist/components/guard.js +1 -1
  225. package/dist/components/header.js +1 -1
  226. package/dist/components/index.cjs.js +1 -1
  227. package/dist/components/index.esm.js +2 -1
  228. package/dist/components/input/Input.cjs.js +17 -0
  229. package/dist/components/input/Input.cjs.js.map +1 -0
  230. package/dist/components/input/Input.d.ts +17 -0
  231. package/dist/components/input/Input.d.ts.map +1 -0
  232. package/dist/{chunks/menu-DCsLCND4.js → components/input/Input.esm.js} +157 -96
  233. package/dist/components/input/Input.esm.js.map +1 -0
  234. package/dist/components/input/Input.stories.d.ts +43 -0
  235. package/dist/components/input/Input.stories.d.ts.map +1 -0
  236. package/dist/components/input/Input.styles.cjs.js +2 -0
  237. package/dist/components/input/Input.styles.cjs.js.map +1 -0
  238. package/dist/components/input/Input.styles.esm.js +7 -0
  239. package/dist/components/input/Input.styles.esm.js.map +1 -0
  240. package/dist/components/input/index.cjs.js +2 -0
  241. package/dist/components/input/index.cjs.js.map +1 -0
  242. package/dist/components/input/index.d.ts +4 -0
  243. package/dist/components/input/index.d.ts.map +1 -0
  244. package/dist/components/input/index.esm.js +7 -0
  245. package/dist/components/input/index.esm.js.map +1 -0
  246. package/dist/components/input.js +2 -0
  247. package/dist/components/login-button/LoginButton.cjs.js +1 -1
  248. package/dist/components/login-button/LoginButton.cjs.js.map +1 -1
  249. package/dist/components/login-button/LoginButton.d.ts +1 -0
  250. package/dist/components/login-button/LoginButton.d.ts.map +1 -1
  251. package/dist/components/login-button/LoginButton.esm.js +5 -2
  252. package/dist/components/login-button/LoginButton.esm.js.map +1 -1
  253. package/dist/components/login-button/index.cjs.js +1 -1
  254. package/dist/components/login-button/index.esm.js +1 -1
  255. package/dist/components/login-button.js +1 -1
  256. package/dist/components/login-modal/LoginModal.cjs.js +1 -1
  257. package/dist/components/login-modal/LoginModal.cjs.js.map +1 -1
  258. package/dist/components/login-modal/LoginModal.esm.js +1 -1
  259. package/dist/components/login-modal/index.cjs.js +1 -1
  260. package/dist/components/login-modal/index.esm.js +1 -1
  261. package/dist/components/login-modal.js +1 -1
  262. package/dist/components/logout-button/LogoutButton.cjs.js +1 -1
  263. package/dist/components/logout-button/LogoutButton.cjs.js.map +1 -1
  264. package/dist/components/logout-button/LogoutButton.d.ts +1 -0
  265. package/dist/components/logout-button/LogoutButton.d.ts.map +1 -1
  266. package/dist/components/logout-button/LogoutButton.esm.js +5 -2
  267. package/dist/components/logout-button/LogoutButton.esm.js.map +1 -1
  268. package/dist/components/logout-button/index.cjs.js +1 -1
  269. package/dist/components/logout-button/index.esm.js +1 -1
  270. package/dist/components/logout-button.js +1 -1
  271. package/dist/components/menu/Menu.cjs.js +13 -8
  272. package/dist/components/menu/Menu.cjs.js.map +1 -1
  273. package/dist/components/menu/Menu.d.ts +13 -8
  274. package/dist/components/menu/Menu.d.ts.map +1 -1
  275. package/dist/components/menu/Menu.esm.js +132 -88
  276. package/dist/components/menu/Menu.esm.js.map +1 -1
  277. package/dist/components/menu/Menu.stories.d.ts.map +1 -1
  278. package/dist/components/menu/Menu.styles.cjs.js +2 -0
  279. package/dist/components/menu/Menu.styles.cjs.js.map +1 -0
  280. package/dist/components/menu/Menu.styles.esm.js +7 -0
  281. package/dist/components/menu/Menu.styles.esm.js.map +1 -0
  282. package/dist/components/menu/index.cjs.js +1 -1
  283. package/dist/components/menu/index.esm.js +1 -1
  284. package/dist/components/menu-item/MenuItem.cjs.js +5 -7
  285. package/dist/components/menu-item/MenuItem.cjs.js.map +1 -1
  286. package/dist/components/menu-item/MenuItem.d.ts +2 -0
  287. package/dist/components/menu-item/MenuItem.d.ts.map +1 -1
  288. package/dist/components/menu-item/MenuItem.esm.js +61 -47
  289. package/dist/components/menu-item/MenuItem.esm.js.map +1 -1
  290. package/dist/components/menu-item/MenuItem.styles.cjs.js +1 -1
  291. package/dist/components/menu-item/MenuItem.styles.cjs.js.map +1 -1
  292. package/dist/components/menu-item/MenuItem.styles.esm.js +1 -1
  293. package/dist/components/menu-item/MenuItem.styles.esm.js.map +1 -1
  294. package/dist/components/menu-item/index.cjs.js +1 -1
  295. package/dist/components/menu-item/index.esm.js +1 -1
  296. package/dist/components/menu-item.js +1 -1
  297. package/dist/components/menu.js +1 -1
  298. package/dist/components/photo-capture.js +1 -1
  299. package/dist/components/provider/Provider.cjs.js +1 -1
  300. package/dist/components/provider/Provider.cjs.js.map +1 -1
  301. package/dist/components/provider/Provider.esm.js +1 -1
  302. package/dist/components/provider/index.cjs.js +1 -1
  303. package/dist/components/provider/index.esm.js +1 -1
  304. package/dist/components/provider.js +1 -1
  305. package/dist/components/select/Select.cjs.js +21 -0
  306. package/dist/components/select/Select.cjs.js.map +1 -0
  307. package/dist/components/select/Select.d.ts +15 -0
  308. package/dist/components/select/Select.d.ts.map +1 -0
  309. package/dist/components/{menu-items/MenuItems.esm.js → select/Select.esm.js} +140 -65
  310. package/dist/components/select/Select.esm.js.map +1 -0
  311. package/dist/components/select/Select.stories.d.ts +27 -0
  312. package/dist/components/select/Select.stories.d.ts.map +1 -0
  313. package/dist/components/select/Select.styles.cjs.js +2 -0
  314. package/dist/components/select/Select.styles.cjs.js.map +1 -0
  315. package/dist/components/select/Select.styles.esm.js +7 -0
  316. package/dist/components/select/Select.styles.esm.js.map +1 -0
  317. package/dist/components/select/index.cjs.js +2 -1
  318. package/dist/components/select/index.cjs.js.map +1 -0
  319. package/dist/components/select/index.d.ts +3 -1
  320. package/dist/components/select/index.d.ts.map +1 -1
  321. package/dist/components/select/index.esm.js +7 -3
  322. package/dist/components/select/index.esm.js.map +1 -0
  323. package/dist/components/select-option/SelectOption.cjs.js +2 -0
  324. package/dist/components/select-option/SelectOption.cjs.js.map +1 -0
  325. package/dist/components/select-option/SelectOption.d.ts +6 -0
  326. package/dist/components/select-option/SelectOption.d.ts.map +1 -0
  327. package/dist/components/select-option/SelectOption.esm.js +194 -0
  328. package/dist/components/select-option/SelectOption.esm.js.map +1 -0
  329. package/dist/components/select-option/index.cjs.js +2 -0
  330. package/dist/components/select-option/index.cjs.js.map +1 -0
  331. package/dist/components/select-option/index.d.ts +4 -0
  332. package/dist/components/select-option/index.d.ts.map +1 -0
  333. package/dist/components/select-option/index.esm.js +7 -0
  334. package/dist/components/select-option/index.esm.js.map +1 -0
  335. package/dist/components/select-option.js +2 -0
  336. package/dist/components/select.js +2 -2
  337. package/dist/components/signup-button/SignupButton.cjs.js +1 -1
  338. package/dist/components/signup-button/SignupButton.cjs.js.map +1 -1
  339. package/dist/components/signup-button/SignupButton.d.ts +1 -0
  340. package/dist/components/signup-button/SignupButton.d.ts.map +1 -1
  341. package/dist/components/signup-button/SignupButton.esm.js +5 -2
  342. package/dist/components/signup-button/SignupButton.esm.js.map +1 -1
  343. package/dist/components/signup-button/index.cjs.js +1 -1
  344. package/dist/components/signup-button/index.esm.js +1 -1
  345. package/dist/components/signup-button.js +1 -1
  346. package/dist/components.js +24 -23
  347. package/dist/create/create.cjs.js.map +1 -1
  348. package/dist/create/create.esm.js.map +1 -1
  349. package/dist/create/index.cjs.js.map +1 -1
  350. package/dist/footer/index.cjs.js +1 -1
  351. package/dist/footer/index.esm.js +1 -1
  352. package/dist/header/index.cjs.js +1 -1
  353. package/dist/header/index.cjs.js.map +1 -1
  354. package/dist/header/index.esm.js +1 -1
  355. package/dist/header/index.esm.js.map +1 -1
  356. package/dist/index.cjs.js +1 -1
  357. package/dist/index.cjs.js.map +1 -1
  358. package/dist/index.d.ts +0 -1
  359. package/dist/index.d.ts.map +1 -1
  360. package/dist/index.esm.js +13 -13
  361. package/dist/index.esm.js.map +1 -1
  362. package/dist/index.js +7 -9
  363. package/dist/lib/auth/SolidAuth.cjs.js.map +1 -1
  364. package/dist/lib/auth/SolidAuth.esm.js.map +1 -1
  365. package/dist/lib/auth/context.cjs.js.map +1 -1
  366. package/dist/lib/auth/index.cjs.js +1 -1
  367. package/dist/lib/auth/index.esm.js +5 -4
  368. package/dist/lib/components/ids.cjs.js.map +1 -1
  369. package/dist/lib/components/ids.esm.js.map +1 -1
  370. package/dist/lib/components/index.cjs.js +1 -1
  371. package/dist/lib/components/index.d.ts +1 -0
  372. package/dist/lib/components/index.d.ts.map +1 -1
  373. package/dist/lib/components/index.esm.js +7 -3
  374. package/dist/lib/components/traits/DialogTrait.cjs.js +2 -0
  375. package/dist/lib/components/traits/DialogTrait.cjs.js.map +1 -0
  376. package/dist/lib/components/traits/DialogTrait.d.ts +13 -0
  377. package/dist/lib/components/traits/DialogTrait.d.ts.map +1 -0
  378. package/dist/lib/components/traits/DialogTrait.esm.js +16 -0
  379. package/dist/lib/components/traits/DialogTrait.esm.js.map +1 -0
  380. package/dist/lib/components/traits/InputTrait.cjs.js +2 -0
  381. package/dist/lib/components/traits/InputTrait.cjs.js.map +1 -0
  382. package/dist/lib/components/traits/InputTrait.d.ts +30 -0
  383. package/dist/lib/components/traits/InputTrait.d.ts.map +1 -0
  384. package/dist/lib/components/traits/InputTrait.esm.js +45 -0
  385. package/dist/lib/components/traits/InputTrait.esm.js.map +1 -0
  386. package/dist/lib/components/traits/WebComponentTrait.d.ts +11 -0
  387. package/dist/lib/components/traits/WebComponentTrait.d.ts.map +1 -0
  388. package/dist/lib/components/traits/index.cjs.js +1 -0
  389. package/dist/lib/components/traits/index.d.ts +6 -0
  390. package/dist/lib/components/traits/index.d.ts.map +1 -0
  391. package/dist/lib/components/traits/index.esm.js +3 -0
  392. package/dist/lib/components/web-component/WebComponent.cjs.js +1 -1
  393. package/dist/lib/components/web-component/WebComponent.cjs.js.map +1 -1
  394. package/dist/lib/components/web-component/WebComponent.d.ts +7 -0
  395. package/dist/lib/components/web-component/WebComponent.d.ts.map +1 -1
  396. package/dist/lib/components/web-component/WebComponent.esm.js +17 -6
  397. package/dist/lib/components/web-component/WebComponent.esm.js.map +1 -1
  398. package/dist/lib/components/web-component/WebComponent.styles.cjs.js.map +1 -1
  399. package/dist/lib/components/web-component/WebComponent.styles.esm.js.map +1 -1
  400. package/dist/lib/components/web-component/index.cjs.js +1 -1
  401. package/dist/lib/components/web-component/index.esm.js +2 -1
  402. package/dist/lib/dialogs/Dialog.cjs.js +1 -1
  403. package/dist/lib/dialogs/Dialog.cjs.js.map +1 -1
  404. package/dist/lib/dialogs/Dialog.d.ts +6 -1
  405. package/dist/lib/dialogs/Dialog.d.ts.map +1 -1
  406. package/dist/lib/dialogs/Dialog.esm.js +6 -2
  407. package/dist/lib/dialogs/Dialog.esm.js.map +1 -1
  408. package/dist/lib/dialogs/context.cjs.js +1 -1
  409. package/dist/lib/dialogs/context.cjs.js.map +1 -1
  410. package/dist/lib/dialogs/context.d.ts +3 -0
  411. package/dist/lib/dialogs/context.d.ts.map +1 -1
  412. package/dist/lib/dialogs/context.esm.js +4 -3
  413. package/dist/lib/dialogs/context.esm.js.map +1 -1
  414. package/dist/lib/dialogs/events/close-dialog.cjs.js +1 -1
  415. package/dist/lib/dialogs/events/close-dialog.cjs.js.map +1 -1
  416. package/dist/lib/dialogs/events/close-dialog.d.ts +2 -1
  417. package/dist/lib/dialogs/events/close-dialog.d.ts.map +1 -1
  418. package/dist/lib/dialogs/events/close-dialog.esm.js +3 -2
  419. package/dist/lib/dialogs/events/close-dialog.esm.js.map +1 -1
  420. package/dist/lib/dialogs/helpers.cjs.js +1 -1
  421. package/dist/lib/dialogs/helpers.cjs.js.map +1 -1
  422. package/dist/lib/dialogs/helpers.d.ts +2 -1
  423. package/dist/lib/dialogs/helpers.d.ts.map +1 -1
  424. package/dist/lib/dialogs/helpers.esm.js +3 -3
  425. package/dist/lib/dialogs/helpers.esm.js.map +1 -1
  426. package/dist/lib/dialogs/index.cjs.js +1 -1
  427. package/dist/lib/dialogs/index.esm.js +6 -5
  428. package/dist/lib/log.cjs.js +1 -1
  429. package/dist/lib/log.cjs.js.map +1 -1
  430. package/dist/lib/log.esm.js +1 -1
  431. package/dist/lib/log.esm.js.map +1 -1
  432. package/dist/lib/messageArea.cjs.js.map +1 -1
  433. package/dist/lib/messageArea.esm.js.map +1 -1
  434. package/dist/lib/ns.cjs.js.map +1 -1
  435. package/dist/lib/pad.cjs.js +1 -1
  436. package/dist/lib/pad.cjs.js.map +1 -1
  437. package/dist/lib/pad.esm.js +1 -1
  438. package/dist/lib/pad.esm.js.map +1 -1
  439. package/dist/lib/participation.cjs.js.map +1 -1
  440. package/dist/lib/participation.esm.js.map +1 -1
  441. package/dist/lib/preferences.cjs.js +1 -1
  442. package/dist/lib/preferences.cjs.js.map +1 -1
  443. package/dist/lib/preferences.esm.js +1 -1
  444. package/dist/lib/preferences.esm.js.map +1 -1
  445. package/dist/lib/table.cjs.js.map +1 -1
  446. package/dist/lib/table.esm.js.map +1 -1
  447. package/dist/lib/tabs.cjs.js +1 -1
  448. package/dist/lib/tabs.cjs.js.map +1 -1
  449. package/dist/lib/tabs.esm.js +1 -1
  450. package/dist/lib/tabs.esm.js.map +1 -1
  451. package/dist/loader.js +7 -9
  452. package/dist/login/login.cjs.js +1 -1
  453. package/dist/login/login.cjs.js.map +1 -1
  454. package/dist/login/login.esm.js +1 -1
  455. package/dist/login/login.esm.js.map +1 -1
  456. package/dist/matrix/index.cjs.js.map +1 -1
  457. package/dist/matrix/matrix.cjs.js.map +1 -1
  458. package/dist/matrix/matrix.esm.js.map +1 -1
  459. package/dist/media/media-capture.cjs.js.map +1 -1
  460. package/dist/media/media-capture.esm.js.map +1 -1
  461. package/dist/signup/signup.cjs.js.map +1 -1
  462. package/dist/signup/signup.esm.js.map +1 -1
  463. package/dist/solid-ui.js +1053 -446
  464. package/dist/solid-ui.min.js +1053 -446
  465. package/dist/solid-ui.min.js.map +1 -1
  466. package/dist/theme.css +1 -1
  467. package/dist/utils/headerFooterHelpers.cjs.js.map +1 -1
  468. package/dist/utils/headerFooterHelpers.esm.js.map +1 -1
  469. package/dist/utils/index.cjs.js +2 -2
  470. package/dist/utils/index.cjs.js.map +1 -1
  471. package/dist/utils/index.esm.js +1 -1
  472. package/dist/utils/index.esm.js.map +1 -1
  473. package/dist/utils/keyHelpers/accessData.cjs.js +1 -1
  474. package/dist/utils/keyHelpers/accessData.cjs.js.map +1 -1
  475. package/dist/utils/keyHelpers/accessData.esm.js +1 -1
  476. package/dist/utils/keyHelpers/accessData.esm.js.map +1 -1
  477. package/dist/utils/keyHelpers/acl.cjs.js.map +1 -1
  478. package/dist/utils/keyHelpers/acl.esm.js.map +1 -1
  479. package/dist/utils/keyHelpers/otherHelpers.cjs.js.map +1 -1
  480. package/dist/utils/keyHelpers/otherHelpers.esm.js.map +1 -1
  481. package/dist/utils/label.cjs.js.map +1 -1
  482. package/dist/utils/label.esm.js.map +1 -1
  483. package/dist/v2/components/auth/loginButton/LoginButton.cjs.js.map +1 -1
  484. package/dist/v2/components/auth/loginButton/LoginButton.esm.js.map +1 -1
  485. package/dist/v2/components/auth/loginButton/downArrow.cjs.js.map +1 -1
  486. package/dist/v2/components/auth/loginButton/index.cjs.js +1 -1
  487. package/dist/v2/components/auth/loginButton/index.esm.js +1 -0
  488. package/dist/v2/components/auth/signupButton/index.cjs.js +1 -1
  489. package/dist/v2/components/auth/signupButton/index.esm.js +1 -0
  490. package/dist/v2/components/layout/footer/index.cjs.js +1 -1
  491. package/dist/v2/components/layout/footer/index.esm.js +1 -0
  492. package/dist/v2/components/layout/header/Header.cjs.js.map +1 -1
  493. package/dist/v2/components/layout/header/Header.esm.js.map +1 -1
  494. package/dist/v2/components/layout/header/index.cjs.js +1 -1
  495. package/dist/v2/components/layout/header/index.esm.js +1 -0
  496. package/dist/v2/components/media/photoCapture/PhotoCapture.cjs.js.map +1 -1
  497. package/dist/v2/components/media/photoCapture/PhotoCapture.esm.js.map +1 -1
  498. package/dist/v2/components/media/photoCapture/index.cjs.js +1 -1
  499. package/dist/v2/components/media/photoCapture/index.esm.js +1 -0
  500. package/dist/widgets/buttons/iconLinks.cjs.js.map +1 -1
  501. package/dist/widgets/buttons/iconLinks.esm.js.map +1 -1
  502. package/dist/widgets/buttons.cjs.js.map +1 -1
  503. package/dist/widgets/buttons.esm.js.map +1 -1
  504. package/dist/widgets/dragAndDrop.cjs.js.map +1 -1
  505. package/dist/widgets/dragAndDrop.esm.js.map +1 -1
  506. package/dist/widgets/error.cjs.js.map +1 -1
  507. package/dist/widgets/error.esm.js.map +1 -1
  508. package/dist/widgets/forms/autocomplete/autocompleteField.cjs.js.map +1 -1
  509. package/dist/widgets/forms/autocomplete/autocompleteField.esm.js.map +1 -1
  510. package/dist/widgets/forms/autocomplete/autocompletePicker.cjs.js.map +1 -1
  511. package/dist/widgets/forms/autocomplete/autocompletePicker.esm.js.map +1 -1
  512. package/dist/widgets/forms/autocomplete/language.cjs.js +1 -1
  513. package/dist/widgets/forms/autocomplete/language.cjs.js.map +1 -1
  514. package/dist/widgets/forms/autocomplete/language.esm.js +1 -1
  515. package/dist/widgets/forms/autocomplete/language.esm.js.map +1 -1
  516. package/dist/widgets/forms/autocomplete/publicData.cjs.js +1 -1
  517. package/dist/widgets/forms/autocomplete/publicData.cjs.js.map +1 -1
  518. package/dist/widgets/forms/autocomplete/publicData.esm.js +1 -1
  519. package/dist/widgets/forms/autocomplete/publicData.esm.js.map +1 -1
  520. package/dist/widgets/forms/basic.cjs.js.map +1 -1
  521. package/dist/widgets/forms/basic.esm.js.map +1 -1
  522. package/dist/widgets/forms/fieldFunction.cjs.js.map +1 -1
  523. package/dist/widgets/forms/fieldParams.cjs.js.map +1 -1
  524. package/dist/widgets/forms/fieldParams.esm.js.map +1 -1
  525. package/dist/widgets/forms/formStyle.cjs.js.map +1 -1
  526. package/dist/widgets/forms/formStyle.esm.js.map +1 -1
  527. package/dist/widgets/forms.cjs.js +1 -1
  528. package/dist/widgets/forms.cjs.js.map +1 -1
  529. package/dist/widgets/forms.esm.js +1 -1
  530. package/dist/widgets/forms.esm.js.map +1 -1
  531. package/dist/widgets/index.cjs.js +1 -1
  532. package/dist/widgets/index.esm.js +65 -65
  533. package/dist/widgets/multiSelect.cjs.js.map +1 -1
  534. package/dist/widgets/multiSelect.esm.js.map +1 -1
  535. package/dist/widgets/peoplePicker.cjs.js.map +1 -1
  536. package/dist/widgets/peoplePicker.esm.js.map +1 -1
  537. package/dist/widgets/widgetHelpers.cjs.js.map +1 -1
  538. package/dist/widgets/widgetHelpers.esm.js.map +1 -1
  539. package/package.json +9 -10
  540. package/dist/chunks/DialogProvider-BbWGIFN5.js +0 -211
  541. package/dist/chunks/DialogProvider-BbWGIFN5.js.map +0 -1
  542. package/dist/chunks/account-B4BktCv0.js.map +0 -1
  543. package/dist/chunks/auth-BPQUXz9Q.js.map +0 -1
  544. package/dist/chunks/avatar-B5DCduCy.js.map +0 -1
  545. package/dist/chunks/close-dialog-qpl1X44Q.js +0 -14
  546. package/dist/chunks/close-dialog-qpl1X44Q.js.map +0 -1
  547. package/dist/chunks/combobox-eju-wypA.js.map +0 -1
  548. package/dist/chunks/components-Dlw2zOvI.js.map +0 -1
  549. package/dist/chunks/consume-BefsVEGX.js +0 -49
  550. package/dist/chunks/consume-BefsVEGX.js.map +0 -1
  551. package/dist/chunks/context-ChcZyr30.js +0 -7
  552. package/dist/chunks/context-ChcZyr30.js.map +0 -1
  553. package/dist/chunks/context-ImtIQIYP.js +0 -7
  554. package/dist/chunks/context-ImtIQIYP.js.map +0 -1
  555. package/dist/chunks/create-context-IPEkU7ze.js.map +0 -1
  556. package/dist/chunks/decorators-CJJL4XBH.js.map +0 -1
  557. package/dist/chunks/dialog-DmDA1aY8.js.map +0 -1
  558. package/dist/chunks/dialogs-root-C4igEIk0.js.map +0 -1
  559. package/dist/chunks/lit-CC2G_f_C.js.map +0 -1
  560. package/dist/chunks/login-button-BKp1-O2q.js.map +0 -1
  561. package/dist/chunks/logout-button-DlU-q-o5.js.map +0 -1
  562. package/dist/chunks/menu-DCsLCND4.js.map +0 -1
  563. package/dist/chunks/menu-item-DoTy3MUu.js.map +0 -1
  564. package/dist/chunks/menu-items-DKKcQrb6.js.map +0 -1
  565. package/dist/chunks/provide-CqCWUUfi.js +0 -113
  566. package/dist/chunks/provide-CqCWUUfi.js.map +0 -1
  567. package/dist/chunks/select-bVnWqF4c.js +0 -560
  568. package/dist/chunks/select-bVnWqF4c.js.map +0 -1
  569. package/dist/chunks/signup-button-BC4LmOXx.js.map +0 -1
  570. package/dist/chunks/solid-logic.esm-7q6hmfIF.js.map +0 -1
  571. package/dist/components/menu-items/MenuItems.cjs.js +0 -6
  572. package/dist/components/menu-items/MenuItems.cjs.js.map +0 -1
  573. package/dist/components/menu-items/MenuItems.d.ts +0 -8
  574. package/dist/components/menu-items/MenuItems.d.ts.map +0 -1
  575. package/dist/components/menu-items/MenuItems.esm.js.map +0 -1
  576. package/dist/components/menu-items/MenuItems.styles.cjs.js +0 -2
  577. package/dist/components/menu-items/MenuItems.styles.cjs.js.map +0 -1
  578. package/dist/components/menu-items/MenuItems.styles.esm.js +0 -7
  579. package/dist/components/menu-items/MenuItems.styles.esm.js.map +0 -1
  580. package/dist/components/menu-items/index.cjs.js +0 -2
  581. package/dist/components/menu-items/index.cjs.js.map +0 -1
  582. package/dist/components/menu-items/index.d.ts +0 -4
  583. package/dist/components/menu-items/index.d.ts.map +0 -1
  584. package/dist/components/menu-items/index.esm.js +0 -7
  585. package/dist/components/menu-items/index.esm.js.map +0 -1
  586. package/dist/components/menu-items.js +0 -2
  587. package/dist/lib/menus/context.cjs.js +0 -2
  588. package/dist/lib/menus/context.cjs.js.map +0 -1
  589. package/dist/lib/menus/context.d.ts +0 -7
  590. package/dist/lib/menus/context.d.ts.map +0 -1
  591. package/dist/lib/menus/context.esm.js +0 -7
  592. package/dist/lib/menus/context.esm.js.map +0 -1
  593. package/dist/lib/menus/index.cjs.js +0 -1
  594. package/dist/lib/menus/index.d.ts +0 -2
  595. package/dist/lib/menus/index.d.ts.map +0 -1
  596. package/dist/lib/menus/index.esm.js +0 -1
  597. package/dist/solid-ui.js.map +0 -1
  598. package/dist/v2/components/forms/select/Select.cjs.js +0 -225
  599. package/dist/v2/components/forms/select/Select.cjs.js.map +0 -1
  600. package/dist/v2/components/forms/select/Select.esm.js +0 -394
  601. package/dist/v2/components/forms/select/Select.esm.js.map +0 -1
  602. package/dist/v2/components/forms/select/index.cjs.js +0 -2
  603. package/dist/v2/components/forms/select/index.cjs.js.map +0 -1
  604. package/dist/v2/components/forms/select/index.esm.js +0 -7
  605. package/dist/v2/components/forms/select/index.esm.js.map +0 -1
  606. package/dist/v2/components/forms/shared/downArrow.cjs.js +0 -9
  607. package/dist/v2/components/forms/shared/downArrow.cjs.js.map +0 -1
  608. package/dist/v2/components/forms/shared/downArrow.esm.js +0 -14
  609. package/dist/v2/components/forms/shared/downArrow.esm.js.map +0 -1
  610. package/dist/v2/components/forms/shared/keyboard.cjs.js +0 -2
  611. package/dist/v2/components/forms/shared/keyboard.cjs.js.map +0 -1
  612. package/dist/v2/components/forms/shared/keyboard.esm.js +0 -34
  613. package/dist/v2/components/forms/shared/keyboard.esm.js.map +0 -1
  614. package/dist/v2/components/forms/shared/listboxStyles.cjs.js +0 -95
  615. package/dist/v2/components/forms/shared/listboxStyles.cjs.js.map +0 -1
  616. package/dist/v2/components/forms/shared/listboxStyles.esm.js +0 -100
  617. package/dist/v2/components/forms/shared/listboxStyles.esm.js.map +0 -1
  618. package/dist/v2/components/forms/shared/listboxTemplate.cjs.js +0 -24
  619. package/dist/v2/components/forms/shared/listboxTemplate.cjs.js.map +0 -1
  620. package/dist/v2/components/forms/shared/listboxTemplate.esm.js +0 -37
  621. package/dist/v2/components/forms/shared/listboxTemplate.esm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Header.cjs.js","names":[],"sources":["../../../../../src/v2/components/layout/header/Header.ts"],"sourcesContent":["import { LitElement, html, css } from 'lit'\nimport { icons } from '../../../../lib/iconBase'\nimport { authSession, authn, performServerSideLogout } from 'solid-logic'\nimport '../../auth/loginButton/index'\nimport '../../auth/signupButton/index'\nimport { ifDefined } from 'lit/directives/if-defined.js'\n\nimport '@/components/account'\nimport '@/components/provider'\nimport Features from '../../../../lib/features'\n\nconst DEFAULT_HELP_MENU_ICON = ''\nconst DEFAULT_SOLID_ICON_URL = 'https://solidproject.org/assets/img/solid-emblem.svg'\nconst DEFAULT_SIGNUP_URL = 'https://solidproject.org/get_a_pod'\nconst DEFAULT_LOGGEDIN_MENU_BUTTON_AVATAR = icons.iconBase + 'emptyProfileAvatar.png'\n\nasync function clearPersistedAuthState (): Promise<void> {\n if (typeof window === 'undefined') {\n return\n }\n\n const explicitKeys = ['loginIssuer', 'preLoginRedirectHash']\n for (const key of explicitKeys) {\n window.localStorage.removeItem(key)\n window.sessionStorage.removeItem(key)\n }\n\n if (typeof indexedDB === 'undefined') {\n return\n }\n\n const databases = ['soidc', 'solid-client-authn-store', 'solid-client-authn']\n for (const dbName of databases) {\n await new Promise<void>((resolve) => {\n try {\n const request = indexedDB.deleteDatabase(dbName)\n request.onsuccess = () => resolve()\n request.onerror = () => resolve()\n request.onblocked = () => resolve()\n } catch (_err) {\n resolve()\n }\n })\n }\n}\n\nexport type HeaderAuthState = 'logged-out' | 'logged-in'\n\nexport type HeaderMenuItem = {\n label: string\n url?: string\n target?: string\n action?: string\n icon?: string\n}\n\nexport type HeaderAccountMenuItem = HeaderMenuItem & {\n avatar?: string\n webid?: string\n}\n\nexport class Header extends LitElement {\n static properties = {\n logo: { type: String, reflect: true },\n helpIcon: { type: String, attribute: 'help-icon', reflect: true },\n layout: { type: String, reflect: true },\n theme: { type: String, reflect: true },\n brandLink: { type: String, attribute: 'brand-link', reflect: true },\n authState: { type: String, attribute: 'auth-state', reflect: true },\n loginAction: { type: Object, attribute: false },\n signUpAction: { type: Object, attribute: false },\n accountMenu: { type: Array, attribute: false },\n logoutLabel: { type: String, attribute: 'logout-label', reflect: true },\n logoutIcon: { type: String, attribute: 'logout-icon', reflect: true },\n accountIcon: { type: String, attribute: 'account-icon', reflect: true },\n accountAvatar: { type: String, attribute: 'account-avatar', reflect: true },\n accountAvatarFallback: { type: String, attribute: 'account-avatar-fallback', reflect: true },\n loginIcon: { type: String, attribute: 'login-icon', reflect: true },\n signUpIcon: { type: String, attribute: 'sign-up-icon', reflect: true },\n helpMenuList: { type: Array },\n accountMenuOpen: { state: true },\n helpMenuOpen: { state: true },\n hasSlottedAccountMenu: { state: true },\n hasSlottedHelpMenu: { state: true },\n authResolved: { state: true }\n }\n\n static styles = css`\n :host { /* default theme */\n display: block;\n --header-bg: var(--color-header-row-bg, #332746);\n --header-text: var(--color-header-text, #ffffff);\n --header-border: var(--color-border, #efecf3);\n --header-line: var(--color-header-menu-separator-line, #5e546d);\n --header-link: var(--color-text-heading, #000000);\n --header-menu-item-hover: var(--color-header-menu-item-hover, #e6dcff);\n --header-menu-item-selected: var(--color-header-menu-item-selected, #cbb9ff);\n --header-menu-bg: var(--color-menu-bg, #f6f5f9);\n --header-menu-loggedin-bg: var(--color-header-menu-loggedin-bg, #5e546d);\n --header-menu-text: var(--color-menu-item-text, #654d6c);\n --header-border-radius: var(--border-radius-sm, 0.2rem);\n --header-button-bg: var(--color-menu-bg, #ffffff);\n --header-button-text: var(--color-header-button-text, #0F172B);\n --header-button-detail-text: var(--color-header-button-detail-text, #99A1AF);\n --header-shadow: var(--color-header-shadow, 2px 6px 10px 0 rgba(0, 0, 0, 0.4), 2px 8px 24px 0 rgba(0, 0, 0, 0.19));\n font-family: var(--font-family-base, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif);\n }\n\n /* for now light and dark are the same */\n :host([theme='dark']) {\n display: block;\n --header-bg: var(--color-header-row-bg, #332746);\n --header-text: var(--color-header-text, #ffffff);\n --header-border: var(--color-border, #efecf3);\n --header-line: var(--color-header-menu-separator-line, #5e546d);\n --header-link: var(--color-text-heading, #000000);\n --header-menu-item-hover: var(--color-header-menu-item-hover, #e6dcff);\n --header-menu-item-selected: var(--color-header-menu-item-selected, #cbb9ff);\n --header-menu-bg: var(--color-menu-bg, #f6f5f9);\n --header-menu-loggedin-bg: var(--color-header-menu-loggedin-bg, #5e546d);\n --header-menu-text: var(--color-menu-item-text, #654d6c);\n --header-border-radius: var(--border-radius-sm, 0.2rem);\n --header-button-bg: var(--color-menu-bg, #ffffff);\n --header-button-text: var(--color-header-button-text, #0f172a);\n --header-button-detail-text: var(--color-header-button-detail-text, #878192);\n --header-icon-filter: invert(1) brightness(1.3); /* special way to invert SVG color of icons, from white to black */\n --header-shadow: var(--color-header-shadow, 2px 6px 10px 0 rgba(0, 0, 0, 0.4), 2px 8px 24px 0 rgba(0, 0, 0, 0.19));\n font-family: var(--font-family-base, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif);\n }\n\n :host([layout='mobile']) .headerInner {\n flex-wrap: wrap;\n text-align: center;\n gap: 0.5rem;\n }\n\n .headerInner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--header-bg);\n color: var(--header-text);\n padding: 0 1.5rem;\n height: 3.75rem;\n }\n\n ::slotted([slot='navigation-toggle']) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-right: 0.75rem;\n }\n\n :host([layout='desktop']) ::slotted([slot='navigation-toggle']) {\n display: none !important;\n }\n\n .brand {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n text-decoration: none;\n color: inherit;\n }\n\n .brand-not-displayed {\n display: none;\n }\n\n .brand img {\n height: 50px;\n width: 55px;\n object-fit: contain;\n }\n\n .menu {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n margin-left: auto;\n }\n\n .auth-actions {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n }\n\n .auth-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n min-height: 2.25rem;\n padding: 0.5rem 0.875rem;\n border: 1px solid var(--header-border);\n border-radius: 999px;\n background: var(--header-menu-bg);\n color: var(--header-button-text);\n cursor: pointer;\n font: inherit;\n line-height: 1;\n text-decoration: none;\n box-sizing: border-box;\n transition: border-color 0.2s ease, transform 0.2s ease;\n }\n\n .auth-button:hover {\n border-color: var(--header-menu-item-hover);\n }\n\n .auth-button:active {\n transform: translateY(1px);\n }\n\n .auth-button-sign-up {\n background: color-mix(in srgb, var(--header-menu-bg) 78%, var(--header-menu-item-selected) 22%);\n }\n\n .header-menu-separator {\n background: var(--header-line);\n width: 1px;\n height: 2.3rem;\n }\n\n .account-menu-container {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .account-menu-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.625rem;\n min-height: 2.5rem;\n border: 1px solid var(--header-menu-loggedin-bg);\n border-radius: 999px;\n background: var(--header-menu-loggedin-bg);\n color: var(--header-button-text);\n cursor: pointer;\n font: inherit;\n line-height: 1;\n }\n\n :host([layout='mobile']) .account-menu-trigger {\n gap: 0;\n min-height: auto;\n padding: 0;\n border: 1.5px solid var(--header-border);\n background: var(--header-menu-loggedin-bg);\n }\n\n :host([layout='mobile']) .account-menu-trigger-label {\n display: none;\n }\n\n .account-menu-trigger:disabled {\n cursor: default;\n opacity: 0.7;\n }\n\n .account-menu-trigger-icon {\n width: 1rem;\n height: 1rem;\n object-fit: contain;\n flex-shrink: 0;\n }\n\n .account-avatar,\n .account-menu-avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n background: color-mix(in srgb, var(--header-bg) 18%, #ded8e7 82%);\n color: var(--header-button-text);\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n }\n\n .account-avatar {\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 999px;\n border: 1.5px solid var(--header-border);\n }\n\n .account-menu-avatar {\n width: 2rem;\n height: 2rem;\n border-radius: 0.5rem;\n }\n\n .account-avatar img,\n .account-menu-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .account-avatar-img {\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 999px;\n object-fit: cover;\n background-color: var(--header-border);\n }\n\n .account-dropdown {\n position: absolute;\n top: calc(100% + 0.9rem);\n right: 0;\n min-width: 15rem;\n padding: 0.5rem;\n background: var(--header-button-bg);\n border: 1px solid var(--header-border);\n border-radius: var(--header-border-radius);\n box-shadow: var(--header-shadow);\n z-index: 10;\n }\n\n .account-dropdown[hidden] {\n display: none;\n }\n\n .account-menu-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .account-menu-item-link,\n .account-menu-item-button,\n ::slotted([slot='account-menu']) {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n width: 100%;\n box-sizing: border-box;\n color: var(--header-link);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 10px;\n padding: 0.5rem;\n cursor: pointer;\n font: inherit;\n text-align: left;\n }\n\n .account-menu-item-link:hover,\n .account-menu-item-button:hover {\n color: var(--header-link);\n background: var(--header-menu-item-hover);\n border-color: var(--header-menu-item-hover);\n }\n\n .account-menu-item-link:active,\n .account-menu-item-button:active {\n color: var(--header-link);\n background: var(--header-menu-item-selected);\n border-color: var(--header-menu-item-selected);\n transform: translateY(1px);\n }\n\n .account-switch {\n display: block;\n width: 100%;\n color: var(--header-menu-text);\n text-align: left;\n text-transform: uppercase;\n font-size: 80%;\n }\n\n .dropdown-menu-separator {\n display: block;\n width: calc(100% + 1rem);\n margin: 0.5rem -0.5rem;\n border: 0;\n border-top: 1px solid var(--header-border);\n }\n\n .account-menu-copy {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .account-menu-label {\n color: var(--header-button-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .account-menu-webid {\n color: var(--header-button-detail-text);\n font-size: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .help-menu-container {\n position: relative;\n display: flex;\n align-items: center;\n background: transparent;\n }\n\n .help-menu-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: 0;\n background: transparent;\n cursor: pointer;\n }\n\n .help-menu-trigger:disabled {\n cursor: default;\n }\n\n .help-dropdown {\n position: absolute;\n top: calc(100% + 0.9rem);\n right: 0;\n min-width: 12rem;\n padding: 0.5rem;\n background: var(--header-button-bg);\n border: 1px solid var(--header-border);\n border-radius: var(--header-border-radius);\n box-shadow: var(--header-shadow);\n z-index: 10;\n }\n\n .help-dropdown[hidden] {\n display: none;\n }\n\n .help-dropdown-content {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .help-menu-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .help-menu-list a,\n .help-menu-list button,\n ::slotted([slot='help-menu']) {\n display: block;\n width: 100%;\n box-sizing: border-box;\n color: var(--header-link);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 0.375rem 0.5rem;\n cursor: pointer;\n font: inherit;\n text-align: left;\n }\n\n .help-menu-list a:hover,\n .help-menu-list button:hover {\n color: var(--header-link);\n background: var(--header-menu-item-hover);\n border-color: var(--header-menu-item-hover);\n }\n\n .help-menu-list a:active,\n .help-menu-list button:active {\n color: var(--header-link);\n background: var(--header-menu-item-selected);\n border-color: var(--header-menu-item-selected);\n transform: translateY(1px);\n }\n\n ::slotted(a), ::slotted(button) {\n color: var(--header-link);\n text-decoration: none;\n background: var(--header-button-bg);\n border: 1px solid var(--header-border);\n border-radius: 4px;\n padding: 0.25rem 0.5rem;\n cursor: pointer;\n font: inherit;\n }\n\n .help-icon {\n width: 35px;\n height: 35px;\n cursor: pointer;\n }\n\n .help-text {\n color: var(--header-text, #ffffff);\n font: inherit;\n }\n\n .logout-action-icon {\n width: 16px;\n height: 16px;\n display: inline-block;\n object-fit: contain;\n margin-right: 0.5rem;\n }\n `\n\n declare logo: string\n declare helpIcon: string\n declare layout: 'desktop' | 'mobile'\n declare theme: 'light' | 'dark'\n declare brandLink: string\n declare authState: HeaderAuthState\n declare loginAction: HeaderMenuItem\n declare signUpAction: HeaderMenuItem\n declare accountMenu: HeaderAccountMenuItem[]\n declare logoutLabel: string | null\n declare logoutIcon: string\n declare accountIcon: string\n declare accountAvatar: string\n declare accountAvatarFallback: string\n declare loginIcon: string\n declare signUpIcon: string\n declare helpMenuList: HeaderMenuItem[]\n declare accountMenuOpen: boolean\n declare helpMenuOpen: boolean\n declare hasSlottedAccountMenu: boolean\n declare hasSlottedHelpMenu: boolean\n declare authResolved: boolean\n private _refreshPromise: Promise<void> | null = null\n\n private readonly handleAuthSessionChange = () => {\n this.refreshAuthStateFromSession().catch(() => {\n // Keep auth event handling resilient on transient refresh failures.\n })\n }\n\n constructor () {\n super()\n this.logo = DEFAULT_SOLID_ICON_URL\n this.helpIcon = DEFAULT_HELP_MENU_ICON\n this.layout = 'desktop'\n this.theme = 'light'\n this.brandLink = '#'\n this.authState = 'logged-out'\n this.loginAction = { label: 'Log In', action: 'login' }\n this.signUpAction = { label: 'Sign Up', action: 'sign-up', url: DEFAULT_SIGNUP_URL }\n this.accountMenu = []\n this.logoutLabel = 'Log Out'\n this.logoutIcon = ''\n this.accountIcon = '▼'\n this.accountAvatar = ''\n this.accountAvatarFallback = ''\n this.loginIcon = ''\n this.signUpIcon = ''\n this.helpMenuList = []\n this.accountMenuOpen = false\n this.helpMenuOpen = false\n this.hasSlottedAccountMenu = false\n this.hasSlottedHelpMenu = false\n this.authResolved = false\n }\n\n connectedCallback () {\n super.connectedCallback()\n document.addEventListener('click', this.handleDocumentClick)\n window.addEventListener('keydown', this.handleWindowKeydown)\n if (typeof authSession.events?.on === 'function') {\n authSession.events.on('login', this.handleAuthSessionChange)\n authSession.events.on('logout', this.handleAuthSessionChange)\n authSession.events.on('sessionRestore', this.handleAuthSessionChange)\n }\n this.refreshAuthStateFromSession().catch(() => {\n // Keep initial header render resilient on transient refresh failures.\n })\n }\n\n disconnectedCallback () {\n document.removeEventListener('click', this.handleDocumentClick)\n window.removeEventListener('keydown', this.handleWindowKeydown)\n if (typeof authSession.events?.off === 'function') {\n authSession.events.off('login', this.handleAuthSessionChange)\n authSession.events.off('logout', this.handleAuthSessionChange)\n authSession.events.off('sessionRestore', this.handleAuthSessionChange)\n }\n super.disconnectedCallback()\n }\n\n private async refreshAuthStateFromSession () {\n if (!this._refreshPromise) {\n this._refreshPromise = (async () => {\n try {\n await authn.checkUser()\n // Some auth stacks resolve session state asynchronously after first check.\n if (!authn.currentUser()) {\n await authn.checkUser()\n }\n } catch (_err) {\n // Keep rendering even if session refresh cannot complete.\n }\n })()\n }\n\n try {\n await this._refreshPromise\n } finally {\n this._refreshPromise = null\n }\n\n this.authState = authn.currentUser() ? 'logged-in' : 'logged-out'\n this.authResolved = true\n }\n\n private handleHelpMenuClick (item: HeaderMenuItem, event: MouseEvent) {\n event.preventDefault()\n this.helpMenuOpen = false\n this.dispatchEvent(new CustomEvent('help-menu-select', {\n detail: item,\n bubbles: true,\n composed: true\n }))\n if (item.url) {\n const target = item.target || '_blank'\n const features = target === '_blank' ? 'noopener,noreferrer' : undefined\n window.open(item.url, target, features)\n }\n }\n\n private handleAccountMenuClick (item: HeaderAccountMenuItem) {\n this.accountMenuOpen = false\n this.dispatchEvent(new CustomEvent('account-menu-select', {\n detail: item,\n bubbles: true,\n composed: true\n }))\n }\n\n private readonly handleDocumentClick = (event: MouseEvent) => {\n if (!event.composedPath().includes(this)) {\n this.accountMenuOpen = false\n this.helpMenuOpen = false\n }\n }\n\n private readonly handleWindowKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && (this.accountMenuOpen || this.helpMenuOpen)) {\n this.accountMenuOpen = false\n this.helpMenuOpen = false\n }\n }\n\n private handleAccountSlotChange (event: Event) {\n const slot = event.target as HTMLSlotElement\n this.hasSlottedAccountMenu = slot.assignedElements({ flatten: true }).length > 0\n }\n\n private handleHelpSlotChange (event: Event) {\n const slot = event.target as HTMLSlotElement\n this.hasSlottedHelpMenu = slot.assignedElements({ flatten: true }).length > 0\n }\n\n private toggleAccountMenu (event: MouseEvent) {\n event.preventDefault()\n if (!this.hasAccountMenuItems()) return\n this.helpMenuOpen = false\n this.accountMenuOpen = !this.accountMenuOpen\n }\n\n private toggleHelpMenu (event: MouseEvent) {\n event.preventDefault()\n if (!this.hasHelpMenuItems()) return\n this.accountMenuOpen = false\n this.helpMenuOpen = !this.helpMenuOpen\n }\n\n private hasAccountMenuItems () {\n return Boolean(this.accountMenu?.length || this.hasSlottedAccountMenu || this.logoutLabel)\n }\n\n private hasHelpMenuItems () {\n return Boolean(this.helpMenuList?.length || this.hasSlottedHelpMenu)\n }\n\n private shouldRenderHelpMenu () {\n return this.layout !== 'mobile' && this.hasHelpMenuItems()\n }\n\n private renderLoggedInAvatar (avatar?: string, wrapperClass = 'account-avatar') {\n const hasAvatar = Boolean(avatar)\n const imageSrc = hasAvatar ? avatar : this.accountAvatarFallback || DEFAULT_LOGGEDIN_MENU_BUTTON_AVATAR\n const imageAlt = hasAvatar ? 'Profile Avatar' : 'Default Avatar'\n\n if (this.layout === 'mobile' && wrapperClass === 'account-avatar') {\n return html`<img class=\"account-avatar-img\" src=\"${imageSrc}\" alt=\"${imageAlt}\" />`\n }\n\n return html`\n <span class=\"${wrapperClass}\" aria-hidden=\"true\">\n <img src=\"${imageSrc}\" alt=\"${imageAlt}\" />\n </span>\n `\n }\n\n private renderLoggedOutActions () {\n return html`\n <div class=\"auth-actions\" part=\"auth-actions\">\n <slot name=\"login-action\">\n <solid-ui-login-button\n label=\"${this.loginAction.label}\"\n icon=${ifDefined(this.layout !== 'mobile' ? (this.loginIcon || this.loginAction.icon) : undefined)}\n layout=\"${this.layout}\"\n theme=\"${this.theme}\"\n part=\"login-action\"\n @login-success=\"${() => this.handleLoginSuccess()}\"\n ></solid-ui-login-button>\n </slot>\n <slot name=\"sign-up-action\">\n <solid-ui-signup-button\n label=\"${this.signUpAction.label}\"\n signup-url=\"${ifDefined(this.signUpAction.url)}\"\n layout=\"${this.layout}\"\n .icon=${ifDefined(this.layout !== 'mobile' ? (this.signUpIcon || this.signUpAction.icon) : undefined)}\n theme=\"${this.theme}\"\n part=\"sign-up-action\"\n ></solid-ui-signup-button>\n </slot>\n </div>\n `\n }\n\n private async handleLoginSuccess () {\n await this.refreshAuthStateFromSession()\n this.dispatchEvent(new CustomEvent('auth-action-select', {\n detail: { role: 'login' },\n bubbles: true,\n composed: true\n }))\n }\n\n private async handleLogout () {\n this.accountMenuOpen = false\n const issuer = window.localStorage.getItem('loginIssuer') || ''\n\n try {\n await authSession.logout()\n } catch (_err) {\n // logout errors are non-fatal — proceed to clear state\n }\n\n await clearPersistedAuthState()\n\n const redirectedToServerLogout = await performServerSideLogout({\n issuer,\n postLogoutRedirectPath: '/'\n })\n if (redirectedToServerLogout) {\n return\n }\n\n await this.refreshAuthStateFromSession()\n this.dispatchEvent(new CustomEvent('logout-select', {\n detail: { role: 'logout' },\n bubbles: true,\n composed: true\n }))\n }\n\n private renderAccountMenuItem (item: HeaderAccountMenuItem) {\n const content = html`\n ${this.renderLoggedInAvatar(item.avatar, 'account-menu-avatar')}\n <span class=\"account-menu-copy\">\n <span class=\"account-menu-label\">${item.label}</span>\n ${item.webid && this.layout !== 'mobile' ? html`<span class=\"account-menu-webid\">${item.webid}</span>` : ''}\n </span>\n `\n\n if (item.url) {\n return html`\n <a\n class=\"account-menu-item-link\"\n href=\"${item.url}\"\n @click=\"${() => this.handleAccountMenuClick(item)}\"\n part=\"account-menu-item\"\n role=\"menuitem\"\n >\n ${content}\n </a>\n `\n }\n\n return html`\n <button\n class=\"account-menu-item-button\"\n type=\"button\"\n @click=\"${() => this.handleAccountMenuClick(item)}\"\n part=\"account-menu-item\"\n role=\"menuitem\"\n >\n ${content}\n </button>\n `\n }\n\n private renderLoggedInActions () {\n return html`\n <div class=\"account-menu-container\" part=\"account-menu-container\">\n <slot name=\"account-trigger\">\n <button\n id=\"accountMenuTrigger\"\n class=\"account-menu-trigger\"\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded=\"${this.accountMenuOpen ? 'true' : 'false'}\"\n ?disabled=\"${!this.hasAccountMenuItems()}\"\n @click=\"${(e: MouseEvent) => this.toggleAccountMenu(e)}\"\n part=\"account-menu-trigger\"\n >\n ${this.renderLoggedInAvatar(this.accountAvatar)}\n ${this.layout !== 'mobile' && this.accountIcon\n? html`\n <img class=\"account-menu-trigger-icon\" src=\"${this.accountIcon}\" alt=\"\" aria-hidden=\"true\" />`\n: ''}\n </button>\n </slot>\n\n <nav\n id=\"accountMenu\"\n class=\"account-dropdown\"\n role=\"menu\"\n ?inert=\"${!this.accountMenuOpen || !this.hasAccountMenuItems()}\"\n ?hidden=\"${!this.accountMenuOpen || !this.hasAccountMenuItems()}\"\n part=\"account-dropdown\"\n >\n <slot name=\"account-switch\" class=\"account-switch\">Switch account</slot>\n <hr class=\"dropdown-menu-separator\" />\n <slot name=\"account-menu\" @slotchange=\"${(e: Event) => this.handleAccountSlotChange(e)}\"></slot>\n ${this.accountMenu && this.accountMenu.length\n ? html`\n <ul class=\"account-menu-list\">\n ${this.accountMenu.map((item: HeaderAccountMenuItem) => html`\n <li>${this.renderAccountMenuItem(item)}</li>\n `)}\n </ul>\n `\n : ''}\n ${this.logoutLabel\n ? html`\n <hr class=\"dropdown-menu-separator\" />\n <button\n class=\"account-menu-item-button\"\n type=\"button\"\n @click=\"${() => this.handleLogout()}\"\n part=\"logout-action\"\n role=\"menuitem\"\n >\n ${this.logoutIcon && this.layout !== 'mobile'\n ? html`<img class=\"logout-action-icon\" src=\"${this.logoutIcon}\" alt=\"\" aria-hidden=\"true\" part=\"logout-action-icon\" />`\n : ''}\n ${this.logoutLabel}\n </button>\n `\n : ''}\n </nav>\n </div>\n `\n }\n\n private renderUserArea () {\n if (Features.DESIGN_SYSTEM_HEADER_ACCOUNT) {\n return html`\n <solid-ui-provider>\n <solid-ui-account></solid-ui-account>\n </solid-ui-provider>\n `\n }\n\n if (!this.authResolved) {\n return html`<div class=\"auth-actions\" part=\"auth-actions\"></div>`\n }\n\n if (this.authState === 'logged-out') {\n return this.renderLoggedOutActions()\n }\n\n return this.renderLoggedInActions()\n }\n\n protected firstUpdated () {\n const brandLink = this.shadowRoot?.getElementById('brandLink')\n if (brandLink) {\n brandLink.classList.toggle('brand-not-displayed', this.layout === 'mobile')\n }\n }\n\n protected updated (changedProperties: Map<string, unknown>) {\n if (changedProperties.has('layout')) {\n const brandLink = this.shadowRoot?.getElementById('brandLink')\n if (brandLink) {\n brandLink.classList.toggle('brand-not-displayed', this.layout === 'mobile')\n }\n }\n }\n\n render () {\n return html`\n <div class=\"headerInner\">\n <slot name=\"navigation-toggle\"></slot>\n <a\n id=\"brandLink\"\n class=\"brand\"\n href=\"${this.brandLink}\"\n part=\"brand\"\n >\n <img id=\"brandImg\" src=\"${this.logo}\" alt=\"Logo\" part=\"logo\" />\n </a>\n\n <div class=\"menu\" part=\"menu\">\n ${this.renderUserArea()}\n\n ${this.shouldRenderHelpMenu()\n ? html`\n <div class=\"header-menu-separator\" />`\n : ''}\n\n ${this.shouldRenderHelpMenu()\n ? html`\n <div class=\"help-menu-container\" part=\"help-menu-container\">\n <button\n id=\"helpMenuTrigger\"\n class=\"help-menu-trigger\"\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded=\"${this.helpMenuOpen ? 'true' : 'false'}\"\n ?disabled=\"${!this.hasHelpMenuItems()}\"\n @click=\"${(e: MouseEvent) => this.toggleHelpMenu(e)}\"\n part=\"help-menu-trigger\"\n >\n ${this.helpIcon\n ? html`<img id=\"helpIcon\" class=\"help-icon\" src=\"${this.helpIcon}\" alt=\"Help\" part=\"help-icon\" />`\n : html`<span class=\"help-text\" part=\"help-text\">Help</span>`}\n </button>\n\n <nav\n id=\"helpMenu\"\n class=\"help-dropdown\"\n role=\"menu\"\n ?inert=\"${!this.helpMenuOpen || !this.hasHelpMenuItems()}\"\n ?hidden=\"${!this.helpMenuOpen || !this.hasHelpMenuItems()}\"\n part=\"help-dropdown\"\n >\n <div class=\"help-dropdown-content\" @click=\"${() => { this.helpMenuOpen = false }}\">\n <slot name=\"help-menu\" @slotchange=\"${(e: Event) => this.handleHelpSlotChange(e)}\"></slot>\n ${this.helpMenuList && this.helpMenuList.length\n ? html`\n <ul class=\"help-menu-list\">\n ${this.helpMenuList.map((item: HeaderMenuItem) => html`\n <li>\n ${item.url\n ? html`\n <a\n href=\"${item.url}\"\n target=\"${item.target || '_blank'}\"\n rel=\"${ifDefined((item.target || '_blank') === '_blank' ? 'noopener noreferrer' : undefined)}\"\n @click=\"${(e: MouseEvent) => this.handleHelpMenuClick(item, e)}\"\n part=\"help-menu-item\"\n role=\"menuitem\"\n >\n ${item.label}\n </a>\n `\n : html`\n <button\n type=\"button\"\n @click=\"${(e: MouseEvent) => this.handleHelpMenuClick(item, e)}\"\n part=\"help-menu-item\"\n role=\"menuitem\"\n >\n ${item.label}\n </button>\n `}\n </li>\n `)}\n </ul>\n `\n : ''}\n </div>\n </nav>\n </div>`\n : ''}\n </div>\n </div>\n `\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Header.cjs.js","names":[],"sources":["../../../../../src/v2/components/layout/header/Header.ts"],"sourcesContent":["import { LitElement, html, css } from 'lit'\nimport { icons } from '../../../../lib/iconBase'\nimport { authSession, authn, performServerSideLogout } from 'solid-logic'\nimport '../../auth/loginButton/index'\nimport '../../auth/signupButton/index'\nimport { ifDefined } from 'lit/directives/if-defined.js'\n\nimport '@/components/account'\nimport '@/components/provider'\nimport Features from '../../../../lib/features'\n\nconst DEFAULT_HELP_MENU_ICON = ''\nconst DEFAULT_SOLID_ICON_URL = 'https://solidproject.org/assets/img/solid-emblem.svg'\nconst DEFAULT_SIGNUP_URL = 'https://solidproject.org/get_a_pod'\nconst DEFAULT_LOGGEDIN_MENU_BUTTON_AVATAR = icons.iconBase + 'emptyProfileAvatar.png'\n\nasync function clearPersistedAuthState (): Promise<void> {\n if (typeof window === 'undefined') {\n return\n }\n\n const explicitKeys = ['loginIssuer', 'preLoginRedirectHash']\n for (const key of explicitKeys) {\n window.localStorage.removeItem(key)\n window.sessionStorage.removeItem(key)\n }\n\n if (typeof indexedDB === 'undefined') {\n return\n }\n\n const databases = ['soidc', 'solid-client-authn-store', 'solid-client-authn']\n for (const dbName of databases) {\n await new Promise<void>((resolve) => {\n try {\n const request = indexedDB.deleteDatabase(dbName)\n request.onsuccess = () => resolve()\n request.onerror = () => resolve()\n request.onblocked = () => resolve()\n } catch (_err) {\n resolve()\n }\n })\n }\n}\n\nexport type HeaderAuthState = 'logged-out' | 'logged-in'\n\nexport type HeaderMenuItem = {\n label: string\n url?: string\n target?: string\n action?: string\n icon?: string\n}\n\nexport type HeaderAccountMenuItem = HeaderMenuItem & {\n avatar?: string\n webid?: string\n}\n\nexport class Header extends LitElement {\n static properties = {\n logo: { type: String, reflect: true },\n helpIcon: { type: String, attribute: 'help-icon', reflect: true },\n layout: { type: String, reflect: true },\n theme: { type: String, reflect: true },\n brandLink: { type: String, attribute: 'brand-link', reflect: true },\n authState: { type: String, attribute: 'auth-state', reflect: true },\n loginAction: { type: Object, attribute: false },\n signUpAction: { type: Object, attribute: false },\n accountMenu: { type: Array, attribute: false },\n logoutLabel: { type: String, attribute: 'logout-label', reflect: true },\n logoutIcon: { type: String, attribute: 'logout-icon', reflect: true },\n accountIcon: { type: String, attribute: 'account-icon', reflect: true },\n accountAvatar: { type: String, attribute: 'account-avatar', reflect: true },\n accountAvatarFallback: { type: String, attribute: 'account-avatar-fallback', reflect: true },\n loginIcon: { type: String, attribute: 'login-icon', reflect: true },\n signUpIcon: { type: String, attribute: 'sign-up-icon', reflect: true },\n helpMenuList: { type: Array },\n accountMenuOpen: { state: true },\n helpMenuOpen: { state: true },\n hasSlottedAccountMenu: { state: true },\n hasSlottedHelpMenu: { state: true },\n authResolved: { state: true }\n }\n\n static styles = css`\n :host { /* default theme */\n display: block;\n --header-bg: var(--color-header-row-bg, #332746);\n --header-text: var(--color-header-text, #ffffff);\n --header-border: var(--color-border, #efecf3);\n --header-line: var(--color-header-menu-separator-line, #5e546d);\n --header-link: var(--color-text-heading, #000000);\n --header-menu-item-hover: var(--color-header-menu-item-hover, #e6dcff);\n --header-menu-item-selected: var(--color-header-menu-item-selected, #cbb9ff);\n --header-menu-bg: var(--color-menu-bg, #f6f5f9);\n --header-menu-loggedin-bg: var(--color-header-menu-loggedin-bg, #5e546d);\n --header-menu-text: var(--color-menu-item-text, #654d6c);\n --header-border-radius: var(--border-radius-sm, 0.2rem);\n --header-button-bg: var(--color-menu-bg, #ffffff);\n --header-button-text: var(--color-header-button-text, #0F172B);\n --header-button-detail-text: var(--color-header-button-detail-text, #99A1AF);\n --header-shadow: var(--color-header-shadow, 2px 6px 10px 0 rgba(0, 0, 0, 0.4), 2px 8px 24px 0 rgba(0, 0, 0, 0.19));\n font-family: var(--font-family-base, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif);\n }\n\n /* for now light and dark are the same */\n :host([theme='dark']) {\n display: block;\n --header-bg: var(--color-header-row-bg, #332746);\n --header-text: var(--color-header-text, #ffffff);\n --header-border: var(--color-border, #efecf3);\n --header-line: var(--color-header-menu-separator-line, #5e546d);\n --header-link: var(--color-text-heading, #000000);\n --header-menu-item-hover: var(--color-header-menu-item-hover, #e6dcff);\n --header-menu-item-selected: var(--color-header-menu-item-selected, #cbb9ff);\n --header-menu-bg: var(--color-menu-bg, #f6f5f9);\n --header-menu-loggedin-bg: var(--color-header-menu-loggedin-bg, #5e546d);\n --header-menu-text: var(--color-menu-item-text, #654d6c);\n --header-border-radius: var(--border-radius-sm, 0.2rem);\n --header-button-bg: var(--color-menu-bg, #ffffff);\n --header-button-text: var(--color-header-button-text, #0f172a);\n --header-button-detail-text: var(--color-header-button-detail-text, #878192);\n --header-icon-filter: invert(1) brightness(1.3); /* special way to invert SVG color of icons, from white to black */\n --header-shadow: var(--color-header-shadow, 2px 6px 10px 0 rgba(0, 0, 0, 0.4), 2px 8px 24px 0 rgba(0, 0, 0, 0.19));\n font-family: var(--font-family-base, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif);\n }\n\n :host([layout='mobile']) .headerInner {\n flex-wrap: wrap;\n text-align: center;\n gap: 0.5rem;\n }\n\n .headerInner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--header-bg);\n color: var(--header-text);\n padding: 0 1.5rem;\n height: 3.75rem;\n }\n\n ::slotted([slot='navigation-toggle']) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-right: 0.75rem;\n }\n\n :host([layout='desktop']) ::slotted([slot='navigation-toggle']) {\n display: none !important;\n }\n\n .brand {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n text-decoration: none;\n color: inherit;\n }\n\n .brand-not-displayed {\n display: none;\n }\n\n .brand img {\n height: 50px;\n width: 55px;\n object-fit: contain;\n }\n\n .menu {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n margin-left: auto;\n }\n\n .auth-actions {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n }\n\n .auth-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n min-height: 2.25rem;\n padding: 0.5rem 0.875rem;\n border: 1px solid var(--header-border);\n border-radius: 999px;\n background: var(--header-menu-bg);\n color: var(--header-button-text);\n cursor: pointer;\n font: inherit;\n line-height: 1;\n text-decoration: none;\n box-sizing: border-box;\n transition: border-color 0.2s ease, transform 0.2s ease;\n }\n\n .auth-button:hover {\n border-color: var(--header-menu-item-hover);\n }\n\n .auth-button:active {\n transform: translateY(1px);\n }\n\n .auth-button-sign-up {\n background: color-mix(in srgb, var(--header-menu-bg) 78%, var(--header-menu-item-selected) 22%);\n }\n\n .header-menu-separator {\n background: var(--header-line);\n width: 1px;\n height: 2.3rem;\n }\n\n .account-menu-container {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .account-menu-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.625rem;\n min-height: 2.5rem;\n border: 1px solid var(--header-menu-loggedin-bg);\n border-radius: 999px;\n background: var(--header-menu-loggedin-bg);\n color: var(--header-button-text);\n cursor: pointer;\n font: inherit;\n line-height: 1;\n }\n\n :host([layout='mobile']) .account-menu-trigger {\n gap: 0;\n min-height: auto;\n padding: 0;\n border: 1.5px solid var(--header-border);\n background: var(--header-menu-loggedin-bg);\n }\n\n :host([layout='mobile']) .account-menu-trigger-label {\n display: none;\n }\n\n .account-menu-trigger:disabled {\n cursor: default;\n opacity: 0.7;\n }\n\n .account-menu-trigger-icon {\n width: 1rem;\n height: 1rem;\n object-fit: contain;\n flex-shrink: 0;\n }\n\n .account-avatar,\n .account-menu-avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n background: color-mix(in srgb, var(--header-bg) 18%, #ded8e7 82%);\n color: var(--header-button-text);\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n }\n\n .account-avatar {\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 999px;\n border: 1.5px solid var(--header-border);\n }\n\n .account-menu-avatar {\n width: 2rem;\n height: 2rem;\n border-radius: 0.5rem;\n }\n\n .account-avatar img,\n .account-menu-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .account-avatar-img {\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 999px;\n object-fit: cover;\n background-color: var(--header-border);\n }\n\n .account-dropdown {\n position: absolute;\n top: calc(100% + 0.9rem);\n right: 0;\n min-width: 15rem;\n padding: 0.5rem;\n background: var(--header-button-bg);\n border: 1px solid var(--header-border);\n border-radius: var(--header-border-radius);\n box-shadow: var(--header-shadow);\n z-index: 10;\n }\n\n .account-dropdown[hidden] {\n display: none;\n }\n\n .account-menu-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .account-menu-item-link,\n .account-menu-item-button,\n ::slotted([slot='account-menu']) {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n width: 100%;\n box-sizing: border-box;\n color: var(--header-link);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 10px;\n padding: 0.5rem;\n cursor: pointer;\n font: inherit;\n text-align: left;\n }\n\n .account-menu-item-link:hover,\n .account-menu-item-button:hover {\n color: var(--header-link);\n background: var(--header-menu-item-hover);\n border-color: var(--header-menu-item-hover);\n }\n\n .account-menu-item-link:active,\n .account-menu-item-button:active {\n color: var(--header-link);\n background: var(--header-menu-item-selected);\n border-color: var(--header-menu-item-selected);\n transform: translateY(1px);\n }\n\n .account-switch {\n display: block;\n width: 100%;\n color: var(--header-menu-text);\n text-align: left;\n text-transform: uppercase;\n font-size: 80%;\n }\n\n .dropdown-menu-separator {\n display: block;\n width: calc(100% + 1rem);\n margin: 0.5rem -0.5rem;\n border: 0;\n border-top: 1px solid var(--header-border);\n }\n\n .account-menu-copy {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .account-menu-label {\n color: var(--header-button-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .account-menu-webid {\n color: var(--header-button-detail-text);\n font-size: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .help-menu-container {\n position: relative;\n display: flex;\n align-items: center;\n background: transparent;\n }\n\n .help-menu-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: 0;\n background: transparent;\n cursor: pointer;\n }\n\n .help-menu-trigger:disabled {\n cursor: default;\n }\n\n .help-dropdown {\n position: absolute;\n top: calc(100% + 0.9rem);\n right: 0;\n min-width: 12rem;\n padding: 0.5rem;\n background: var(--header-button-bg);\n border: 1px solid var(--header-border);\n border-radius: var(--header-border-radius);\n box-shadow: var(--header-shadow);\n z-index: 10;\n }\n\n .help-dropdown[hidden] {\n display: none;\n }\n\n .help-dropdown-content {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .help-menu-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .help-menu-list a,\n .help-menu-list button,\n ::slotted([slot='help-menu']) {\n display: block;\n width: 100%;\n box-sizing: border-box;\n color: var(--header-link);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 0.375rem 0.5rem;\n cursor: pointer;\n font: inherit;\n text-align: left;\n }\n\n .help-menu-list a:hover,\n .help-menu-list button:hover {\n color: var(--header-link);\n background: var(--header-menu-item-hover);\n border-color: var(--header-menu-item-hover);\n }\n\n .help-menu-list a:active,\n .help-menu-list button:active {\n color: var(--header-link);\n background: var(--header-menu-item-selected);\n border-color: var(--header-menu-item-selected);\n transform: translateY(1px);\n }\n\n ::slotted(a), ::slotted(button) {\n color: var(--header-link);\n text-decoration: none;\n background: var(--header-button-bg);\n border: 1px solid var(--header-border);\n border-radius: 4px;\n padding: 0.25rem 0.5rem;\n cursor: pointer;\n font: inherit;\n }\n\n .help-icon {\n width: 35px;\n height: 35px;\n cursor: pointer;\n }\n\n .help-text {\n color: var(--header-text, #ffffff);\n font: inherit;\n }\n\n .logout-action-icon {\n width: 16px;\n height: 16px;\n display: inline-block;\n object-fit: contain;\n margin-right: 0.5rem;\n }\n `\n\n declare logo: string\n declare helpIcon: string\n declare layout: 'desktop' | 'mobile'\n declare theme: 'light' | 'dark'\n declare brandLink: string\n declare authState: HeaderAuthState\n declare loginAction: HeaderMenuItem\n declare signUpAction: HeaderMenuItem\n declare accountMenu: HeaderAccountMenuItem[]\n declare logoutLabel: string | null\n declare logoutIcon: string\n declare accountIcon: string\n declare accountAvatar: string\n declare accountAvatarFallback: string\n declare loginIcon: string\n declare signUpIcon: string\n declare helpMenuList: HeaderMenuItem[]\n declare accountMenuOpen: boolean\n declare helpMenuOpen: boolean\n declare hasSlottedAccountMenu: boolean\n declare hasSlottedHelpMenu: boolean\n declare authResolved: boolean\n private _refreshPromise: Promise<void> | null = null\n\n private readonly handleAuthSessionChange = () => {\n this.refreshAuthStateFromSession().catch(() => {\n // Keep auth event handling resilient on transient refresh failures.\n })\n }\n\n constructor () {\n super()\n this.logo = DEFAULT_SOLID_ICON_URL\n this.helpIcon = DEFAULT_HELP_MENU_ICON\n this.layout = 'desktop'\n this.theme = 'light'\n this.brandLink = '#'\n this.authState = 'logged-out'\n this.loginAction = { label: 'Log In', action: 'login' }\n this.signUpAction = { label: 'Sign Up', action: 'sign-up', url: DEFAULT_SIGNUP_URL }\n this.accountMenu = []\n this.logoutLabel = 'Log Out'\n this.logoutIcon = ''\n this.accountIcon = '▼'\n this.accountAvatar = ''\n this.accountAvatarFallback = ''\n this.loginIcon = ''\n this.signUpIcon = ''\n this.helpMenuList = []\n this.accountMenuOpen = false\n this.helpMenuOpen = false\n this.hasSlottedAccountMenu = false\n this.hasSlottedHelpMenu = false\n this.authResolved = false\n }\n\n connectedCallback () {\n super.connectedCallback()\n document.addEventListener('click', this.handleDocumentClick)\n window.addEventListener('keydown', this.handleWindowKeydown)\n if (typeof authSession.events?.on === 'function') {\n authSession.events.on('login', this.handleAuthSessionChange)\n authSession.events.on('logout', this.handleAuthSessionChange)\n authSession.events.on('sessionRestore', this.handleAuthSessionChange)\n }\n this.refreshAuthStateFromSession().catch(() => {\n // Keep initial header render resilient on transient refresh failures.\n })\n }\n\n disconnectedCallback () {\n document.removeEventListener('click', this.handleDocumentClick)\n window.removeEventListener('keydown', this.handleWindowKeydown)\n if (typeof authSession.events?.off === 'function') {\n authSession.events.off('login', this.handleAuthSessionChange)\n authSession.events.off('logout', this.handleAuthSessionChange)\n authSession.events.off('sessionRestore', this.handleAuthSessionChange)\n }\n super.disconnectedCallback()\n }\n\n private async refreshAuthStateFromSession () {\n if (!this._refreshPromise) {\n this._refreshPromise = (async () => {\n try {\n await authn.checkUser()\n // Some auth stacks resolve session state asynchronously after first check.\n if (!authn.currentUser()) {\n await authn.checkUser()\n }\n } catch (_err) {\n // Keep rendering even if session refresh cannot complete.\n }\n })()\n }\n\n try {\n await this._refreshPromise\n } finally {\n this._refreshPromise = null\n }\n\n this.authState = authn.currentUser() ? 'logged-in' : 'logged-out'\n this.authResolved = true\n }\n\n private handleHelpMenuClick (item: HeaderMenuItem, event: MouseEvent) {\n event.preventDefault()\n this.helpMenuOpen = false\n this.dispatchEvent(new CustomEvent('help-menu-select', {\n detail: item,\n bubbles: true,\n composed: true\n }))\n if (item.url) {\n const target = item.target || '_blank'\n const features = target === '_blank' ? 'noopener,noreferrer' : undefined\n window.open(item.url, target, features)\n }\n }\n\n private handleAccountMenuClick (item: HeaderAccountMenuItem) {\n this.accountMenuOpen = false\n this.dispatchEvent(new CustomEvent('account-menu-select', {\n detail: item,\n bubbles: true,\n composed: true\n }))\n }\n\n private readonly handleDocumentClick = (event: MouseEvent) => {\n if (!event.composedPath().includes(this)) {\n this.accountMenuOpen = false\n this.helpMenuOpen = false\n }\n }\n\n private readonly handleWindowKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && (this.accountMenuOpen || this.helpMenuOpen)) {\n this.accountMenuOpen = false\n this.helpMenuOpen = false\n }\n }\n\n private handleAccountSlotChange (event: Event) {\n const slot = event.target as HTMLSlotElement\n this.hasSlottedAccountMenu = slot.assignedElements({ flatten: true }).length > 0\n }\n\n private handleHelpSlotChange (event: Event) {\n const slot = event.target as HTMLSlotElement\n this.hasSlottedHelpMenu = slot.assignedElements({ flatten: true }).length > 0\n }\n\n private toggleAccountMenu (event: MouseEvent) {\n event.preventDefault()\n if (!this.hasAccountMenuItems()) return\n this.helpMenuOpen = false\n this.accountMenuOpen = !this.accountMenuOpen\n }\n\n private toggleHelpMenu (event: MouseEvent) {\n event.preventDefault()\n if (!this.hasHelpMenuItems()) return\n this.accountMenuOpen = false\n this.helpMenuOpen = !this.helpMenuOpen\n }\n\n private hasAccountMenuItems () {\n return Boolean(this.accountMenu?.length || this.hasSlottedAccountMenu || this.logoutLabel)\n }\n\n private hasHelpMenuItems () {\n return Boolean(this.helpMenuList?.length || this.hasSlottedHelpMenu)\n }\n\n private shouldRenderHelpMenu () {\n return this.layout !== 'mobile' && this.hasHelpMenuItems()\n }\n\n private renderLoggedInAvatar (avatar?: string, wrapperClass = 'account-avatar') {\n const hasAvatar = Boolean(avatar)\n const imageSrc = hasAvatar ? avatar : this.accountAvatarFallback || DEFAULT_LOGGEDIN_MENU_BUTTON_AVATAR\n const imageAlt = hasAvatar ? 'Profile Avatar' : 'Default Avatar'\n\n if (this.layout === 'mobile' && wrapperClass === 'account-avatar') {\n return html`<img class=\"account-avatar-img\" src=\"${imageSrc}\" alt=\"${imageAlt}\" />`\n }\n\n return html`\n <span class=\"${wrapperClass}\" aria-hidden=\"true\">\n <img src=\"${imageSrc}\" alt=\"${imageAlt}\" />\n </span>\n `\n }\n\n private renderLoggedOutActions () {\n return html`\n <div class=\"auth-actions\" part=\"auth-actions\">\n <slot name=\"login-action\">\n <solid-ui-login-button\n label=\"${this.loginAction.label}\"\n icon=${ifDefined(this.layout !== 'mobile' ? (this.loginIcon || this.loginAction.icon) : undefined)}\n layout=\"${this.layout}\"\n theme=\"${this.theme}\"\n part=\"login-action\"\n @login-success=\"${() => this.handleLoginSuccess()}\"\n ></solid-ui-login-button>\n </slot>\n <slot name=\"sign-up-action\">\n <solid-ui-signup-button\n label=\"${this.signUpAction.label}\"\n signup-url=\"${ifDefined(this.signUpAction.url)}\"\n layout=\"${this.layout}\"\n .icon=${ifDefined(this.layout !== 'mobile' ? (this.signUpIcon || this.signUpAction.icon) : undefined)}\n theme=\"${this.theme}\"\n part=\"sign-up-action\"\n ></solid-ui-signup-button>\n </slot>\n </div>\n `\n }\n\n private async handleLoginSuccess () {\n await this.refreshAuthStateFromSession()\n this.dispatchEvent(new CustomEvent('auth-action-select', {\n detail: { role: 'login' },\n bubbles: true,\n composed: true\n }))\n }\n\n private async handleLogout () {\n this.accountMenuOpen = false\n const issuer = window.localStorage.getItem('loginIssuer') || ''\n\n try {\n await authSession.logout()\n } catch (_err) {\n // logout errors are non-fatal — proceed to clear state\n }\n\n await clearPersistedAuthState()\n\n const redirectedToServerLogout = await performServerSideLogout({\n issuer,\n postLogoutRedirectPath: '/'\n })\n if (redirectedToServerLogout) {\n return\n }\n\n await this.refreshAuthStateFromSession()\n this.dispatchEvent(new CustomEvent('logout-select', {\n detail: { role: 'logout' },\n bubbles: true,\n composed: true\n }))\n }\n\n private renderAccountMenuItem (item: HeaderAccountMenuItem) {\n const content = html`\n ${this.renderLoggedInAvatar(item.avatar, 'account-menu-avatar')}\n <span class=\"account-menu-copy\">\n <span class=\"account-menu-label\">${item.label}</span>\n ${item.webid && this.layout !== 'mobile' ? html`<span class=\"account-menu-webid\">${item.webid}</span>` : ''}\n </span>\n `\n\n if (item.url) {\n return html`\n <a\n class=\"account-menu-item-link\"\n href=\"${item.url}\"\n @click=\"${() => this.handleAccountMenuClick(item)}\"\n part=\"account-menu-item\"\n role=\"menuitem\"\n >\n ${content}\n </a>\n `\n }\n\n return html`\n <button\n class=\"account-menu-item-button\"\n type=\"button\"\n @click=\"${() => this.handleAccountMenuClick(item)}\"\n part=\"account-menu-item\"\n role=\"menuitem\"\n >\n ${content}\n </button>\n `\n }\n\n private renderLoggedInActions () {\n return html`\n <div class=\"account-menu-container\" part=\"account-menu-container\">\n <slot name=\"account-trigger\">\n <button\n id=\"accountMenuTrigger\"\n class=\"account-menu-trigger\"\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded=\"${this.accountMenuOpen ? 'true' : 'false'}\"\n ?disabled=\"${!this.hasAccountMenuItems()}\"\n @click=\"${(e: MouseEvent) => this.toggleAccountMenu(e)}\"\n part=\"account-menu-trigger\"\n >\n ${this.renderLoggedInAvatar(this.accountAvatar)}\n ${this.layout !== 'mobile' && this.accountIcon\n? html`\n <img class=\"account-menu-trigger-icon\" src=\"${this.accountIcon}\" alt=\"\" aria-hidden=\"true\" />`\n: ''}\n </button>\n </slot>\n\n <nav\n id=\"accountMenu\"\n class=\"account-dropdown\"\n role=\"menu\"\n ?inert=\"${!this.accountMenuOpen || !this.hasAccountMenuItems()}\"\n ?hidden=\"${!this.accountMenuOpen || !this.hasAccountMenuItems()}\"\n part=\"account-dropdown\"\n >\n <slot name=\"account-switch\" class=\"account-switch\">Switch account</slot>\n <hr class=\"dropdown-menu-separator\" />\n <slot name=\"account-menu\" @slotchange=\"${(e: Event) => this.handleAccountSlotChange(e)}\"></slot>\n ${this.accountMenu && this.accountMenu.length\n ? html`\n <ul class=\"account-menu-list\">\n ${this.accountMenu.map((item: HeaderAccountMenuItem) => html`\n <li>${this.renderAccountMenuItem(item)}</li>\n `)}\n </ul>\n `\n : ''}\n ${this.logoutLabel\n ? html`\n <hr class=\"dropdown-menu-separator\" />\n <button\n class=\"account-menu-item-button\"\n type=\"button\"\n @click=\"${() => this.handleLogout()}\"\n part=\"logout-action\"\n role=\"menuitem\"\n >\n ${this.logoutIcon && this.layout !== 'mobile'\n ? html`<img class=\"logout-action-icon\" src=\"${this.logoutIcon}\" alt=\"\" aria-hidden=\"true\" part=\"logout-action-icon\" />`\n : ''}\n ${this.logoutLabel}\n </button>\n `\n : ''}\n </nav>\n </div>\n `\n }\n\n private renderUserArea () {\n if (Features.DESIGN_SYSTEM_HEADER_ACCOUNT) {\n return html`\n <solid-ui-provider>\n <solid-ui-account></solid-ui-account>\n </solid-ui-provider>\n `\n }\n\n if (!this.authResolved) {\n return html`<div class=\"auth-actions\" part=\"auth-actions\"></div>`\n }\n\n if (this.authState === 'logged-out') {\n return this.renderLoggedOutActions()\n }\n\n return this.renderLoggedInActions()\n }\n\n protected firstUpdated () {\n const brandLink = this.shadowRoot?.getElementById('brandLink')\n if (brandLink) {\n brandLink.classList.toggle('brand-not-displayed', this.layout === 'mobile')\n }\n }\n\n protected updated (changedProperties: Map<string, unknown>) {\n if (changedProperties.has('layout')) {\n const brandLink = this.shadowRoot?.getElementById('brandLink')\n if (brandLink) {\n brandLink.classList.toggle('brand-not-displayed', this.layout === 'mobile')\n }\n }\n }\n\n render () {\n return html`\n <div class=\"headerInner\">\n <slot name=\"navigation-toggle\"></slot>\n <a\n id=\"brandLink\"\n class=\"brand\"\n href=\"${this.brandLink}\"\n part=\"brand\"\n >\n <img id=\"brandImg\" src=\"${this.logo}\" alt=\"Logo\" part=\"logo\" />\n </a>\n\n <div class=\"menu\" part=\"menu\">\n ${this.renderUserArea()}\n\n ${this.shouldRenderHelpMenu()\n ? html`\n <div class=\"header-menu-separator\" />`\n : ''}\n\n ${this.shouldRenderHelpMenu()\n ? html`\n <div class=\"help-menu-container\" part=\"help-menu-container\">\n <button\n id=\"helpMenuTrigger\"\n class=\"help-menu-trigger\"\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded=\"${this.helpMenuOpen ? 'true' : 'false'}\"\n ?disabled=\"${!this.hasHelpMenuItems()}\"\n @click=\"${(e: MouseEvent) => this.toggleHelpMenu(e)}\"\n part=\"help-menu-trigger\"\n >\n ${this.helpIcon\n ? html`<img id=\"helpIcon\" class=\"help-icon\" src=\"${this.helpIcon}\" alt=\"Help\" part=\"help-icon\" />`\n : html`<span class=\"help-text\" part=\"help-text\">Help</span>`}\n </button>\n\n <nav\n id=\"helpMenu\"\n class=\"help-dropdown\"\n role=\"menu\"\n ?inert=\"${!this.helpMenuOpen || !this.hasHelpMenuItems()}\"\n ?hidden=\"${!this.helpMenuOpen || !this.hasHelpMenuItems()}\"\n part=\"help-dropdown\"\n >\n <div class=\"help-dropdown-content\" @click=\"${() => { this.helpMenuOpen = false }}\">\n <slot name=\"help-menu\" @slotchange=\"${(e: Event) => this.handleHelpSlotChange(e)}\"></slot>\n ${this.helpMenuList && this.helpMenuList.length\n ? html`\n <ul class=\"help-menu-list\">\n ${this.helpMenuList.map((item: HeaderMenuItem) => html`\n <li>\n ${item.url\n ? html`\n <a\n href=\"${item.url}\"\n target=\"${item.target || '_blank'}\"\n rel=\"${ifDefined((item.target || '_blank') === '_blank' ? 'noopener noreferrer' : undefined)}\"\n @click=\"${(e: MouseEvent) => this.handleHelpMenuClick(item, e)}\"\n part=\"help-menu-item\"\n role=\"menuitem\"\n >\n ${item.label}\n </a>\n `\n : html`\n <button\n type=\"button\"\n @click=\"${(e: MouseEvent) => this.handleHelpMenuClick(item, e)}\"\n part=\"help-menu-item\"\n role=\"menuitem\"\n >\n ${item.label}\n </button>\n `}\n </li>\n `)}\n </ul>\n `\n : ''}\n </div>\n </nav>\n </div>`\n : ''}\n </div>\n </div>\n `\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Header.esm.js","names":[],"sources":["../../../../../src/v2/components/layout/header/Header.ts"],"sourcesContent":["import { LitElement, html, css } from 'lit'\nimport { icons } from '../../../../lib/iconBase'\nimport { authSession, authn, performServerSideLogout } from 'solid-logic'\nimport '../../auth/loginButton/index'\nimport '../../auth/signupButton/index'\nimport { ifDefined } from 'lit/directives/if-defined.js'\n\nimport '@/components/account'\nimport '@/components/provider'\nimport Features from '../../../../lib/features'\n\nconst DEFAULT_HELP_MENU_ICON = ''\nconst DEFAULT_SOLID_ICON_URL = 'https://solidproject.org/assets/img/solid-emblem.svg'\nconst DEFAULT_SIGNUP_URL = 'https://solidproject.org/get_a_pod'\nconst DEFAULT_LOGGEDIN_MENU_BUTTON_AVATAR = icons.iconBase + 'emptyProfileAvatar.png'\n\nasync function clearPersistedAuthState (): Promise<void> {\n if (typeof window === 'undefined') {\n return\n }\n\n const explicitKeys = ['loginIssuer', 'preLoginRedirectHash']\n for (const key of explicitKeys) {\n window.localStorage.removeItem(key)\n window.sessionStorage.removeItem(key)\n }\n\n if (typeof indexedDB === 'undefined') {\n return\n }\n\n const databases = ['soidc', 'solid-client-authn-store', 'solid-client-authn']\n for (const dbName of databases) {\n await new Promise<void>((resolve) => {\n try {\n const request = indexedDB.deleteDatabase(dbName)\n request.onsuccess = () => resolve()\n request.onerror = () => resolve()\n request.onblocked = () => resolve()\n } catch (_err) {\n resolve()\n }\n })\n }\n}\n\nexport type HeaderAuthState = 'logged-out' | 'logged-in'\n\nexport type HeaderMenuItem = {\n label: string\n url?: string\n target?: string\n action?: string\n icon?: string\n}\n\nexport type HeaderAccountMenuItem = HeaderMenuItem & {\n avatar?: string\n webid?: string\n}\n\nexport class Header extends LitElement {\n static properties = {\n logo: { type: String, reflect: true },\n helpIcon: { type: String, attribute: 'help-icon', reflect: true },\n layout: { type: String, reflect: true },\n theme: { type: String, reflect: true },\n brandLink: { type: String, attribute: 'brand-link', reflect: true },\n authState: { type: String, attribute: 'auth-state', reflect: true },\n loginAction: { type: Object, attribute: false },\n signUpAction: { type: Object, attribute: false },\n accountMenu: { type: Array, attribute: false },\n logoutLabel: { type: String, attribute: 'logout-label', reflect: true },\n logoutIcon: { type: String, attribute: 'logout-icon', reflect: true },\n accountIcon: { type: String, attribute: 'account-icon', reflect: true },\n accountAvatar: { type: String, attribute: 'account-avatar', reflect: true },\n accountAvatarFallback: { type: String, attribute: 'account-avatar-fallback', reflect: true },\n loginIcon: { type: String, attribute: 'login-icon', reflect: true },\n signUpIcon: { type: String, attribute: 'sign-up-icon', reflect: true },\n helpMenuList: { type: Array },\n accountMenuOpen: { state: true },\n helpMenuOpen: { state: true },\n hasSlottedAccountMenu: { state: true },\n hasSlottedHelpMenu: { state: true },\n authResolved: { state: true }\n }\n\n static styles = css`\n :host { /* default theme */\n display: block;\n --header-bg: var(--color-header-row-bg, #332746);\n --header-text: var(--color-header-text, #ffffff);\n --header-border: var(--color-border, #efecf3);\n --header-line: var(--color-header-menu-separator-line, #5e546d);\n --header-link: var(--color-text-heading, #000000);\n --header-menu-item-hover: var(--color-header-menu-item-hover, #e6dcff);\n --header-menu-item-selected: var(--color-header-menu-item-selected, #cbb9ff);\n --header-menu-bg: var(--color-menu-bg, #f6f5f9);\n --header-menu-loggedin-bg: var(--color-header-menu-loggedin-bg, #5e546d);\n --header-menu-text: var(--color-menu-item-text, #654d6c);\n --header-border-radius: var(--border-radius-sm, 0.2rem);\n --header-button-bg: var(--color-menu-bg, #ffffff);\n --header-button-text: var(--color-header-button-text, #0F172B);\n --header-button-detail-text: var(--color-header-button-detail-text, #99A1AF);\n --header-shadow: var(--color-header-shadow, 2px 6px 10px 0 rgba(0, 0, 0, 0.4), 2px 8px 24px 0 rgba(0, 0, 0, 0.19));\n font-family: var(--font-family-base, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif);\n }\n\n /* for now light and dark are the same */\n :host([theme='dark']) {\n display: block;\n --header-bg: var(--color-header-row-bg, #332746);\n --header-text: var(--color-header-text, #ffffff);\n --header-border: var(--color-border, #efecf3);\n --header-line: var(--color-header-menu-separator-line, #5e546d);\n --header-link: var(--color-text-heading, #000000);\n --header-menu-item-hover: var(--color-header-menu-item-hover, #e6dcff);\n --header-menu-item-selected: var(--color-header-menu-item-selected, #cbb9ff);\n --header-menu-bg: var(--color-menu-bg, #f6f5f9);\n --header-menu-loggedin-bg: var(--color-header-menu-loggedin-bg, #5e546d);\n --header-menu-text: var(--color-menu-item-text, #654d6c);\n --header-border-radius: var(--border-radius-sm, 0.2rem);\n --header-button-bg: var(--color-menu-bg, #ffffff);\n --header-button-text: var(--color-header-button-text, #0f172a);\n --header-button-detail-text: var(--color-header-button-detail-text, #878192);\n --header-icon-filter: invert(1) brightness(1.3); /* special way to invert SVG color of icons, from white to black */\n --header-shadow: var(--color-header-shadow, 2px 6px 10px 0 rgba(0, 0, 0, 0.4), 2px 8px 24px 0 rgba(0, 0, 0, 0.19));\n font-family: var(--font-family-base, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif);\n }\n\n :host([layout='mobile']) .headerInner {\n flex-wrap: wrap;\n text-align: center;\n gap: 0.5rem;\n }\n\n .headerInner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--header-bg);\n color: var(--header-text);\n padding: 0 1.5rem;\n height: 3.75rem;\n }\n\n ::slotted([slot='navigation-toggle']) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-right: 0.75rem;\n }\n\n :host([layout='desktop']) ::slotted([slot='navigation-toggle']) {\n display: none !important;\n }\n\n .brand {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n text-decoration: none;\n color: inherit;\n }\n\n .brand-not-displayed {\n display: none;\n }\n\n .brand img {\n height: 50px;\n width: 55px;\n object-fit: contain;\n }\n\n .menu {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n margin-left: auto;\n }\n\n .auth-actions {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n }\n\n .auth-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n min-height: 2.25rem;\n padding: 0.5rem 0.875rem;\n border: 1px solid var(--header-border);\n border-radius: 999px;\n background: var(--header-menu-bg);\n color: var(--header-button-text);\n cursor: pointer;\n font: inherit;\n line-height: 1;\n text-decoration: none;\n box-sizing: border-box;\n transition: border-color 0.2s ease, transform 0.2s ease;\n }\n\n .auth-button:hover {\n border-color: var(--header-menu-item-hover);\n }\n\n .auth-button:active {\n transform: translateY(1px);\n }\n\n .auth-button-sign-up {\n background: color-mix(in srgb, var(--header-menu-bg) 78%, var(--header-menu-item-selected) 22%);\n }\n\n .header-menu-separator {\n background: var(--header-line);\n width: 1px;\n height: 2.3rem;\n }\n\n .account-menu-container {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .account-menu-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.625rem;\n min-height: 2.5rem;\n border: 1px solid var(--header-menu-loggedin-bg);\n border-radius: 999px;\n background: var(--header-menu-loggedin-bg);\n color: var(--header-button-text);\n cursor: pointer;\n font: inherit;\n line-height: 1;\n }\n\n :host([layout='mobile']) .account-menu-trigger {\n gap: 0;\n min-height: auto;\n padding: 0;\n border: 1.5px solid var(--header-border);\n background: var(--header-menu-loggedin-bg);\n }\n\n :host([layout='mobile']) .account-menu-trigger-label {\n display: none;\n }\n\n .account-menu-trigger:disabled {\n cursor: default;\n opacity: 0.7;\n }\n\n .account-menu-trigger-icon {\n width: 1rem;\n height: 1rem;\n object-fit: contain;\n flex-shrink: 0;\n }\n\n .account-avatar,\n .account-menu-avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n background: color-mix(in srgb, var(--header-bg) 18%, #ded8e7 82%);\n color: var(--header-button-text);\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n }\n\n .account-avatar {\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 999px;\n border: 1.5px solid var(--header-border);\n }\n\n .account-menu-avatar {\n width: 2rem;\n height: 2rem;\n border-radius: 0.5rem;\n }\n\n .account-avatar img,\n .account-menu-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .account-avatar-img {\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 999px;\n object-fit: cover;\n background-color: var(--header-border);\n }\n\n .account-dropdown {\n position: absolute;\n top: calc(100% + 0.9rem);\n right: 0;\n min-width: 15rem;\n padding: 0.5rem;\n background: var(--header-button-bg);\n border: 1px solid var(--header-border);\n border-radius: var(--header-border-radius);\n box-shadow: var(--header-shadow);\n z-index: 10;\n }\n\n .account-dropdown[hidden] {\n display: none;\n }\n\n .account-menu-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .account-menu-item-link,\n .account-menu-item-button,\n ::slotted([slot='account-menu']) {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n width: 100%;\n box-sizing: border-box;\n color: var(--header-link);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 10px;\n padding: 0.5rem;\n cursor: pointer;\n font: inherit;\n text-align: left;\n }\n\n .account-menu-item-link:hover,\n .account-menu-item-button:hover {\n color: var(--header-link);\n background: var(--header-menu-item-hover);\n border-color: var(--header-menu-item-hover);\n }\n\n .account-menu-item-link:active,\n .account-menu-item-button:active {\n color: var(--header-link);\n background: var(--header-menu-item-selected);\n border-color: var(--header-menu-item-selected);\n transform: translateY(1px);\n }\n\n .account-switch {\n display: block;\n width: 100%;\n color: var(--header-menu-text);\n text-align: left;\n text-transform: uppercase;\n font-size: 80%;\n }\n\n .dropdown-menu-separator {\n display: block;\n width: calc(100% + 1rem);\n margin: 0.5rem -0.5rem;\n border: 0;\n border-top: 1px solid var(--header-border);\n }\n\n .account-menu-copy {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .account-menu-label {\n color: var(--header-button-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .account-menu-webid {\n color: var(--header-button-detail-text);\n font-size: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .help-menu-container {\n position: relative;\n display: flex;\n align-items: center;\n background: transparent;\n }\n\n .help-menu-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: 0;\n background: transparent;\n cursor: pointer;\n }\n\n .help-menu-trigger:disabled {\n cursor: default;\n }\n\n .help-dropdown {\n position: absolute;\n top: calc(100% + 0.9rem);\n right: 0;\n min-width: 12rem;\n padding: 0.5rem;\n background: var(--header-button-bg);\n border: 1px solid var(--header-border);\n border-radius: var(--header-border-radius);\n box-shadow: var(--header-shadow);\n z-index: 10;\n }\n\n .help-dropdown[hidden] {\n display: none;\n }\n\n .help-dropdown-content {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .help-menu-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .help-menu-list a,\n .help-menu-list button,\n ::slotted([slot='help-menu']) {\n display: block;\n width: 100%;\n box-sizing: border-box;\n color: var(--header-link);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 0.375rem 0.5rem;\n cursor: pointer;\n font: inherit;\n text-align: left;\n }\n\n .help-menu-list a:hover,\n .help-menu-list button:hover {\n color: var(--header-link);\n background: var(--header-menu-item-hover);\n border-color: var(--header-menu-item-hover);\n }\n\n .help-menu-list a:active,\n .help-menu-list button:active {\n color: var(--header-link);\n background: var(--header-menu-item-selected);\n border-color: var(--header-menu-item-selected);\n transform: translateY(1px);\n }\n\n ::slotted(a), ::slotted(button) {\n color: var(--header-link);\n text-decoration: none;\n background: var(--header-button-bg);\n border: 1px solid var(--header-border);\n border-radius: 4px;\n padding: 0.25rem 0.5rem;\n cursor: pointer;\n font: inherit;\n }\n\n .help-icon {\n width: 35px;\n height: 35px;\n cursor: pointer;\n }\n\n .help-text {\n color: var(--header-text, #ffffff);\n font: inherit;\n }\n\n .logout-action-icon {\n width: 16px;\n height: 16px;\n display: inline-block;\n object-fit: contain;\n margin-right: 0.5rem;\n }\n `\n\n declare logo: string\n declare helpIcon: string\n declare layout: 'desktop' | 'mobile'\n declare theme: 'light' | 'dark'\n declare brandLink: string\n declare authState: HeaderAuthState\n declare loginAction: HeaderMenuItem\n declare signUpAction: HeaderMenuItem\n declare accountMenu: HeaderAccountMenuItem[]\n declare logoutLabel: string | null\n declare logoutIcon: string\n declare accountIcon: string\n declare accountAvatar: string\n declare accountAvatarFallback: string\n declare loginIcon: string\n declare signUpIcon: string\n declare helpMenuList: HeaderMenuItem[]\n declare accountMenuOpen: boolean\n declare helpMenuOpen: boolean\n declare hasSlottedAccountMenu: boolean\n declare hasSlottedHelpMenu: boolean\n declare authResolved: boolean\n private _refreshPromise: Promise<void> | null = null\n\n private readonly handleAuthSessionChange = () => {\n this.refreshAuthStateFromSession().catch(() => {\n // Keep auth event handling resilient on transient refresh failures.\n })\n }\n\n constructor () {\n super()\n this.logo = DEFAULT_SOLID_ICON_URL\n this.helpIcon = DEFAULT_HELP_MENU_ICON\n this.layout = 'desktop'\n this.theme = 'light'\n this.brandLink = '#'\n this.authState = 'logged-out'\n this.loginAction = { label: 'Log In', action: 'login' }\n this.signUpAction = { label: 'Sign Up', action: 'sign-up', url: DEFAULT_SIGNUP_URL }\n this.accountMenu = []\n this.logoutLabel = 'Log Out'\n this.logoutIcon = ''\n this.accountIcon = '▼'\n this.accountAvatar = ''\n this.accountAvatarFallback = ''\n this.loginIcon = ''\n this.signUpIcon = ''\n this.helpMenuList = []\n this.accountMenuOpen = false\n this.helpMenuOpen = false\n this.hasSlottedAccountMenu = false\n this.hasSlottedHelpMenu = false\n this.authResolved = false\n }\n\n connectedCallback () {\n super.connectedCallback()\n document.addEventListener('click', this.handleDocumentClick)\n window.addEventListener('keydown', this.handleWindowKeydown)\n if (typeof authSession.events?.on === 'function') {\n authSession.events.on('login', this.handleAuthSessionChange)\n authSession.events.on('logout', this.handleAuthSessionChange)\n authSession.events.on('sessionRestore', this.handleAuthSessionChange)\n }\n this.refreshAuthStateFromSession().catch(() => {\n // Keep initial header render resilient on transient refresh failures.\n })\n }\n\n disconnectedCallback () {\n document.removeEventListener('click', this.handleDocumentClick)\n window.removeEventListener('keydown', this.handleWindowKeydown)\n if (typeof authSession.events?.off === 'function') {\n authSession.events.off('login', this.handleAuthSessionChange)\n authSession.events.off('logout', this.handleAuthSessionChange)\n authSession.events.off('sessionRestore', this.handleAuthSessionChange)\n }\n super.disconnectedCallback()\n }\n\n private async refreshAuthStateFromSession () {\n if (!this._refreshPromise) {\n this._refreshPromise = (async () => {\n try {\n await authn.checkUser()\n // Some auth stacks resolve session state asynchronously after first check.\n if (!authn.currentUser()) {\n await authn.checkUser()\n }\n } catch (_err) {\n // Keep rendering even if session refresh cannot complete.\n }\n })()\n }\n\n try {\n await this._refreshPromise\n } finally {\n this._refreshPromise = null\n }\n\n this.authState = authn.currentUser() ? 'logged-in' : 'logged-out'\n this.authResolved = true\n }\n\n private handleHelpMenuClick (item: HeaderMenuItem, event: MouseEvent) {\n event.preventDefault()\n this.helpMenuOpen = false\n this.dispatchEvent(new CustomEvent('help-menu-select', {\n detail: item,\n bubbles: true,\n composed: true\n }))\n if (item.url) {\n const target = item.target || '_blank'\n const features = target === '_blank' ? 'noopener,noreferrer' : undefined\n window.open(item.url, target, features)\n }\n }\n\n private handleAccountMenuClick (item: HeaderAccountMenuItem) {\n this.accountMenuOpen = false\n this.dispatchEvent(new CustomEvent('account-menu-select', {\n detail: item,\n bubbles: true,\n composed: true\n }))\n }\n\n private readonly handleDocumentClick = (event: MouseEvent) => {\n if (!event.composedPath().includes(this)) {\n this.accountMenuOpen = false\n this.helpMenuOpen = false\n }\n }\n\n private readonly handleWindowKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && (this.accountMenuOpen || this.helpMenuOpen)) {\n this.accountMenuOpen = false\n this.helpMenuOpen = false\n }\n }\n\n private handleAccountSlotChange (event: Event) {\n const slot = event.target as HTMLSlotElement\n this.hasSlottedAccountMenu = slot.assignedElements({ flatten: true }).length > 0\n }\n\n private handleHelpSlotChange (event: Event) {\n const slot = event.target as HTMLSlotElement\n this.hasSlottedHelpMenu = slot.assignedElements({ flatten: true }).length > 0\n }\n\n private toggleAccountMenu (event: MouseEvent) {\n event.preventDefault()\n if (!this.hasAccountMenuItems()) return\n this.helpMenuOpen = false\n this.accountMenuOpen = !this.accountMenuOpen\n }\n\n private toggleHelpMenu (event: MouseEvent) {\n event.preventDefault()\n if (!this.hasHelpMenuItems()) return\n this.accountMenuOpen = false\n this.helpMenuOpen = !this.helpMenuOpen\n }\n\n private hasAccountMenuItems () {\n return Boolean(this.accountMenu?.length || this.hasSlottedAccountMenu || this.logoutLabel)\n }\n\n private hasHelpMenuItems () {\n return Boolean(this.helpMenuList?.length || this.hasSlottedHelpMenu)\n }\n\n private shouldRenderHelpMenu () {\n return this.layout !== 'mobile' && this.hasHelpMenuItems()\n }\n\n private renderLoggedInAvatar (avatar?: string, wrapperClass = 'account-avatar') {\n const hasAvatar = Boolean(avatar)\n const imageSrc = hasAvatar ? avatar : this.accountAvatarFallback || DEFAULT_LOGGEDIN_MENU_BUTTON_AVATAR\n const imageAlt = hasAvatar ? 'Profile Avatar' : 'Default Avatar'\n\n if (this.layout === 'mobile' && wrapperClass === 'account-avatar') {\n return html`<img class=\"account-avatar-img\" src=\"${imageSrc}\" alt=\"${imageAlt}\" />`\n }\n\n return html`\n <span class=\"${wrapperClass}\" aria-hidden=\"true\">\n <img src=\"${imageSrc}\" alt=\"${imageAlt}\" />\n </span>\n `\n }\n\n private renderLoggedOutActions () {\n return html`\n <div class=\"auth-actions\" part=\"auth-actions\">\n <slot name=\"login-action\">\n <solid-ui-login-button\n label=\"${this.loginAction.label}\"\n icon=${ifDefined(this.layout !== 'mobile' ? (this.loginIcon || this.loginAction.icon) : undefined)}\n layout=\"${this.layout}\"\n theme=\"${this.theme}\"\n part=\"login-action\"\n @login-success=\"${() => this.handleLoginSuccess()}\"\n ></solid-ui-login-button>\n </slot>\n <slot name=\"sign-up-action\">\n <solid-ui-signup-button\n label=\"${this.signUpAction.label}\"\n signup-url=\"${ifDefined(this.signUpAction.url)}\"\n layout=\"${this.layout}\"\n .icon=${ifDefined(this.layout !== 'mobile' ? (this.signUpIcon || this.signUpAction.icon) : undefined)}\n theme=\"${this.theme}\"\n part=\"sign-up-action\"\n ></solid-ui-signup-button>\n </slot>\n </div>\n `\n }\n\n private async handleLoginSuccess () {\n await this.refreshAuthStateFromSession()\n this.dispatchEvent(new CustomEvent('auth-action-select', {\n detail: { role: 'login' },\n bubbles: true,\n composed: true\n }))\n }\n\n private async handleLogout () {\n this.accountMenuOpen = false\n const issuer = window.localStorage.getItem('loginIssuer') || ''\n\n try {\n await authSession.logout()\n } catch (_err) {\n // logout errors are non-fatal — proceed to clear state\n }\n\n await clearPersistedAuthState()\n\n const redirectedToServerLogout = await performServerSideLogout({\n issuer,\n postLogoutRedirectPath: '/'\n })\n if (redirectedToServerLogout) {\n return\n }\n\n await this.refreshAuthStateFromSession()\n this.dispatchEvent(new CustomEvent('logout-select', {\n detail: { role: 'logout' },\n bubbles: true,\n composed: true\n }))\n }\n\n private renderAccountMenuItem (item: HeaderAccountMenuItem) {\n const content = html`\n ${this.renderLoggedInAvatar(item.avatar, 'account-menu-avatar')}\n <span class=\"account-menu-copy\">\n <span class=\"account-menu-label\">${item.label}</span>\n ${item.webid && this.layout !== 'mobile' ? html`<span class=\"account-menu-webid\">${item.webid}</span>` : ''}\n </span>\n `\n\n if (item.url) {\n return html`\n <a\n class=\"account-menu-item-link\"\n href=\"${item.url}\"\n @click=\"${() => this.handleAccountMenuClick(item)}\"\n part=\"account-menu-item\"\n role=\"menuitem\"\n >\n ${content}\n </a>\n `\n }\n\n return html`\n <button\n class=\"account-menu-item-button\"\n type=\"button\"\n @click=\"${() => this.handleAccountMenuClick(item)}\"\n part=\"account-menu-item\"\n role=\"menuitem\"\n >\n ${content}\n </button>\n `\n }\n\n private renderLoggedInActions () {\n return html`\n <div class=\"account-menu-container\" part=\"account-menu-container\">\n <slot name=\"account-trigger\">\n <button\n id=\"accountMenuTrigger\"\n class=\"account-menu-trigger\"\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded=\"${this.accountMenuOpen ? 'true' : 'false'}\"\n ?disabled=\"${!this.hasAccountMenuItems()}\"\n @click=\"${(e: MouseEvent) => this.toggleAccountMenu(e)}\"\n part=\"account-menu-trigger\"\n >\n ${this.renderLoggedInAvatar(this.accountAvatar)}\n ${this.layout !== 'mobile' && this.accountIcon\n? html`\n <img class=\"account-menu-trigger-icon\" src=\"${this.accountIcon}\" alt=\"\" aria-hidden=\"true\" />`\n: ''}\n </button>\n </slot>\n\n <nav\n id=\"accountMenu\"\n class=\"account-dropdown\"\n role=\"menu\"\n ?inert=\"${!this.accountMenuOpen || !this.hasAccountMenuItems()}\"\n ?hidden=\"${!this.accountMenuOpen || !this.hasAccountMenuItems()}\"\n part=\"account-dropdown\"\n >\n <slot name=\"account-switch\" class=\"account-switch\">Switch account</slot>\n <hr class=\"dropdown-menu-separator\" />\n <slot name=\"account-menu\" @slotchange=\"${(e: Event) => this.handleAccountSlotChange(e)}\"></slot>\n ${this.accountMenu && this.accountMenu.length\n ? html`\n <ul class=\"account-menu-list\">\n ${this.accountMenu.map((item: HeaderAccountMenuItem) => html`\n <li>${this.renderAccountMenuItem(item)}</li>\n `)}\n </ul>\n `\n : ''}\n ${this.logoutLabel\n ? html`\n <hr class=\"dropdown-menu-separator\" />\n <button\n class=\"account-menu-item-button\"\n type=\"button\"\n @click=\"${() => this.handleLogout()}\"\n part=\"logout-action\"\n role=\"menuitem\"\n >\n ${this.logoutIcon && this.layout !== 'mobile'\n ? html`<img class=\"logout-action-icon\" src=\"${this.logoutIcon}\" alt=\"\" aria-hidden=\"true\" part=\"logout-action-icon\" />`\n : ''}\n ${this.logoutLabel}\n </button>\n `\n : ''}\n </nav>\n </div>\n `\n }\n\n private renderUserArea () {\n if (Features.DESIGN_SYSTEM_HEADER_ACCOUNT) {\n return html`\n <solid-ui-provider>\n <solid-ui-account></solid-ui-account>\n </solid-ui-provider>\n `\n }\n\n if (!this.authResolved) {\n return html`<div class=\"auth-actions\" part=\"auth-actions\"></div>`\n }\n\n if (this.authState === 'logged-out') {\n return this.renderLoggedOutActions()\n }\n\n return this.renderLoggedInActions()\n }\n\n protected firstUpdated () {\n const brandLink = this.shadowRoot?.getElementById('brandLink')\n if (brandLink) {\n brandLink.classList.toggle('brand-not-displayed', this.layout === 'mobile')\n }\n }\n\n protected updated (changedProperties: Map<string, unknown>) {\n if (changedProperties.has('layout')) {\n const brandLink = this.shadowRoot?.getElementById('brandLink')\n if (brandLink) {\n brandLink.classList.toggle('brand-not-displayed', this.layout === 'mobile')\n }\n }\n }\n\n render () {\n return html`\n <div class=\"headerInner\">\n <slot name=\"navigation-toggle\"></slot>\n <a\n id=\"brandLink\"\n class=\"brand\"\n href=\"${this.brandLink}\"\n part=\"brand\"\n >\n <img id=\"brandImg\" src=\"${this.logo}\" alt=\"Logo\" part=\"logo\" />\n </a>\n\n <div class=\"menu\" part=\"menu\">\n ${this.renderUserArea()}\n\n ${this.shouldRenderHelpMenu()\n ? html`\n <div class=\"header-menu-separator\" />`\n : ''}\n\n ${this.shouldRenderHelpMenu()\n ? html`\n <div class=\"help-menu-container\" part=\"help-menu-container\">\n <button\n id=\"helpMenuTrigger\"\n class=\"help-menu-trigger\"\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded=\"${this.helpMenuOpen ? 'true' : 'false'}\"\n ?disabled=\"${!this.hasHelpMenuItems()}\"\n @click=\"${(e: MouseEvent) => this.toggleHelpMenu(e)}\"\n part=\"help-menu-trigger\"\n >\n ${this.helpIcon\n ? html`<img id=\"helpIcon\" class=\"help-icon\" src=\"${this.helpIcon}\" alt=\"Help\" part=\"help-icon\" />`\n : html`<span class=\"help-text\" part=\"help-text\">Help</span>`}\n </button>\n\n <nav\n id=\"helpMenu\"\n class=\"help-dropdown\"\n role=\"menu\"\n ?inert=\"${!this.helpMenuOpen || !this.hasHelpMenuItems()}\"\n ?hidden=\"${!this.helpMenuOpen || !this.hasHelpMenuItems()}\"\n part=\"help-dropdown\"\n >\n <div class=\"help-dropdown-content\" @click=\"${() => { this.helpMenuOpen = false }}\">\n <slot name=\"help-menu\" @slotchange=\"${(e: Event) => this.handleHelpSlotChange(e)}\"></slot>\n ${this.helpMenuList && this.helpMenuList.length\n ? html`\n <ul class=\"help-menu-list\">\n ${this.helpMenuList.map((item: HeaderMenuItem) => html`\n <li>\n ${item.url\n ? html`\n <a\n href=\"${item.url}\"\n target=\"${item.target || '_blank'}\"\n rel=\"${ifDefined((item.target || '_blank') === '_blank' ? 'noopener noreferrer' : undefined)}\"\n @click=\"${(e: MouseEvent) => this.handleHelpMenuClick(item, e)}\"\n part=\"help-menu-item\"\n role=\"menuitem\"\n >\n ${item.label}\n </a>\n `\n : html`\n <button\n type=\"button\"\n @click=\"${(e: MouseEvent) => this.handleHelpMenuClick(item, e)}\"\n part=\"help-menu-item\"\n role=\"menuitem\"\n >\n ${item.label}\n </button>\n `}\n </li>\n `)}\n </ul>\n `\n : ''}\n </div>\n </nav>\n </div>`\n : ''}\n </div>\n </div>\n `\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Header.esm.js","names":[],"sources":["../../../../../src/v2/components/layout/header/Header.ts"],"sourcesContent":["import { LitElement, html, css } from 'lit'\nimport { icons } from '../../../../lib/iconBase'\nimport { authSession, authn, performServerSideLogout } from 'solid-logic'\nimport '../../auth/loginButton/index'\nimport '../../auth/signupButton/index'\nimport { ifDefined } from 'lit/directives/if-defined.js'\n\nimport '@/components/account'\nimport '@/components/provider'\nimport Features from '../../../../lib/features'\n\nconst DEFAULT_HELP_MENU_ICON = ''\nconst DEFAULT_SOLID_ICON_URL = 'https://solidproject.org/assets/img/solid-emblem.svg'\nconst DEFAULT_SIGNUP_URL = 'https://solidproject.org/get_a_pod'\nconst DEFAULT_LOGGEDIN_MENU_BUTTON_AVATAR = icons.iconBase + 'emptyProfileAvatar.png'\n\nasync function clearPersistedAuthState (): Promise<void> {\n if (typeof window === 'undefined') {\n return\n }\n\n const explicitKeys = ['loginIssuer', 'preLoginRedirectHash']\n for (const key of explicitKeys) {\n window.localStorage.removeItem(key)\n window.sessionStorage.removeItem(key)\n }\n\n if (typeof indexedDB === 'undefined') {\n return\n }\n\n const databases = ['soidc', 'solid-client-authn-store', 'solid-client-authn']\n for (const dbName of databases) {\n await new Promise<void>((resolve) => {\n try {\n const request = indexedDB.deleteDatabase(dbName)\n request.onsuccess = () => resolve()\n request.onerror = () => resolve()\n request.onblocked = () => resolve()\n } catch (_err) {\n resolve()\n }\n })\n }\n}\n\nexport type HeaderAuthState = 'logged-out' | 'logged-in'\n\nexport type HeaderMenuItem = {\n label: string\n url?: string\n target?: string\n action?: string\n icon?: string\n}\n\nexport type HeaderAccountMenuItem = HeaderMenuItem & {\n avatar?: string\n webid?: string\n}\n\nexport class Header extends LitElement {\n static properties = {\n logo: { type: String, reflect: true },\n helpIcon: { type: String, attribute: 'help-icon', reflect: true },\n layout: { type: String, reflect: true },\n theme: { type: String, reflect: true },\n brandLink: { type: String, attribute: 'brand-link', reflect: true },\n authState: { type: String, attribute: 'auth-state', reflect: true },\n loginAction: { type: Object, attribute: false },\n signUpAction: { type: Object, attribute: false },\n accountMenu: { type: Array, attribute: false },\n logoutLabel: { type: String, attribute: 'logout-label', reflect: true },\n logoutIcon: { type: String, attribute: 'logout-icon', reflect: true },\n accountIcon: { type: String, attribute: 'account-icon', reflect: true },\n accountAvatar: { type: String, attribute: 'account-avatar', reflect: true },\n accountAvatarFallback: { type: String, attribute: 'account-avatar-fallback', reflect: true },\n loginIcon: { type: String, attribute: 'login-icon', reflect: true },\n signUpIcon: { type: String, attribute: 'sign-up-icon', reflect: true },\n helpMenuList: { type: Array },\n accountMenuOpen: { state: true },\n helpMenuOpen: { state: true },\n hasSlottedAccountMenu: { state: true },\n hasSlottedHelpMenu: { state: true },\n authResolved: { state: true }\n }\n\n static styles = css`\n :host { /* default theme */\n display: block;\n --header-bg: var(--color-header-row-bg, #332746);\n --header-text: var(--color-header-text, #ffffff);\n --header-border: var(--color-border, #efecf3);\n --header-line: var(--color-header-menu-separator-line, #5e546d);\n --header-link: var(--color-text-heading, #000000);\n --header-menu-item-hover: var(--color-header-menu-item-hover, #e6dcff);\n --header-menu-item-selected: var(--color-header-menu-item-selected, #cbb9ff);\n --header-menu-bg: var(--color-menu-bg, #f6f5f9);\n --header-menu-loggedin-bg: var(--color-header-menu-loggedin-bg, #5e546d);\n --header-menu-text: var(--color-menu-item-text, #654d6c);\n --header-border-radius: var(--border-radius-sm, 0.2rem);\n --header-button-bg: var(--color-menu-bg, #ffffff);\n --header-button-text: var(--color-header-button-text, #0F172B);\n --header-button-detail-text: var(--color-header-button-detail-text, #99A1AF);\n --header-shadow: var(--color-header-shadow, 2px 6px 10px 0 rgba(0, 0, 0, 0.4), 2px 8px 24px 0 rgba(0, 0, 0, 0.19));\n font-family: var(--font-family-base, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif);\n }\n\n /* for now light and dark are the same */\n :host([theme='dark']) {\n display: block;\n --header-bg: var(--color-header-row-bg, #332746);\n --header-text: var(--color-header-text, #ffffff);\n --header-border: var(--color-border, #efecf3);\n --header-line: var(--color-header-menu-separator-line, #5e546d);\n --header-link: var(--color-text-heading, #000000);\n --header-menu-item-hover: var(--color-header-menu-item-hover, #e6dcff);\n --header-menu-item-selected: var(--color-header-menu-item-selected, #cbb9ff);\n --header-menu-bg: var(--color-menu-bg, #f6f5f9);\n --header-menu-loggedin-bg: var(--color-header-menu-loggedin-bg, #5e546d);\n --header-menu-text: var(--color-menu-item-text, #654d6c);\n --header-border-radius: var(--border-radius-sm, 0.2rem);\n --header-button-bg: var(--color-menu-bg, #ffffff);\n --header-button-text: var(--color-header-button-text, #0f172a);\n --header-button-detail-text: var(--color-header-button-detail-text, #878192);\n --header-icon-filter: invert(1) brightness(1.3); /* special way to invert SVG color of icons, from white to black */\n --header-shadow: var(--color-header-shadow, 2px 6px 10px 0 rgba(0, 0, 0, 0.4), 2px 8px 24px 0 rgba(0, 0, 0, 0.19));\n font-family: var(--font-family-base, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif);\n }\n\n :host([layout='mobile']) .headerInner {\n flex-wrap: wrap;\n text-align: center;\n gap: 0.5rem;\n }\n\n .headerInner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--header-bg);\n color: var(--header-text);\n padding: 0 1.5rem;\n height: 3.75rem;\n }\n\n ::slotted([slot='navigation-toggle']) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-right: 0.75rem;\n }\n\n :host([layout='desktop']) ::slotted([slot='navigation-toggle']) {\n display: none !important;\n }\n\n .brand {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n text-decoration: none;\n color: inherit;\n }\n\n .brand-not-displayed {\n display: none;\n }\n\n .brand img {\n height: 50px;\n width: 55px;\n object-fit: contain;\n }\n\n .menu {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n margin-left: auto;\n }\n\n .auth-actions {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n }\n\n .auth-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n min-height: 2.25rem;\n padding: 0.5rem 0.875rem;\n border: 1px solid var(--header-border);\n border-radius: 999px;\n background: var(--header-menu-bg);\n color: var(--header-button-text);\n cursor: pointer;\n font: inherit;\n line-height: 1;\n text-decoration: none;\n box-sizing: border-box;\n transition: border-color 0.2s ease, transform 0.2s ease;\n }\n\n .auth-button:hover {\n border-color: var(--header-menu-item-hover);\n }\n\n .auth-button:active {\n transform: translateY(1px);\n }\n\n .auth-button-sign-up {\n background: color-mix(in srgb, var(--header-menu-bg) 78%, var(--header-menu-item-selected) 22%);\n }\n\n .header-menu-separator {\n background: var(--header-line);\n width: 1px;\n height: 2.3rem;\n }\n\n .account-menu-container {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .account-menu-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.625rem;\n min-height: 2.5rem;\n border: 1px solid var(--header-menu-loggedin-bg);\n border-radius: 999px;\n background: var(--header-menu-loggedin-bg);\n color: var(--header-button-text);\n cursor: pointer;\n font: inherit;\n line-height: 1;\n }\n\n :host([layout='mobile']) .account-menu-trigger {\n gap: 0;\n min-height: auto;\n padding: 0;\n border: 1.5px solid var(--header-border);\n background: var(--header-menu-loggedin-bg);\n }\n\n :host([layout='mobile']) .account-menu-trigger-label {\n display: none;\n }\n\n .account-menu-trigger:disabled {\n cursor: default;\n opacity: 0.7;\n }\n\n .account-menu-trigger-icon {\n width: 1rem;\n height: 1rem;\n object-fit: contain;\n flex-shrink: 0;\n }\n\n .account-avatar,\n .account-menu-avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n background: color-mix(in srgb, var(--header-bg) 18%, #ded8e7 82%);\n color: var(--header-button-text);\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n }\n\n .account-avatar {\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 999px;\n border: 1.5px solid var(--header-border);\n }\n\n .account-menu-avatar {\n width: 2rem;\n height: 2rem;\n border-radius: 0.5rem;\n }\n\n .account-avatar img,\n .account-menu-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .account-avatar-img {\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 999px;\n object-fit: cover;\n background-color: var(--header-border);\n }\n\n .account-dropdown {\n position: absolute;\n top: calc(100% + 0.9rem);\n right: 0;\n min-width: 15rem;\n padding: 0.5rem;\n background: var(--header-button-bg);\n border: 1px solid var(--header-border);\n border-radius: var(--header-border-radius);\n box-shadow: var(--header-shadow);\n z-index: 10;\n }\n\n .account-dropdown[hidden] {\n display: none;\n }\n\n .account-menu-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .account-menu-item-link,\n .account-menu-item-button,\n ::slotted([slot='account-menu']) {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n width: 100%;\n box-sizing: border-box;\n color: var(--header-link);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 10px;\n padding: 0.5rem;\n cursor: pointer;\n font: inherit;\n text-align: left;\n }\n\n .account-menu-item-link:hover,\n .account-menu-item-button:hover {\n color: var(--header-link);\n background: var(--header-menu-item-hover);\n border-color: var(--header-menu-item-hover);\n }\n\n .account-menu-item-link:active,\n .account-menu-item-button:active {\n color: var(--header-link);\n background: var(--header-menu-item-selected);\n border-color: var(--header-menu-item-selected);\n transform: translateY(1px);\n }\n\n .account-switch {\n display: block;\n width: 100%;\n color: var(--header-menu-text);\n text-align: left;\n text-transform: uppercase;\n font-size: 80%;\n }\n\n .dropdown-menu-separator {\n display: block;\n width: calc(100% + 1rem);\n margin: 0.5rem -0.5rem;\n border: 0;\n border-top: 1px solid var(--header-border);\n }\n\n .account-menu-copy {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .account-menu-label {\n color: var(--header-button-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .account-menu-webid {\n color: var(--header-button-detail-text);\n font-size: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .help-menu-container {\n position: relative;\n display: flex;\n align-items: center;\n background: transparent;\n }\n\n .help-menu-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: 0;\n background: transparent;\n cursor: pointer;\n }\n\n .help-menu-trigger:disabled {\n cursor: default;\n }\n\n .help-dropdown {\n position: absolute;\n top: calc(100% + 0.9rem);\n right: 0;\n min-width: 12rem;\n padding: 0.5rem;\n background: var(--header-button-bg);\n border: 1px solid var(--header-border);\n border-radius: var(--header-border-radius);\n box-shadow: var(--header-shadow);\n z-index: 10;\n }\n\n .help-dropdown[hidden] {\n display: none;\n }\n\n .help-dropdown-content {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .help-menu-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .help-menu-list a,\n .help-menu-list button,\n ::slotted([slot='help-menu']) {\n display: block;\n width: 100%;\n box-sizing: border-box;\n color: var(--header-link);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 0.375rem 0.5rem;\n cursor: pointer;\n font: inherit;\n text-align: left;\n }\n\n .help-menu-list a:hover,\n .help-menu-list button:hover {\n color: var(--header-link);\n background: var(--header-menu-item-hover);\n border-color: var(--header-menu-item-hover);\n }\n\n .help-menu-list a:active,\n .help-menu-list button:active {\n color: var(--header-link);\n background: var(--header-menu-item-selected);\n border-color: var(--header-menu-item-selected);\n transform: translateY(1px);\n }\n\n ::slotted(a), ::slotted(button) {\n color: var(--header-link);\n text-decoration: none;\n background: var(--header-button-bg);\n border: 1px solid var(--header-border);\n border-radius: 4px;\n padding: 0.25rem 0.5rem;\n cursor: pointer;\n font: inherit;\n }\n\n .help-icon {\n width: 35px;\n height: 35px;\n cursor: pointer;\n }\n\n .help-text {\n color: var(--header-text, #ffffff);\n font: inherit;\n }\n\n .logout-action-icon {\n width: 16px;\n height: 16px;\n display: inline-block;\n object-fit: contain;\n margin-right: 0.5rem;\n }\n `\n\n declare logo: string\n declare helpIcon: string\n declare layout: 'desktop' | 'mobile'\n declare theme: 'light' | 'dark'\n declare brandLink: string\n declare authState: HeaderAuthState\n declare loginAction: HeaderMenuItem\n declare signUpAction: HeaderMenuItem\n declare accountMenu: HeaderAccountMenuItem[]\n declare logoutLabel: string | null\n declare logoutIcon: string\n declare accountIcon: string\n declare accountAvatar: string\n declare accountAvatarFallback: string\n declare loginIcon: string\n declare signUpIcon: string\n declare helpMenuList: HeaderMenuItem[]\n declare accountMenuOpen: boolean\n declare helpMenuOpen: boolean\n declare hasSlottedAccountMenu: boolean\n declare hasSlottedHelpMenu: boolean\n declare authResolved: boolean\n private _refreshPromise: Promise<void> | null = null\n\n private readonly handleAuthSessionChange = () => {\n this.refreshAuthStateFromSession().catch(() => {\n // Keep auth event handling resilient on transient refresh failures.\n })\n }\n\n constructor () {\n super()\n this.logo = DEFAULT_SOLID_ICON_URL\n this.helpIcon = DEFAULT_HELP_MENU_ICON\n this.layout = 'desktop'\n this.theme = 'light'\n this.brandLink = '#'\n this.authState = 'logged-out'\n this.loginAction = { label: 'Log In', action: 'login' }\n this.signUpAction = { label: 'Sign Up', action: 'sign-up', url: DEFAULT_SIGNUP_URL }\n this.accountMenu = []\n this.logoutLabel = 'Log Out'\n this.logoutIcon = ''\n this.accountIcon = '▼'\n this.accountAvatar = ''\n this.accountAvatarFallback = ''\n this.loginIcon = ''\n this.signUpIcon = ''\n this.helpMenuList = []\n this.accountMenuOpen = false\n this.helpMenuOpen = false\n this.hasSlottedAccountMenu = false\n this.hasSlottedHelpMenu = false\n this.authResolved = false\n }\n\n connectedCallback () {\n super.connectedCallback()\n document.addEventListener('click', this.handleDocumentClick)\n window.addEventListener('keydown', this.handleWindowKeydown)\n if (typeof authSession.events?.on === 'function') {\n authSession.events.on('login', this.handleAuthSessionChange)\n authSession.events.on('logout', this.handleAuthSessionChange)\n authSession.events.on('sessionRestore', this.handleAuthSessionChange)\n }\n this.refreshAuthStateFromSession().catch(() => {\n // Keep initial header render resilient on transient refresh failures.\n })\n }\n\n disconnectedCallback () {\n document.removeEventListener('click', this.handleDocumentClick)\n window.removeEventListener('keydown', this.handleWindowKeydown)\n if (typeof authSession.events?.off === 'function') {\n authSession.events.off('login', this.handleAuthSessionChange)\n authSession.events.off('logout', this.handleAuthSessionChange)\n authSession.events.off('sessionRestore', this.handleAuthSessionChange)\n }\n super.disconnectedCallback()\n }\n\n private async refreshAuthStateFromSession () {\n if (!this._refreshPromise) {\n this._refreshPromise = (async () => {\n try {\n await authn.checkUser()\n // Some auth stacks resolve session state asynchronously after first check.\n if (!authn.currentUser()) {\n await authn.checkUser()\n }\n } catch (_err) {\n // Keep rendering even if session refresh cannot complete.\n }\n })()\n }\n\n try {\n await this._refreshPromise\n } finally {\n this._refreshPromise = null\n }\n\n this.authState = authn.currentUser() ? 'logged-in' : 'logged-out'\n this.authResolved = true\n }\n\n private handleHelpMenuClick (item: HeaderMenuItem, event: MouseEvent) {\n event.preventDefault()\n this.helpMenuOpen = false\n this.dispatchEvent(new CustomEvent('help-menu-select', {\n detail: item,\n bubbles: true,\n composed: true\n }))\n if (item.url) {\n const target = item.target || '_blank'\n const features = target === '_blank' ? 'noopener,noreferrer' : undefined\n window.open(item.url, target, features)\n }\n }\n\n private handleAccountMenuClick (item: HeaderAccountMenuItem) {\n this.accountMenuOpen = false\n this.dispatchEvent(new CustomEvent('account-menu-select', {\n detail: item,\n bubbles: true,\n composed: true\n }))\n }\n\n private readonly handleDocumentClick = (event: MouseEvent) => {\n if (!event.composedPath().includes(this)) {\n this.accountMenuOpen = false\n this.helpMenuOpen = false\n }\n }\n\n private readonly handleWindowKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && (this.accountMenuOpen || this.helpMenuOpen)) {\n this.accountMenuOpen = false\n this.helpMenuOpen = false\n }\n }\n\n private handleAccountSlotChange (event: Event) {\n const slot = event.target as HTMLSlotElement\n this.hasSlottedAccountMenu = slot.assignedElements({ flatten: true }).length > 0\n }\n\n private handleHelpSlotChange (event: Event) {\n const slot = event.target as HTMLSlotElement\n this.hasSlottedHelpMenu = slot.assignedElements({ flatten: true }).length > 0\n }\n\n private toggleAccountMenu (event: MouseEvent) {\n event.preventDefault()\n if (!this.hasAccountMenuItems()) return\n this.helpMenuOpen = false\n this.accountMenuOpen = !this.accountMenuOpen\n }\n\n private toggleHelpMenu (event: MouseEvent) {\n event.preventDefault()\n if (!this.hasHelpMenuItems()) return\n this.accountMenuOpen = false\n this.helpMenuOpen = !this.helpMenuOpen\n }\n\n private hasAccountMenuItems () {\n return Boolean(this.accountMenu?.length || this.hasSlottedAccountMenu || this.logoutLabel)\n }\n\n private hasHelpMenuItems () {\n return Boolean(this.helpMenuList?.length || this.hasSlottedHelpMenu)\n }\n\n private shouldRenderHelpMenu () {\n return this.layout !== 'mobile' && this.hasHelpMenuItems()\n }\n\n private renderLoggedInAvatar (avatar?: string, wrapperClass = 'account-avatar') {\n const hasAvatar = Boolean(avatar)\n const imageSrc = hasAvatar ? avatar : this.accountAvatarFallback || DEFAULT_LOGGEDIN_MENU_BUTTON_AVATAR\n const imageAlt = hasAvatar ? 'Profile Avatar' : 'Default Avatar'\n\n if (this.layout === 'mobile' && wrapperClass === 'account-avatar') {\n return html`<img class=\"account-avatar-img\" src=\"${imageSrc}\" alt=\"${imageAlt}\" />`\n }\n\n return html`\n <span class=\"${wrapperClass}\" aria-hidden=\"true\">\n <img src=\"${imageSrc}\" alt=\"${imageAlt}\" />\n </span>\n `\n }\n\n private renderLoggedOutActions () {\n return html`\n <div class=\"auth-actions\" part=\"auth-actions\">\n <slot name=\"login-action\">\n <solid-ui-login-button\n label=\"${this.loginAction.label}\"\n icon=${ifDefined(this.layout !== 'mobile' ? (this.loginIcon || this.loginAction.icon) : undefined)}\n layout=\"${this.layout}\"\n theme=\"${this.theme}\"\n part=\"login-action\"\n @login-success=\"${() => this.handleLoginSuccess()}\"\n ></solid-ui-login-button>\n </slot>\n <slot name=\"sign-up-action\">\n <solid-ui-signup-button\n label=\"${this.signUpAction.label}\"\n signup-url=\"${ifDefined(this.signUpAction.url)}\"\n layout=\"${this.layout}\"\n .icon=${ifDefined(this.layout !== 'mobile' ? (this.signUpIcon || this.signUpAction.icon) : undefined)}\n theme=\"${this.theme}\"\n part=\"sign-up-action\"\n ></solid-ui-signup-button>\n </slot>\n </div>\n `\n }\n\n private async handleLoginSuccess () {\n await this.refreshAuthStateFromSession()\n this.dispatchEvent(new CustomEvent('auth-action-select', {\n detail: { role: 'login' },\n bubbles: true,\n composed: true\n }))\n }\n\n private async handleLogout () {\n this.accountMenuOpen = false\n const issuer = window.localStorage.getItem('loginIssuer') || ''\n\n try {\n await authSession.logout()\n } catch (_err) {\n // logout errors are non-fatal — proceed to clear state\n }\n\n await clearPersistedAuthState()\n\n const redirectedToServerLogout = await performServerSideLogout({\n issuer,\n postLogoutRedirectPath: '/'\n })\n if (redirectedToServerLogout) {\n return\n }\n\n await this.refreshAuthStateFromSession()\n this.dispatchEvent(new CustomEvent('logout-select', {\n detail: { role: 'logout' },\n bubbles: true,\n composed: true\n }))\n }\n\n private renderAccountMenuItem (item: HeaderAccountMenuItem) {\n const content = html`\n ${this.renderLoggedInAvatar(item.avatar, 'account-menu-avatar')}\n <span class=\"account-menu-copy\">\n <span class=\"account-menu-label\">${item.label}</span>\n ${item.webid && this.layout !== 'mobile' ? html`<span class=\"account-menu-webid\">${item.webid}</span>` : ''}\n </span>\n `\n\n if (item.url) {\n return html`\n <a\n class=\"account-menu-item-link\"\n href=\"${item.url}\"\n @click=\"${() => this.handleAccountMenuClick(item)}\"\n part=\"account-menu-item\"\n role=\"menuitem\"\n >\n ${content}\n </a>\n `\n }\n\n return html`\n <button\n class=\"account-menu-item-button\"\n type=\"button\"\n @click=\"${() => this.handleAccountMenuClick(item)}\"\n part=\"account-menu-item\"\n role=\"menuitem\"\n >\n ${content}\n </button>\n `\n }\n\n private renderLoggedInActions () {\n return html`\n <div class=\"account-menu-container\" part=\"account-menu-container\">\n <slot name=\"account-trigger\">\n <button\n id=\"accountMenuTrigger\"\n class=\"account-menu-trigger\"\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded=\"${this.accountMenuOpen ? 'true' : 'false'}\"\n ?disabled=\"${!this.hasAccountMenuItems()}\"\n @click=\"${(e: MouseEvent) => this.toggleAccountMenu(e)}\"\n part=\"account-menu-trigger\"\n >\n ${this.renderLoggedInAvatar(this.accountAvatar)}\n ${this.layout !== 'mobile' && this.accountIcon\n? html`\n <img class=\"account-menu-trigger-icon\" src=\"${this.accountIcon}\" alt=\"\" aria-hidden=\"true\" />`\n: ''}\n </button>\n </slot>\n\n <nav\n id=\"accountMenu\"\n class=\"account-dropdown\"\n role=\"menu\"\n ?inert=\"${!this.accountMenuOpen || !this.hasAccountMenuItems()}\"\n ?hidden=\"${!this.accountMenuOpen || !this.hasAccountMenuItems()}\"\n part=\"account-dropdown\"\n >\n <slot name=\"account-switch\" class=\"account-switch\">Switch account</slot>\n <hr class=\"dropdown-menu-separator\" />\n <slot name=\"account-menu\" @slotchange=\"${(e: Event) => this.handleAccountSlotChange(e)}\"></slot>\n ${this.accountMenu && this.accountMenu.length\n ? html`\n <ul class=\"account-menu-list\">\n ${this.accountMenu.map((item: HeaderAccountMenuItem) => html`\n <li>${this.renderAccountMenuItem(item)}</li>\n `)}\n </ul>\n `\n : ''}\n ${this.logoutLabel\n ? html`\n <hr class=\"dropdown-menu-separator\" />\n <button\n class=\"account-menu-item-button\"\n type=\"button\"\n @click=\"${() => this.handleLogout()}\"\n part=\"logout-action\"\n role=\"menuitem\"\n >\n ${this.logoutIcon && this.layout !== 'mobile'\n ? html`<img class=\"logout-action-icon\" src=\"${this.logoutIcon}\" alt=\"\" aria-hidden=\"true\" part=\"logout-action-icon\" />`\n : ''}\n ${this.logoutLabel}\n </button>\n `\n : ''}\n </nav>\n </div>\n `\n }\n\n private renderUserArea () {\n if (Features.DESIGN_SYSTEM_HEADER_ACCOUNT) {\n return html`\n <solid-ui-provider>\n <solid-ui-account></solid-ui-account>\n </solid-ui-provider>\n `\n }\n\n if (!this.authResolved) {\n return html`<div class=\"auth-actions\" part=\"auth-actions\"></div>`\n }\n\n if (this.authState === 'logged-out') {\n return this.renderLoggedOutActions()\n }\n\n return this.renderLoggedInActions()\n }\n\n protected firstUpdated () {\n const brandLink = this.shadowRoot?.getElementById('brandLink')\n if (brandLink) {\n brandLink.classList.toggle('brand-not-displayed', this.layout === 'mobile')\n }\n }\n\n protected updated (changedProperties: Map<string, unknown>) {\n if (changedProperties.has('layout')) {\n const brandLink = this.shadowRoot?.getElementById('brandLink')\n if (brandLink) {\n brandLink.classList.toggle('brand-not-displayed', this.layout === 'mobile')\n }\n }\n }\n\n render () {\n return html`\n <div class=\"headerInner\">\n <slot name=\"navigation-toggle\"></slot>\n <a\n id=\"brandLink\"\n class=\"brand\"\n href=\"${this.brandLink}\"\n part=\"brand\"\n >\n <img id=\"brandImg\" src=\"${this.logo}\" alt=\"Logo\" part=\"logo\" />\n </a>\n\n <div class=\"menu\" part=\"menu\">\n ${this.renderUserArea()}\n\n ${this.shouldRenderHelpMenu()\n ? html`\n <div class=\"header-menu-separator\" />`\n : ''}\n\n ${this.shouldRenderHelpMenu()\n ? html`\n <div class=\"help-menu-container\" part=\"help-menu-container\">\n <button\n id=\"helpMenuTrigger\"\n class=\"help-menu-trigger\"\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded=\"${this.helpMenuOpen ? 'true' : 'false'}\"\n ?disabled=\"${!this.hasHelpMenuItems()}\"\n @click=\"${(e: MouseEvent) => this.toggleHelpMenu(e)}\"\n part=\"help-menu-trigger\"\n >\n ${this.helpIcon\n ? html`<img id=\"helpIcon\" class=\"help-icon\" src=\"${this.helpIcon}\" alt=\"Help\" part=\"help-icon\" />`\n : html`<span class=\"help-text\" part=\"help-text\">Help</span>`}\n </button>\n\n <nav\n id=\"helpMenu\"\n class=\"help-dropdown\"\n role=\"menu\"\n ?inert=\"${!this.helpMenuOpen || !this.hasHelpMenuItems()}\"\n ?hidden=\"${!this.helpMenuOpen || !this.hasHelpMenuItems()}\"\n part=\"help-dropdown\"\n >\n <div class=\"help-dropdown-content\" @click=\"${() => { this.helpMenuOpen = false }}\">\n <slot name=\"help-menu\" @slotchange=\"${(e: Event) => this.handleHelpSlotChange(e)}\"></slot>\n ${this.helpMenuList && this.helpMenuList.length\n ? html`\n <ul class=\"help-menu-list\">\n ${this.helpMenuList.map((item: HeaderMenuItem) => html`\n <li>\n ${item.url\n ? html`\n <a\n href=\"${item.url}\"\n target=\"${item.target || '_blank'}\"\n rel=\"${ifDefined((item.target || '_blank') === '_blank' ? 'noopener noreferrer' : undefined)}\"\n @click=\"${(e: MouseEvent) => this.handleHelpMenuClick(item, e)}\"\n part=\"help-menu-item\"\n role=\"menuitem\"\n >\n ${item.label}\n </a>\n `\n : html`\n <button\n type=\"button\"\n @click=\"${(e: MouseEvent) => this.handleHelpMenuClick(item, e)}\"\n part=\"help-menu-item\"\n role=\"menuitem\"\n >\n ${item.label}\n </button>\n `}\n </li>\n `)}\n </ul>\n `\n : ''}\n </div>\n </nav>\n </div>`\n : ''}\n </div>\n </div>\n `\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("./Header.cjs.js");var t=`solid-ui-header`;customElements.get(t)||customElements.define(t,e.Header);
1
+ const e=require("./Header.cjs.js");var t=`solid-ui-header`;customElements.get(t)||customElements.define(t,e.Header),exports.Header=e.Header;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -3,5 +3,6 @@ import { Header as e } from "./Header.esm.js";
3
3
  var t = "solid-ui-header";
4
4
  customElements.get(t) || customElements.define(t, e);
5
5
  //#endregion
6
+ export { e as Header };
6
7
 
7
8
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PhotoCapture.cjs.js","names":[],"sources":["../../../../../src/v2/components/media/photoCapture/PhotoCapture.ts"],"sourcesContent":["import { LitElement, css, html, nothing, type PropertyValues } from 'lit'\n/* The original code was written by Sir Tim Berners-Lee. It was made into a\nweb component by AI Model GPT-5.4\nPrompt: Take the code from src/media/media-capture.ts and make it a\nweb component. Make it work in forms as well as not. Make it\nconfigurable and follow LoginButton. */\nexport interface PhotoCapturedDetail {\n file: File\n blob: Blob\n objectUrl: string\n contentType: string\n}\n\nexport interface PhotoCaptureErrorDetail {\n error: unknown\n message: string\n}\n\nexport interface PhotoCaptureOpenChangeDetail {\n open: boolean\n}\n\nexport interface PhotoCaptureValueDetail {\n value: File | null\n}\n\ntype PresentationMode = 'inline' | 'dialog'\ntype ThemeMode = 'light' | 'dark'\n\nconst DEFAULT_CAPTURE_FORMAT = 'image/png'\n\nexport class PhotoCapture extends LitElement {\n static formAssociated = true\n\n static properties = {\n label: { type: String, reflect: true },\n heading: { type: String, reflect: true },\n captureLabel: { type: String, attribute: 'capture-label', reflect: true },\n confirmLabel: { type: String, attribute: 'confirm-label', reflect: true },\n retakeLabel: { type: String, attribute: 'retake-label', reflect: true },\n cancelLabel: { type: String, attribute: 'cancel-label', reflect: true },\n presentation: { type: String, reflect: true },\n theme: { type: String, reflect: true },\n facingMode: { type: String, attribute: 'facing-mode', reflect: true },\n constraints: { type: String, reflect: true },\n captureFormat: { type: String, attribute: 'capture-format', reflect: true },\n captureQuality: { type: Number, attribute: 'capture-quality' },\n open: { type: Boolean, reflect: true },\n disabled: { type: Boolean, reflect: true },\n name: { type: String, reflect: true },\n required: { type: Boolean, reflect: true },\n showTrigger: { type: Boolean, attribute: 'show-trigger', reflect: true },\n showCancelButton: { type: Boolean, attribute: 'show-cancel-button', reflect: true },\n autoCloseOnCapture: { type: Boolean, attribute: 'auto-close-on-capture' },\n fileNamePrefix: { type: String, attribute: 'file-name-prefix', reflect: true },\n value: { attribute: false },\n mediaConstraints: { attribute: false },\n _errorMessage: { state: true },\n _previewUrl: { state: true },\n _startingPreview: { state: true }\n }\n\n static styles = css`\n :host {\n display: block;\n --photo-capture-trigger-background: var(--lavender-900, #7c4cff);\n --photo-capture-trigger-text: var(--color-header-text, #ffffff);\n --photo-capture-surface: var(--color-background, #ffffff);\n --photo-capture-text: var(--gray-900, #101828);\n --photo-capture-muted-text: var(--gray-600, #4a5565);\n --photo-capture-border: var(--gray-200, #e5e7eb);\n --photo-capture-hover: var(--gray-100, #f3f4f6);\n --photo-capture-shadow: var(--box-shadow-sm, 0 1px 4px rgba(0, 0, 0, 0.12));\n --photo-capture-overlay: rgba(0, 0, 0, 0.6);\n --photo-capture-frame-max-width: 260px;\n --photo-capture-radius: 8px;\n --photo-capture-button-radius: var(--border-radius-base, 0.3125rem);\n --photo-capture-gap: var(--spacing-2xs, 0.625rem);\n color: var(--photo-capture-text);\n box-sizing: border-box;\n }\n\n :host([theme='dark']) {\n --photo-capture-surface: var(--gray-900, #111827);\n --photo-capture-text: var(--white, #ffffff);\n --photo-capture-muted-text: var(--gray-300, #d1d5dc);\n --photo-capture-border: var(--gray-700, #364153);\n --photo-capture-hover: rgba(255, 255, 255, 0.08);\n --photo-capture-shadow: 0 10px 30px rgba(0, 0, 0, 0.35);\n }\n\n *, *::before, *::after {\n box-sizing: border-box;\n }\n\n .trigger-button,\n .action-button,\n .cancel-button,\n .close-button {\n font: inherit;\n cursor: pointer;\n }\n\n .trigger-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: 35px;\n padding: 0.5rem 0.9rem;\n border: none;\n border-radius: var(--photo-capture-button-radius);\n background: var(--photo-capture-trigger-background);\n color: var(--photo-capture-trigger-text);\n transition: transform 0.2s ease;\n }\n\n .trigger-button:active {\n transform: translateY(1px);\n }\n\n .trigger-button:disabled,\n .action-button:disabled,\n .cancel-button:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n }\n\n .inline-root[hidden] {\n display: none;\n }\n\n .dialog {\n border: none;\n padding: 0;\n background: transparent;\n outline: none;\n overflow: visible;\n max-width: none;\n max-height: none;\n }\n\n .dialog::backdrop {\n background: var(--photo-capture-overlay);\n }\n\n .panel {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--photo-capture-gap);\n width: min(100%, 340px);\n padding: 1rem;\n border: 1px solid var(--photo-capture-border);\n border-radius: var(--photo-capture-radius);\n background: var(--photo-capture-surface);\n color: var(--photo-capture-text);\n box-shadow: var(--photo-capture-shadow);\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n width: 100%;\n }\n\n .panel-heading {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.4;\n }\n\n .close-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n padding: 0;\n border: none;\n border-radius: 999px;\n background: transparent;\n color: var(--photo-capture-muted-text);\n font-size: 1.125rem;\n line-height: 1;\n }\n\n .close-button:hover,\n .close-button:focus-visible,\n .action-button:hover,\n .action-button:focus-visible,\n .cancel-button:hover,\n .cancel-button:focus-visible {\n background: var(--photo-capture-hover);\n }\n\n .viewport {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-height: 200px;\n border-radius: 0.5rem;\n overflow: hidden;\n background: color-mix(in srgb, var(--photo-capture-surface) 92%, #000 8%);\n }\n\n .viewport video,\n .viewport img {\n display: block;\n width: 100%;\n max-width: var(--photo-capture-frame-max-width);\n height: auto;\n border-radius: 0.5rem;\n margin: 0 auto;\n object-fit: cover;\n }\n\n .status {\n width: 100%;\n text-align: center;\n color: var(--photo-capture-muted-text);\n font-size: 0.875rem;\n }\n\n .status.error {\n color: var(--color-error, #b00020);\n }\n\n .actions {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n gap: var(--photo-capture-gap);\n width: 100%;\n }\n\n .action-button,\n .cancel-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: 2.25rem;\n padding: 0.45rem 0.85rem;\n border-radius: var(--photo-capture-button-radius);\n border: 1px solid var(--photo-capture-border);\n background: var(--photo-capture-surface);\n color: var(--photo-capture-text);\n font-size: var(--font-size-xxs, 0.75rem);\n font-weight: var(--font-weight-xbold, 700);\n line-height: 1.5;\n }\n\n .action-button--primary {\n background: var(--photo-capture-trigger-background);\n color: var(--photo-capture-trigger-text);\n border-color: transparent;\n }\n `\n\n declare label: string\n declare heading: string\n declare captureLabel: string\n declare confirmLabel: string\n declare retakeLabel: string\n declare cancelLabel: string\n declare presentation: PresentationMode\n declare theme: ThemeMode\n declare facingMode: string\n declare constraints: string\n declare captureFormat: string\n declare captureQuality?: number\n declare open: boolean\n declare disabled: boolean\n declare name: string\n declare required: boolean\n declare showTrigger: boolean\n declare showCancelButton: boolean\n declare autoCloseOnCapture: boolean\n declare fileNamePrefix: string\n declare mediaConstraints?: MediaStreamConstraints\n declare _errorMessage: string\n declare _previewUrl: string\n declare _startingPreview: boolean\n\n private _value: File | null = null\n private _stream: MediaStream | null = null\n private readonly _internals: ElementInternals | null\n private _associatedForm: HTMLFormElement | null = null\n private readonly _handleFormData = (event: Event) => {\n const formData = (event as Event & { formData?: FormData }).formData\n if (!formData || !this.name || !this.value || this.disabled) return\n formData.append(this.name, this.value, this.value.name)\n }\n\n private readonly _handleFormReset = () => {\n this._clearValue({ emitEvents: false })\n if (this.open) {\n this._queuePreviewStart()\n }\n }\n\n private get _supportsFormInternals (): boolean {\n return !!this._internals && typeof this._internals.setFormValue === 'function'\n }\n\n constructor () {\n super()\n this.label = 'Take Photo'\n this.heading = 'Take a photo'\n this.captureLabel = 'Take Photo'\n this.confirmLabel = 'Use Photo'\n this.retakeLabel = 'Retake'\n this.cancelLabel = 'Cancel'\n this.presentation = 'inline'\n this.theme = 'light'\n this.facingMode = 'user'\n this.constraints = ''\n this.captureFormat = DEFAULT_CAPTURE_FORMAT\n this.captureQuality = undefined\n this.open = false\n this.disabled = false\n this.name = ''\n this.required = false\n this.showTrigger = false\n this.showCancelButton = true\n this.autoCloseOnCapture = false\n this.fileNamePrefix = ''\n this.mediaConstraints = undefined\n this._errorMessage = ''\n this._previewUrl = ''\n this._startingPreview = false\n this._internals = typeof this.attachInternals === 'function' ? this.attachInternals() : null\n }\n\n get value (): File | null {\n return this._value\n }\n\n set value (nextValue: File | null) {\n const normalizedValue = nextValue instanceof File ? nextValue : null\n const previousValue = this._value\n if (previousValue === normalizedValue) return\n\n this._value = normalizedValue\n this._syncPreviewFromValue(normalizedValue)\n this._syncFormValue()\n this._syncValidity()\n this.requestUpdate('value', previousValue)\n }\n\n get form (): HTMLFormElement | null {\n return (this._supportsFormInternals ? this._internals?.form : null) ?? this._associatedForm\n }\n\n get validationMessage (): string {\n return (typeof this._internals?.validationMessage === 'string' ? this._internals.validationMessage : '') || (this.required && !this.value ? 'Please capture a photo.' : '')\n }\n\n get willValidate (): boolean {\n return typeof this._internals?.willValidate === 'boolean' ? this._internals.willValidate : !this.disabled\n }\n\n checkValidity (): boolean {\n if (this._internals && typeof this._internals.checkValidity === 'function') {\n return this._internals.checkValidity()\n }\n return !(this.required && !this.value)\n }\n\n reportValidity (): boolean {\n if (this._internals && typeof this._internals.reportValidity === 'function') {\n return this._internals.reportValidity()\n }\n return this.checkValidity()\n }\n\n connectedCallback () {\n super.connectedCallback()\n this._syncAssociatedForm()\n this._syncFormValue()\n this._syncValidity()\n }\n\n disconnectedCallback () {\n this._syncAssociatedForm(null)\n this._stopStream()\n this._revokePreviewUrl()\n super.disconnectedCallback()\n }\n\n formResetCallback () {\n this._handleFormReset()\n }\n\n formDisabledCallback (disabled: boolean) {\n this.disabled = disabled\n }\n\n protected updated (changed: PropertyValues<this>) {\n this._syncAssociatedForm()\n\n if (this.presentation === 'dialog') {\n const dialog = this.shadowRoot?.querySelector('dialog') as HTMLDialogElement | null\n if (dialog) {\n if (this.open && !dialog.open) {\n dialog.showModal()\n } else if (!this.open && dialog.open) {\n dialog.close()\n }\n }\n }\n\n if (changed.has('open') && !this.open) {\n this._stopStream()\n }\n\n if (\n this.open &&\n !this.value &&\n !this._stream &&\n !this._startingPreview &&\n (changed.has('open') || changed.has('presentation') || changed.has('_previewUrl') || changed.has('value'))\n ) {\n this._queuePreviewStart()\n }\n\n if (changed.has('name') || changed.has('disabled') || changed.has('value')) {\n this._syncFormValue()\n }\n\n if (changed.has('required') || changed.has('disabled') || changed.has('value')) {\n this._syncValidity()\n }\n\n if (this._stream) {\n const video = this.shadowRoot?.querySelector('video.capture-preview') as HTMLVideoElement | null\n if (video && video.srcObject !== this._stream) {\n video.srcObject = this._stream\n }\n }\n }\n\n private _setOpen (open: boolean) {\n if (this.open === open) return\n this.open = open\n this.dispatchEvent(new CustomEvent<PhotoCaptureOpenChangeDetail>('open-change', {\n detail: { open },\n bubbles: true,\n composed: true\n }))\n }\n\n private _emitError (error: unknown, message = 'Unable to access the camera') {\n this._errorMessage = message\n this.dispatchEvent(new CustomEvent<PhotoCaptureErrorDetail>('error', {\n detail: { error, message },\n bubbles: true,\n composed: true\n }))\n }\n\n private _syncAssociatedForm (nextForm = this.closest('form') as HTMLFormElement | null) {\n if (this._associatedForm === nextForm) return\n\n if (this._associatedForm) {\n this._associatedForm.removeEventListener('formdata', this._handleFormData)\n this._associatedForm.removeEventListener('reset', this._handleFormReset)\n }\n\n this._associatedForm = nextForm\n\n if (this._associatedForm && !this._supportsFormInternals) {\n this._associatedForm.addEventListener('formdata', this._handleFormData)\n this._associatedForm.addEventListener('reset', this._handleFormReset)\n }\n }\n\n private _syncFormValue () {\n if (!this._supportsFormInternals) return\n const internals = this._internals\n if (!internals) return\n if (this.disabled || !this.name || !this.value) {\n internals.setFormValue(null)\n return\n }\n internals.setFormValue(this.value)\n }\n\n private _syncValidity () {\n if (!this._internals || !this._supportsFormInternals || typeof this._internals.setValidity !== 'function') return\n if (this.disabled || !this.required || this.value) {\n this._internals.setValidity({})\n return\n }\n this._internals.setValidity({ valueMissing: true }, 'Please capture a photo.')\n }\n\n private _syncPreviewFromValue (file: File | null) {\n this._revokePreviewUrl()\n if (!file) return\n this._stopStream()\n this._previewUrl = URL.createObjectURL(file)\n }\n\n private _clearValue (options: { emitEvents: boolean }) {\n this.value = null\n this._errorMessage = ''\n if (options.emitEvents) {\n this._dispatchValueEvents()\n }\n }\n\n private _dispatchValueEvents () {\n const detail = { value: this.value }\n this.dispatchEvent(new CustomEvent<PhotoCaptureValueDetail>('input', {\n detail,\n bubbles: true,\n composed: true\n }))\n this.dispatchEvent(new CustomEvent<PhotoCaptureValueDetail>('change', {\n detail,\n bubbles: true,\n composed: true\n }))\n }\n\n private _fileExtensionForMimeType (mimeType: string): string {\n switch (mimeType) {\n case 'image/jpeg':\n return 'jpg'\n case 'image/webp':\n return 'webp'\n case 'image/gif':\n return 'gif'\n default:\n return 'png'\n }\n }\n\n private _createFileFromBlob (blob: Blob): File {\n const contentType = blob.type || this.captureFormat || DEFAULT_CAPTURE_FORMAT\n const extension = this._fileExtensionForMimeType(contentType)\n const safePrefix = (this.fileNamePrefix || this.name || 'photo').trim() || 'photo'\n return new File([blob], `${safePrefix}-${Date.now()}.${extension}`, { type: contentType })\n }\n\n private _queuePreviewStart () {\n this._startPreview().catch(() => undefined)\n }\n\n private _resolveMediaConstraints (): MediaStreamConstraints {\n if (this.mediaConstraints) {\n return this.mediaConstraints\n }\n if (this.constraints) {\n try {\n return JSON.parse(this.constraints) as MediaStreamConstraints\n } catch (error) {\n throw new Error(`Invalid constraints JSON: ${(error as Error).message}`)\n }\n }\n\n return {\n video: this.facingMode\n ? { facingMode: { ideal: this.facingMode } }\n : true\n }\n }\n\n private async _startPreview () {\n if (!this.open || this.value || this._startingPreview) return\n if (!navigator.mediaDevices?.getUserMedia) {\n this._emitError(new Error('navigator.mediaDevices.getUserMedia not available'), 'Camera access is not available in this browser')\n return\n }\n\n this._startingPreview = true\n this._errorMessage = ''\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia(this._resolveMediaConstraints())\n if (!this.open) {\n stream.getTracks().forEach(track => track.stop())\n return\n }\n this._stream = stream\n this.requestUpdate()\n await this.updateComplete\n const video = this.shadowRoot?.querySelector('video.capture-preview') as HTMLVideoElement | null\n if (video) {\n video.srcObject = stream\n await video.play?.().catch(() => undefined)\n }\n } catch (error) {\n this._emitError(error, (error as Error)?.message || 'Unable to start the camera preview')\n } finally {\n this._startingPreview = false\n }\n }\n\n private _stopStream () {\n if (!this._stream) return\n this._stream.getTracks().forEach(track => track.stop())\n this._stream = null\n const video = this.shadowRoot?.querySelector('video.capture-preview') as HTMLVideoElement | null\n if (video) {\n video.srcObject = null\n }\n }\n\n private _revokePreviewUrl () {\n if (this._previewUrl) {\n URL.revokeObjectURL(this._previewUrl)\n }\n this._previewUrl = ''\n }\n\n private async _captureSnapshot () {\n const video = this.shadowRoot?.querySelector('video.capture-preview') as HTMLVideoElement | null\n if (!video) return\n\n const width = video.videoWidth || video.clientWidth || 640\n const height = video.videoHeight || video.clientHeight || 480\n const canvas = document.createElement('canvas')\n canvas.width = width\n canvas.height = height\n\n const context = canvas.getContext('2d')\n if (!context) {\n this._emitError(new Error('Canvas 2D context unavailable'), 'Unable to capture a photo in this browser')\n return\n }\n\n context.drawImage(video, 0, 0, width, height)\n\n const blob = await new Promise<Blob | null>(resolve => {\n canvas.toBlob(resolve, this.captureFormat || DEFAULT_CAPTURE_FORMAT, this.captureQuality)\n })\n\n if (!blob) {\n this._emitError(new Error('Camera snapshot failed'), 'Unable to create an image from the current camera frame')\n return\n }\n\n this.value = this._createFileFromBlob(blob)\n this._errorMessage = ''\n }\n\n private async _retakePhoto () {\n this._clearValue({ emitEvents: true })\n await this._startPreview()\n }\n\n private _confirmPhoto () {\n if (!this.value || !this._previewUrl) return\n\n this._dispatchValueEvents()\n\n this.dispatchEvent(new CustomEvent<PhotoCapturedDetail>('photo-captured', {\n detail: {\n file: this.value,\n blob: this.value,\n objectUrl: this._previewUrl,\n contentType: this.value.type || this.captureFormat || DEFAULT_CAPTURE_FORMAT\n },\n bubbles: true,\n composed: true\n }))\n\n if (this.autoCloseOnCapture) {\n this._setOpen(false)\n }\n }\n\n private _handleCancel () {\n this._stopStream()\n this._clearValue({ emitEvents: false })\n this._setOpen(false)\n this.dispatchEvent(new CustomEvent('cancel', {\n bubbles: true,\n composed: true\n }))\n }\n\n private _openCapture () {\n if (this.disabled) return\n this._setOpen(true)\n }\n\n private _renderViewport () {\n if (this._previewUrl) {\n return html`<img class=\"capture-preview\" part=\"preview-image\" src=\"${this._previewUrl}\" alt=\"Captured photo preview\" />`\n }\n\n return html`<video class=\"capture-preview\" part=\"preview-video\" autoplay playsinline muted></video>`\n }\n\n private _renderStatus () {\n if (this._errorMessage) {\n return html`<div class=\"status error\" part=\"error-message\">${this._errorMessage}</div>`\n }\n\n if (this._startingPreview) {\n return html`<div class=\"status\" part=\"status-message\">Opening camera…</div>`\n }\n\n if (!this.value) {\n return html`<div class=\"status\" part=\"status-message\">Preview the camera and take a photo when ready.</div>`\n }\n\n return html`<div class=\"status\" part=\"status-message\">Review the photo before confirming it.</div>`\n }\n\n private _renderActions () {\n return html`\n <div class=\"actions\" part=\"actions\">\n ${this.showCancelButton\n ? html`\n <button\n class=\"cancel-button\"\n part=\"cancel-button\"\n type=\"button\"\n @click=\"${this._handleCancel}\"\n >${this.cancelLabel}</button>\n `\n : nothing}\n\n ${this.value\n ? html`\n <button\n class=\"action-button\"\n part=\"retake-button\"\n type=\"button\"\n @click=\"${this._retakePhoto}\"\n >${this.retakeLabel}</button>\n <button\n class=\"action-button action-button--primary\"\n part=\"confirm-button\"\n type=\"button\"\n @click=\"${this._confirmPhoto}\"\n >${this.confirmLabel}</button>\n `\n : html`\n <button\n class=\"action-button action-button--primary\"\n part=\"capture-button\"\n type=\"button\"\n ?disabled=\"${this._startingPreview || !this._stream}\"\n @click=\"${this._captureSnapshot}\"\n >${this.captureLabel}</button>\n `}\n </div>\n `\n }\n\n private _renderPanel () {\n return html`\n <div class=\"panel\" part=\"panel\">\n <div class=\"panel-header\" part=\"header\">\n <h2 class=\"panel-heading\" part=\"heading\"><slot name=\"heading\">${this.heading}</slot></h2>\n ${this.showCancelButton\n ? html`\n <button\n class=\"close-button\"\n part=\"close-button\"\n type=\"button\"\n aria-label=\"${this.cancelLabel}\"\n @click=\"${this._handleCancel}\"\n >&times;</button>\n `\n : nothing}\n </div>\n <div class=\"viewport\" part=\"viewport\">${this._renderViewport()}</div>\n ${this._renderStatus()}\n ${this._renderActions()}\n </div>\n `\n }\n\n render () {\n const trigger = this.showTrigger || this.presentation === 'dialog'\n\n return html`\n ${trigger\n ? html`\n <button\n class=\"trigger-button\"\n part=\"trigger-button\"\n type=\"button\"\n ?disabled=\"${this.disabled}\"\n @click=\"${this._openCapture}\"\n ><slot>${this.label}</slot></button>\n `\n : nothing}\n\n ${this.presentation === 'dialog'\n ? html`\n <dialog\n class=\"dialog\"\n part=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"${this.heading}\"\n @cancel=\"${(event: Event) => { event.preventDefault(); this._handleCancel() }}\"\n @click=\"${(event: MouseEvent) => {\n if (event.target === event.currentTarget) {\n this._handleCancel()\n }\n }}\"\n >\n ${this.open ? this._renderPanel() : nothing}\n </dialog>\n `\n : html`\n <div class=\"inline-root\" part=\"inline-root\" ?hidden=\"${!this.open}\">\n ${this.open ? this._renderPanel() : nothing}\n </div>\n `}\n `\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PhotoCapture.cjs.js","names":[],"sources":["../../../../../src/v2/components/media/photoCapture/PhotoCapture.ts"],"sourcesContent":["import { LitElement, css, html, nothing, type PropertyValues } from 'lit'\n/* The original code was written by Sir Tim Berners-Lee. It was made into a\nweb component by AI Model GPT-5.4\nPrompt: Take the code from src/media/media-capture.ts and make it a\nweb component. Make it work in forms as well as not. Make it\nconfigurable and follow LoginButton. */\nexport interface PhotoCapturedDetail {\n file: File\n blob: Blob\n objectUrl: string\n contentType: string\n}\n\nexport interface PhotoCaptureErrorDetail {\n error: unknown\n message: string\n}\n\nexport interface PhotoCaptureOpenChangeDetail {\n open: boolean\n}\n\nexport interface PhotoCaptureValueDetail {\n value: File | null\n}\n\ntype PresentationMode = 'inline' | 'dialog'\ntype ThemeMode = 'light' | 'dark'\n\nconst DEFAULT_CAPTURE_FORMAT = 'image/png'\n\nexport class PhotoCapture extends LitElement {\n static formAssociated = true\n\n static properties = {\n label: { type: String, reflect: true },\n heading: { type: String, reflect: true },\n captureLabel: { type: String, attribute: 'capture-label', reflect: true },\n confirmLabel: { type: String, attribute: 'confirm-label', reflect: true },\n retakeLabel: { type: String, attribute: 'retake-label', reflect: true },\n cancelLabel: { type: String, attribute: 'cancel-label', reflect: true },\n presentation: { type: String, reflect: true },\n theme: { type: String, reflect: true },\n facingMode: { type: String, attribute: 'facing-mode', reflect: true },\n constraints: { type: String, reflect: true },\n captureFormat: { type: String, attribute: 'capture-format', reflect: true },\n captureQuality: { type: Number, attribute: 'capture-quality' },\n open: { type: Boolean, reflect: true },\n disabled: { type: Boolean, reflect: true },\n name: { type: String, reflect: true },\n required: { type: Boolean, reflect: true },\n showTrigger: { type: Boolean, attribute: 'show-trigger', reflect: true },\n showCancelButton: { type: Boolean, attribute: 'show-cancel-button', reflect: true },\n autoCloseOnCapture: { type: Boolean, attribute: 'auto-close-on-capture' },\n fileNamePrefix: { type: String, attribute: 'file-name-prefix', reflect: true },\n value: { attribute: false },\n mediaConstraints: { attribute: false },\n _errorMessage: { state: true },\n _previewUrl: { state: true },\n _startingPreview: { state: true }\n }\n\n static styles = css`\n :host {\n display: block;\n --photo-capture-trigger-background: var(--lavender-900, #7c4cff);\n --photo-capture-trigger-text: var(--color-header-text, #ffffff);\n --photo-capture-surface: var(--color-background, #ffffff);\n --photo-capture-text: var(--gray-900, #101828);\n --photo-capture-muted-text: var(--gray-600, #4a5565);\n --photo-capture-border: var(--gray-200, #e5e7eb);\n --photo-capture-hover: var(--gray-100, #f3f4f6);\n --photo-capture-shadow: var(--box-shadow-sm, 0 1px 4px rgba(0, 0, 0, 0.12));\n --photo-capture-overlay: rgba(0, 0, 0, 0.6);\n --photo-capture-frame-max-width: 260px;\n --photo-capture-radius: 8px;\n --photo-capture-button-radius: var(--border-radius-base, 0.3125rem);\n --photo-capture-gap: var(--spacing-2xs, 0.625rem);\n color: var(--photo-capture-text);\n box-sizing: border-box;\n }\n\n :host([theme='dark']) {\n --photo-capture-surface: var(--gray-900, #111827);\n --photo-capture-text: var(--white, #ffffff);\n --photo-capture-muted-text: var(--gray-300, #d1d5dc);\n --photo-capture-border: var(--gray-700, #364153);\n --photo-capture-hover: rgba(255, 255, 255, 0.08);\n --photo-capture-shadow: 0 10px 30px rgba(0, 0, 0, 0.35);\n }\n\n *, *::before, *::after {\n box-sizing: border-box;\n }\n\n .trigger-button,\n .action-button,\n .cancel-button,\n .close-button {\n font: inherit;\n cursor: pointer;\n }\n\n .trigger-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: 35px;\n padding: 0.5rem 0.9rem;\n border: none;\n border-radius: var(--photo-capture-button-radius);\n background: var(--photo-capture-trigger-background);\n color: var(--photo-capture-trigger-text);\n transition: transform 0.2s ease;\n }\n\n .trigger-button:active {\n transform: translateY(1px);\n }\n\n .trigger-button:disabled,\n .action-button:disabled,\n .cancel-button:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n }\n\n .inline-root[hidden] {\n display: none;\n }\n\n .dialog {\n border: none;\n padding: 0;\n background: transparent;\n outline: none;\n overflow: visible;\n max-width: none;\n max-height: none;\n }\n\n .dialog::backdrop {\n background: var(--photo-capture-overlay);\n }\n\n .panel {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--photo-capture-gap);\n width: min(100%, 340px);\n padding: 1rem;\n border: 1px solid var(--photo-capture-border);\n border-radius: var(--photo-capture-radius);\n background: var(--photo-capture-surface);\n color: var(--photo-capture-text);\n box-shadow: var(--photo-capture-shadow);\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n width: 100%;\n }\n\n .panel-heading {\n margin: 0;\n font-size: 1rem;\n font-weight: 700;\n line-height: 1.4;\n }\n\n .close-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n padding: 0;\n border: none;\n border-radius: 999px;\n background: transparent;\n color: var(--photo-capture-muted-text);\n font-size: 1.125rem;\n line-height: 1;\n }\n\n .close-button:hover,\n .close-button:focus-visible,\n .action-button:hover,\n .action-button:focus-visible,\n .cancel-button:hover,\n .cancel-button:focus-visible {\n background: var(--photo-capture-hover);\n }\n\n .viewport {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-height: 200px;\n border-radius: 0.5rem;\n overflow: hidden;\n background: color-mix(in srgb, var(--photo-capture-surface) 92%, #000 8%);\n }\n\n .viewport video,\n .viewport img {\n display: block;\n width: 100%;\n max-width: var(--photo-capture-frame-max-width);\n height: auto;\n border-radius: 0.5rem;\n margin: 0 auto;\n object-fit: cover;\n }\n\n .status {\n width: 100%;\n text-align: center;\n color: var(--photo-capture-muted-text);\n font-size: 0.875rem;\n }\n\n .status.error {\n color: var(--color-error, #b00020);\n }\n\n .actions {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n gap: var(--photo-capture-gap);\n width: 100%;\n }\n\n .action-button,\n .cancel-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: 2.25rem;\n padding: 0.45rem 0.85rem;\n border-radius: var(--photo-capture-button-radius);\n border: 1px solid var(--photo-capture-border);\n background: var(--photo-capture-surface);\n color: var(--photo-capture-text);\n font-size: var(--font-size-xxs, 0.75rem);\n font-weight: var(--font-weight-xbold, 700);\n line-height: 1.5;\n }\n\n .action-button--primary {\n background: var(--photo-capture-trigger-background);\n color: var(--photo-capture-trigger-text);\n border-color: transparent;\n }\n `\n\n declare label: string\n declare heading: string\n declare captureLabel: string\n declare confirmLabel: string\n declare retakeLabel: string\n declare cancelLabel: string\n declare presentation: PresentationMode\n declare theme: ThemeMode\n declare facingMode: string\n declare constraints: string\n declare captureFormat: string\n declare captureQuality?: number\n declare open: boolean\n declare disabled: boolean\n declare name: string\n declare required: boolean\n declare showTrigger: boolean\n declare showCancelButton: boolean\n declare autoCloseOnCapture: boolean\n declare fileNamePrefix: string\n declare mediaConstraints?: MediaStreamConstraints\n declare _errorMessage: string\n declare _previewUrl: string\n declare _startingPreview: boolean\n\n private _value: File | null = null\n private _stream: MediaStream | null = null\n private readonly _internals: ElementInternals | null\n private _associatedForm: HTMLFormElement | null = null\n private readonly _handleFormData = (event: Event) => {\n const formData = (event as Event & { formData?: FormData }).formData\n if (!formData || !this.name || !this.value || this.disabled) return\n formData.append(this.name, this.value, this.value.name)\n }\n\n private readonly _handleFormReset = () => {\n this._clearValue({ emitEvents: false })\n if (this.open) {\n this._queuePreviewStart()\n }\n }\n\n private get _supportsFormInternals (): boolean {\n return !!this._internals && typeof this._internals.setFormValue === 'function'\n }\n\n constructor () {\n super()\n this.label = 'Take Photo'\n this.heading = 'Take a photo'\n this.captureLabel = 'Take Photo'\n this.confirmLabel = 'Use Photo'\n this.retakeLabel = 'Retake'\n this.cancelLabel = 'Cancel'\n this.presentation = 'inline'\n this.theme = 'light'\n this.facingMode = 'user'\n this.constraints = ''\n this.captureFormat = DEFAULT_CAPTURE_FORMAT\n this.captureQuality = undefined\n this.open = false\n this.disabled = false\n this.name = ''\n this.required = false\n this.showTrigger = false\n this.showCancelButton = true\n this.autoCloseOnCapture = false\n this.fileNamePrefix = ''\n this.mediaConstraints = undefined\n this._errorMessage = ''\n this._previewUrl = ''\n this._startingPreview = false\n this._internals = typeof this.attachInternals === 'function' ? this.attachInternals() : null\n }\n\n get value (): File | null {\n return this._value\n }\n\n set value (nextValue: File | null) {\n const normalizedValue = nextValue instanceof File ? nextValue : null\n const previousValue = this._value\n if (previousValue === normalizedValue) return\n\n this._value = normalizedValue\n this._syncPreviewFromValue(normalizedValue)\n this._syncFormValue()\n this._syncValidity()\n this.requestUpdate('value', previousValue)\n }\n\n get form (): HTMLFormElement | null {\n return (this._supportsFormInternals ? this._internals?.form : null) ?? this._associatedForm\n }\n\n get validationMessage (): string {\n return (typeof this._internals?.validationMessage === 'string' ? this._internals.validationMessage : '') || (this.required && !this.value ? 'Please capture a photo.' : '')\n }\n\n get willValidate (): boolean {\n return typeof this._internals?.willValidate === 'boolean' ? this._internals.willValidate : !this.disabled\n }\n\n checkValidity (): boolean {\n if (this._internals && typeof this._internals.checkValidity === 'function') {\n return this._internals.checkValidity()\n }\n return !(this.required && !this.value)\n }\n\n reportValidity (): boolean {\n if (this._internals && typeof this._internals.reportValidity === 'function') {\n return this._internals.reportValidity()\n }\n return this.checkValidity()\n }\n\n connectedCallback () {\n super.connectedCallback()\n this._syncAssociatedForm()\n this._syncFormValue()\n this._syncValidity()\n }\n\n disconnectedCallback () {\n this._syncAssociatedForm(null)\n this._stopStream()\n this._revokePreviewUrl()\n super.disconnectedCallback()\n }\n\n formResetCallback () {\n this._handleFormReset()\n }\n\n formDisabledCallback (disabled: boolean) {\n this.disabled = disabled\n }\n\n protected updated (changed: PropertyValues<this>) {\n this._syncAssociatedForm()\n\n if (this.presentation === 'dialog') {\n const dialog = this.shadowRoot?.querySelector('dialog') as HTMLDialogElement | null\n if (dialog) {\n if (this.open && !dialog.open) {\n dialog.showModal()\n } else if (!this.open && dialog.open) {\n dialog.close()\n }\n }\n }\n\n if (changed.has('open') && !this.open) {\n this._stopStream()\n }\n\n if (\n this.open &&\n !this.value &&\n !this._stream &&\n !this._startingPreview &&\n (changed.has('open') || changed.has('presentation') || changed.has('_previewUrl') || changed.has('value'))\n ) {\n this._queuePreviewStart()\n }\n\n if (changed.has('name') || changed.has('disabled') || changed.has('value')) {\n this._syncFormValue()\n }\n\n if (changed.has('required') || changed.has('disabled') || changed.has('value')) {\n this._syncValidity()\n }\n\n if (this._stream) {\n const video = this.shadowRoot?.querySelector('video.capture-preview') as HTMLVideoElement | null\n if (video && video.srcObject !== this._stream) {\n video.srcObject = this._stream\n }\n }\n }\n\n private _setOpen (open: boolean) {\n if (this.open === open) return\n this.open = open\n this.dispatchEvent(new CustomEvent<PhotoCaptureOpenChangeDetail>('open-change', {\n detail: { open },\n bubbles: true,\n composed: true\n }))\n }\n\n private _emitError (error: unknown, message = 'Unable to access the camera') {\n this._errorMessage = message\n this.dispatchEvent(new CustomEvent<PhotoCaptureErrorDetail>('error', {\n detail: { error, message },\n bubbles: true,\n composed: true\n }))\n }\n\n private _syncAssociatedForm (nextForm = this.closest('form') as HTMLFormElement | null) {\n if (this._associatedForm === nextForm) return\n\n if (this._associatedForm) {\n this._associatedForm.removeEventListener('formdata', this._handleFormData)\n this._associatedForm.removeEventListener('reset', this._handleFormReset)\n }\n\n this._associatedForm = nextForm\n\n if (this._associatedForm && !this._supportsFormInternals) {\n this._associatedForm.addEventListener('formdata', this._handleFormData)\n this._associatedForm.addEventListener('reset', this._handleFormReset)\n }\n }\n\n private _syncFormValue () {\n if (!this._supportsFormInternals) return\n const internals = this._internals\n if (!internals) return\n if (this.disabled || !this.name || !this.value) {\n internals.setFormValue(null)\n return\n }\n internals.setFormValue(this.value)\n }\n\n private _syncValidity () {\n if (!this._internals || !this._supportsFormInternals || typeof this._internals.setValidity !== 'function') return\n if (this.disabled || !this.required || this.value) {\n this._internals.setValidity({})\n return\n }\n this._internals.setValidity({ valueMissing: true }, 'Please capture a photo.')\n }\n\n private _syncPreviewFromValue (file: File | null) {\n this._revokePreviewUrl()\n if (!file) return\n this._stopStream()\n this._previewUrl = URL.createObjectURL(file)\n }\n\n private _clearValue (options: { emitEvents: boolean }) {\n this.value = null\n this._errorMessage = ''\n if (options.emitEvents) {\n this._dispatchValueEvents()\n }\n }\n\n private _dispatchValueEvents () {\n const detail = { value: this.value }\n this.dispatchEvent(new CustomEvent<PhotoCaptureValueDetail>('input', {\n detail,\n bubbles: true,\n composed: true\n }))\n this.dispatchEvent(new CustomEvent<PhotoCaptureValueDetail>('change', {\n detail,\n bubbles: true,\n composed: true\n }))\n }\n\n private _fileExtensionForMimeType (mimeType: string): string {\n switch (mimeType) {\n case 'image/jpeg':\n return 'jpg'\n case 'image/webp':\n return 'webp'\n case 'image/gif':\n return 'gif'\n default:\n return 'png'\n }\n }\n\n private _createFileFromBlob (blob: Blob): File {\n const contentType = blob.type || this.captureFormat || DEFAULT_CAPTURE_FORMAT\n const extension = this._fileExtensionForMimeType(contentType)\n const safePrefix = (this.fileNamePrefix || this.name || 'photo').trim() || 'photo'\n return new File([blob], `${safePrefix}-${Date.now()}.${extension}`, { type: contentType })\n }\n\n private _queuePreviewStart () {\n this._startPreview().catch(() => undefined)\n }\n\n private _resolveMediaConstraints (): MediaStreamConstraints {\n if (this.mediaConstraints) {\n return this.mediaConstraints\n }\n if (this.constraints) {\n try {\n return JSON.parse(this.constraints) as MediaStreamConstraints\n } catch (error) {\n throw new Error(`Invalid constraints JSON: ${(error as Error).message}`)\n }\n }\n\n return {\n video: this.facingMode\n ? { facingMode: { ideal: this.facingMode } }\n : true\n }\n }\n\n private async _startPreview () {\n if (!this.open || this.value || this._startingPreview) return\n if (!navigator.mediaDevices?.getUserMedia) {\n this._emitError(new Error('navigator.mediaDevices.getUserMedia not available'), 'Camera access is not available in this browser')\n return\n }\n\n this._startingPreview = true\n this._errorMessage = ''\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia(this._resolveMediaConstraints())\n if (!this.open) {\n stream.getTracks().forEach(track => track.stop())\n return\n }\n this._stream = stream\n this.requestUpdate()\n await this.updateComplete\n const video = this.shadowRoot?.querySelector('video.capture-preview') as HTMLVideoElement | null\n if (video) {\n video.srcObject = stream\n await video.play?.().catch(() => undefined)\n }\n } catch (error) {\n this._emitError(error, (error as Error)?.message || 'Unable to start the camera preview')\n } finally {\n this._startingPreview = false\n }\n }\n\n private _stopStream () {\n if (!this._stream) return\n this._stream.getTracks().forEach(track => track.stop())\n this._stream = null\n const video = this.shadowRoot?.querySelector('video.capture-preview') as HTMLVideoElement | null\n if (video) {\n video.srcObject = null\n }\n }\n\n private _revokePreviewUrl () {\n if (this._previewUrl) {\n URL.revokeObjectURL(this._previewUrl)\n }\n this._previewUrl = ''\n }\n\n private async _captureSnapshot () {\n const video = this.shadowRoot?.querySelector('video.capture-preview') as HTMLVideoElement | null\n if (!video) return\n\n const width = video.videoWidth || video.clientWidth || 640\n const height = video.videoHeight || video.clientHeight || 480\n const canvas = document.createElement('canvas')\n canvas.width = width\n canvas.height = height\n\n const context = canvas.getContext('2d')\n if (!context) {\n this._emitError(new Error('Canvas 2D context unavailable'), 'Unable to capture a photo in this browser')\n return\n }\n\n context.drawImage(video, 0, 0, width, height)\n\n const blob = await new Promise<Blob | null>(resolve => {\n canvas.toBlob(resolve, this.captureFormat || DEFAULT_CAPTURE_FORMAT, this.captureQuality)\n })\n\n if (!blob) {\n this._emitError(new Error('Camera snapshot failed'), 'Unable to create an image from the current camera frame')\n return\n }\n\n this.value = this._createFileFromBlob(blob)\n this._errorMessage = ''\n }\n\n private async _retakePhoto () {\n this._clearValue({ emitEvents: true })\n await this._startPreview()\n }\n\n private _confirmPhoto () {\n if (!this.value || !this._previewUrl) return\n\n this._dispatchValueEvents()\n\n this.dispatchEvent(new CustomEvent<PhotoCapturedDetail>('photo-captured', {\n detail: {\n file: this.value,\n blob: this.value,\n objectUrl: this._previewUrl,\n contentType: this.value.type || this.captureFormat || DEFAULT_CAPTURE_FORMAT\n },\n bubbles: true,\n composed: true\n }))\n\n if (this.autoCloseOnCapture) {\n this._setOpen(false)\n }\n }\n\n private _handleCancel () {\n this._stopStream()\n this._clearValue({ emitEvents: false })\n this._setOpen(false)\n this.dispatchEvent(new CustomEvent('cancel', {\n bubbles: true,\n composed: true\n }))\n }\n\n private _openCapture () {\n if (this.disabled) return\n this._setOpen(true)\n }\n\n private _renderViewport () {\n if (this._previewUrl) {\n return html`<img class=\"capture-preview\" part=\"preview-image\" src=\"${this._previewUrl}\" alt=\"Captured photo preview\" />`\n }\n\n return html`<video class=\"capture-preview\" part=\"preview-video\" autoplay playsinline muted></video>`\n }\n\n private _renderStatus () {\n if (this._errorMessage) {\n return html`<div class=\"status error\" part=\"error-message\">${this._errorMessage}</div>`\n }\n\n if (this._startingPreview) {\n return html`<div class=\"status\" part=\"status-message\">Opening camera…</div>`\n }\n\n if (!this.value) {\n return html`<div class=\"status\" part=\"status-message\">Preview the camera and take a photo when ready.</div>`\n }\n\n return html`<div class=\"status\" part=\"status-message\">Review the photo before confirming it.</div>`\n }\n\n private _renderActions () {\n return html`\n <div class=\"actions\" part=\"actions\">\n ${this.showCancelButton\n ? html`\n <button\n class=\"cancel-button\"\n part=\"cancel-button\"\n type=\"button\"\n @click=\"${this._handleCancel}\"\n >${this.cancelLabel}</button>\n `\n : nothing}\n\n ${this.value\n ? html`\n <button\n class=\"action-button\"\n part=\"retake-button\"\n type=\"button\"\n @click=\"${this._retakePhoto}\"\n >${this.retakeLabel}</button>\n <button\n class=\"action-button action-button--primary\"\n part=\"confirm-button\"\n type=\"button\"\n @click=\"${this._confirmPhoto}\"\n >${this.confirmLabel}</button>\n `\n : html`\n <button\n class=\"action-button action-button--primary\"\n part=\"capture-button\"\n type=\"button\"\n ?disabled=\"${this._startingPreview || !this._stream}\"\n @click=\"${this._captureSnapshot}\"\n >${this.captureLabel}</button>\n `}\n </div>\n `\n }\n\n private _renderPanel () {\n return html`\n <div class=\"panel\" part=\"panel\">\n <div class=\"panel-header\" part=\"header\">\n <h2 class=\"panel-heading\" part=\"heading\"><slot name=\"heading\">${this.heading}</slot></h2>\n ${this.showCancelButton\n ? html`\n <button\n class=\"close-button\"\n part=\"close-button\"\n type=\"button\"\n aria-label=\"${this.cancelLabel}\"\n @click=\"${this._handleCancel}\"\n >&times;</button>\n `\n : nothing}\n </div>\n <div class=\"viewport\" part=\"viewport\">${this._renderViewport()}</div>\n ${this._renderStatus()}\n ${this._renderActions()}\n </div>\n `\n }\n\n render () {\n const trigger = this.showTrigger || this.presentation === 'dialog'\n\n return html`\n ${trigger\n ? html`\n <button\n class=\"trigger-button\"\n part=\"trigger-button\"\n type=\"button\"\n ?disabled=\"${this.disabled}\"\n @click=\"${this._openCapture}\"\n ><slot>${this.label}</slot></button>\n `\n : nothing}\n\n ${this.presentation === 'dialog'\n ? html`\n <dialog\n class=\"dialog\"\n part=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"${this.heading}\"\n @cancel=\"${(event: Event) => { event.preventDefault(); this._handleCancel() }}\"\n @click=\"${(event: MouseEvent) => {\n if (event.target === event.currentTarget) {\n this._handleCancel()\n }\n }}\"\n >\n ${this.open ? this._renderPanel() : nothing}\n </dialog>\n `\n : html`\n <div class=\"inline-root\" part=\"inline-root\" ?hidden=\"${!this.open}\">\n ${this.open ? this._renderPanel() : nothing}\n </div>\n `}\n `\n }\n}\n"],"mappings":"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"}