@wix/patterns-fields 1.72.0 → 1.73.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 (277) 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/address/input/form-address-input.js +5 -16
  4. package/dist/cjs/components/address/input/form-address-input.js.map +1 -1
  5. package/dist/cjs/components/audio/actions/actions-menu/actions-menu.st.css.js +3 -3
  6. package/dist/cjs/components/audio/actions/actions-menu/actions-menu.st.css.js.map +1 -1
  7. package/dist/cjs/components/audio/audio-field/form-audio-field.js +14 -13
  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-field/form-audio.js +6 -1
  12. package/dist/cjs/components/audio/audio-field/form-audio.js.map +1 -1
  13. package/dist/cjs/components/audio/audio-player/audio-player.st.css.js +2 -2
  14. package/dist/cjs/components/audio/audio-player/audio-player.st.css.js.map +1 -1
  15. package/dist/cjs/components/color-view/cell-color-view.st.css.js +3 -3
  16. package/dist/cjs/components/color-view/cell-color-view.st.css.js.map +1 -1
  17. package/dist/cjs/components/color-view/color-view.st.css.js +4 -4
  18. package/dist/cjs/components/color-view/color-view.st.css.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.js +7 -6
  22. package/dist/cjs/components/document/form-document-field.js.map +1 -1
  23. package/dist/cjs/components/document/form-document-field.st.css.js +7 -7
  24. package/dist/cjs/components/document/form-document-field.st.css.js.map +1 -1
  25. package/dist/cjs/components/document/form-document.js +6 -1
  26. package/dist/cjs/components/document/form-document.js.map +1 -1
  27. package/dist/cjs/components/exclamation/exclamation.st.css.js +5 -5
  28. package/dist/cjs/components/exclamation/exclamation.st.css.js.map +1 -1
  29. package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js +5 -5
  30. package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js.map +1 -1
  31. package/dist/cjs/components/image/form-image-input.js +6 -1
  32. package/dist/cjs/components/image/form-image-input.js.map +1 -1
  33. package/dist/cjs/components/image/thumbnail-replace-overlay.st.css.js +3 -3
  34. package/dist/cjs/components/image/thumbnail-replace-overlay.st.css.js.map +1 -1
  35. package/dist/cjs/components/media-control/cell-media-edit-shell.st.css.js +2 -2
  36. package/dist/cjs/components/media-control/cell-media-edit-shell.st.css.js.map +1 -1
  37. package/dist/cjs/components/media-control/paste-url-button.st.css.js +4 -4
  38. package/dist/cjs/components/media-control/paste-url-button.st.css.js.map +1 -1
  39. package/dist/cjs/components/media-gallery/form-media-gallery-field.js +24 -21
  40. package/dist/cjs/components/media-gallery/form-media-gallery-field.js.map +1 -1
  41. package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.js +10 -10
  42. package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.js.map +1 -1
  43. package/dist/cjs/components/media-gallery/form-media-gallery.js +6 -1
  44. package/dist/cjs/components/media-gallery/form-media-gallery.js.map +1 -1
  45. package/dist/cjs/components/media-image/media-image.st.css.js +4 -4
  46. package/dist/cjs/components/media-image/media-image.st.css.js.map +1 -1
  47. package/dist/cjs/components/media-image/overlays/overlay.st.css.js +3 -3
  48. package/dist/cjs/components/media-image/overlays/overlay.st.css.js.map +1 -1
  49. package/dist/cjs/components/media-loader/media-loader.st.css.js +3 -3
  50. package/dist/cjs/components/media-loader/media-loader.st.css.js.map +1 -1
  51. package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
  52. package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js.map +1 -1
  53. package/dist/cjs/components/multi-document/cell-multi-document-edit.st.css.js +3 -3
  54. package/dist/cjs/components/multi-document/cell-multi-document-edit.st.css.js.map +1 -1
  55. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document-field.js +7 -6
  56. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document-field.js.map +1 -1
  57. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.js +6 -1
  58. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.js.map +1 -1
  59. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js +5 -5
  60. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js.map +1 -1
  61. package/dist/cjs/components/reference/cell-multi-reference-input.st.css.js +2 -2
  62. package/dist/cjs/components/reference/cell-multi-reference-input.st.css.js.map +1 -1
  63. package/dist/cjs/components/reference/cell-reference-input.st.css.js +3 -3
  64. package/dist/cjs/components/reference/cell-reference-input.st.css.js.map +1 -1
  65. package/dist/cjs/components/rich-content/form-rich-content.js +20 -5
  66. package/dist/cjs/components/rich-content/form-rich-content.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/form-rich-text.js +18 -5
  86. package/dist/cjs/components/rich-text/form-rich-text.js.map +1 -1
  87. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +18 -18
  88. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js.map +1 -1
  89. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +4 -4
  90. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js.map +1 -1
  91. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +18 -18
  92. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js.map +1 -1
  93. package/dist/cjs/components/text/text-view.st.css.js +3 -3
  94. package/dist/cjs/components/text/text-view.st.css.js.map +1 -1
  95. package/dist/cjs/hooks/index.js +12 -0
  96. package/dist/cjs/hooks/index.js.map +1 -1
  97. package/dist/cjs/hooks/use-merged-ref.js +27 -0
  98. package/dist/cjs/hooks/use-merged-ref.js.map +1 -0
  99. package/dist/cjs/hooks/use-scroll-to-error-ref.js +34 -0
  100. package/dist/cjs/hooks/use-scroll-to-error-ref.js.map +1 -0
  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/address/input/address-input.st.css.js.map +1 -1
  104. package/dist/esm/components/address/input/form-address-input.js +4 -15
  105. package/dist/esm/components/address/input/form-address-input.js.map +1 -1
  106. package/dist/esm/components/audio/actions/actions-menu/actions-menu.st.css.js +2 -2
  107. package/dist/esm/components/audio/actions/actions-menu/actions-menu.st.css.js.map +1 -1
  108. package/dist/esm/components/audio/audio-field/form-audio-field.js +4 -4
  109. package/dist/esm/components/audio/audio-field/form-audio-field.js.map +1 -1
  110. package/dist/esm/components/audio/audio-field/form-audio-field.st.css.js +2 -2
  111. package/dist/esm/components/audio/audio-field/form-audio-field.st.css.js.map +1 -1
  112. package/dist/esm/components/audio/audio-field/form-audio.js +9 -1
  113. package/dist/esm/components/audio/audio-field/form-audio.js.map +1 -1
  114. package/dist/esm/components/audio/audio-player/audio-player.st.css.js +2 -2
  115. package/dist/esm/components/color-view/cell-color-view.st.css.js +2 -2
  116. package/dist/esm/components/color-view/color-view.st.css.js +2 -2
  117. package/dist/esm/components/delete-dialog/delete-dialog.st.css.js +2 -2
  118. package/dist/esm/components/delete-dialog/delete-dialog.st.css.js.map +1 -1
  119. package/dist/esm/components/document/form-document-field.js +4 -4
  120. package/dist/esm/components/document/form-document-field.js.map +1 -1
  121. package/dist/esm/components/document/form-document-field.st.css.js +2 -2
  122. package/dist/esm/components/document/form-document-field.st.css.js.map +1 -1
  123. package/dist/esm/components/document/form-document.js +9 -1
  124. package/dist/esm/components/document/form-document.js.map +1 -1
  125. package/dist/esm/components/exclamation/exclamation.st.css.js +2 -2
  126. package/dist/esm/components/highlighted-text/highlighted-text.st.css.js +3 -3
  127. package/dist/esm/components/highlighted-text/highlighted-text.st.css.js.map +1 -1
  128. package/dist/esm/components/image/form-image-input.js +9 -1
  129. package/dist/esm/components/image/form-image-input.js.map +1 -1
  130. package/dist/esm/components/image/thumbnail-replace-overlay.st.css.js +2 -2
  131. package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js +2 -2
  132. package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js.map +1 -1
  133. package/dist/esm/components/media-control/paste-url-button.st.css.js +2 -2
  134. package/dist/esm/components/media-control/paste-url-button.st.css.js.map +1 -1
  135. package/dist/esm/components/media-gallery/form-media-gallery-field.js +7 -5
  136. package/dist/esm/components/media-gallery/form-media-gallery-field.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-gallery/form-media-gallery.js +9 -1
  139. package/dist/esm/components/media-gallery/form-media-gallery.js.map +1 -1
  140. package/dist/esm/components/media-image/media-image.st.css.js +3 -3
  141. package/dist/esm/components/media-image/overlays/overlay.st.css.js +2 -2
  142. package/dist/esm/components/media-image/overlays/overlay.st.css.js.map +1 -1
  143. package/dist/esm/components/media-loader/media-loader.st.css.js +2 -2
  144. package/dist/esm/components/media-loader/media-loader.st.css.js.map +1 -1
  145. package/dist/esm/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
  146. package/dist/esm/components/multi-document/cell-multi-document-edit.st.css.js +2 -2
  147. package/dist/esm/components/multi-document/cell-multi-document-edit.st.css.js.map +1 -1
  148. package/dist/esm/components/multi-document/multi-document-input/form-multi-document-field.js +4 -4
  149. package/dist/esm/components/multi-document/multi-document-input/form-multi-document-field.js.map +1 -1
  150. package/dist/esm/components/multi-document/multi-document-input/form-multi-document.js +9 -1
  151. package/dist/esm/components/multi-document/multi-document-input/form-multi-document.js.map +1 -1
  152. package/dist/esm/components/multi-document/multi-document-input/form-multi-document.st.css.js +2 -2
  153. package/dist/esm/components/multi-document/multi-document-input/form-multi-document.st.css.js.map +1 -1
  154. package/dist/esm/components/reference/cell-multi-reference-input.st.css.js +2 -2
  155. package/dist/esm/components/reference/cell-reference-input.st.css.js +2 -2
  156. package/dist/esm/components/rich-content/form-rich-content.js +8 -3
  157. package/dist/esm/components/rich-content/form-rich-content.js.map +1 -1
  158. package/dist/esm/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +2 -2
  159. package/dist/esm/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +2 -2
  160. package/dist/esm/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js.map +1 -1
  161. package/dist/esm/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
  162. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +2 -2
  163. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +2 -2
  164. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
  165. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +2 -2
  166. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js.map +1 -1
  167. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +2 -2
  168. package/dist/esm/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +2 -2
  169. package/dist/esm/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js.map +1 -1
  170. package/dist/esm/components/rich-text/form-rich-text.js +7 -3
  171. package/dist/esm/components/rich-text/form-rich-text.js.map +1 -1
  172. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +2 -2
  173. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +2 -2
  174. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +2 -2
  175. package/dist/esm/components/text/text-view.st.css.js +2 -2
  176. package/dist/esm/components/text/text-view.st.css.js.map +1 -1
  177. package/dist/esm/hooks/index.js +2 -0
  178. package/dist/esm/hooks/index.js.map +1 -1
  179. package/dist/esm/hooks/use-merged-ref.js +23 -0
  180. package/dist/esm/hooks/use-merged-ref.js.map +1 -0
  181. package/dist/esm/hooks/use-scroll-to-error-ref.js +26 -0
  182. package/dist/esm/hooks/use-scroll-to-error-ref.js.map +1 -0
  183. package/dist/esm/styles.global.css +1 -1
  184. package/dist/types/components/address/input/address-input.st.css.d.ts.map +1 -1
  185. package/dist/types/components/address/input/form-address-input.d.ts.map +1 -1
  186. package/dist/types/components/audio/actions/actions-menu/actions-menu.st.css.d.ts.map +1 -1
  187. package/dist/types/components/audio/audio-field/form-audio-field.d.ts.map +1 -1
  188. package/dist/types/components/audio/audio-field/form-audio-field.st.css.d.ts.map +1 -1
  189. package/dist/types/components/audio/audio-field/form-audio.d.ts.map +1 -1
  190. package/dist/types/components/delete-dialog/delete-dialog.st.css.d.ts.map +1 -1
  191. package/dist/types/components/document/form-document-field.d.ts.map +1 -1
  192. package/dist/types/components/document/form-document-field.st.css.d.ts.map +1 -1
  193. package/dist/types/components/document/form-document.d.ts.map +1 -1
  194. package/dist/types/components/highlighted-text/highlighted-text.st.css.d.ts.map +1 -1
  195. package/dist/types/components/image/form-image-input.d.ts.map +1 -1
  196. package/dist/types/components/media-control/cell-media-edit-shell.st.css.d.ts.map +1 -1
  197. package/dist/types/components/media-control/paste-url-button.st.css.d.ts.map +1 -1
  198. package/dist/types/components/media-gallery/form-media-gallery-field.d.ts +3 -0
  199. package/dist/types/components/media-gallery/form-media-gallery-field.d.ts.map +1 -1
  200. package/dist/types/components/media-gallery/form-media-gallery.d.ts.map +1 -1
  201. package/dist/types/components/media-image/overlays/overlay.st.css.d.ts.map +1 -1
  202. package/dist/types/components/media-loader/media-loader.st.css.d.ts.map +1 -1
  203. package/dist/types/components/multi-document/cell-multi-document-edit.st.css.d.ts.map +1 -1
  204. package/dist/types/components/multi-document/multi-document-input/form-multi-document-field.d.ts.map +1 -1
  205. package/dist/types/components/multi-document/multi-document-input/form-multi-document.d.ts.map +1 -1
  206. package/dist/types/components/multi-document/multi-document-input/form-multi-document.st.css.d.ts.map +1 -1
  207. package/dist/types/components/rich-content/form-rich-content.d.ts.map +1 -1
  208. package/dist/types/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.d.ts.map +1 -1
  209. package/dist/types/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.d.ts.map +1 -1
  210. package/dist/types/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.d.ts.map +1 -1
  211. package/dist/types/components/rich-text/form-rich-text.d.ts.map +1 -1
  212. package/dist/types/components/text/text-view.st.css.d.ts.map +1 -1
  213. package/dist/types/hooks/index.d.ts +2 -0
  214. package/dist/types/hooks/index.d.ts.map +1 -1
  215. package/dist/types/hooks/use-merged-ref.d.ts +11 -0
  216. package/dist/types/hooks/use-merged-ref.d.ts.map +1 -0
  217. package/dist/types/hooks/use-scroll-to-error-ref.d.ts +14 -0
  218. package/dist/types/hooks/use-scroll-to-error-ref.d.ts.map +1 -0
  219. package/package.json +5 -5
  220. package/src/__tests__/components/audio/form-audio.spec.tsx +22 -0
  221. package/src/__tests__/components/document/form-document.spec.tsx +22 -0
  222. package/src/__tests__/components/image/form-image-input.spec.tsx +22 -0
  223. package/src/__tests__/components/media-gallery/form-media-gallery.spec.tsx +21 -0
  224. package/src/__tests__/components/multi-document/form-multi-document.spec.tsx +21 -0
  225. package/src/__tests__/components/rich-content/form-rich-content.spec.tsx +22 -0
  226. package/src/__tests__/components/rich-text/form-rich-text.spec.tsx +18 -0
  227. package/src/components/address/input/address-input.st.css.ts +2 -2
  228. package/src/components/address/input/form-address-input.tsx +5 -20
  229. package/src/components/audio/actions/actions-menu/actions-menu.st.css.ts +2 -2
  230. package/src/components/audio/audio-field/form-audio-field.st.css.ts +2 -2
  231. package/src/components/audio/audio-field/form-audio-field.tsx +4 -3
  232. package/src/components/audio/audio-field/form-audio.tsx +4 -0
  233. package/src/components/audio/audio-player/audio-player.st.css.ts +2 -2
  234. package/src/components/color-view/cell-color-view.st.css.ts +2 -2
  235. package/src/components/color-view/color-view.st.css.ts +2 -2
  236. package/src/components/delete-dialog/delete-dialog.st.css.ts +2 -2
  237. package/src/components/document/form-document-field.st.css.ts +2 -2
  238. package/src/components/document/form-document-field.tsx +4 -3
  239. package/src/components/document/form-document.tsx +4 -0
  240. package/src/components/exclamation/exclamation.st.css.ts +2 -2
  241. package/src/components/highlighted-text/highlighted-text.st.css.ts +3 -3
  242. package/src/components/image/form-image-input.tsx +4 -0
  243. package/src/components/image/thumbnail-replace-overlay.st.css.ts +2 -2
  244. package/src/components/media-control/cell-media-edit-shell.st.css.ts +2 -2
  245. package/src/components/media-control/paste-url-button.st.css.ts +2 -2
  246. package/src/components/media-gallery/form-media-gallery-field.st.css.ts +2 -2
  247. package/src/components/media-gallery/form-media-gallery-field.tsx +9 -4
  248. package/src/components/media-gallery/form-media-gallery.tsx +4 -0
  249. package/src/components/media-image/media-image.st.css.ts +3 -3
  250. package/src/components/media-image/overlays/overlay.st.css.ts +2 -2
  251. package/src/components/media-loader/media-loader.st.css.ts +2 -2
  252. package/src/components/media-tag/web-media-tag/media-tag.st.css.ts +2 -2
  253. package/src/components/multi-document/cell-multi-document-edit.st.css.ts +2 -2
  254. package/src/components/multi-document/multi-document-input/form-multi-document-field.tsx +4 -3
  255. package/src/components/multi-document/multi-document-input/form-multi-document.st.css.ts +2 -2
  256. package/src/components/multi-document/multi-document-input/form-multi-document.tsx +4 -0
  257. package/src/components/reference/cell-multi-reference-input.st.css.ts +2 -2
  258. package/src/components/reference/cell-reference-input.st.css.ts +2 -2
  259. package/src/components/rich-content/form-rich-content.tsx +24 -14
  260. package/src/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.ts +2 -2
  261. package/src/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.ts +2 -2
  262. package/src/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.ts +2 -2
  263. package/src/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.ts +2 -2
  264. package/src/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.ts +2 -2
  265. package/src/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.ts +2 -2
  266. package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.ts +2 -2
  267. package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.ts +2 -2
  268. package/src/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.ts +2 -2
  269. package/src/components/rich-text/form-rich-text.tsx +18 -9
  270. package/src/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.ts +2 -2
  271. package/src/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.ts +2 -2
  272. package/src/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.ts +2 -2
  273. package/src/components/text/text-view.st.css.ts +2 -2
  274. package/src/hooks/index.ts +2 -0
  275. package/src/hooks/use-merged-ref.ts +30 -0
  276. package/src/hooks/use-scroll-to-error-ref.ts +34 -0
  277. package/src/styles.global.css +1 -1
