solid-ui 3.1.3-12 → 3.1.3-13

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 (289) hide show
  1. package/README.md +9 -0
  2. package/dist/chunks/{DialogProvider-ge2aA77F.js → DialogProvider-B7wEBrVN.js} +11 -13
  3. package/dist/chunks/{DialogProvider-ge2aA77F.js.map → DialogProvider-B7wEBrVN.js.map} +1 -1
  4. package/dist/chunks/{account-Bb818bGF.js → account-DeNlj01m.js} +24 -26
  5. package/dist/chunks/{account-Bb818bGF.js.map → account-DeNlj01m.js.map} +1 -1
  6. package/dist/chunks/{auth-ClVI18ss.js → auth-Knq99zZ9.js} +75 -103
  7. package/dist/chunks/auth-Knq99zZ9.js.map +1 -0
  8. package/dist/chunks/{avatar-DGu_PX5y.js → avatar-DgO_p94F.js} +8 -9
  9. package/dist/chunks/{avatar-DGu_PX5y.js.map → avatar-DgO_p94F.js.map} +1 -1
  10. package/dist/chunks/{button-B9-nlEpz.js → button-Dvkek1tx.js} +10 -11
  11. package/dist/chunks/{button-B9-nlEpz.js.map → button-Dvkek1tx.js.map} +1 -1
  12. package/dist/chunks/{chunk.7MPIABXH-CEYdxYyt.js → chunk.7MPIABXH-DNcYOuE8.js} +22 -22
  13. package/dist/chunks/{chunk.7MPIABXH-CEYdxYyt.js.map → chunk.7MPIABXH-DNcYOuE8.js.map} +1 -1
  14. package/dist/chunks/{combobox-DrT0Nb-A.js → combobox-B5j4LoHY.js} +108 -179
  15. package/dist/chunks/combobox-B5j4LoHY.js.map +1 -0
  16. package/dist/chunks/{combobox-option-DxJvAZ_Q.js → combobox-option-C5lKAumO.js} +7 -8
  17. package/dist/chunks/{combobox-option-DxJvAZ_Q.js.map → combobox-option-C5lKAumO.js.map} +1 -1
  18. package/dist/chunks/components-BD458q30.js +758 -0
  19. package/dist/chunks/components-BD458q30.js.map +1 -0
  20. package/dist/chunks/{dialog-kyHgc-uy.js → dialog-DZgm_Tph.js} +57 -114
  21. package/dist/chunks/dialog-DZgm_Tph.js.map +1 -0
  22. package/dist/chunks/{dialog-content-CEITrC59.js → dialog-content-DY-ROHyi.js} +4 -4
  23. package/dist/chunks/{dialog-content-CEITrC59.js.map → dialog-content-DY-ROHyi.js.map} +1 -1
  24. package/dist/chunks/{dialog-footer-DVLEK5bU.js → dialog-footer-BAZTjZ8J.js} +4 -4
  25. package/dist/chunks/{dialog-footer-DVLEK5bU.js.map → dialog-footer-BAZTjZ8J.js.map} +1 -1
  26. package/dist/chunks/{dialog-header-kEWl21oD.js → dialog-header-COzPcK8F.js} +4 -4
  27. package/dist/chunks/{dialog-header-kEWl21oD.js.map → dialog-header-COzPcK8F.js.map} +1 -1
  28. package/dist/chunks/dialogs-DEuwXC46.js +26 -0
  29. package/dist/chunks/dialogs-DEuwXC46.js.map +1 -0
  30. package/dist/chunks/{dialogs-root-dPGfuzSZ.js → dialogs-root-BYp6fIUE.js} +12 -17
  31. package/dist/chunks/dialogs-root-BYp6fIUE.js.map +1 -0
  32. package/dist/chunks/{guard-DEqOFEs4.js → guard-DI4k0FkM.js} +8 -9
  33. package/dist/chunks/{guard-DEqOFEs4.js.map → guard-DI4k0FkM.js.map} +1 -1
  34. package/dist/chunks/{input-BjCX2bFe.js → input-CCpEhtqA.js} +57 -131
  35. package/dist/chunks/input-CCpEhtqA.js.map +1 -0
  36. package/dist/chunks/{login-button-Czm-E9Na.js → login-button-BafqiKef.js} +9 -10
  37. package/dist/chunks/{login-button-Czm-E9Na.js.map → login-button-BafqiKef.js.map} +1 -1
  38. package/dist/chunks/{logout-button-BrR_jOhK.js → logout-button-D54NF9EW.js} +9 -10
  39. package/dist/chunks/{logout-button-BrR_jOhK.js.map → logout-button-D54NF9EW.js.map} +1 -1
  40. package/dist/chunks/{menu-1PG19fCC.js → menu-DKxtACGA.js} +45 -46
  41. package/dist/chunks/{menu-1PG19fCC.js.map → menu-DKxtACGA.js.map} +1 -1
  42. package/dist/chunks/{menu-item-C9uErV38.js → menu-item-D9BqJtKZ.js} +10 -11
  43. package/dist/chunks/{menu-item-C9uErV38.js.map → menu-item-D9BqJtKZ.js.map} +1 -1
  44. package/dist/chunks/photo-capture-BoZF621r.js +403 -0
  45. package/dist/chunks/photo-capture-BoZF621r.js.map +1 -0
  46. package/dist/chunks/photo-capture-modal-BLZtHDj1.js +560 -0
  47. package/dist/chunks/photo-capture-modal-BLZtHDj1.js.map +1 -0
  48. package/dist/chunks/{provider-qd_4VaKB.js → provider-Btl6Lnki.js} +13 -14
  49. package/dist/chunks/{provider-qd_4VaKB.js.map → provider-Btl6Lnki.js.map} +1 -1
  50. package/dist/chunks/{select-OM-SgY4K.js → select-XkieYvDm.js} +53 -110
  51. package/dist/chunks/select-XkieYvDm.js.map +1 -0
  52. package/dist/chunks/{select-option-pVhYlXrt.js → select-option-DUg4AWzw.js} +7 -8
  53. package/dist/chunks/{select-option-pVhYlXrt.js.map → select-option-DUg4AWzw.js.map} +1 -1
  54. package/dist/chunks/{signup-button-BnA5p-uJ.js → signup-button-D5wS8_gB.js} +9 -10
  55. package/dist/chunks/{signup-button-BnA5p-uJ.js.map → signup-button-D5wS8_gB.js.map} +1 -1
  56. package/dist/chunks/{solid-emblem-D2clBuKZ.js → solid-emblem-XHk-oomv.js} +5 -5
  57. package/dist/chunks/{solid-emblem-D2clBuKZ.js.map → solid-emblem-XHk-oomv.js.map} +1 -1
  58. package/dist/chunks/{src-DJOb1wMf.js → src-CJICzMIV.js} +4 -3
  59. package/dist/chunks/{src-DJOb1wMf.js.map → src-CJICzMIV.js.map} +1 -1
  60. package/dist/components/account/Account.stories.d.ts +3 -13
  61. package/dist/components/account/Account.stories.d.ts.map +1 -1
  62. package/dist/components/account.js +1 -1
  63. package/dist/components/all.cjs.js +1 -1
  64. package/dist/components/all.esm.js +1 -0
  65. package/dist/components/avatar/Avatar.stories.d.ts +3 -21
  66. package/dist/components/avatar/Avatar.stories.d.ts.map +1 -1
  67. package/dist/components/avatar.js +1 -1
  68. package/dist/components/button/Button.stories.d.ts +15 -154
  69. package/dist/components/button/Button.stories.d.ts.map +1 -1
  70. package/dist/components/button.js +1 -1
  71. package/dist/components/combobox/Combobox.cjs.js +11 -11
  72. package/dist/components/combobox/Combobox.cjs.js.map +1 -1
  73. package/dist/components/combobox/Combobox.d.ts +4 -11
  74. package/dist/components/combobox/Combobox.d.ts.map +1 -1
  75. package/dist/components/combobox/Combobox.esm.js +101 -172
  76. package/dist/components/combobox/Combobox.esm.js.map +1 -1
  77. package/dist/components/combobox/Combobox.stories.d.ts +9 -46
  78. package/dist/components/combobox/Combobox.stories.d.ts.map +1 -1
  79. package/dist/components/combobox-option.js +1 -1
  80. package/dist/components/combobox.js +1 -1
  81. package/dist/components/dialog/Dialog.cjs.js +3 -3
  82. package/dist/components/dialog/Dialog.cjs.js.map +1 -1
  83. package/dist/components/dialog/Dialog.esm.js +6 -6
  84. package/dist/components/dialog/Dialog.esm.js.map +1 -1
  85. package/dist/components/dialog/Dialog.stories.d.ts +22 -0
  86. package/dist/components/dialog/Dialog.stories.d.ts.map +1 -0
  87. package/dist/components/dialog/docs/sample-modal/SampleModal.d.ts +6 -0
  88. package/dist/components/dialog/docs/sample-modal/SampleModal.d.ts.map +1 -0
  89. package/dist/components/dialog/docs/sample-modal/index.d.ts +4 -0
  90. package/dist/components/dialog/docs/sample-modal/index.d.ts.map +1 -0
  91. package/dist/components/dialog-content.js +1 -1
  92. package/dist/components/dialog-footer.js +1 -1
  93. package/dist/components/dialog-header.js +1 -1
  94. package/dist/components/dialog-provider.js +1 -1
  95. package/dist/components/dialog.js +1 -1
  96. package/dist/components/dialogs-root/DialogsRoot.cjs.js +4 -7
  97. package/dist/components/dialogs-root/DialogsRoot.cjs.js.map +1 -1
  98. package/dist/components/dialogs-root/DialogsRoot.d.ts.map +1 -1
  99. package/dist/components/dialogs-root/DialogsRoot.esm.js +7 -10
  100. package/dist/components/dialogs-root/DialogsRoot.esm.js.map +1 -1
  101. package/dist/components/dialogs-root.js +1 -1
  102. package/dist/components/guard/Guard.stories.d.ts +3 -21
  103. package/dist/components/guard/Guard.stories.d.ts.map +1 -1
  104. package/dist/components/guard.js +1 -1
  105. package/dist/components/input/Input.cjs.js +2 -2
  106. package/dist/components/input/Input.cjs.js.map +1 -1
  107. package/dist/components/input/Input.d.ts +3 -11
  108. package/dist/components/input/Input.d.ts.map +1 -1
  109. package/dist/components/input/Input.esm.js +61 -135
  110. package/dist/components/input/Input.esm.js.map +1 -1
  111. package/dist/components/input/Input.stories.d.ts +13 -22
  112. package/dist/components/input/Input.stories.d.ts.map +1 -1
  113. package/dist/components/input.js +1 -1
  114. package/dist/components/login-button/LoginButton.stories.d.ts +4 -4
  115. package/dist/components/login-button/LoginButton.stories.d.ts.map +1 -1
  116. package/dist/components/login-button.js +1 -1
  117. package/dist/components/login-modal/LoginModal.cjs.js +1 -1
  118. package/dist/components/login-modal/LoginModal.cjs.js.map +1 -1
  119. package/dist/components/login-modal/LoginModal.esm.js +1 -1
  120. package/dist/components/login-modal/LoginModal.esm.js.map +1 -1
  121. package/dist/components/login-modal/LoginModal.stories.d.ts +13 -5
  122. package/dist/components/login-modal/LoginModal.stories.d.ts.map +1 -1
  123. package/dist/components/login-modal.js +1 -1
  124. package/dist/components/logout-button/LogoutButton.stories.d.ts +4 -4
  125. package/dist/components/logout-button/LogoutButton.stories.d.ts.map +1 -1
  126. package/dist/components/logout-button.js +1 -1
  127. package/dist/components/menu/Menu.stories.d.ts +3 -4
  128. package/dist/components/menu/Menu.stories.d.ts.map +1 -1
  129. package/dist/components/menu-item.js +1 -1
  130. package/dist/components/menu.js +1 -1
  131. package/dist/components/photo-capture/PhotoCapture.cjs.js +6 -0
  132. package/dist/components/photo-capture/PhotoCapture.cjs.js.map +1 -0
  133. package/dist/components/photo-capture/PhotoCapture.d.ts +20 -0
  134. package/dist/components/photo-capture/PhotoCapture.d.ts.map +1 -0
  135. package/dist/components/photo-capture/PhotoCapture.esm.js +404 -0
  136. package/dist/components/photo-capture/PhotoCapture.esm.js.map +1 -0
  137. package/dist/components/photo-capture/PhotoCapture.stories.d.ts +16 -0
  138. package/dist/components/photo-capture/PhotoCapture.stories.d.ts.map +1 -0
  139. package/dist/components/photo-capture/docs/photo-capture-sandbox/PhotoCaptureSandbox.d.ts +9 -0
  140. package/dist/components/photo-capture/docs/photo-capture-sandbox/PhotoCaptureSandbox.d.ts.map +1 -0
  141. package/dist/components/photo-capture/docs/photo-capture-sandbox/index.d.ts +4 -0
  142. package/dist/components/photo-capture/docs/photo-capture-sandbox/index.d.ts.map +1 -0
  143. package/dist/components/photo-capture/index.cjs.js +2 -1
  144. package/dist/components/photo-capture/index.cjs.js.map +1 -0
  145. package/dist/components/photo-capture/index.d.ts +4 -1
  146. package/dist/components/photo-capture/index.d.ts.map +1 -1
  147. package/dist/components/photo-capture/index.esm.js +7 -3
  148. package/dist/components/photo-capture/index.esm.js.map +1 -0
  149. package/dist/components/photo-capture-modal/PhotoCaptureModal.cjs.js +24 -0
  150. package/dist/components/photo-capture-modal/PhotoCaptureModal.cjs.js.map +1 -0
  151. package/dist/components/photo-capture-modal/PhotoCaptureModal.d.ts +42 -0
  152. package/dist/components/photo-capture-modal/PhotoCaptureModal.d.ts.map +1 -0
  153. package/dist/components/photo-capture-modal/PhotoCaptureModal.esm.js +561 -0
  154. package/dist/components/photo-capture-modal/PhotoCaptureModal.esm.js.map +1 -0
  155. package/dist/components/photo-capture-modal/PhotoCaptureModal.styles.cjs.js +2 -0
  156. package/dist/components/photo-capture-modal/PhotoCaptureModal.styles.cjs.js.map +1 -0
  157. package/dist/components/photo-capture-modal/PhotoCaptureModal.styles.esm.js +7 -0
  158. package/dist/components/photo-capture-modal/PhotoCaptureModal.styles.esm.js.map +1 -0
  159. package/dist/components/photo-capture-modal/index.cjs.js +2 -0
  160. package/dist/components/photo-capture-modal/index.cjs.js.map +1 -0
  161. package/dist/components/photo-capture-modal/index.d.ts +4 -0
  162. package/dist/components/photo-capture-modal/index.d.ts.map +1 -0
  163. package/dist/components/photo-capture-modal/index.esm.js +7 -0
  164. package/dist/components/photo-capture-modal/index.esm.js.map +1 -0
  165. package/dist/components/photo-capture-modal.js +2 -0
  166. package/dist/components/photo-capture.js +2 -2
  167. package/dist/components/provider.js +1 -1
  168. package/dist/components/select/Select.cjs.js +3 -3
  169. package/dist/components/select/Select.cjs.js.map +1 -1
  170. package/dist/components/select/Select.d.ts +3 -10
  171. package/dist/components/select/Select.d.ts.map +1 -1
  172. package/dist/components/select/Select.esm.js +52 -109
  173. package/dist/components/select/Select.esm.js.map +1 -1
  174. package/dist/components/select/Select.stories.d.ts +9 -13
  175. package/dist/components/select/Select.stories.d.ts.map +1 -1
  176. package/dist/components/select-option.js +1 -1
  177. package/dist/components/select.js +1 -1
  178. package/dist/components/signup-button/SignupButton.stories.d.ts +4 -4
  179. package/dist/components/signup-button/SignupButton.stories.d.ts.map +1 -1
  180. package/dist/components/signup-button.js +1 -1
  181. package/dist/components/solid-emblem.js +1 -1
  182. package/dist/components.js +24 -23
  183. package/dist/index.cjs.js +1 -1
  184. package/dist/index.cjs.js.map +1 -1
  185. package/dist/index.esm.js +12 -10
  186. package/dist/index.esm.js.map +1 -1
  187. package/dist/index.js +6 -8
  188. package/dist/lib/auth/SolidAuth.cjs.js +1 -1
  189. package/dist/lib/auth/SolidAuth.cjs.js.map +1 -1
  190. package/dist/lib/auth/SolidAuth.d.ts.map +1 -1
  191. package/dist/lib/auth/SolidAuth.esm.js +15 -16
  192. package/dist/lib/auth/SolidAuth.esm.js.map +1 -1
  193. package/dist/lib/components/decorators.cjs.js.map +1 -1
  194. package/dist/lib/components/decorators.esm.js.map +1 -1
  195. package/dist/lib/components/dialog-component/DialogComponent.cjs.js +2 -0
  196. package/dist/lib/components/dialog-component/DialogComponent.cjs.js.map +1 -0
  197. package/dist/lib/components/dialog-component/DialogComponent.d.ts +10 -0
  198. package/dist/lib/components/dialog-component/DialogComponent.d.ts.map +1 -0
  199. package/dist/lib/components/dialog-component/DialogComponent.esm.js +203 -0
  200. package/dist/lib/components/dialog-component/DialogComponent.esm.js.map +1 -0
  201. package/dist/lib/components/dialog-component/index.cjs.js +1 -0
  202. package/dist/lib/components/dialog-component/index.d.ts +4 -0
  203. package/dist/lib/components/dialog-component/index.d.ts.map +1 -0
  204. package/dist/lib/components/dialog-component/index.esm.js +2 -0
  205. package/dist/lib/components/form-control-component/FormControlComponent.cjs.js +2 -0
  206. package/dist/lib/components/form-control-component/FormControlComponent.cjs.js.map +1 -0
  207. package/dist/lib/components/form-control-component/FormControlComponent.d.ts +15 -0
  208. package/dist/lib/components/form-control-component/FormControlComponent.d.ts.map +1 -0
  209. package/dist/lib/components/form-control-component/FormControlComponent.esm.js +271 -0
  210. package/dist/lib/components/form-control-component/FormControlComponent.esm.js.map +1 -0
  211. package/dist/lib/components/form-control-component/index.cjs.js +1 -0
  212. package/dist/lib/components/form-control-component/index.d.ts +4 -0
  213. package/dist/lib/components/form-control-component/index.d.ts.map +1 -0
  214. package/dist/lib/components/form-control-component/index.esm.js +2 -0
  215. package/dist/lib/components/ids.cjs.js.map +1 -1
  216. package/dist/lib/components/ids.esm.js.map +1 -1
  217. package/dist/lib/components/index.cjs.js +1 -1
  218. package/dist/lib/components/index.d.ts +3 -1
  219. package/dist/lib/components/index.d.ts.map +1 -1
  220. package/dist/lib/components/index.esm.js +8 -4
  221. package/dist/lib/components/traits/DialogTrait.cjs.js +1 -1
  222. package/dist/lib/components/traits/DialogTrait.cjs.js.map +1 -1
  223. package/dist/lib/components/traits/DialogTrait.d.ts +2 -1
  224. package/dist/lib/components/traits/DialogTrait.d.ts.map +1 -1
  225. package/dist/lib/components/traits/DialogTrait.esm.js +26 -6
  226. package/dist/lib/components/traits/DialogTrait.esm.js.map +1 -1
  227. package/dist/lib/components/traits/FormControlTrait.cjs.js +1 -1
  228. package/dist/lib/components/traits/FormControlTrait.cjs.js.map +1 -1
  229. package/dist/lib/components/traits/FormControlTrait.d.ts +4 -2
  230. package/dist/lib/components/traits/FormControlTrait.d.ts.map +1 -1
  231. package/dist/lib/components/traits/FormControlTrait.esm.js +28 -10
  232. package/dist/lib/components/traits/FormControlTrait.esm.js.map +1 -1
  233. package/dist/lib/components/web-component/WebComponent.cjs.js +1 -1
  234. package/dist/lib/components/web-component/WebComponent.cjs.js.map +1 -1
  235. package/dist/lib/components/web-component/WebComponent.d.ts +12 -1
  236. package/dist/lib/components/web-component/WebComponent.d.ts.map +1 -1
  237. package/dist/lib/components/web-component/WebComponent.esm.js +28 -6
  238. package/dist/lib/components/web-component/WebComponent.esm.js.map +1 -1
  239. package/dist/lib/components/web-component/WebComponent.styles.cjs.js +1 -1
  240. package/dist/lib/components/web-component/WebComponent.styles.esm.js +1 -1
  241. package/dist/lib/dialogs/Dialog.cjs.js +1 -1
  242. package/dist/lib/dialogs/Dialog.cjs.js.map +1 -1
  243. package/dist/lib/dialogs/Dialog.d.ts +4 -8
  244. package/dist/lib/dialogs/Dialog.d.ts.map +1 -1
  245. package/dist/lib/dialogs/Dialog.esm.js +1 -8
  246. package/dist/lib/dialogs/Dialog.esm.js.map +1 -1
  247. package/dist/lib/dialogs/helpers.cjs.js +1 -1
  248. package/dist/lib/dialogs/helpers.cjs.js.map +1 -1
  249. package/dist/lib/dialogs/helpers.d.ts +7 -2
  250. package/dist/lib/dialogs/helpers.d.ts.map +1 -1
  251. package/dist/lib/dialogs/helpers.esm.js +5 -3
  252. package/dist/lib/dialogs/helpers.esm.js.map +1 -1
  253. package/dist/loader.js +6 -8
  254. package/dist/solid-ui.js +130 -386
  255. package/dist/solid-ui.min.js +130 -386
  256. package/dist/solid-ui.min.js.map +1 -1
  257. package/dist/storybook/helpers.d.ts +2 -6
  258. package/dist/storybook/helpers.d.ts.map +1 -1
  259. package/package.json +1 -2
  260. package/dist/chunks/auth-ClVI18ss.js.map +0 -1
  261. package/dist/chunks/close-dialog-DfAh83bX.js +0 -14
  262. package/dist/chunks/close-dialog-DfAh83bX.js.map +0 -1
  263. package/dist/chunks/combobox-DrT0Nb-A.js.map +0 -1
  264. package/dist/chunks/components-PQfnwrHI.js +0 -107
  265. package/dist/chunks/components-PQfnwrHI.js.map +0 -1
  266. package/dist/chunks/context-B_xwK-Y_.js +0 -22
  267. package/dist/chunks/context-B_xwK-Y_.js.map +0 -1
  268. package/dist/chunks/decorators-BqWyWiL9.js +0 -50
  269. package/dist/chunks/decorators-BqWyWiL9.js.map +0 -1
  270. package/dist/chunks/dialog-kyHgc-uy.js.map +0 -1
  271. package/dist/chunks/dialogs-root-dPGfuzSZ.js.map +0 -1
  272. package/dist/chunks/input-BjCX2bFe.js.map +0 -1
  273. package/dist/chunks/photo-capture-DzK6wZF4.js +0 -624
  274. package/dist/chunks/photo-capture-DzK6wZF4.js.map +0 -1
  275. package/dist/chunks/select-OM-SgY4K.js.map +0 -1
  276. package/dist/v2/components/media/photoCapture/PhotoCapture.cjs.js +0 -281
  277. package/dist/v2/components/media/photoCapture/PhotoCapture.cjs.js.map +0 -1
  278. package/dist/v2/components/media/photoCapture/PhotoCapture.d.ts +0 -200
  279. package/dist/v2/components/media/photoCapture/PhotoCapture.d.ts.map +0 -1
  280. package/dist/v2/components/media/photoCapture/PhotoCapture.esm.js +0 -623
  281. package/dist/v2/components/media/photoCapture/PhotoCapture.esm.js.map +0 -1
  282. package/dist/v2/components/media/photoCapture/PhotoCapture.test.d.ts +0 -1
  283. package/dist/v2/components/media/photoCapture/PhotoCapture.test.d.ts.map +0 -1
  284. package/dist/v2/components/media/photoCapture/index.cjs.js +0 -2
  285. package/dist/v2/components/media/photoCapture/index.cjs.js.map +0 -1
  286. package/dist/v2/components/media/photoCapture/index.d.ts +0 -3
  287. package/dist/v2/components/media/photoCapture/index.d.ts.map +0 -1
  288. package/dist/v2/components/media/photoCapture/index.esm.js +0 -8
  289. package/dist/v2/components/media/photoCapture/index.esm.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"photo-capture-DzK6wZF4.js","names":["LitElement","css","html","nothing","DEFAULT_CAPTURE_FORMAT","PhotoCapture","formAssociated","properties","label","type","String","reflect","heading","captureLabel","attribute","confirmLabel","retakeLabel","cancelLabel","presentation","theme","facingMode","constraints","captureFormat","captureQuality","Number","open","Boolean","disabled","name","required","showTrigger","showCancelButton","autoCloseOnCapture","fileNamePrefix","value","mediaConstraints","_errorMessage","state","_previewUrl","_startingPreview","styles","_value","_stream","_internals","_associatedForm","_handleFormData","event","formData","append","_handleFormReset","_clearValue","emitEvents","_queuePreviewStart","_supportsFormInternals","setFormValue","constructor","undefined","attachInternals","nextValue","normalizedValue","File","previousValue","_syncPreviewFromValue","_syncFormValue","_syncValidity","requestUpdate","form","validationMessage","willValidate","checkValidity","reportValidity","connectedCallback","_syncAssociatedForm","disconnectedCallback","_stopStream","_revokePreviewUrl","formResetCallback","formDisabledCallback","updated","changed","dialog","shadowRoot","querySelector","showModal","close","has","video","srcObject","_setOpen","dispatchEvent","CustomEvent","detail","bubbles","composed","_emitError","error","message","nextForm","closest","removeEventListener","addEventListener","internals","setValidity","valueMissing","file","URL","createObjectURL","options","_dispatchValueEvents","_fileExtensionForMimeType","mimeType","_createFileFromBlob","blob","contentType","extension","safePrefix","trim","Date","now","_startPreview","catch","_resolveMediaConstraints","JSON","parse","Error","ideal","navigator","mediaDevices","getUserMedia","stream","getTracks","forEach","track","stop","updateComplete","play","revokeObjectURL","_captureSnapshot","width","videoWidth","clientWidth","height","videoHeight","clientHeight","canvas","document","createElement","context","getContext","drawImage","Promise","resolve","toBlob","_retakePhoto","_confirmPhoto","objectUrl","_handleCancel","_openCapture","_renderViewport","_renderStatus","_renderActions","_renderPanel","render","trigger","preventDefault","target","currentTarget","PhotoCapture","PHOTO_CAPTURE_TAG_NAME","customElements","get","define"],"sources":["../../src/v2/components/media/photoCapture/PhotoCapture.ts","../../src/v2/components/media/photoCapture/index.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","import { PhotoCapture } from './PhotoCapture'\n\nexport { PhotoCapture }\n\nconst PHOTO_CAPTURE_TAG_NAME = 'solid-ui-photo-capture'\n\nif (!customElements.get(PHOTO_CAPTURE_TAG_NAME)) {\n customElements.define(PHOTO_CAPTURE_TAG_NAME, PhotoCapture)\n}\n"],"mappings":";;AA6BA,IAAMI,IAAyB,aAElBC,IAAb,cAAkCL,EAAW;CAC3C,OAAOM,iBAAiB;CAExB,OAAOC,aAAa;EAClBC,OAAO;GAAEC,MAAMC;GAAQC,SAAS;EAAK;EACrCC,SAAS;GAAEH,MAAMC;GAAQC,SAAS;EAAK;EACvCE,cAAc;GAAEJ,MAAMC;GAAQI,WAAW;GAAiBH,SAAS;EAAK;EACxEI,cAAc;GAAEN,MAAMC;GAAQI,WAAW;GAAiBH,SAAS;EAAK;EACxEK,aAAa;GAAEP,MAAMC;GAAQI,WAAW;GAAgBH,SAAS;EAAK;EACtEM,aAAa;GAAER,MAAMC;GAAQI,WAAW;GAAgBH,SAAS;EAAK;EACtEO,cAAc;GAAET,MAAMC;GAAQC,SAAS;EAAK;EAC5CQ,OAAO;GAAEV,MAAMC;GAAQC,SAAS;EAAK;EACrCS,YAAY;GAAEX,MAAMC;GAAQI,WAAW;GAAeH,SAAS;EAAK;EACpEU,aAAa;GAAEZ,MAAMC;GAAQC,SAAS;EAAK;EAC3CW,eAAe;GAAEb,MAAMC;GAAQI,WAAW;GAAkBH,SAAS;EAAK;EAC1EY,gBAAgB;GAAEd,MAAMe;GAAQV,WAAW;EAAkB;EAC7DW,MAAM;GAAEhB,MAAMiB;GAASf,SAAS;EAAK;EACrCgB,UAAU;GAAElB,MAAMiB;GAASf,SAAS;EAAK;EACzCiB,MAAM;GAAEnB,MAAMC;GAAQC,SAAS;EAAK;EACpCkB,UAAU;GAAEpB,MAAMiB;GAASf,SAAS;EAAK;EACzCmB,aAAa;GAAErB,MAAMiB;GAASZ,WAAW;GAAgBH,SAAS;EAAK;EACvEoB,kBAAkB;GAAEtB,MAAMiB;GAASZ,WAAW;GAAsBH,SAAS;EAAK;EAClFqB,oBAAoB;GAAEvB,MAAMiB;GAASZ,WAAW;EAAwB;EACxEmB,gBAAgB;GAAExB,MAAMC;GAAQI,WAAW;GAAoBH,SAAS;EAAK;EAC7EuB,OAAO,EAAEpB,WAAW,GAAM;EAC1BqB,kBAAkB,EAAErB,WAAW,GAAM;EACrCsB,eAAe,EAAEC,OAAO,GAAK;EAC7BC,aAAa,EAAED,OAAO,GAAK;EAC3BE,kBAAkB,EAAEF,OAAO,GAAK;CAClC;CAEA,OAAOG,SAASvC,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmOXwC,SAAsB;CACtBC,UAA8B;CACrBC;CACTC,kBAA0C;CACjCC,mBAAmBC,MAAiB;EACnD,IAAMC,IAAYD,EAA0CC;EACxD,CAACA,KAAY,CAAC,KAAKnB,QAAQ,CAAC,KAAKM,SAAS,KAAKP,YACnDoB,EAASC,OAAO,KAAKpB,MAAM,KAAKM,OAAO,KAAKA,MAAMN,IAAI;CACxD;CAEiBqB,yBAAyB;EAExC,AADA,KAAKC,YAAY,EAAEC,YAAY,GAAM,CAAC,GAClC,KAAK1B,QACP,KAAK2B,mBAAmB;CAE5B;CAEA,IAAYC,yBAAmC;EAC7C,OAAO,CAAC,CAAC,KAAKV,cAAc,OAAO,KAAKA,WAAWW,gBAAiB;CACtE;CAEAC,cAAe;EA0Bb,AAzBA,MAAM,GACN,KAAK/C,QAAQ,cACb,KAAKI,UAAU,gBACf,KAAKC,eAAe,cACpB,KAAKE,eAAe,aACpB,KAAKC,cAAc,UACnB,KAAKC,cAAc,UACnB,KAAKC,eAAe,UACpB,KAAKC,QAAQ,SACb,KAAKC,aAAa,QAClB,KAAKC,cAAc,IACnB,KAAKC,gBAAgBlB,GACrB,KAAKmB,iBAAiBiC,KAAAA,GACtB,KAAK/B,OAAO,IACZ,KAAKE,WAAW,IAChB,KAAKC,OAAO,IACZ,KAAKC,WAAW,IAChB,KAAKC,cAAc,IACnB,KAAKC,mBAAmB,IACxB,KAAKC,qBAAqB,IAC1B,KAAKC,iBAAiB,IACtB,KAAKE,mBAAmBqB,KAAAA,GACxB,KAAKpB,gBAAgB,IACrB,KAAKE,cAAc,IACnB,KAAKC,mBAAmB,IACxB,KAAKI,aAAa,OAAO,KAAKc,mBAAoB,aAAa,KAAKA,gBAAgB,IAAI;CAC1F;CAEA,IAAIvB,QAAsB;EACxB,OAAO,KAAKO;CACd;CAEA,IAAIP,MAAOwB,GAAwB;EACjC,IAAMC,IAAkBD,aAAqBE,OAAOF,IAAY,MAC1DG,IAAgB,KAAKpB;EACvBoB,MAAkBF,MAEtB,KAAKlB,SAASkB,GACd,KAAKG,sBAAsBH,CAAe,GAC1C,KAAKI,eAAe,GACpB,KAAKC,cAAc,GACnB,KAAKC,cAAc,SAASJ,CAAa;CAC3C;CAEA,IAAIK,OAAgC;EAClC,QAAQ,KAAKb,yBAAyB,KAAKV,YAAYuB,OAAO,SAAS,KAAKtB;CAC9E;CAEA,IAAIuB,oBAA6B;EAC/B,QAAQ,OAAO,KAAKxB,YAAYwB,qBAAsB,WAAW,KAAKxB,WAAWwB,oBAAoB,QAAQ,KAAKtC,YAAY,CAAC,KAAKK,QAAQ,4BAA4B;CAC1K;CAEA,IAAIkC,eAAyB;EAC3B,OAAO,OAAO,KAAKzB,YAAYyB,gBAAiB,YAAY,KAAKzB,WAAWyB,eAAe,CAAC,KAAKzC;CACnG;CAEA0C,gBAA0B;EAIxB,OAHI,KAAK1B,cAAc,OAAO,KAAKA,WAAW0B,iBAAkB,aACvD,KAAK1B,WAAW0B,cAAc,IAEhC,EAAE,KAAKxC,YAAY,CAAC,KAAKK;CAClC;CAEAoC,iBAA2B;EAIzB,OAHI,KAAK3B,cAAc,OAAO,KAAKA,WAAW2B,kBAAmB,aACxD,KAAK3B,WAAW2B,eAAe,IAEjC,KAAKD,cAAc;CAC5B;CAEAE,oBAAqB;EAInB,AAHA,MAAMA,kBAAkB,GACxB,KAAKC,oBAAoB,GACzB,KAAKT,eAAe,GACpB,KAAKC,cAAc;CACrB;CAEAS,uBAAwB;EAItB,AAHA,KAAKD,oBAAoB,IAAI,GAC7B,KAAKE,YAAY,GACjB,KAAKC,kBAAkB,GACvB,MAAMF,qBAAqB;CAC7B;CAEAG,oBAAqB;EACnB,KAAK3B,iBAAiB;CACxB;CAEA4B,qBAAsBlD,GAAmB;EACvC,KAAKA,WAAWA;CAClB;CAEUmD,QAASC,GAA+B;EAGhD,IAFA,KAAKP,oBAAoB,GAErB,KAAKtD,iBAAiB,UAAU;GAClC,IAAM8D,IAAS,KAAKC,YAAYC,cAAc,QAAQ;GACtD,AAAIF,MACE,KAAKvD,QAAQ,CAACuD,EAAOvD,OACvBuD,EAAOG,UAAU,IACR,CAAC,KAAK1D,QAAQuD,EAAOvD,QAC9BuD,EAAOI,MAAM;EAGnB;EAwBA,IAtBIL,EAAQM,IAAI,MAAM,KAAK,CAAC,KAAK5D,QAC/B,KAAKiD,YAAY,GAIjB,KAAKjD,QACL,CAAC,KAAKS,SACN,CAAC,KAAKQ,WACN,CAAC,KAAKH,qBACLwC,EAAQM,IAAI,MAAM,KAAKN,EAAQM,IAAI,cAAc,KAAKN,EAAQM,IAAI,aAAa,KAAKN,EAAQM,IAAI,OAAO,MAExG,KAAKjC,mBAAmB,IAGtB2B,EAAQM,IAAI,MAAM,KAAKN,EAAQM,IAAI,UAAU,KAAKN,EAAQM,IAAI,OAAO,MACvE,KAAKtB,eAAe,IAGlBgB,EAAQM,IAAI,UAAU,KAAKN,EAAQM,IAAI,UAAU,KAAKN,EAAQM,IAAI,OAAO,MAC3E,KAAKrB,cAAc,GAGjB,KAAKtB,SAAS;GAChB,IAAM4C,IAAQ,KAAKL,YAAYC,cAAc,uBAAuB;GACpE,AAAII,KAASA,EAAMC,cAAc,KAAK7C,YACpC4C,EAAMC,YAAY,KAAK7C;EAE3B;CACF;CAEQ8C,SAAU/D,GAAe;EAC3B,KAAKA,SAASA,MAClB,KAAKA,OAAOA,GACZ,KAAKgE,cAAc,IAAIC,YAA0C,eAAe;GAC9EC,QAAQ,EAAElE,QAAK;GACfmE,SAAS;GACTC,UAAU;EACZ,CAAC,CAAC;CACJ;CAEQC,WAAYC,GAAgBC,IAAU,+BAA+B;EAE3E,AADA,KAAK5D,gBAAgB4D,GACrB,KAAKP,cAAc,IAAIC,YAAqC,SAAS;GACnEC,QAAQ;IAAEI;IAAOC;GAAQ;GACzBJ,SAAS;GACTC,UAAU;EACZ,CAAC,CAAC;CACJ;CAEQrB,oBAAqByB,IAAW,KAAKC,QAAQ,MAAM,GAA6B;EAClF,KAAKtD,oBAAoBqD,MAEzB,KAAKrD,oBACP,KAAKA,gBAAgBuD,oBAAoB,YAAY,KAAKtD,eAAe,GACzE,KAAKD,gBAAgBuD,oBAAoB,SAAS,KAAKlD,gBAAgB,IAGzE,KAAKL,kBAAkBqD,GAEnB,KAAKrD,mBAAmB,CAAC,KAAKS,2BAChC,KAAKT,gBAAgBwD,iBAAiB,YAAY,KAAKvD,eAAe,GACtE,KAAKD,gBAAgBwD,iBAAiB,SAAS,KAAKnD,gBAAgB;CAExE;CAEQc,iBAAkB;EACxB,IAAI,CAAC,KAAKV,wBAAwB;EAClC,IAAMgD,IAAY,KAAK1D;EAClB0D,OACL;OAAI,KAAK1E,YAAY,CAAC,KAAKC,QAAQ,CAAC,KAAKM,OAAO;IAC9CmE,EAAU/C,aAAa,IAAI;IAC3B;GACF;GACA+C,EAAU/C,aAAa,KAAKpB,KAAK;EADjC;CAEF;CAEQ8B,gBAAiB;EACnB,OAAC,KAAKrB,cAAc,CAAC,KAAKU,0BAA0B,OAAO,KAAKV,WAAW2D,eAAgB,aAC/F;OAAI,KAAK3E,YAAY,CAAC,KAAKE,YAAY,KAAKK,OAAO;IACjD,KAAKS,WAAW2D,YAAY,CAAC,CAAC;IAC9B;GACF;GACA,KAAK3D,WAAW2D,YAAY,EAAEC,cAAc,GAAK,GAAG,yBAAyB;EAD7E;CAEF;CAEQzC,sBAAuB0C,GAAmB;EAChD,KAAK7B,kBAAkB,GAClB6B,MACL,KAAK9B,YAAY,GACjB,KAAKpC,cAAcmE,IAAIC,gBAAgBF,CAAI;CAC7C;CAEQtD,YAAayD,GAAkC;EAGrD,AAFA,KAAKzE,QAAQ,MACb,KAAKE,gBAAgB,IACjBuE,EAAQxD,cACV,KAAKyD,qBAAqB;CAE9B;CAEQA,uBAAwB;EAC9B,IAAMjB,IAAS,EAAEzD,OAAO,KAAKA,MAAM;EAMnC,AALA,KAAKuD,cAAc,IAAIC,YAAqC,SAAS;GACnEC;GACAC,SAAS;GACTC,UAAU;EACZ,CAAC,CAAC,GACF,KAAKJ,cAAc,IAAIC,YAAqC,UAAU;GACpEC;GACAC,SAAS;GACTC,UAAU;EACZ,CAAC,CAAC;CACJ;CAEQgB,0BAA2BC,GAA0B;EAC3D,QAAQA,GAAR;GACE,KAAK,cACH,OAAO;GACT,KAAK,cACH,OAAO;GACT,KAAK,aACH,OAAO;GACT,SACE,OAAO;EACX;CACF;CAEQC,oBAAqBC,GAAkB;EAC7C,IAAMC,IAAcD,EAAKvG,QAAQ,KAAKa,iBAAiBlB,GACjD8G,IAAY,KAAKL,0BAA0BI,CAAW,GACtDE,KAAc,KAAKlF,kBAAkB,KAAKL,QAAQ,QAAA,CAASwF,KAAK,KAAK;EAC3E,OAAO,IAAIxD,KAAK,CAACoD,CAAI,GAAG,GAAGG,EAAU,GAAIE,KAAKC,IAAI,EAAC,GAAIJ,KAAa,EAAEzG,MAAMwG,EAAY,CAAC;CAC3F;CAEQ7D,qBAAsB;EAC5B,KAAKmE,cAAc,CAAC,CAACC,YAAYhE,KAAAA,CAAS;CAC5C;CAEQiE,2BAAoD;EAC1D,IAAI,KAAKtF,kBACP,OAAO,KAAKA;EAEd,IAAI,KAAKd,aACP,IAAI;GACF,OAAOqG,KAAKC,MAAM,KAAKtG,WAAW;EACpC,SAAS0E,GAAO;GACd,MAAU6B,MAAM,6BAA8B7B,EAAgBC,SAAS;EACzE;EAGF,OAAO,EACLV,OAAO,MAAKlE,cACR,EAAEA,YAAY,EAAEyG,OAAO,KAAKzG,WAAW,EAAE,EAE/C;CACF;CAEA,MAAcmG,gBAAiB;EACzB,OAAC,KAAK9F,QAAQ,KAAKS,SAAS,KAAKK,mBACrC;OAAI,CAACuF,UAAUC,cAAcC,cAAc;IACzC,KAAKlC,WAAW,gBAAI8B,MAAM,mDAAmD,GAAG,gDAAgD;IAChI;GACF;GAGA,AADA,KAAKrF,mBAAmB,IACxB,KAAKH,gBAAgB;GAErB,IAAI;IACF,IAAM6F,IAAS,MAAMH,UAAUC,aAAaC,aAAa,KAAKP,yBAAyB,CAAC;IACxF,IAAI,CAAC,KAAKhG,MAAM;KACdwG,EAAOC,UAAU,CAAC,CAACC,SAAQC,MAASA,EAAMC,KAAK,CAAC;KAChD;IACF;IAGA,AAFA,KAAK3F,UAAUuF,GACf,KAAKhE,cAAc,GACnB,MAAM,KAAKqE;IACX,IAAMhD,IAAQ,KAAKL,YAAYC,cAAc,uBAAuB;IACpE,AAAII,MACFA,EAAMC,YAAY0C,GAClB,MAAM3C,EAAMiD,OAAO,CAAC,CAACf,YAAYhE,KAAAA,CAAS;GAE9C,SAASuC,GAAO;IACd,KAAKD,WAAWC,GAAQA,GAAiBC,WAAW,oCAAoC;GAC1F,UAAU;IACR,KAAKzD,mBAAmB;GAC1B;EAvBA;CAwBF;CAEQmC,cAAe;EACrB,IAAI,CAAC,KAAKhC,SAAS;EAEnB,AADA,KAAKA,QAAQwF,UAAU,CAAC,CAACC,SAAQC,MAASA,EAAMC,KAAK,CAAC,GACtD,KAAK3F,UAAU;EACf,IAAM4C,IAAQ,KAAKL,YAAYC,cAAc,uBAAuB;EACpE,AAAII,MACFA,EAAMC,YAAY;CAEtB;CAEQZ,oBAAqB;EAI3B,AAHI,KAAKrC,eACPmE,IAAI+B,gBAAgB,KAAKlG,WAAW,GAEtC,KAAKA,cAAc;CACrB;CAEA,MAAcmG,mBAAoB;EAChC,IAAMnD,IAAQ,KAAKL,YAAYC,cAAc,uBAAuB;EACpE,IAAI,CAACI,GAAO;EAEZ,IAAMoD,IAAQpD,EAAMqD,cAAcrD,EAAMsD,eAAe,KACjDC,IAASvD,EAAMwD,eAAexD,EAAMyD,gBAAgB,KACpDC,IAASC,SAASC,cAAc,QAAQ;EAE9CF,AADAA,EAAON,QAAQA,GACfM,EAAOH,SAASA;EAEhB,IAAMM,IAAUH,EAAOI,WAAW,IAAI;EACtC,IAAI,CAACD,GAAS;GACZ,KAAKrD,WAAW,gBAAI8B,MAAM,+BAA+B,GAAG,2CAA2C;GACvG;EACF;EAEAuB,EAAQE,UAAU/D,GAAO,GAAG,GAAGoD,GAAOG,CAAM;EAE5C,IAAM7B,IAAO,MAAM,IAAIsC,SAAqBC,MAAW;GACrDP,EAAOQ,OAAOD,GAAS,KAAKjI,iBAAiBlB,GAAwB,KAAKmB,cAAc;EAC1F,CAAC;EAED,IAAI,CAACyF,GAAM;GACT,KAAKlB,WAAW,gBAAI8B,MAAM,wBAAwB,GAAG,yDAAyD;GAC9G;EACF;EAGA,AADA,KAAK1F,QAAQ,KAAK6E,oBAAoBC,CAAI,GAC1C,KAAK5E,gBAAgB;CACvB;CAEA,MAAcqH,eAAgB;EAE5B,AADA,KAAKvG,YAAY,EAAEC,YAAY,GAAK,CAAC,GACrC,MAAM,KAAKoE,cAAc;CAC3B;CAEQmC,gBAAiB;EACnB,CAAC,KAAKxH,SAAS,CAAC,KAAKI,gBAEzB,KAAKsE,qBAAqB,GAE1B,KAAKnB,cAAc,IAAIC,YAAiC,kBAAkB;GACxEC,QAAQ;IACNa,MAAM,KAAKtE;IACX8E,MAAM,KAAK9E;IACXyH,WAAW,KAAKrH;IAChB2E,aAAa,KAAK/E,MAAMzB,QAAQ,KAAKa,iBAAiBlB;GACxD;GACAwF,SAAS;GACTC,UAAU;EACZ,CAAC,CAAC,GAEE,KAAK7D,sBACP,KAAKwD,SAAS,EAAK;CAEvB;CAEQoE,gBAAiB;EAIvB,AAHA,KAAKlF,YAAY,GACjB,KAAKxB,YAAY,EAAEC,YAAY,GAAM,CAAC,GACtC,KAAKqC,SAAS,EAAK,GACnB,KAAKC,cAAc,IAAIC,YAAY,UAAU;GAC3CE,SAAS;GACTC,UAAU;EACZ,CAAC,CAAC;CACJ;CAEQgE,eAAgB;EAClB,KAAKlI,YACT,KAAK6D,SAAS,EAAI;CACpB;CAEQsE,kBAAmB;EAKzB,OAJI,KAAKxH,cACApC,CAAI,0DAA0D,KAAKoC,YAAW,qCAGhFpC,CAAI;CACb;CAEQ6J,gBAAiB;EAavB,OAZI,KAAK3H,gBACAlC,CAAI,kDAAkD,KAAKkC,cAAa,UAG7E,KAAKG,mBACArC,CAAI,oEAGR,KAAKgC,QAIHhC,CAAI,2FAHFA,CAAI;CAIf;CAEQ8J,iBAAkB;EACxB,OAAO9J,CAAI;;UAEL,KAAK6B,mBACH7B,CAAI;;;;;wBAKQ,KAAK0J,cAAa;eAC3B,KAAK3I,YAAW;cAEnBd,EAAO;;UAET,KAAK+B,QACHhC,CAAI;;;;;wBAKQ,KAAKuJ,aAAY;eAC1B,KAAKzI,YAAW;;;;;wBAKP,KAAK0I,cAAa;eAC3B,KAAK3I,aAAY;cAEpBb,CAAI;;;;;2BAKW,KAAKqC,oBAAoB,CAAC,KAAKG,QAAO;wBACzC,KAAK+F,iBAAgB;eAC9B,KAAK5H,aAAY;YACrB;;;CAGT;CAEQoJ,eAAgB;EACtB,OAAO/J,CAAI;;;0EAG2D,KAAKU,QAAO;YAC1E,KAAKmB,mBACH7B,CAAI;;;;;8BAKY,KAAKe,YAAW;0BACpB,KAAK2I,cAAa;;gBAG9BzJ,EAAO;;gDAE2B,KAAK2J,gBAAgB,EAAC;UAC5D,KAAKC,cAAc,EAAC;UACpB,KAAKC,eAAe,EAAC;;;CAG7B;CAEAE,SAAU;EAGR,OAAOhK,CAAI;QAFK,KAAK4B,eAAe,KAAKZ,iBAAiB,WAIpDhB,CAAI;;;;;yBAKW,KAAKyB,SAAQ;sBAChB,KAAKkI,aAAY;mBACpB,KAAKrJ,MAAK;YAEnBL,EAAO;;QAET,KAAKe,iBAAiB,WACpBhB,CAAI;;;;;0BAKY,KAAKU,QAAO;wBACdkC,MAAiB;GAA0B,AAAxBA,EAAMsH,eAAe,GAAG,KAAKR,cAAc;EAAE,EAAC;uBAClE9G,MAAsB;GAC/B,AAAIA,EAAMuH,WAAWvH,EAAMwH,iBACzB,KAAKV,cAAc;EAEvB,EAAC;;cAEC,KAAKnI,OAAO,KAAKwI,aAAa,IAAI9J,EAAO;;YAG7CD,CAAI;iEACmD,CAAC,KAAKuB,KAAI;cAC7D,KAAKA,OAAO,KAAKwI,aAAa,IAAI9J,EAAO;;UAE9C;;CAEP;AACF,GCpzBMqK,IAAyB;AAE1BC,eAAeC,IAAIF,CAAsB,KAC5CC,eAAeE,OAAOH,GAAwBD,CAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"select-OM-SgY4K.js","names":["isEmptyValue","value","undefined","customElement","WebComponent","html","nothing","property","query","state","isEmptyValue","FormControlTrait","styles","_classDecs","_Select","_Select2","_A","WeakMap","_B","_C","_D","_E","_F","_ref","_labelDecs","type","String","reflect","_nameDecs","_valueDecs","_requiredDecs","Boolean","_optionsDecs","Array","_inputElementDecs","_optionsDecs2","_Select3","Select","_classPrivateFieldGet","label","v","_classPrivateFieldSet","name","value","required","options","_options","querySelectorAll","from","map","option","textContent","inputElement","constructor","_classPrivateFieldInitSpec","_initProto","_init_label","_init_name","_init_value","_init_required","_init_inputElement","_init__options","_defineProperty","controlTrait","addTrait","getControlElement","getInternals","render","defaultOption","some","renderLabel","controlId","onChange","find","setValue","dispatchEvent","CustomEvent","bubbles","composed","detail","e","c","_initClass","_applyDecs","_Class","_identity","default","Select"],"sources":["../../src/lib/values.ts","../../src/components/select/Select.styles.css","../../src/components/select/Select.ts","../../src/components/select/index.ts"],"sourcesContent":["export function isEmptyValue (value: unknown): boolean {\n return value === null || value === undefined || value === ''\n}\n",":host {\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 5px;\n\n label {\n color: var(--solid-ui-color-gray-600);\n font-size: var(--solid-ui-font-size-sm);\n font-weight: 400;\n }\n\n .input-wrapper {\n position: relative;\n width: 100%;\n\n select {\n appearance: none;\n border: 1px solid var(--solid-ui-color-gray-400);\n border-radius: 5px;\n padding: 10px;\n padding-right: 40px;\n width: 100%;\n background: white;\n color: var(--solid-ui-color-gray-700);\n font-size: inherit;\n cursor: pointer;\n }\n\n icon-lucide-chevron-down {\n position: absolute;\n right: 15px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--solid-ui-color-gray-500);\n width: var(--solid-ui-font-size-lg);\n height: var(--solid-ui-font-size-lg);\n pointer-events: none;\n }\n }\n}\n","import { customElement, WebComponent } from '@/lib/components'\nimport { html, nothing } from 'lit'\nimport { property, query, state } from 'lit/decorators.js'\nimport { isEmptyValue } from '@/lib/values'\nimport FormControlTrait from '@/lib/components/traits/FormControlTrait'\nimport type SelectOption from '@/components/select-option/SelectOption'\n\nimport '~icons/lucide/chevron-down'\n\nimport styles from './Select.styles.css'\n\nexport type SelectOptionData = {\n value: unknown;\n label: string;\n}\n\nexport type SelectChangeEvent = CustomEvent<{ option: SelectOptionData }>\n\n@customElement('solid-ui-select')\nexport default class Select extends WebComponent {\n static styles = styles\n static formAssociated = true\n\n @property({ type: String, reflect: true })\n accessor label = '';\n\n @property({ type: String, reflect: true })\n accessor name = '';\n\n @property({ type: String })\n accessor value = '';\n\n @property({ type: Boolean, reflect: true })\n accessor required = false;\n\n @property({ type: Array })\n set options (value: SelectOptionData[] | null) {\n this._options = value\n }\n\n get options (): SelectOptionData[] {\n if (this._options) {\n return this._options\n }\n\n const options = this.querySelectorAll<SelectOption>(\n 'solid-ui-select-option'\n )\n\n return Array.from(options).map((option) => ({\n value: option.value,\n label: option.textContent,\n }))\n }\n\n @query('select')\n accessor inputElement: HTMLSelectElement | null = null;\n\n @state()\n private accessor _options: SelectOptionData[] | null = null\n\n private controlTrait: FormControlTrait\n\n constructor () {\n super()\n\n this.controlTrait = this.addTrait(new FormControlTrait(this, {\n getControlElement: () => this.inputElement,\n getInternals: () => this.getInternals(),\n }))\n }\n\n protected render () {\n const defaultOption = this.options.some(option => isEmptyValue(option.value))\n ? nothing\n : html`<option disabled value=\"\" ?selected=${!this.value}>Select an option</option>`\n\n return html`\n ${this.controlTrait.renderLabel()}\n\n <div class=\"input-wrapper\">\n <select\n id=\"${this.controlTrait.controlId}\"\n name=${this.name}\n ?required=${this.required}\n @change=${this.onChange}\n >\n ${defaultOption}\n ${this.options.map(\n (option) =>\n html`<option\n .value=${option.value}\n ?selected=${option.value === this.value}\n >\n ${option.label}\n </option>`\n )}\n </select>\n <icon-lucide-chevron-down></icon-lucide-chevron-down>\n </div>\n `\n }\n\n private onChange () {\n const value = this.inputElement?.value\n const option = this.options.find((option) => option.value === value)\n\n this.controlTrait.setValue(value)\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: { option } }))\n }\n}\n","import Select from './Select'\n\nexport * from './Select'\nexport { Select }\nexport default Select\n"],"mappings":"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"}
