@wix/patterns-fields 1.87.0 → 1.89.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/dist/cjs/components/address/input/address-input.st.css.js +3 -3
  2. package/dist/cjs/components/address/input/address-input.st.css.js.map +1 -1
  3. package/dist/cjs/components/audio/actions/actions-menu/actions-menu.st.css.js +3 -3
  4. package/dist/cjs/components/audio/actions/actions-menu/actions-menu.st.css.js.map +1 -1
  5. package/dist/cjs/components/audio/audio-field/controlled-audio.uni.driver.js +29 -0
  6. package/dist/cjs/components/audio/audio-field/controlled-audio.uni.driver.js.map +1 -0
  7. package/dist/cjs/components/audio/audio-field/form-audio-field.js +42 -12
  8. package/dist/cjs/components/audio/audio-field/form-audio-field.js.map +1 -1
  9. package/dist/cjs/components/audio/audio-field/form-audio-field.st.css.js +4 -4
  10. package/dist/cjs/components/audio/audio-field/form-audio-field.st.css.js.map +1 -1
  11. package/dist/cjs/components/audio/audio-player/audio-player.st.css.js +2 -2
  12. package/dist/cjs/components/audio/audio-player/audio-player.st.css.js.map +1 -1
  13. package/dist/cjs/components/color-view/cell-color-view.st.css.js +3 -3
  14. package/dist/cjs/components/color-view/cell-color-view.st.css.js.map +1 -1
  15. package/dist/cjs/components/color-view/color-view.st.css.js +4 -4
  16. package/dist/cjs/components/color-view/color-view.st.css.js.map +1 -1
  17. package/dist/cjs/components/controlled-input.uni.driver.js +7 -1
  18. package/dist/cjs/components/controlled-input.uni.driver.js.map +1 -1
  19. package/dist/cjs/components/delete-dialog/delete-dialog.st.css.js +3 -3
  20. package/dist/cjs/components/delete-dialog/delete-dialog.st.css.js.map +1 -1
  21. package/dist/cjs/components/document/form-document-field.st.css.js +7 -7
  22. package/dist/cjs/components/document/form-document-field.st.css.js.map +1 -1
  23. package/dist/cjs/components/exclamation/exclamation.st.css.js +5 -5
  24. package/dist/cjs/components/exclamation/exclamation.st.css.js.map +1 -1
  25. package/dist/cjs/components/field-validation-settings/field-validation-settings-input.js +44 -42
  26. package/dist/cjs/components/field-validation-settings/field-validation-settings-input.js.map +1 -1
  27. package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js +5 -5
  28. package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js.map +1 -1
  29. package/dist/cjs/components/image/controlled-image.uni.driver.js +23 -0
  30. package/dist/cjs/components/image/controlled-image.uni.driver.js.map +1 -0
  31. package/dist/cjs/components/image/form-image-field.js +124 -0
  32. package/dist/cjs/components/image/form-image-field.js.map +1 -0
  33. package/dist/cjs/components/image/form-image-input.js +13 -50
  34. package/dist/cjs/components/image/form-image-input.js.map +1 -1
  35. package/dist/cjs/components/image/index.js +6 -0
  36. package/dist/cjs/components/image/index.js.map +1 -1
  37. package/dist/cjs/components/image/thumbnail-replace-overlay.st.css.js +3 -3
  38. package/dist/cjs/components/image/thumbnail-replace-overlay.st.css.js.map +1 -1
  39. package/dist/cjs/components/media-control/cell-media-edit-shell.st.css.js +2 -2
  40. package/dist/cjs/components/media-control/cell-media-edit-shell.st.css.js.map +1 -1
  41. package/dist/cjs/components/media-control/paste-url-button.st.css.js +4 -4
  42. package/dist/cjs/components/media-control/paste-url-button.st.css.js.map +1 -1
  43. package/dist/cjs/components/media-control/use-media-control.js +4 -1
  44. package/dist/cjs/components/media-control/use-media-control.js.map +1 -1
  45. package/dist/cjs/components/media-gallery/cell-media-gallery-edit.js +33 -28
  46. package/dist/cjs/components/media-gallery/cell-media-gallery-edit.js.map +1 -1
  47. package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.js +10 -10
  48. package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.js.map +1 -1
  49. package/dist/cjs/components/media-image/media-image.st.css.js +4 -4
  50. package/dist/cjs/components/media-image/media-image.st.css.js.map +1 -1
  51. package/dist/cjs/components/media-image/overlays/overlay.st.css.js +3 -3
  52. package/dist/cjs/components/media-image/overlays/overlay.st.css.js.map +1 -1
  53. package/dist/cjs/components/media-loader/media-loader.st.css.js +3 -3
  54. package/dist/cjs/components/media-loader/media-loader.st.css.js.map +1 -1
  55. package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
  56. package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js.map +1 -1
  57. package/dist/cjs/components/multi-document/cell-multi-document-edit.js +1 -1
  58. package/dist/cjs/components/multi-document/cell-multi-document-edit.js.map +1 -1
  59. package/dist/cjs/components/multi-document/cell-multi-document-edit.st.css.js +3 -3
  60. package/dist/cjs/components/multi-document/cell-multi-document-edit.st.css.js.map +1 -1
  61. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js +5 -5
  62. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js.map +1 -1
  63. package/dist/cjs/components/reference/cell-multi-reference-input.st.css.js +2 -2
  64. package/dist/cjs/components/reference/cell-multi-reference-input.st.css.js.map +1 -1
  65. package/dist/cjs/components/reference/cell-reference-input.st.css.js +3 -3
  66. package/dist/cjs/components/reference/cell-reference-input.st.css.js.map +1 -1
  67. package/dist/cjs/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +4 -4
  68. package/dist/cjs/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js.map +1 -1
  69. package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +3 -3
  70. package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js.map +1 -1
  71. package/dist/cjs/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
  72. package/dist/cjs/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js.map +1 -1
  73. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +3 -3
  74. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js.map +1 -1
  75. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +3 -3
  76. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js.map +1 -1
  77. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
  78. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js.map +1 -1
  79. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +7 -7
  80. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js.map +1 -1
  81. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +5 -5
  82. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js.map +1 -1
  83. package/dist/cjs/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +4 -4
  84. package/dist/cjs/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js.map +1 -1
  85. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +18 -18
  86. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js.map +1 -1
  87. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +4 -4
  88. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js.map +1 -1
  89. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +18 -18
  90. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js.map +1 -1
  91. package/dist/cjs/components/text/text-view.st.css.js +3 -3
  92. package/dist/cjs/components/text/text-view.st.css.js.map +1 -1
  93. package/dist/cjs/components/video/controlled-video.uni.driver.js +40 -0
  94. package/dist/cjs/components/video/controlled-video.uni.driver.js.map +1 -0
  95. package/dist/cjs/components/video/form-video-field.js +358 -0
  96. package/dist/cjs/components/video/form-video-field.js.map +1 -0
  97. package/dist/cjs/components/video/form-video.js +22 -284
  98. package/dist/cjs/components/video/form-video.js.map +1 -1
  99. package/dist/cjs/components/video/index.js +4 -1
  100. package/dist/cjs/components/video/index.js.map +1 -1
  101. package/dist/cjs/styles.global.css +1 -1
  102. package/dist/esm/components/address/input/address-input.st.css.js +2 -2
  103. package/dist/esm/components/audio/actions/actions-menu/actions-menu.st.css.js +2 -2
  104. package/dist/esm/components/audio/audio-field/controlled-audio.uni.driver.js +26 -0
  105. package/dist/esm/components/audio/audio-field/controlled-audio.uni.driver.js.map +1 -0
  106. package/dist/esm/components/audio/audio-field/form-audio-field.js +6 -1
  107. package/dist/esm/components/audio/audio-field/form-audio-field.js.map +1 -1
  108. package/dist/esm/components/audio/audio-field/form-audio-field.st.css.js +2 -2
  109. package/dist/esm/components/audio/audio-player/audio-player.st.css.js +2 -2
  110. package/dist/esm/components/color-view/cell-color-view.st.css.js +2 -2
  111. package/dist/esm/components/color-view/color-view.st.css.js +2 -2
  112. package/dist/esm/components/controlled-input.uni.driver.js +6 -0
  113. package/dist/esm/components/controlled-input.uni.driver.js.map +1 -1
  114. package/dist/esm/components/delete-dialog/delete-dialog.st.css.js +2 -2
  115. package/dist/esm/components/document/form-document-field.st.css.js +2 -2
  116. package/dist/esm/components/exclamation/exclamation.st.css.js +2 -2
  117. package/dist/esm/components/field-validation-settings/field-validation-settings-input.js +14 -11
  118. package/dist/esm/components/field-validation-settings/field-validation-settings-input.js.map +1 -1
  119. package/dist/esm/components/highlighted-text/highlighted-text.st.css.js +3 -3
  120. package/dist/esm/components/image/controlled-image.uni.driver.js +19 -0
  121. package/dist/esm/components/image/controlled-image.uni.driver.js.map +1 -0
  122. package/dist/esm/components/image/form-image-field.js +48 -0
  123. package/dist/esm/components/image/form-image-field.js.map +1 -0
  124. package/dist/esm/components/image/form-image-input.js +11 -33
  125. package/dist/esm/components/image/form-image-input.js.map +1 -1
  126. package/dist/esm/components/image/index.js +1 -0
  127. package/dist/esm/components/image/index.js.map +1 -1
  128. package/dist/esm/components/image/thumbnail-replace-overlay.st.css.js +2 -2
  129. package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js +2 -2
  130. package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js.map +1 -1
  131. package/dist/esm/components/media-control/paste-url-button.st.css.js +2 -2
  132. package/dist/esm/components/media-control/paste-url-button.st.css.js.map +1 -1
  133. package/dist/esm/components/media-control/use-media-control.js +4 -3
  134. package/dist/esm/components/media-control/use-media-control.js.map +1 -1
  135. package/dist/esm/components/media-gallery/cell-media-gallery-edit.js +12 -9
  136. package/dist/esm/components/media-gallery/cell-media-gallery-edit.js.map +1 -1
  137. package/dist/esm/components/media-gallery/form-media-gallery-field.st.css.js +2 -2
  138. package/dist/esm/components/media-image/media-image.st.css.js +3 -3
  139. package/dist/esm/components/media-image/media-image.st.css.js.map +1 -1
  140. package/dist/esm/components/media-image/overlays/overlay.st.css.js +2 -2
  141. package/dist/esm/components/media-loader/media-loader.st.css.js +2 -2
  142. package/dist/esm/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
  143. package/dist/esm/components/multi-document/cell-multi-document-edit.js +1 -1
  144. package/dist/esm/components/multi-document/cell-multi-document-edit.js.map +1 -1
  145. package/dist/esm/components/multi-document/cell-multi-document-edit.st.css.js +2 -2
  146. package/dist/esm/components/multi-document/cell-multi-document-edit.st.css.js.map +1 -1
  147. package/dist/esm/components/multi-document/multi-document-input/form-multi-document.st.css.js +2 -2
  148. package/dist/esm/components/reference/cell-multi-reference-input.st.css.js +2 -2
  149. package/dist/esm/components/reference/cell-multi-reference-input.st.css.js.map +1 -1
  150. package/dist/esm/components/reference/cell-reference-input.st.css.js +2 -2
  151. package/dist/esm/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +2 -2
  152. package/dist/esm/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +2 -2
  153. package/dist/esm/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js.map +1 -1
  154. package/dist/esm/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
  155. package/dist/esm/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js.map +1 -1
  156. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +2 -2
  157. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js.map +1 -1
  158. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +2 -2
  159. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js.map +1 -1
  160. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
  161. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js.map +1 -1
  162. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +2 -2
  163. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +2 -2
  164. package/dist/esm/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +2 -2
  165. package/dist/esm/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js.map +1 -1
  166. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +2 -2
  167. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js.map +1 -1
  168. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +2 -2
  169. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +2 -2
  170. package/dist/esm/components/text/text-view.st.css.js +2 -2
  171. package/dist/esm/components/video/controlled-video.uni.driver.js +37 -0
  172. package/dist/esm/components/video/controlled-video.uni.driver.js.map +1 -0
  173. package/dist/esm/components/video/form-video-field.js +71 -0
  174. package/dist/esm/components/video/form-video-field.js.map +1 -0
  175. package/dist/esm/components/video/form-video.js +17 -56
  176. package/dist/esm/components/video/form-video.js.map +1 -1
  177. package/dist/esm/components/video/index.js +1 -0
  178. package/dist/esm/components/video/index.js.map +1 -1
  179. package/dist/esm/styles.global.css +1 -1
  180. package/dist/types/components/audio/audio-field/controlled-audio.uni.driver.d.ts +18 -0
  181. package/dist/types/components/audio/audio-field/controlled-audio.uni.driver.d.ts.map +1 -0
  182. package/dist/types/components/audio/audio-field/form-audio-field.d.ts +12 -1
  183. package/dist/types/components/audio/audio-field/form-audio-field.d.ts.map +1 -1
  184. package/dist/types/components/controlled-input.uni.driver.d.ts +74 -0
  185. package/dist/types/components/controlled-input.uni.driver.d.ts.map +1 -1
  186. package/dist/types/components/field-validation-settings/field-validation-settings-input.d.ts +4 -2
  187. package/dist/types/components/field-validation-settings/field-validation-settings-input.d.ts.map +1 -1
  188. package/dist/types/components/image/controlled-image.uni.driver.d.ts +40 -0
  189. package/dist/types/components/image/controlled-image.uni.driver.d.ts.map +1 -0
  190. package/dist/types/components/image/form-image-field.d.ts +15 -0
  191. package/dist/types/components/image/form-image-field.d.ts.map +1 -0
  192. package/dist/types/components/image/form-image-input.d.ts.map +1 -1
  193. package/dist/types/components/image/index.d.ts +1 -0
  194. package/dist/types/components/image/index.d.ts.map +1 -1
  195. package/dist/types/components/media-control/cell-media-edit-shell.st.css.d.ts.map +1 -1
  196. package/dist/types/components/media-control/paste-url-button.st.css.d.ts.map +1 -1
  197. package/dist/types/components/media-control/use-media-control.d.ts.map +1 -1
  198. package/dist/types/components/media-gallery/cell-media-gallery-edit.d.ts.map +1 -1
  199. package/dist/types/components/media-image/media-image.st.css.d.ts.map +1 -1
  200. package/dist/types/components/multi-document/cell-multi-document-edit.st.css.d.ts.map +1 -1
  201. package/dist/types/components/reference/cell-multi-reference-input.st.css.d.ts.map +1 -1
  202. package/dist/types/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.d.ts.map +1 -1
  203. package/dist/types/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.d.ts.map +1 -1
  204. package/dist/types/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.d.ts.map +1 -1
  205. package/dist/types/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.d.ts.map +1 -1
  206. package/dist/types/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.d.ts.map +1 -1
  207. package/dist/types/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.d.ts.map +1 -1
  208. package/dist/types/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.d.ts.map +1 -1
  209. package/dist/types/components/video/controlled-video.uni.driver.d.ts +22 -0
  210. package/dist/types/components/video/controlled-video.uni.driver.d.ts.map +1 -0
  211. package/dist/types/components/video/form-video-field.d.ts +29 -0
  212. package/dist/types/components/video/form-video-field.d.ts.map +1 -0
  213. package/dist/types/components/video/form-video.d.ts.map +1 -1
  214. package/dist/types/components/video/index.d.ts +2 -0
  215. package/dist/types/components/video/index.d.ts.map +1 -1
  216. package/package.json +4 -4
  217. package/src/__tests__/components/field-validation-settings/field-validation-settings-input.spec.tsx +20 -1
  218. package/src/__tests__/exports/controlled-inputs.spec.tsx +677 -1
  219. package/src/components/address/input/address-input.st.css.ts +2 -2
  220. package/src/components/audio/actions/actions-menu/actions-menu.st.css.ts +2 -2
  221. package/src/components/audio/audio-field/controlled-audio.uni.driver.ts +35 -0
  222. package/src/components/audio/audio-field/form-audio-field.st.css.ts +2 -2
  223. package/src/components/audio/audio-field/form-audio-field.tsx +41 -1
  224. package/src/components/audio/audio-player/audio-player.st.css.ts +2 -2
  225. package/src/components/color-view/cell-color-view.st.css.ts +2 -2
  226. package/src/components/color-view/color-view.st.css.ts +2 -2
  227. package/src/components/controlled-input.uni.driver.ts +6 -0
  228. package/src/components/delete-dialog/delete-dialog.st.css.ts +2 -2
  229. package/src/components/document/form-document-field.st.css.ts +2 -2
  230. package/src/components/exclamation/exclamation.st.css.ts +2 -2
  231. package/src/components/field-validation-settings/field-validation-settings-input.tsx +22 -10
  232. package/src/components/highlighted-text/highlighted-text.st.css.ts +3 -3
  233. package/src/components/image/controlled-image.uni.driver.ts +30 -0
  234. package/src/components/image/form-image-field.tsx +124 -0
  235. package/src/components/image/form-image-input.tsx +13 -46
  236. package/src/components/image/index.ts +1 -0
  237. package/src/components/image/thumbnail-replace-overlay.st.css.ts +2 -2
  238. package/src/components/media-control/cell-media-edit-shell.st.css.ts +2 -2
  239. package/src/components/media-control/paste-url-button.st.css.ts +2 -2
  240. package/src/components/media-control/use-media-control.ts +4 -3
  241. package/src/components/media-gallery/cell-media-gallery-edit.tsx +14 -9
  242. package/src/components/media-gallery/form-media-gallery-field.st.css.ts +2 -2
  243. package/src/components/media-image/media-image.st.css.ts +3 -3
  244. package/src/components/media-image/overlays/overlay.st.css.ts +2 -2
  245. package/src/components/media-loader/media-loader.st.css.ts +2 -2
  246. package/src/components/media-tag/web-media-tag/media-tag.st.css.ts +2 -2
  247. package/src/components/multi-document/cell-multi-document-edit.st.css.ts +2 -2
  248. package/src/components/multi-document/cell-multi-document-edit.tsx +1 -1
  249. package/src/components/multi-document/multi-document-input/form-multi-document.st.css.ts +2 -2
  250. package/src/components/reference/cell-multi-reference-input.st.css.ts +2 -2
  251. package/src/components/reference/cell-reference-input.st.css.ts +2 -2
  252. package/src/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.ts +2 -2
  253. package/src/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.ts +2 -2
  254. package/src/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.ts +2 -2
  255. package/src/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.ts +2 -2
  256. package/src/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.ts +2 -2
  257. package/src/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.ts +2 -2
  258. package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.ts +2 -2
  259. package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.ts +2 -2
  260. package/src/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.ts +2 -2
  261. package/src/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.ts +2 -2
  262. package/src/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.ts +2 -2
  263. package/src/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.ts +2 -2
  264. package/src/components/text/text-view.st.css.ts +2 -2
  265. package/src/components/video/controlled-video.uni.driver.ts +48 -0
  266. package/src/components/video/form-video-field.tsx +268 -0
  267. package/src/components/video/form-video.tsx +21 -179
  268. package/src/components/video/index.ts +6 -0
  269. package/src/styles.global.css +1 -1
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../../stylable-esm-runtime.
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "richtexteditor2877563601";
8
+ var _namespace_ = "richtexteditor3399826991";
9
9
  var _style_ = classesRuntime.bind(null, _namespace_);