@@ -71,4 +71,25 @@ describe('FormMediaGallery field', () => {
71
71
 
72
72
  expect(await driver.tk.hasError()).toBe(false);
73
73
  });
74
+
75
+ // Only the empty state can fail `required`, so its add button is where
76
+ // react-hook-form should land. Nothing focuses a field whose input never
77
+ // reached controller.field.ref.
78
+ it('focuses the add button when a required value blocks submit', async () => {
79
+ const field = makeField({
80
+ type: 'MEDIA_GALLERY',
81
+ validation: { required: true },
82
+ });
83
+ const driver = setup({ field });
84
+
85
+ await driver.submit();
86
+
87
+ const active = document.activeElement;
88
+ expect(active?.tagName).toBe('BUTTON');
89
+ expect(
90
+ document
91
+ .querySelector(`[data-hook="media-gallery-field-${field.id}"]`)
92
+ ?.contains(active),
93
+ ).toBe(true);
94
+ });
74
95
  });
@@ -57,4 +57,25 @@ describe('FormMultiDocument field', () => {
57
57
  'cairo.fieldValidation.requiredField',
58
58
  );
59
59
  });
60
+
61
+ // Only the empty state can fail `required`, so its add button is where
62
+ // react-hook-form should land. Nothing focuses a field whose input never
63
+ // reached controller.field.ref.
64
+ it('focuses the add button when a required value blocks submit', async () => {
65
+ const field = makeField({
66
+ type: 'MULTI_DOCUMENT',
67
+ validation: { required: true },
68
+ });
69
+ const driver = setup({ field });
70
+
71
+ await driver.submit();
72
+
73
+ const active = document.activeElement;
74
+ expect(active?.tagName).toBe('BUTTON');
75
+ expect(
76
+ document
77
+ .querySelector(`[data-hook="multi-document-field-${field.id}"]`)
78
+ ?.contains(active),
79
+ ).toBe(true);
80
+ });
60
81
  });