@@ -1,281 +0,0 @@
1
- let e=require("lit");var t=`image/png`,n=class extends e.LitElement{static formAssociated=!0;static properties={label:{type:String,reflect:!0},heading:{type:String,reflect:!0},captureLabel:{type:String,attribute:`capture-label`,reflect:!0},confirmLabel:{type:String,attribute:`confirm-label`,reflect:!0},retakeLabel:{type:String,attribute:`retake-label`,reflect:!0},cancelLabel:{type:String,attribute:`cancel-label`,reflect:!0},presentation:{type:String,reflect:!0},theme:{type:String,reflect:!0},facingMode:{type:String,attribute:`facing-mode`,reflect:!0},constraints:{type:String,reflect:!0},captureFormat:{type:String,attribute:`capture-format`,reflect:!0},captureQuality:{type:Number,attribute:`capture-quality`},open:{type:Boolean,reflect:!0},disabled:{type:Boolean,reflect:!0},name:{type:String,reflect:!0},required:{type:Boolean,reflect:!0},showTrigger:{type:Boolean,attribute:`show-trigger`,reflect:!0},showCancelButton:{type:Boolean,attribute:`show-cancel-button`,reflect:!0},autoCloseOnCapture:{type:Boolean,attribute:`auto-close-on-capture`},fileNamePrefix:{type:String,attribute:`file-name-prefix`,reflect:!0},value:{attribute:!1},mediaConstraints:{attribute:!1},_errorMessage:{state:!0},_previewUrl:{state:!0},_startingPreview:{state:!0}};static styles=e.css`
2
- :host {
3
- display: block;
4
- --photo-capture-trigger-background: var(--lavender-900, #7c4cff);
5
- --photo-capture-trigger-text: var(--color-header-text, #ffffff);
6
- --photo-capture-surface: var(--color-background, #ffffff);
7
- --photo-capture-text: var(--gray-900, #101828);
8
- --photo-capture-muted-text: var(--gray-600, #4a5565);
9
- --photo-capture-border: var(--gray-200, #e5e7eb);
10
- --photo-capture-hover: var(--gray-100, #f3f4f6);
11
- --photo-capture-shadow: var(--box-shadow-sm, 0 1px 4px rgba(0, 0, 0, 0.12));
12
- --photo-capture-overlay: rgba(0, 0, 0, 0.6);
13
- --photo-capture-frame-max-width: 260px;
14
- --photo-capture-radius: 8px;
15
- --photo-capture-button-radius: var(--border-radius-base, 0.3125rem);
16
- --photo-capture-gap: var(--spacing-2xs, 0.625rem);
17
- color: var(--photo-capture-text);
18
- box-sizing: border-box;
19
- }
20
-
21
- :host([theme='dark']) {
22
- --photo-capture-surface: var(--gray-900, #111827);
23
- --photo-capture-text: var(--white, #ffffff);
24
- --photo-capture-muted-text: var(--gray-300, #d1d5dc);
25
- --photo-capture-border: var(--gray-700, #364153);
26
- --photo-capture-hover: rgba(255, 255, 255, 0.08);
27
- --photo-capture-shadow: 0 10px 30px rgba(0, 0, 0, 0.35);
28
- }
29
-
30
- *, *::before, *::after {
31
- box-sizing: border-box;
32
- }
33
-
34
- .trigger-button,
35
- .action-button,
36
- .cancel-button,
37
- .close-button {
38
- font: inherit;
39
- cursor: pointer;
40
- }
41
-
42
- .trigger-button {
43
- display: inline-flex;
44
- align-items: center;
45
- justify-content: center;
46
- min-height: 35px;
47
- padding: 0.5rem 0.9rem;
48
- border: none;
49
- border-radius: var(--photo-capture-button-radius);
50
- background: var(--photo-capture-trigger-background);
51
- color: var(--photo-capture-trigger-text);
52
- transition: transform 0.2s ease;
53
- }
54
-
55
- .trigger-button:active {
56
- transform: translateY(1px);
57
- }
58
-
59
- .trigger-button:disabled,
60
- .action-button:disabled,
61
- .cancel-button:disabled {
62
- opacity: 0.55;
63
- cursor: not-allowed;
64
- }
65
-
66
- .inline-root[hidden] {
67
- display: none;
68
- }
69
-
70
- .dialog {
71
- border: none;
72
- padding: 0;
73
- background: transparent;
74
- outline: none;
75
- overflow: visible;
76
- max-width: none;
77
- max-height: none;
78
- }
79
-
80
- .dialog::backdrop {
81
- background: var(--photo-capture-overlay);
82
- }
83
-
84
- .panel {
85
- position: relative;
86
- display: flex;
87
- flex-direction: column;
88
- align-items: center;
89
- gap: var(--photo-capture-gap);
90
- width: min(100%, 340px);
91
- padding: 1rem;
92
- border: 1px solid var(--photo-capture-border);
93
- border-radius: var(--photo-capture-radius);
94
- background: var(--photo-capture-surface);
95
- color: var(--photo-capture-text);
96
- box-shadow: var(--photo-capture-shadow);
97
- }
98
-
99
- .panel-header {
100
- display: flex;
101
- align-items: center;
102
- justify-content: space-between;
103
- gap: 0.5rem;
104
- width: 100%;
105
- }
106
-
107
- .panel-heading {
108
- margin: 0;
109
- font-size: 1rem;
110
- font-weight: 700;
111
- line-height: 1.4;
112
- }
113
-
114
- .close-button {
115
- display: inline-flex;
116
- align-items: center;
117
- justify-content: center;
118
- width: 1.75rem;
119
- height: 1.75rem;
120
- padding: 0;
121
- border: none;
122
- border-radius: 999px;
123
- background: transparent;
124
- color: var(--photo-capture-muted-text);
125
- font-size: 1.125rem;
126
- line-height: 1;
127
- }
128
-
129
- .close-button:hover,
130
- .close-button:focus-visible,
131
- .action-button:hover,
132
- .action-button:focus-visible,
133
- .cancel-button:hover,
134
- .cancel-button:focus-visible {
135
- background: var(--photo-capture-hover);
136
- }
137
-
138
- .viewport {
139
- display: flex;
140
- align-items: center;
141
- justify-content: center;
142
- width: 100%;
143
- min-height: 200px;
144
- border-radius: 0.5rem;
145
- overflow: hidden;
146
- background: color-mix(in srgb, var(--photo-capture-surface) 92%, #000 8%);
147
- }
148
-
149
- .viewport video,
150
- .viewport img {
151
- display: block;
152
- width: 100%;
153
- max-width: var(--photo-capture-frame-max-width);
154
- height: auto;
155
- border-radius: 0.5rem;
156
- margin: 0 auto;
157
- object-fit: cover;
158
- }
159
-
160
- .status {
161
- width: 100%;
162
- text-align: center;
163
- color: var(--photo-capture-muted-text);
164
- font-size: 0.875rem;
165
- }
166
-
167
- .status.error {
168
- color: var(--color-error, #b00020);
169
- }
170
-
171
- .actions {
172
- display: flex;
173
- align-items: center;
174
- justify-content: center;
175
- flex-wrap: wrap;
176
- gap: var(--photo-capture-gap);
177
- width: 100%;
178
- }
179
-
180
- .action-button,
181
- .cancel-button {
182
- display: inline-flex;
183
- align-items: center;
184
- justify-content: center;
185
- min-height: 2.25rem;
186
- padding: 0.45rem 0.85rem;
187
- border-radius: var(--photo-capture-button-radius);
188
- border: 1px solid var(--photo-capture-border);
189
- background: var(--photo-capture-surface);
190
- color: var(--photo-capture-text);
191
- font-size: var(--font-size-xxs, 0.75rem);
192
- font-weight: var(--font-weight-xbold, 700);
193
- line-height: 1.5;
194
- }
195
-
196
- .action-button--primary {
197
- background: var(--photo-capture-trigger-background);
198
- color: var(--photo-capture-trigger-text);
199
- border-color: transparent;
200
- }
201
- `;_value=null;_stream=null;_internals;_associatedForm=null;_handleFormData=e=>{let t=e.formData;!t||!this.name||!this.value||this.disabled||t.append(this.name,this.value,this.value.name)};_handleFormReset=()=>{this._clearValue({emitEvents:!1}),this.open&&this._queuePreviewStart()};get _supportsFormInternals(){return!!this._internals&&typeof this._internals.setFormValue==`function`}constructor(){super(),this.label=`Take Photo`,this.heading=`Take a photo`,this.captureLabel=`Take Photo`,this.confirmLabel=`Use Photo`,this.retakeLabel=`Retake`,this.cancelLabel=`Cancel`,this.presentation=`inline`,this.theme=`light`,this.facingMode=`user`,this.constraints=``,this.captureFormat=t,this.captureQuality=void 0,this.open=!1,this.disabled=!1,this.name=``,this.required=!1,this.showTrigger=!1,this.showCancelButton=!0,this.autoCloseOnCapture=!1,this.fileNamePrefix=``,this.mediaConstraints=void 0,this._errorMessage=``,this._previewUrl=``,this._startingPreview=!1,this._internals=typeof this.attachInternals==`function`?this.attachInternals():null}get value(){return this._value}set value(e){let t=e instanceof File?e:null,n=this._value;n!==t&&(this._value=t,this._syncPreviewFromValue(t),this._syncFormValue(),this._syncValidity(),this.requestUpdate(`value`,n))}get form(){return(this._supportsFormInternals?this._internals?.form:null)??this._associatedForm}get validationMessage(){return(typeof this._internals?.validationMessage==`string`?this._internals.validationMessage:``)||(this.required&&!this.value?`Please capture a photo.`:``)}get willValidate(){return typeof this._internals?.willValidate==`boolean`?this._internals.willValidate:!this.disabled}checkValidity(){return this._internals&&typeof this._internals.checkValidity==`function`?this._internals.checkValidity():!(this.required&&!this.value)}reportValidity(){return this._internals&&typeof this._internals.reportValidity==`function`?this._internals.reportValidity():this.checkValidity()}connectedCallback(){super.connectedCallback(),this._syncAssociatedForm(),this._syncFormValue(),this._syncValidity()}disconnectedCallback(){this._syncAssociatedForm(null),this._stopStream(),this._revokePreviewUrl(),super.disconnectedCallback()}formResetCallback(){this._handleFormReset()}formDisabledCallback(e){this.disabled=e}updated(e){if(this._syncAssociatedForm(),this.presentation===`dialog`){let e=this.shadowRoot?.querySelector(`dialog`);e&&(this.open&&!e.open?e.showModal():!this.open&&e.open&&e.close())}if(e.has(`open`)&&!this.open&&this._stopStream(),this.open&&!this.value&&!this._stream&&!this._startingPreview&&(e.has(`open`)||e.has(`presentation`)||e.has(`_previewUrl`)||e.has(`value`))&&this._queuePreviewStart(),(e.has(`name`)||e.has(`disabled`)||e.has(`value`))&&this._syncFormValue(),(e.has(`required`)||e.has(`disabled`)||e.has(`value`))&&this._syncValidity(),this._stream){let e=this.shadowRoot?.querySelector(`video.capture-preview`);e&&e.srcObject!==this._stream&&(e.srcObject=this._stream)}}_setOpen(e){this.open!==e&&(this.open=e,this.dispatchEvent(new CustomEvent(`open-change`,{detail:{open:e},bubbles:!0,composed:!0})))}_emitError(e,t=`Unable to access the camera`){this._errorMessage=t,this.dispatchEvent(new CustomEvent(`error`,{detail:{error:e,message:t},bubbles:!0,composed:!0}))}_syncAssociatedForm(e=this.closest(`form`)){this._associatedForm!==e&&(this._associatedForm&&(this._associatedForm.removeEventListener(`formdata`,this._handleFormData),this._associatedForm.removeEventListener(`reset`,this._handleFormReset)),this._associatedForm=e,this._associatedForm&&!this._supportsFormInternals&&(this._associatedForm.addEventListener(`formdata`,this._handleFormData),this._associatedForm.addEventListener(`reset`,this._handleFormReset)))}_syncFormValue(){if(!this._supportsFormInternals)return;let e=this._internals;if(e){if(this.disabled||!this.name||!this.value){e.setFormValue(null);return}e.setFormValue(this.value)}}_syncValidity(){if(!(!this._internals||!this._supportsFormInternals||typeof this._internals.setValidity!=`function`)){if(this.disabled||!this.required||this.value){this._internals.setValidity({});return}this._internals.setValidity({valueMissing:!0},`Please capture a photo.`)}}_syncPreviewFromValue(e){this._revokePreviewUrl(),e&&(this._stopStream(),this._previewUrl=URL.createObjectURL(e))}_clearValue(e){this.value=null,this._errorMessage=``,e.emitEvents&&this._dispatchValueEvents()}_dispatchValueEvents(){let e={value:this.value};this.dispatchEvent(new CustomEvent(`input`,{detail:e,bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent(`change`,{detail:e,bubbles:!0,composed:!0}))}_fileExtensionForMimeType(e){switch(e){case`image/jpeg`:return`jpg`;case`image/webp`:return`webp`;case`image/gif`:return`gif`;default:return`png`}}_createFileFromBlob(e){let n=e.type||this.captureFormat||t,r=this._fileExtensionForMimeType(n),i=(this.fileNamePrefix||this.name||`photo`).trim()||`photo`;return new File([e],`${i}-${Date.now()}.${r}`,{type:n})}_queuePreviewStart(){this._startPreview().catch(()=>void 0)}_resolveMediaConstraints(){if(this.mediaConstraints)return this.mediaConstraints;if(this.constraints)try{return JSON.parse(this.constraints)}catch(e){throw Error(`Invalid constraints JSON: ${e.message}`)}return{video:!this.facingMode||{facingMode:{ideal:this.facingMode}}}}async _startPreview(){if(!(!this.open||this.value||this._startingPreview)){if(!navigator.mediaDevices?.getUserMedia){this._emitError(Error(`navigator.mediaDevices.getUserMedia not available`),`Camera access is not available in this browser`);return}this._startingPreview=!0,this._errorMessage=``;try{let e=await navigator.mediaDevices.getUserMedia(this._resolveMediaConstraints());if(!this.open){e.getTracks().forEach(e=>e.stop());return}this._stream=e,this.requestUpdate(),await this.updateComplete;let t=this.shadowRoot?.querySelector(`video.capture-preview`);t&&(t.srcObject=e,await t.play?.().catch(()=>void 0))}catch(e){this._emitError(e,e?.message||`Unable to start the camera preview`)}finally{this._startingPreview=!1}}}_stopStream(){if(!this._stream)return;this._stream.getTracks().forEach(e=>e.stop()),this._stream=null;let e=this.shadowRoot?.querySelector(`video.capture-preview`);e&&(e.srcObject=null)}_revokePreviewUrl(){this._previewUrl&&URL.revokeObjectURL(this._previewUrl),this._previewUrl=``}async _captureSnapshot(){let e=this.shadowRoot?.querySelector(`video.capture-preview`);if(!e)return;let n=e.videoWidth||e.clientWidth||640,r=e.videoHeight||e.clientHeight||480,i=document.createElement(`canvas`);i.width=n,i.height=r;let a=i.getContext(`2d`);if(!a){this._emitError(Error(`Canvas 2D context unavailable`),`Unable to capture a photo in this browser`);return}a.drawImage(e,0,0,n,r);let o=await new Promise(e=>{i.toBlob(e,this.captureFormat||t,this.captureQuality)});if(!o){this._emitError(Error(`Camera snapshot failed`),`Unable to create an image from the current camera frame`);return}this.value=this._createFileFromBlob(o),this._errorMessage=``}async _retakePhoto(){this._clearValue({emitEvents:!0}),await this._startPreview()}_confirmPhoto(){!this.value||!this._previewUrl||(this._dispatchValueEvents(),this.dispatchEvent(new CustomEvent(`photo-captured`,{detail:{file:this.value,blob:this.value,objectUrl:this._previewUrl,contentType:this.value.type||this.captureFormat||t},bubbles:!0,composed:!0})),this.autoCloseOnCapture&&this._setOpen(!1))}_handleCancel(){this._stopStream(),this._clearValue({emitEvents:!1}),this._setOpen(!1),this.dispatchEvent(new CustomEvent(`cancel`,{bubbles:!0,composed:!0}))}_openCapture(){this.disabled||this._setOpen(!0)}_renderViewport(){return this._previewUrl?e.html`<img class="capture-preview" part="preview-image" src="${this._previewUrl}" alt="Captured photo preview" />`:e.html`<video class="capture-preview" part="preview-video" autoplay playsinline muted></video>`}_renderStatus(){return this._errorMessage?e.html`<div class="status error" part="error-message">${this._errorMessage}</div>`:this._startingPreview?e.html`<div class="status" part="status-message">Opening camera…</div>`:this.value?e.html`<div class="status" part="status-message">Review the photo before confirming it.</div>`:e.html`<div class="status" part="status-message">Preview the camera and take a photo when ready.</div>`}_renderActions(){return e.html`
202
- <div class="actions" part="actions">
203
- ${this.showCancelButton?e.html`
204
- <button
205
- class="cancel-button"
206
- part="cancel-button"
207
- type="button"
208
- @click="${this._handleCancel}"
209
- >${this.cancelLabel}</button>
210
- `:e.nothing}
211
-
212
- ${this.value?e.html`
213
- <button
214
- class="action-button"
215
- part="retake-button"
216
- type="button"
217
- @click="${this._retakePhoto}"
218
- >${this.retakeLabel}</button>
219
- <button
220
- class="action-button action-button--primary"
221
- part="confirm-button"
222
- type="button"
223
- @click="${this._confirmPhoto}"
224
- >${this.confirmLabel}</button>
225
- `:e.html`
226
- <button
227
- class="action-button action-button--primary"
228
- part="capture-button"
229
- type="button"
230
- ?disabled="${this._startingPreview||!this._stream}"
231
- @click="${this._captureSnapshot}"
232
- >${this.captureLabel}</button>
233
- `}
234
- </div>
235
- `}_renderPanel(){return e.html`
236
- <div class="panel" part="panel">
237
- <div class="panel-header" part="header">
238
- <h2 class="panel-heading" part="heading"><slot name="heading">${this.heading}</slot></h2>
239
- ${this.showCancelButton?e.html`
240
- <button
241
- class="close-button"
242
- part="close-button"
243
- type="button"
244
- aria-label="${this.cancelLabel}"
245
- @click="${this._handleCancel}"
246
- >&times;</button>
247
- `:e.nothing}
248
- </div>
249
- <div class="viewport" part="viewport">${this._renderViewport()}</div>
250
- ${this._renderStatus()}
251
- ${this._renderActions()}
252
- </div>
253
- `}render(){return e.html`
254
- ${this.showTrigger||this.presentation===`dialog`?e.html`
255
- <button
256
- class="trigger-button"
257
- part="trigger-button"
258
- type="button"
259
- ?disabled="${this.disabled}"
260
- @click="${this._openCapture}"
261
- ><slot>${this.label}</slot></button>
262
- `:e.nothing}
263
-
264
- ${this.presentation===`dialog`?e.html`
265
- <dialog
266
- class="dialog"
267
- part="dialog"
268
- aria-modal="true"
269
- aria-label="${this.heading}"
270
- @cancel="${e=>{e.preventDefault(),this._handleCancel()}}"
271
- @click="${e=>{e.target===e.currentTarget&&this._handleCancel()}}"
272
- >
273
- ${this.open?this._renderPanel():e.nothing}
274
- </dialog>
275
- `:e.html`
276
- <div class="inline-root" part="inline-root" ?hidden="${!this.open}">
277
- ${this.open?this._renderPanel():e.nothing}
278
- </div>
279
- `}
280
- `}};exports.PhotoCapture=n;
281
- //# sourceMappingURL=PhotoCapture.cjs.js.map
@@ -1 +0,0 @@
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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"}