10
10
 
11
11
  export var cssStates = statesRuntime.bind(null, _namespace_);
@@ -13,7 +13,7 @@ export var style: import("@stylable/runtime").STFunction = _style_;
13
13
  export var st: import("@stylable/runtime").STFunction = _style_;
14
14
 
15
15
  export var namespace = _namespace_;
16
- export var classes = {"root":"richtexteditor2877563601__root","nativeInput":"richtexteditor2877563601__nativeInput","editor":"richtexteditor2877563601__editor"};
16
+ export var classes = {"root":"richtexteditor3399826991__root","nativeInput":"richtexteditor3399826991__nativeInput","editor":"richtexteditor3399826991__editor"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../../../stylable-esm-runti
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "toolbar3472368645";
8
+ var _namespace_ = "toolbar1543323063";
9
9
  var _style_ = classesRuntime.bind(null, _namespace_);
10
10
 
11
11
  export var cssStates = statesRuntime.bind(null, _namespace_);
@@ -13,7 +13,7 @@ export var style: import("@stylable/runtime").STFunction = _style_;
13
13
  export var st: import("@stylable/runtime").STFunction = _style_;
14
14
 
15
15
  export var namespace = _namespace_;
16
- export var classes = {"root":"toolbar3472368645__root","item":"toolbar3472368645__item","separator":"toolbar3472368645__separator","clearFormatting":"toolbar3472368645__clearFormatting","fullScreen":"toolbar3472368645__fullScreen","dropdownItemContent":"toolbar3472368645__dropdownItemContent","dropdownItemTitle":"toolbar3472368645__dropdownItemTitle","dropdownItemSubtitle":"toolbar3472368645__dropdownItemSubtitle","dropdownHeaderOne":"toolbar3472368645__dropdownHeaderOne","dropdownHeaderTwo":"toolbar3472368645__dropdownHeaderTwo","dropdownHeaderThree":"toolbar3472368645__dropdownHeaderThree","dropdownHeaderFour":"toolbar3472368645__dropdownHeaderFour","dropdownHeaderFive":"toolbar3472368645__dropdownHeaderFive","dropdownHeaderSix":"toolbar3472368645__dropdownHeaderSix","dropdownParagraphOne":"toolbar3472368645__dropdownParagraphOne","dropdownNormalText":"toolbar3472368645__dropdownNormalText","dropdownParagraphThree":"toolbar3472368645__dropdownParagraphThree"};
16
+ export var classes = {"root":"toolbar1543323063__root","item":"toolbar1543323063__item","separator":"toolbar1543323063__separator","clearFormatting":"toolbar1543323063__clearFormatting","fullScreen":"toolbar1543323063__fullScreen","dropdownItemContent":"toolbar1543323063__dropdownItemContent","dropdownItemTitle":"toolbar1543323063__dropdownItemTitle","dropdownItemSubtitle":"toolbar1543323063__dropdownItemSubtitle","dropdownHeaderOne":"toolbar1543323063__dropdownHeaderOne","dropdownHeaderTwo":"toolbar1543323063__dropdownHeaderTwo","dropdownHeaderThree":"toolbar1543323063__dropdownHeaderThree","dropdownHeaderFour":"toolbar1543323063__dropdownHeaderFour","dropdownHeaderFive":"toolbar1543323063__dropdownHeaderFive","dropdownHeaderSix":"toolbar1543323063__dropdownHeaderSix","dropdownParagraphOne":"toolbar1543323063__dropdownParagraphOne","dropdownNormalText":"toolbar1543323063__dropdownNormalText","dropdownParagraphThree":"toolbar1543323063__dropdownParagraphThree"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "textview2454520084";
8
+ var _namespace_ = "textview3643180884";
9
9
  var _style_ = classesRuntime.bind(null, _namespace_);
10
10
 
11
11
  export var cssStates = statesRuntime.bind(null, _namespace_);
@@ -13,7 +13,7 @@ export var style: import("@stylable/runtime").STFunction = _style_;
13
13
  export var st: import("@stylable/runtime").STFunction = _style_;
14
14
 
15
15
  export var namespace = _namespace_;
16
- export var classes = {"root":"textview2454520084__root","textView":"textview2454520084__textView"};
16
+ export var classes = {"root":"textview3643180884__root","textView":"textview3643180884__textView"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};
@@ -0,0 +1,48 @@
1
+ import { UniDriver } from '@wix/wix-ui-test-utils/unidriver';
2
+ import {
3
+ AddItemUniDriver,
4
+ ImageViewerUniDriver,
5
+ } from '@wix/design-system/dist/testkit/unidriver';
6
+
7
+ import { baseUniDriverFactory } from '../../testkit/base-driver';
8
+
9
+ export function ControlledVideoInputUniDriver(
10
+ base: UniDriver,
11
+ body: UniDriver,
12
+ ) {
13
+ // The dataHook sits on the ImageViewer in the empty state and on the
14
+ // MediaOverlay in the filled one, so `base` is either.
15
+ const imageViewer = ImageViewerUniDriver(base, body);
16
+ // `add-image` is ImageViewer's own hook for its empty-state AddItem.
17
+ const addItem = AddItemUniDriver(base.$('[data-hook="add-image"]'), body);
18
+ const addButton = base.$('[data-hook="add-image"] [data-hook="additem"]');
19
+ // Scoped to button / menuitem so a consumer dataHook that happens to end in
20
+ // one of these suffixes cannot match the root element instead.
21
+ const replaceButton = base.$('button[data-hook$="-replace"]');
22
+ const moreButton = base.$('button[data-hook$="-more"]');
23
+ const previewAction = body.$('[role="menuitem"][data-hook$="-preview"]');
24
+ const downloadAction = body.$('[role="menuitem"][data-hook$="-download"]');
25
+ const deleteAction = body.$('[role="menuitem"][data-hook$="-delete"]');
26
+
27
+ const isDisabled = async (element: UniDriver) =>
28
+ (await element.attr('disabled')) !== null ||
29
+ (await element.attr('aria-disabled')) === 'true';
30
+
31
+ return {
32
+ ...baseUniDriverFactory(base),
33
+ isAddItemVisible: () => imageViewer.isAddItemVisible(),
34
+ clickAddButton: () => imageViewer.clickAdd(),
35
+ isAddButtonFocused: () => addItem.isFocused(),
36
+ isAddButtonDisabled: () => isDisabled(addButton),
37
+ hasReplaceButton: () => replaceButton.exists(),
38
+ hasMoreButton: () => moreButton.exists(),
39
+ isReplaceDisabled: () => isDisabled(replaceButton),
40
+ clickReplace: () => replaceButton.click(),
41
+ clickMore: () => moreButton.click(),
42
+ clickPreview: () => previewAction.click(),
43
+ clickDownload: () => downloadAction.click(),
44
+ clickDelete: () => deleteAction.click(),
45
+ isDeleteDisabled: () => isDisabled(deleteAction),
46
+ getPreviewTitle: () => body.$('[data-hook="baseModalLayout-title"]').text(),
47
+ };
48
+ }
@@ -0,0 +1,268 @@
1
+ import type { FC } from 'react';
2
+ import React from 'react';
3
+ import {
4
+ Box,
5
+ CustomModalLayout,
6
+ IconButton,
7
+ Image,
8
+ ImageViewer,
9
+ MediaOverlay,
10
+ Modal,
11
+ PopoverMenu,
12
+ Tooltip,
13
+ } from '@wix/design-system';
14
+ import {
15
+ Delete,
16
+ Download,
17
+ Maximize,
18
+ More,
19
+ Replace,
20
+ } from '@wix/wix-ui-icons-common/lazy';
21
+ import { useIsMobile } from '@wix/bex-core/react';
22
+
23
+ import type { ControlledInputProps } from '../../types/controlled-input';
24
+ import { useMergedRef, useTranslations, useWithCallback } from '../../hooks';
25
+ import { MEDIA_HEIGHT, MEDIA_MAX_WIDTH } from '../../utils/media-constants';
26
+ import { MEDIA_TYPES } from '../../utils';
27
+ import type { FormMediaControlProps } from '../media-control';
28
+ import { useMediaControl } from '../media-control';
29
+
30
+ import { useVideoPreview } from './use-video-preview';
31
+
32
+ interface ImageViewerActions {
33
+ focus: () => void;
34
+ }
35
+
36
+ export interface VideoFieldDataHooks {
37
+ replace: string;
38
+ more: string;
39
+ preview: string;
40
+ download: string;
41
+ delete: string;
42
+ }
43
+
44
+ // `invalid` is not part of this contract. The empty state's ImageViewer has no
45
+ // error prop; it takes its error styling from the enclosing WDS FormField's
46
+ // status context. To show an error, render the field inside a FormField with
47
+ // status="error".
48
+ export interface FormVideoFieldProps
49
+ extends Omit<FormMediaControlProps, 'invalid'> {
50
+ /** Overrides for the action-button hooks, which otherwise derive from `dataHook`. */
51
+ dataHooks?: Partial<VideoFieldDataHooks>;
52
+ /** Title of the preview modal. Defaults to the translated "Preview". */
53
+ previewTitle?: string;
54
+ /**
55
+ * Fires when the media manager closes, whether or not a file was picked.
56
+ * A media field has no text control to blur, so the picker closing is its
57
+ * blur signal.
58
+ */
59
+ onBlur?: () => void;
60
+ }
61
+
62
+ export const FormVideoField: FC<FormVideoFieldProps> = ({
63
+ data,
64
+ onChange: onChangeVideo,
65
+ onClear: onClearVideo,
66
+ onInput,
67
+ onBlur,
68
+ readOnly,
69
+ autoFocus,
70
+ dataHook,
71
+ dataHooks,
72
+ previewTitle,
73
+ inputRef: forwardedRef,
74
+ }) => {
75
+ const { t } = useTranslations();
76
+ const isMobile = useIsMobile();
77
+
78
+ const onChange = useWithCallback(onChangeVideo, onInput);
79
+ const onClear = useWithCallback(onClearVideo, onInput);
80
+
81
+ const [inputRef, setInputRef] =
82
+ useMergedRef<ImageViewerActions>(forwardedRef);
83
+
84
+ const hooks: VideoFieldDataHooks = {
85
+ replace: dataHooks?.replace ?? `${dataHook}-replace`,
86
+ more: dataHooks?.more ?? `${dataHook}-more`,
87
+ preview: dataHooks?.preview ?? `${dataHook}-preview`,
88
+ download: dataHooks?.download ?? `${dataHook}-download`,
89
+ delete: dataHooks?.delete ?? `${dataHook}-delete`,
90
+ };
91
+
92
+ const { callMedia } = useMediaControl({
93
+ mediaType: MEDIA_TYPES.VIDEO,
94
+ value: data,
95
+ onChange,
96
+ autoFocus,
97
+ readOnly,
98
+ onBlur,
99
+ inputRef,
100
+ });
101
+
102
+ const {
103
+ videoUrl,
104
+ posterUrl: imageUrl,
105
+ isPreviewOpen,
106
+ openPreview: handlePreview,
107
+ closePreview: handleClosePreview,
108
+ handleDownload,
109
+ } = useVideoPreview({ videoUri: data });
110
+
111
+ const canEdit = !isMobile && !readOnly;
112
+
113
+ return (
114
+ <>
115
+ {data ? (
116
+ <Box width="100%" maxWidth={MEDIA_MAX_WIDTH} height={MEDIA_HEIGHT}>
117
+ <MediaOverlay
118
+ dataHook={dataHook}
119
+ hoverSkin="dark"
120
+ media={
121
+ <Image
122
+ src={imageUrl}
123
+ width="100%"
124
+ height={MEDIA_HEIGHT}
125
+ fit="cover"
126
+ />
127
+ }
128
+ >
129
+ <MediaOverlay.Content placement="middle" visible="hover">
130
+ <Box gap="SP2">
131
+ <Tooltip
132
+ content={t('auto-patterns.fields.replace_video_tooltip')}
133
+ >
134
+ <IconButton
135
+ onClick={callMedia}
136
+ skin="light"
137
+ priority="secondary"
138
+ disabled={!canEdit}
139
+ ariaLabel={t('auto-patterns.fields.replace_video_tooltip')}
140
+ dataHook={hooks.replace}
141
+ >
142
+ <Replace />
143
+ </IconButton>
144
+ </Tooltip>
145
+ <PopoverMenu
146
+ triggerElement={({ toggle }) => (
147
+ <Tooltip
148
+ content={t('auto-patterns.fields.more_actions_tooltip')}
149
+ >
150
+ <IconButton
151
+ priority="secondary"
152
+ onClick={toggle}
153
+ skin="light"
154
+ ariaLabel={t(
155
+ 'auto-patterns.fields.more_actions_tooltip',
156
+ )}
157
+ dataHook={hooks.more}
158
+ >
159
+ <More />
160
+ </IconButton>
161
+ </Tooltip>
162
+ )}
163
+ >
164
+ <PopoverMenu.MenuItem
165
+ prefixIcon={<Maximize />}
166
+ text={t('auto-patterns.fields.preview_video')}
167
+ onClick={handlePreview}
168
+ disabled={!videoUrl}
169
+ dataHook={hooks.preview}
170
+ />
171
+ <PopoverMenu.MenuItem
172
+ prefixIcon={<Download />}
173
+ text={t('auto-patterns.fields.download_video')}
174
+ onClick={handleDownload}
175
+ dataHook={hooks.download}
176
+ />
177
+ <PopoverMenu.Divider />
178
+ <PopoverMenu.MenuItem
179
+ prefixIcon={<Delete />}
180
+ text={t('auto-patterns.fields.remove_video')}
181
+ onClick={onClear}
182
+ disabled={readOnly || !onClearVideo}
183
+ dataHook={hooks.delete}
184
+ />
185
+ </PopoverMenu>
186
+ </Box>
187
+ </MediaOverlay.Content>
188
+ </MediaOverlay>
189
+ </Box>
190
+ ) : (
191
+ <Box width="100%" maxWidth={MEDIA_MAX_WIDTH}>
192
+ <ImageViewer
193
+ // Only the empty state has a focusable control, so this is the
194
+ // only place inputRef can land.
195
+ ref={setInputRef}
196
+ dataHook={dataHook}
197
+ onAddImage={canEdit ? callMedia : undefined}
198
+ disabled={!canEdit}
199
+ addImageInfo={t('auto-patterns.fields.add_video_tooltip')}
200
+ height={MEDIA_HEIGHT}
201
+ width="100%"
202
+ />
203
+ </Box>
204
+ )}
205
+ {isPreviewOpen && (
206
+ <Modal isOpen={isPreviewOpen} onRequestClose={handleClosePreview}>
207
+ <CustomModalLayout
208
+ title={previewTitle ?? t('auto-patterns.fields.preview_video')}
209
+ onCloseButtonClick={handleClosePreview}
210
+ content={
211
+ <div
212
+ style={{
213
+ display: 'flex',
214
+ justifyContent: 'center',
215
+ padding: '24px',
216
+ }}
217
+ >
218
+ <video
219
+ controls
220
+ autoPlay
221
+ style={{ maxWidth: '100%', maxHeight: '70vh' }}
222
+ poster={imageUrl}
223
+ >
224
+ {videoUrl && <source src={videoUrl} type="video/mp4" />}
225
+ Your browser does not support the video tag.
226
+ </video>
227
+ </div>
228
+ }
229
+ />
230
+ </Modal>
231
+ )}
232
+ </>
233
+ );
234
+ };
235
+
236
+ FormVideoField.displayName = 'FormVideoField';
237
+
238
+ export type ControlledVideoInputProps = Omit<
239
+ ControlledInputProps<string | undefined>,
240
+ 'invalid'
241
+ > & {
242
+ /** Title of the preview modal. Defaults to the translated "Preview". */
243
+ previewTitle?: string;
244
+ };
245
+
246
+ export const ControlledVideoInput: FC<ControlledVideoInputProps> = ({
247
+ data,
248
+ onChange,
249
+ onBlur,
250
+ readOnly,
251
+ autoFocus,
252
+ dataHook,
253
+ previewTitle,
254
+ }) => (
255
+ <FormVideoField
256
+ data={data}
257
+ onChange={onChange}
258
+ // FormVideoField reports deletion through onClear, not onChange.
259
+ onClear={() => onChange(undefined)}
260
+ onBlur={onBlur}
261
+ readOnly={readOnly}
262
+ autoFocus={autoFocus}
263
+ dataHook={dataHook}
264
+ previewTitle={previewTitle}
265
+ />
266
+ );
267
+
268
+ ControlledVideoInput.displayName = 'ControlledVideoInput';
@@ -1,25 +1,7 @@
1
1
  import React from 'react';
2
- import {
3
- FormField,
4
- ImageViewer,
5
- Modal,
6
- CustomModalLayout,
7
- MediaOverlay,
8
- Box,
9
- Tooltip,
10
- IconButton,
11
- PopoverMenu,
12
- Image,
13
- } from '@wix/design-system';
14
- import {
15
- Replace,
16
- More,
17
- Download,
18
- Delete,
19
- Maximize,
20
- } from '@wix/wix-ui-icons-common/lazy';
2
+ import { FormField } from '@wix/design-system';
21
3
  import { observer } from 'mobx-react-lite';
22
- import { useIsMobile, useWixPatternsContainer } from '@wix/bex-core/react';
4
+ import { useWixPatternsContainer } from '@wix/bex-core/react';
23
5
  import { useController } from '@wix/bex-core/form';
24
6
  import { BaseInputProps } from '../../types/base-input';
25
7
  import { useFieldRef, useTranslations } from '../../hooks';
@@ -27,28 +9,15 @@ import { isEmpty } from '../../validations/string';
27
9
  import { isDataValidOrNotSet } from '../../validations/validations';
28
10
  import * as videoValidation from '../../validations/video';
29
11
  import { TypeMismatchExclamation } from '../exclamation/type-mismatch-exclamation';
30
- import { MEDIA_HEIGHT, MEDIA_MAX_WIDTH } from '../../utils/media-constants';
31
- import { useVideoPreview } from './use-video-preview';
32
-
33
- interface VideoMediaDescriptor {
34
- video?: string;
35
- }
36
-
37
- interface MediaManagerVideoItem {
38
- _id?: string;
39
- displayName?: string;
40
- mediaType?: string;
41
- media?: VideoMediaDescriptor;
42
- }
12
+ import { FormVideoField } from './form-video-field';
43
13
 
44
14
  export interface FormVideoProps extends BaseInputProps<string> {}
45
15
 
46
16
  const _FormVideo = (props: FormVideoProps) => {
47
17
  const { field, dataHook, formControl, data } = props;
48
18
 
49
- const { translate: pt, openMediaManager } = useWixPatternsContainer();
19
+ const { translate: pt } = useWixPatternsContainer();
50
20
  const { t } = useTranslations();
51
- const isMobile = useIsMobile();
52
21
 
53
22
  const controller = useController({
54
23
  name: field?.id ?? '',
@@ -66,35 +35,6 @@ const _FormVideo = (props: FormVideoProps) => {
66
35
 
67
36
  const setFieldRef = useFieldRef(controller.field.ref);
68
37
 
69
- async function openMedia() {
70
- if (!openMediaManager) return;
71
- try {
72
- const chosenMediaItems = await openMediaManager({
73
- multiSelect: false,
74
- category: 'VIDEO',
75
- });
76
-
77
- const mediaItem = chosenMediaItems?.items?.[0] as
78
- | MediaManagerVideoItem
79
- | undefined;
80
- const newVideo = mediaItem?.media?.video;
81
- if (newVideo) {
82
- controller.field.onChange(newVideo);
83
- }
84
- } catch (error) {
85
- console.error('Error opening Media Manager or no files selected:', error);
86
- }
87
- }
88
-
89
- const {
90
- videoUrl,
91
- posterUrl: imageUrl,
92
- isPreviewOpen,
93
- openPreview: handlePreview,
94
- closePreview: handleClosePreview,
95
- handleDownload,
96
- } = useVideoPreview({ videoUri: controller.field.value });
97
-
98
38
  return (
99
39
  <FormField
100
40
  label={field.displayName}
@@ -127,121 +67,23 @@ const _FormVideo = (props: FormVideoProps) => {
127
67
  )
128
68
  }
129
69
  >
130
- {controller.field.value ? (
131
- <Box width="100%" maxWidth={MEDIA_MAX_WIDTH} height={MEDIA_HEIGHT}>
132
- <MediaOverlay
133
- dataHook={`video-${field.id}`}
134
- hoverSkin="dark"
135
- media={
136
- <Image
137
- src={imageUrl}
138
- width="100%"
139
- height={MEDIA_HEIGHT}
140
- fit="cover"
141
- />
142
- }
143
- >
144
- <MediaOverlay.Content placement="middle" visible="hover">
145
- <Box gap="SP2">
146
- <Tooltip
147
- content={t('auto-patterns.fields.replace_video_tooltip')}
148
- >
149
- <IconButton
150
- onClick={() => openMedia()}
151
- skin="light"
152
- priority="secondary"
153
- disabled={isMobile}
154
- ariaLabel={t('auto-patterns.fields.replace_video_tooltip')}
155
- dataHook={`video-replace-${field.id}`}
156
- >
157
- <Replace />
158
- </IconButton>
159
- </Tooltip>
160
- <PopoverMenu
161
- triggerElement={({ toggle }) => (
162
- <Tooltip
163
- content={t('auto-patterns.fields.more_actions_tooltip')}
164
- >
165
- <IconButton
166
- priority="secondary"
167
- onClick={toggle}
168
- skin="light"
169
- ariaLabel={t(
170
- 'auto-patterns.fields.more_actions_tooltip',
171
- )}
172
- dataHook={`video-more-${field.id}`}
173
- >
174
- <More />
175
- </IconButton>
176
- </Tooltip>
177
- )}
178
- >
179
- <PopoverMenu.MenuItem
180
- prefixIcon={<Maximize />}
181
- text={t('auto-patterns.fields.preview_video')}
182
- onClick={handlePreview}
183
- disabled={!videoUrl}
184
- dataHook={`video-preview-${field.id}`}
185
- />
186
- <PopoverMenu.MenuItem
187
- prefixIcon={<Download />}
188
- text={t('auto-patterns.fields.download_video')}
189
- onClick={handleDownload}
190
- dataHook={`video-download-${field.id}`}
191
- />
192
- <PopoverMenu.Divider />
193
- <PopoverMenu.MenuItem
194
- prefixIcon={<Delete />}
195
- text={t('auto-patterns.fields.remove_video')}
196
- onClick={() => controller.field.onChange(null)}
197
- dataHook={`video-delete-${field.id}`}
198
- />
199
- </PopoverMenu>
200
- </Box>
201
- </MediaOverlay.Content>
202
- </MediaOverlay>
203
- </Box>
204
- ) : (
205
- <Box width="100%" maxWidth={MEDIA_MAX_WIDTH}>
206
- <ImageViewer
207
- // Only the empty state can fail `required`, so the add button is
208
- // always the right target for react-hook-form's shouldFocusError.
209
- ref={setFieldRef}
210
- dataHook={`video-${field.id}`}
211
- onAddImage={isMobile ? undefined : () => openMedia()}
212
- addImageInfo={t('auto-patterns.fields.add_video_tooltip')}
213
- height={MEDIA_HEIGHT}
214
- width="100%"
215
- />
216
- </Box>
217
- )}
218
- {isPreviewOpen && (
219
- <Modal isOpen={isPreviewOpen} onRequestClose={handleClosePreview}>
220
- <CustomModalLayout
221
- title={field.displayName}
222
- onCloseButtonClick={handleClosePreview}
223
- content={
224
- <div
225
- style={{
226
- display: 'flex',
227
- justifyContent: 'center',
228
- padding: '24px',
229
- }}
230
- >
231
- <video
232
- controls
233
- autoPlay
234
- style={{ maxWidth: '100%', maxHeight: '70vh' }}
235
- poster={imageUrl}
236
- >
237
- {videoUrl && <source src={videoUrl} type="video/mp4" />}
238
- Your browser does not support the video tag.
239
- </video>
240
- </div>
241
- }
242
- />
243
- </Modal>
244
- )}
70
+ <FormVideoField
71
+ // Hands the add button to react-hook-form so shouldFocusError can
72
+ // reach this field when a required value blocks save.
73
+ inputRef={setFieldRef}
74
+ data={controller.field.value}
75
+ onChange={(value) => controller.field.onChange(value)}
76
+ onClear={() => controller.field.onChange(null)}
77
+ previewTitle={field.displayName}
78
+ dataHook={`video-${field.id}`}
79
+ dataHooks={{
80
+ replace: `video-replace-${field.id}`,
81
+ more: `video-more-${field.id}`,
82
+ preview: `video-preview-${field.id}`,
83
+ download: `video-download-${field.id}`,
84
+ delete: `video-delete-${field.id}`,
85
+ }}
86
+ />
245
87
  </FormField>
246
88
  );
247
89
  };
@@ -4,6 +4,12 @@ export { VideoViewField } from './video-view-field';
4
4
  export type { VideoViewFieldProps } from './video-view-field';
5
5
  export { CellVideoEdit } from './cell-video-edit';
6
6
  export type { CellVideoEditProps } from './cell-video-edit';
7
+ export { FormVideoField, ControlledVideoInput } from './form-video-field';
8
+ export type {
9
+ FormVideoFieldProps,
10
+ ControlledVideoInputProps,
11
+ VideoFieldDataHooks,
12
+ } from './form-video-field';
7
13
  export { FormVideo } from './form-video';
8
14
  export type { FormVideoProps } from './form-video';
9
15
  export { useVideoPreview } from './use-video-preview';