@@ -77,4 +77,26 @@ describe('FormRichContent field', () => {
77
77
  'cairo.fieldValidation.requiredField',
78
78
  );
79
79
  });
80
+
81
+ // Ricos is lazy and renders no editable node here, so there is nothing to
82
+ // focus — the wrapper still has to bring the field into view. Without the
83
+ // ref registered, react-hook-form calls nothing at all.
84
+ it('brings the field into view when a required value blocks submit', async () => {
85
+ const scrollIntoView = jest.fn();
86
+ // Not implemented in jsdom.
87
+ Element.prototype.scrollIntoView = scrollIntoView;
88
+
89
+ const field = makeField({
90
+ type: 'RICH_CONTENT',
91
+ validation: { required: true },
92
+ });
93
+ const driver = setup({ field, initialValue: '' });
94
+
95
+ await driver.submit();
96
+
97
+ expect(scrollIntoView).toHaveBeenCalled();
98
+
99
+ delete (Element.prototype as Partial<Element>).scrollIntoView;
100
+ });
101
+
80
102
  });
@@ -76,4 +76,22 @@ describe('FormRichText field', () => {
76
76
  'cairo.fieldValidation.requiredField',
77
77
  );
78
78
  });
79
+
80
+ // The editor exposes no focus handle, so react-hook-form gets a wrapper
81
+ // whose focus() brings the field into view and then focuses the editor if
82
+ // it has rendered. Nothing happens at all when the ref is not registered.
83
+ it('focuses the editor when a required value blocks submit', async () => {
84
+ const field = makeField({
85
+ type: 'RICH_TEXT',
86
+ validation: { required: true },
87
+ });
88
+ const driver = setup({ field, initialValue: '' });
89
+
90
+ await driver.submit();
91
+
92
+ const editable = document.querySelector('[contenteditable]');
93
+ expect(editable).toBeTruthy();
94
+ expect(document.activeElement).toBe(editable);
95
+ });
96
+
79
97
  });
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../stylable-esm-runtime.js"
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "addressinput1990163582";
8
+ var _namespace_ = "addressinput249613619";
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":"addressinput1990163582__root","tableAddressInput":"addressinput1990163582__tableAddressInput"};
16
+ export var classes = {"root":"addressinput249613619__root","tableAddressInput":"addressinput249613619__tableAddressInput"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};
@@ -1,9 +1,9 @@
1
- import React, { useCallback, useRef } from 'react';
1
+ import React from 'react';
2
2
 
3
3
  import type { Address } from '../../../types/address';
4
4
  import type { FormInputProps } from '../../../types/form-input';
5
5
  import { Z_INDEX_MODAL_POPOVER } from '../../common';
6
- import { useAutoFocus } from '../../../hooks';
6
+ import { useAutoFocus, useMergedRef } from '../../../hooks';
7
7
 
8
8
  import type { AddressInputImperativeHandle } from './address-input';
9
9
  import { AddressInput } from './address-input';
@@ -25,28 +25,13 @@ export const FormAddressInput: React.FC<FormAddressInputProps> = ({
25
25
  dataHook,
26
26
  inputRef: forwardedRef,
27
27
  }) => {
28
- const inputRef = useRef<AddressInputImperativeHandle | null>(null);
28
+ const [inputRef, setInputRef] =
29
+ useMergedRef<AddressInputImperativeHandle>(forwardedRef);
29
30
  useAutoFocus(inputRef, autoFocus);
30
31
 
31
- // autoFocus reads the handle from here, so a caller's ref has to be filled
32
- // alongside it rather than replacing it.
33
- const setRef = useCallback(
34
- (handle: AddressInputImperativeHandle | null) => {
35
- inputRef.current = handle;
36
- if (typeof forwardedRef === 'function') {
37
- forwardedRef(handle);
38
- } else if (forwardedRef) {
39
- (
40
- forwardedRef as React.MutableRefObject<AddressInputImperativeHandle | null>
41
- ).current = handle;
42
- }
43
- },
44
- [forwardedRef],
45
- );
46
-
47
32
  return (
48
33
  <AddressInput
49
- ref={setRef}
34
+ ref={setInputRef}
50
35
  dataHook={dataHook}
51
36
  value={data}
52
37
  onChange={onChange}
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../../stylable-esm-runtime.
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "actionsmenu3350107513";
8
+ var _namespace_ = "actionsmenu101643419";
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":"actionsmenu3350107513__root","action":"actionsmenu3350107513__action"};
16
+ export var classes = {"root":"actionsmenu101643419__root","action":"actionsmenu101643419__action"};
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_ = "formaudiofield4179309703";
8
+ var _namespace_ = "formaudiofield606935778";
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":"formaudiofield4179309703__root","addItem":"formaudiofield4179309703__addItem","mediaTitle":"formaudiofield4179309703__mediaTitle"};
16
+ export var classes = {"root":"formaudiofield606935778__root","addItem":"formaudiofield606935778__addItem","mediaTitle":"formaudiofield606935778__mediaTitle"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};
@@ -5,7 +5,7 @@ import { getMediaURL } from '../../../auto-field-types';
5
5
  import type { AddItemActions } from '@wix/design-system';
6
6
  import { AddItem, AudioPlayer, Box, Text } from '@wix/design-system';
7
7
 
8
- import { useTranslations, useWithCallback } from '../../../hooks';
8
+ import { useMergedRef, useTranslations, useWithCallback } from '../../../hooks';
9
9
  import { getMediaTitle, MEDIA_TYPES } from '../../../utils';
10
10
 
11
11
  import { Z_INDEX_MODAL_POPOVER } from '../../common';
@@ -26,13 +26,14 @@ export const FormAudioField: FC<FormMediaControlProps> = ({
26
26
  readOnly,
27
27
  invalid,
28
28
  dataHook,
29
+ inputRef: forwardedRef,
29
30
  }) => {
30
31
  const { t } = useTranslations();
31
32
 
32
33
  const onChange = useWithCallback(onChangeAudio, onInput);
33
34
  const onClear = useWithCallback(onClearAudio, onInput);
34
35
 
35
- const inputRef = useRef<AddItemActions>(null);
36
+ const [inputRef, setInputRef] = useMergedRef<AddItemActions>(forwardedRef);
36
37
  const viewRef = useRef<HTMLDivElement>(null);
37
38
 
38
39
  const { callMedia, onMediaLoad, downloadMedia, loading } = useMediaControl({
@@ -91,7 +92,7 @@ export const FormAudioField: FC<FormMediaControlProps> = ({
91
92
  if (!data) {
92
93
  return (
93
94
  <AddItem
94
- ref={inputRef}
95
+ ref={setInputRef}
95
96
  dataHook={dataHook}
96
97
  className={style(classes.addItem, {
97
98
  disabled: !!readOnly,
@@ -39,6 +39,10 @@ const _FormAudio = (props: FormAudioProps) => {
39
39
  dataHook={dataHook}
40
40
  >
41
41
  <FormAudioField
42
+ // Hand the add button to react-hook-form so
43
+ // shouldFocusError scrolls to + focuses this field when it
44
+ // blocks save.
45
+ inputRef={controller.field.ref}
42
46
  data={controller.field.value}
43
47
  onChange={(value) => controller.field.onChange(value)}
44
48
  onClear={() => controller.field.onChange(null)}
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../stylable-esm-runtime.js"
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "audioplayer3525516735";
8
+ var _namespace_ = "audioplayer2613344239";
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":"audioplayer3525516735__root"};
16
+ export var classes = {"root":"audioplayer2613344239__root"};
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_ = "cellcolorview2573090781";
8
+ var _namespace_ = "cellcolorview1178629535";
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":"cellcolorview2573090781__root","hashPrefix":"cellcolorview2573090781__hashPrefix"};
16
+ export var classes = {"root":"cellcolorview1178629535__root","hashPrefix":"cellcolorview1178629535__hashPrefix"};
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_ = "colorview1092527435";
8
+ var _namespace_ = "colorview2624366234";
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":"colorview1092527435__root","view":"colorview1092527435__view","fillPreview":"colorview1092527435__fillPreview"};
16
+ export var classes = {"root":"colorview2624366234__root","view":"colorview2624366234__view","fillPreview":"colorview2624366234__fillPreview"};
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_ = "deletedialog557815988";
8
+ var _namespace_ = "deletedialog1579435053";
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":"deletedialog557815988__root","layout":"deletedialog557815988__layout"};
16
+ export var classes = {"root":"deletedialog1579435053__root","layout":"deletedialog1579435053__layout"};
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_ = "formdocumentfield22050767";
8
+ var _namespace_ = "formdocumentfield3894914095";
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":"formdocumentfield22050767__root","viewWrapper":"formdocumentfield22050767__viewWrapper","textWidth":"formdocumentfield22050767__textWidth","documentLoader":"formdocumentfield22050767__documentLoader","addDocument":"formdocumentfield22050767__addDocument","addItemWrapper":"formdocumentfield22050767__addItemWrapper"};
16
+ export var classes = {"root":"formdocumentfield3894914095__root","viewWrapper":"formdocumentfield3894914095__viewWrapper","textWidth":"formdocumentfield3894914095__textWidth","documentLoader":"formdocumentfield3894914095__documentLoader","addDocument":"formdocumentfield3894914095__addDocument","addItemWrapper":"formdocumentfield3894914095__addItemWrapper"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};
@@ -1,7 +1,7 @@
1
1
  import React, { useRef } from 'react';
2
2
 
3
3
  import { MEDIA_TYPES } from '../../utils/media-utils';
4
- import { useTranslations, useWithCallback } from '../../hooks';
4
+ import { useMergedRef, useTranslations, useWithCallback } from '../../hooks';
5
5
  import type { AddItemActions } from '@wix/design-system';
6
6
 
7
7
  import type { FormMediaControlProps } from '../media-control';
@@ -26,13 +26,14 @@ export const FormDocumentField: React.FC<FormMediaControlProps> = ({
26
26
  readOnly,
27
27
  invalid,
28
28
  dataHook,
29
+ inputRef: forwardedRef,
29
30
  }) => {
30
31
  const { t } = useTranslations();
31
32
 
32
33
  const onChange = useWithCallback(onChangeDocument, onInput);
33
34
  const onClear = useWithCallback(onClearDocument, onInput);
34
35
 
35
- const inputRef = useRef<AddItemActions>(null);
36
+ const [inputRef, setInputRef] = useMergedRef<AddItemActions>(forwardedRef);
36
37
  const viewRef = useRef<HTMLDivElement>(null);
37
38
 
38
39
  const { callMedia, loading, downloadMedia } = useMediaControl({
@@ -54,7 +55,7 @@ export const FormDocumentField: React.FC<FormMediaControlProps> = ({
54
55
  {!data ? (
55
56
  <FormDocumentInput
56
57
  dataHook={dataHook}
57
- ref={inputRef}
58
+ ref={setInputRef}
58
59
  theme="dashes"
59
60
  disabled={readOnly}
60
61
  loading={loading}
@@ -39,6 +39,10 @@ const _FormDocument = (props: FormDocumentProps) => {
39
39
  dataHook={dataHook}
40
40
  >
41
41
  <FormDocumentField
42
+ // Hand the add button to react-hook-form so
43
+ // shouldFocusError scrolls to + focuses this field when it
44
+ // blocks save.
45
+ inputRef={controller.field.ref}
42
46
  data={controller.field.value}
43
47
  onChange={(value) => controller.field.onChange(value)}
44
48
  onClear={() => controller.field.onChange(null)}
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "exclamation2447154459";
8
+ var _namespace_ = "exclamation2180886733";
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":"exclamation2447154459__root","exclamation":"exclamation2447154459__exclamation","actions":"exclamation2447154459__actions","action":"exclamation2447154459__action"};
16
+ export var classes = {"root":"exclamation2180886733__root","exclamation":"exclamation2180886733__exclamation","actions":"exclamation2180886733__actions","action":"exclamation2180886733__action"};
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_ = "highlightedtext950230055";
8
+ var _namespace_ = "highlightedtext3218260618";
9
9
  var _style_ = classesRuntime.bind(null, _namespace_);
10
10
 
11
11
  export var cssStates = statesRuntime.bind(null, _namespace_);
@@ -13,8 +13,8 @@ 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":"highlightedtext950230055__root","substring":"highlightedtext950230055__substring"};
17
- export var keyframes = {"highlighted":"highlightedtext950230055__highlighted","highlighted-match":"highlightedtext950230055__highlighted-match"};
16
+ export var classes = {"root":"highlightedtext3218260618__root","substring":"highlightedtext3218260618__substring"};
17
+ export var keyframes = {"highlighted":"highlightedtext3218260618__highlighted","highlighted-match":"highlightedtext3218260618__highlighted-match"};
18
18
  export var layers = {};
19
19
  export var containers = {};
20
20
  export var stVars = {};
@@ -63,6 +63,10 @@ const _FormImageInput = (props: FormImageInputProps) => {
63
63
  >
64
64
  <Box width="100%" maxWidth={MEDIA_MAX_WIDTH}>
65
65
  <ImageViewer
66
+ // ImageViewer keeps its focus node on whichever button is live, so
67
+ // one ref serves both the empty and filled states. Lets
68
+ // react-hook-form's shouldFocusError reach this field.
69
+ ref={controller.field.ref}
66
70
  imageUrl={imageUrl}
67
71
  dataHook={`image-${field.id}`}
68
72
  onAddImage={isMobile ? undefined : () => openMedia()}
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "thumbnailreplaceoverlay2586707932";
8
+ var _namespace_ = "thumbnailreplaceoverlay1250295104";
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":"thumbnailreplaceoverlay2586707932__root","icon":"thumbnailreplaceoverlay2586707932__icon"};
16
+ export var classes = {"root":"thumbnailreplaceoverlay1250295104__root","icon":"thumbnailreplaceoverlay1250295104__icon"};
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_ = "cellmediaeditshell2678045238";
8
+ var _namespace_ = "cellmediaeditshell222630220";
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":"cellmediaeditshell2678045238__root"};
16
+ export var classes = {"root":"cellmediaeditshell222630220__root"};
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_ = "pasteurlbutton2432712873";
8
+ var _namespace_ = "pasteurlbutton285657028";
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":"pasteurlbutton2432712873__root","iconButtonTooltip":"pasteurlbutton2432712873__iconButtonTooltip","iconButton":"pasteurlbutton2432712873__iconButton"};
16
+ export var classes = {"root":"pasteurlbutton285657028__root","iconButtonTooltip":"pasteurlbutton285657028__iconButtonTooltip","iconButton":"pasteurlbutton285657028__iconButton"};
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_ = "formmediagalleryfield1363730960";
8
+ var _namespace_ = "formmediagalleryfield2943984590";
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":"formmediagalleryfield1363730960__root","container":"formmediagalleryfield1363730960__container","viewBox":"formmediagalleryfield1363730960__viewBox","addItemWrapper":"formmediagalleryfield1363730960__addItemWrapper","addItem":"formmediagalleryfield1363730960__addItem","overlay":"formmediagalleryfield1363730960__overlay","image":"formmediagalleryfield1363730960__image","previewImage":"formmediagalleryfield1363730960__previewImage","previewVideo":"formmediagalleryfield1363730960__previewVideo"};
16
+ export var classes = {"root":"formmediagalleryfield2943984590__root","container":"formmediagalleryfield2943984590__container","viewBox":"formmediagalleryfield2943984590__viewBox","addItemWrapper":"formmediagalleryfield2943984590__addItemWrapper","addItem":"formmediagalleryfield2943984590__addItem","overlay":"formmediagalleryfield2943984590__overlay","image":"formmediagalleryfield2943984590__image","previewImage":"formmediagalleryfield2943984590__previewImage","previewVideo":"formmediagalleryfield2943984590__previewVideo"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};
@@ -14,7 +14,7 @@ import {
14
14
  Maximize as MaximizeIcon,
15
15
  } from '@wix/wix-ui-icons-common/lazy';
16
16
  import type { WixCodeGalleryItem } from '../../auto-field-types';
17
- import { useTranslations } from '../../hooks';
17
+ import { useMergedRef, useTranslations } from '../../hooks';
18
18
  import { executeDownloading } from '../../utils/media-utils';
19
19
  import { getMediaURL } from '../../auto-field-types';
20
20
  import { files } from '@wix/media';
@@ -33,6 +33,8 @@ export interface FormMediaGalleryFieldProps {
33
33
  invalid?: boolean;
34
34
  autoFocus?: boolean;
35
35
  dataHook?: string;
36
+ /** Caller's ref to the add button, filled alongside the internal one. */
37
+ inputRef?: React.Ref<AddItemActions>;
36
38
  }
37
39
 
38
40
  const mediaGalleryPreviewTextKeys = {
@@ -49,10 +51,11 @@ export const FormMediaGalleryField: React.FC<FormMediaGalleryFieldProps> = ({
49
51
  invalid,
50
52
  autoFocus,
51
53
  dataHook,
54
+ inputRef: forwardedRef,
52
55
  }) => {
53
56
  const { t } = useTranslations();
54
57
  const boxRef = useRef<HTMLDivElement>(null);
55
- const inputRef = useRef<AddItemActions>(null);
58
+ const [inputRef, setInputRef] = useMergedRef<AddItemActions>(forwardedRef);
56
59
  const [boxWidth, setBoxWidth] = useState(0);
57
60
  const [hovered, setHovered] = useState(false);
58
61
  const [isPreviewOpen, setIsPreviewOpen] = useState(false);
@@ -66,7 +69,9 @@ export const FormMediaGalleryField: React.FC<FormMediaGalleryFieldProps> = ({
66
69
  }
67
70
  boxRef.current?.focus();
68
71
  inputRef.current?.focus();
69
- }, [autoFocus]);
72
+ // inputRef comes from useMergedRef and is stable, but eslint only knows
73
+ // that about a bare useRef.
74
+ }, [autoFocus, inputRef]);
70
75
 
71
76
  // Responsive width tracking
72
77
  useEffect(() => {
@@ -137,7 +142,7 @@ export const FormMediaGalleryField: React.FC<FormMediaGalleryFieldProps> = ({
137
142
  {!hasValue ? (
138
143
  <div className={classes.addItemWrapper}>
139
144
  <AddItem
140
- ref={inputRef}
145
+ ref={setInputRef}
141
146
  className={style(classes.addItem, { error: invalid })}
142
147
  size="tiny"
143
148
  theme="dashes"
@@ -40,6 +40,10 @@ const _FormMediaGallery = (props: FormMediaGalleryProps) => {
40
40
  dataHook={dataHook}
41
41
  >
42
42
  <FormMediaGalleryField
43
+ // Hand the add button to react-hook-form so
44
+ // shouldFocusError scrolls to + focuses this field when it
45
+ // blocks save.
46
+ inputRef={controller.field.ref}
43
47
  data={controller.field.value}
44
48
  onChange={(value) => controller.field.onChange(value)}
45
49
  onClear={() => controller.field.onChange([])}
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "mediaimage3037602971";
8
+ var _namespace_ = "mediaimage1081502549";
9
9
  var _style_ = classesRuntime.bind(null, _namespace_);
10
10
 
11
11
  export var cssStates = statesRuntime.bind(null, _namespace_);
@@ -13,12 +13,12 @@ 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":"mediaimage3037602971__root"};
16
+ export var classes = {"root":"mediaimage1081502549__root"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};
20
20
  export var stVars = {};
21
- export var vars = {"wds-color-red-200":"--wds-color-red-200","wsr-color-R20":"--wsr-color-R20","wds-color-black-550":"--wds-color-black-550","wsr-color-D55":"--wsr-color-D55","from":"--mediaimage3037602971-from","to":"--mediaimage3037602971-to"};
21
+ export var vars = {"wds-color-red-200":"--wds-color-red-200","wsr-color-R20":"--wsr-color-R20","wds-color-black-550":"--wds-color-black-550","wsr-color-D55":"--wsr-color-D55","from":"--mediaimage1081502549-from","to":"--mediaimage1081502549-to"};
22
22
 
23
23
 
24
24
 
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../stylable-esm-runtime.js"
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "overlay726786880";
8
+ var _namespace_ = "overlay1338093693";
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":"overlay726786880__root","iconOverlay":"overlay726786880__iconOverlay"};
16
+ export var classes = {"root":"overlay1338093693__root","iconOverlay":"overlay1338093693__iconOverlay"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};