@wix/patterns-fields 1.108.0 → 1.110.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 (273) 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/form-audio-field.st.css.js +4 -4
  6. package/dist/cjs/components/audio/audio-field/form-audio-field.st.css.js.map +1 -1
  7. package/dist/cjs/components/audio/audio-player/audio-player.st.css.js +2 -2
  8. package/dist/cjs/components/audio/audio-player/audio-player.st.css.js.map +1 -1
  9. package/dist/cjs/components/boolean/cell-checkbox.js +15 -6
  10. package/dist/cjs/components/boolean/cell-checkbox.js.map +1 -1
  11. package/dist/cjs/components/color-view/cell-color-view.st.css.js +3 -3
  12. package/dist/cjs/components/color-view/cell-color-view.st.css.js.map +1 -1
  13. package/dist/cjs/components/color-view/color-view.st.css.js +4 -4
  14. package/dist/cjs/components/color-view/color-view.st.css.js.map +1 -1
  15. package/dist/cjs/components/date-input/cell-date-input.js +21 -2
  16. package/dist/cjs/components/date-input/cell-date-input.js.map +1 -1
  17. package/dist/cjs/components/date-input/date-picker-internals.js +93 -3
  18. package/dist/cjs/components/date-input/date-picker-internals.js.map +1 -1
  19. package/dist/cjs/components/date-input/form-date-input.driver.js +2 -0
  20. package/dist/cjs/components/date-input/form-date-input.driver.js.map +1 -1
  21. package/dist/cjs/components/date-input/form-date-input.js +23 -6
  22. package/dist/cjs/components/date-input/form-date-input.js.map +1 -1
  23. package/dist/cjs/components/date-input/use-field-value-replacement.js +48 -0
  24. package/dist/cjs/components/date-input/use-field-value-replacement.js.map +1 -0
  25. package/dist/cjs/components/datetime-input/form-date-time.driver.js +3 -0
  26. package/dist/cjs/components/datetime-input/form-date-time.driver.js.map +1 -1
  27. package/dist/cjs/components/datetime-input/form-date-time.js +61 -24
  28. package/dist/cjs/components/datetime-input/form-date-time.js.map +1 -1
  29. package/dist/cjs/components/delete-dialog/delete-dialog.st.css.js +3 -3
  30. package/dist/cjs/components/delete-dialog/delete-dialog.st.css.js.map +1 -1
  31. package/dist/cjs/components/document/form-document-field.st.css.js +7 -7
  32. package/dist/cjs/components/document/form-document-field.st.css.js.map +1 -1
  33. package/dist/cjs/components/exclamation/exclamation.st.css.js +5 -5
  34. package/dist/cjs/components/exclamation/exclamation.st.css.js.map +1 -1
  35. package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js +5 -5
  36. package/dist/cjs/components/highlighted-text/highlighted-text.st.css.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-gallery/form-media-gallery-field.st.css.js +10 -10
  44. package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.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-tag/web-media-tag/media-tag.st.css.js +2 -2
  50. package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js.map +1 -1
  51. package/dist/cjs/components/multi-document/cell-multi-document-edit.st.css.js +3 -3
  52. package/dist/cjs/components/multi-document/cell-multi-document-edit.st.css.js.map +1 -1
  53. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js +5 -5
  54. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js.map +1 -1
  55. package/dist/cjs/components/reference/cell-multi-reference-input.st.css.js +2 -2
  56. package/dist/cjs/components/reference/cell-multi-reference-input.st.css.js.map +1 -1
  57. package/dist/cjs/components/reference/cell-reference-input.st.css.js +3 -3
  58. package/dist/cjs/components/reference/cell-reference-input.st.css.js.map +1 -1
  59. package/dist/cjs/components/rich-content/cell-rich-content-input.js +12 -9
  60. package/dist/cjs/components/rich-content/cell-rich-content-input.js.map +1 -1
  61. package/dist/cjs/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +4 -4
  62. package/dist/cjs/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js.map +1 -1
  63. package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +3 -3
  64. package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js.map +1 -1
  65. package/dist/cjs/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
  66. 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
  67. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +3 -3
  68. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js.map +1 -1
  69. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +3 -3
  70. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js.map +1 -1
  71. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
  72. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js.map +1 -1
  73. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.js +23 -17
  74. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.js.map +1 -1
  75. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +7 -7
  76. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js.map +1 -1
  77. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +5 -5
  78. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js.map +1 -1
  79. package/dist/cjs/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +4 -4
  80. package/dist/cjs/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js.map +1 -1
  81. package/dist/cjs/components/rich-text/cell-rich-text-editor.js +21 -5
  82. package/dist/cjs/components/rich-text/cell-rich-text-editor.js.map +1 -1
  83. package/dist/cjs/components/rich-text/cell-rich-text-input.js +15 -7
  84. package/dist/cjs/components/rich-text/cell-rich-text-input.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/form-short-text.js +1 -1
  92. package/dist/cjs/components/text/form-short-text.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/styles.global.css +1 -1
  96. package/dist/cjs/utils/keyboard.js +12 -0
  97. package/dist/cjs/utils/keyboard.js.map +1 -0
  98. package/dist/esm/components/address/input/address-input.st.css.js +2 -2
  99. package/dist/esm/components/address/input/address-input.st.css.js.map +1 -1
  100. package/dist/esm/components/audio/actions/actions-menu/actions-menu.st.css.js +2 -2
  101. package/dist/esm/components/audio/audio-field/form-audio-field.st.css.js +2 -2
  102. package/dist/esm/components/audio/audio-player/audio-player.st.css.js +2 -2
  103. package/dist/esm/components/boolean/cell-checkbox.js +10 -4
  104. package/dist/esm/components/boolean/cell-checkbox.js.map +1 -1
  105. package/dist/esm/components/color-view/cell-color-view.st.css.js +2 -2
  106. package/dist/esm/components/color-view/color-view.st.css.js +2 -2
  107. package/dist/esm/components/date-input/cell-date-input.js +21 -2
  108. package/dist/esm/components/date-input/cell-date-input.js.map +1 -1
  109. package/dist/esm/components/date-input/date-picker-internals.js +67 -0
  110. package/dist/esm/components/date-input/date-picker-internals.js.map +1 -1
  111. package/dist/esm/components/date-input/form-date-input.driver.js +2 -0
  112. package/dist/esm/components/date-input/form-date-input.driver.js.map +1 -1
  113. package/dist/esm/components/date-input/form-date-input.js +25 -4
  114. package/dist/esm/components/date-input/form-date-input.js.map +1 -1
  115. package/dist/esm/components/date-input/use-field-value-replacement.js +48 -0
  116. package/dist/esm/components/date-input/use-field-value-replacement.js.map +1 -0
  117. package/dist/esm/components/datetime-input/form-date-time.driver.js +3 -0
  118. package/dist/esm/components/datetime-input/form-date-time.driver.js.map +1 -1
  119. package/dist/esm/components/datetime-input/form-date-time.js +51 -21
  120. package/dist/esm/components/datetime-input/form-date-time.js.map +1 -1
  121. package/dist/esm/components/delete-dialog/delete-dialog.st.css.js +2 -2
  122. package/dist/esm/components/delete-dialog/delete-dialog.st.css.js.map +1 -1
  123. package/dist/esm/components/document/form-document-field.st.css.js +2 -2
  124. package/dist/esm/components/exclamation/exclamation.st.css.js +2 -2
  125. package/dist/esm/components/highlighted-text/highlighted-text.st.css.js +3 -3
  126. package/dist/esm/components/highlighted-text/highlighted-text.st.css.js.map +1 -1
  127. package/dist/esm/components/image/thumbnail-replace-overlay.st.css.js +2 -2
  128. package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js +2 -2
  129. package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js.map +1 -1
  130. package/dist/esm/components/media-control/paste-url-button.st.css.js +2 -2
  131. package/dist/esm/components/media-control/paste-url-button.st.css.js.map +1 -1
  132. package/dist/esm/components/media-gallery/form-media-gallery-field.st.css.js +2 -2
  133. package/dist/esm/components/media-gallery/form-media-gallery-field.st.css.js.map +1 -1
  134. package/dist/esm/components/media-image/media-image.st.css.js +3 -3
  135. package/dist/esm/components/media-image/media-image.st.css.js.map +1 -1
  136. package/dist/esm/components/media-image/overlays/overlay.st.css.js +2 -2
  137. package/dist/esm/components/media-image/overlays/overlay.st.css.js.map +1 -1
  138. package/dist/esm/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
  139. package/dist/esm/components/multi-document/cell-multi-document-edit.st.css.js +2 -2
  140. package/dist/esm/components/multi-document/multi-document-input/form-multi-document.st.css.js +2 -2
  141. package/dist/esm/components/reference/cell-multi-reference-input.st.css.js +2 -2
  142. package/dist/esm/components/reference/cell-reference-input.st.css.js +2 -2
  143. package/dist/esm/components/reference/cell-reference-input.st.css.js.map +1 -1
  144. package/dist/esm/components/rich-content/cell-rich-content-input.js +11 -9
  145. package/dist/esm/components/rich-content/cell-rich-content-input.js.map +1 -1
  146. package/dist/esm/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +2 -2
  147. package/dist/esm/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +2 -2
  148. package/dist/esm/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
  149. 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
  150. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +2 -2
  151. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +2 -2
  152. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js.map +1 -1
  153. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
  154. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.js +8 -2
  155. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.js.map +1 -1
  156. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +2 -2
  157. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +2 -2
  158. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js.map +1 -1
  159. package/dist/esm/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +2 -2
  160. package/dist/esm/components/rich-text/cell-rich-text-editor.js +16 -1
  161. package/dist/esm/components/rich-text/cell-rich-text-editor.js.map +1 -1
  162. package/dist/esm/components/rich-text/cell-rich-text-input.js +8 -0
  163. package/dist/esm/components/rich-text/cell-rich-text-input.js.map +1 -1
  164. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +2 -2
  165. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +2 -2
  166. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +2 -2
  167. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js.map +1 -1
  168. package/dist/esm/components/text/form-short-text.js +1 -1
  169. package/dist/esm/components/text/form-short-text.js.map +1 -1
  170. package/dist/esm/components/text/text-view.st.css.js +2 -2
  171. package/dist/esm/components/text/text-view.st.css.js.map +1 -1
  172. package/dist/esm/styles.global.css +1 -1
  173. package/dist/esm/utils/keyboard.js +7 -0
  174. package/dist/esm/utils/keyboard.js.map +1 -0
  175. package/dist/types/components/address/input/address-input.st.css.d.ts.map +1 -1
  176. package/dist/types/components/boolean/cell-checkbox.d.ts +4 -1
  177. package/dist/types/components/boolean/cell-checkbox.d.ts.map +1 -1
  178. package/dist/types/components/date-input/cell-date-input.d.ts +4 -0
  179. package/dist/types/components/date-input/cell-date-input.d.ts.map +1 -1
  180. package/dist/types/components/date-input/date-picker-internals.d.ts +11 -1
  181. package/dist/types/components/date-input/date-picker-internals.d.ts.map +1 -1
  182. package/dist/types/components/date-input/form-date-input.d.ts.map +1 -1
  183. package/dist/types/components/date-input/form-date-input.driver.d.ts +2 -0
  184. package/dist/types/components/date-input/form-date-input.driver.d.ts.map +1 -1
  185. package/dist/types/components/date-input/use-field-value-replacement.d.ts +3 -0
  186. package/dist/types/components/date-input/use-field-value-replacement.d.ts.map +1 -0
  187. package/dist/types/components/datetime-input/form-date-time.d.ts.map +1 -1
  188. package/dist/types/components/datetime-input/form-date-time.driver.d.ts +3 -0
  189. package/dist/types/components/datetime-input/form-date-time.driver.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/highlighted-text/highlighted-text.st.css.d.ts.map +1 -1
  192. package/dist/types/components/media-control/cell-media-edit-shell.st.css.d.ts.map +1 -1
  193. package/dist/types/components/media-control/paste-url-button.st.css.d.ts.map +1 -1
  194. package/dist/types/components/media-gallery/form-media-gallery-field.st.css.d.ts.map +1 -1
  195. package/dist/types/components/media-image/media-image.st.css.d.ts.map +1 -1
  196. package/dist/types/components/media-image/overlays/overlay.st.css.d.ts.map +1 -1
  197. package/dist/types/components/reference/cell-reference-input.st.css.d.ts.map +1 -1
  198. package/dist/types/components/rich-content/cell-rich-content-input.d.ts +2 -1
  199. package/dist/types/components/rich-content/cell-rich-content-input.d.ts.map +1 -1
  200. 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
  201. package/dist/types/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.d.ts.map +1 -1
  202. package/dist/types/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.d.ts +2 -0
  203. package/dist/types/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.d.ts.map +1 -1
  204. package/dist/types/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.d.ts.map +1 -1
  205. package/dist/types/components/rich-text/cell-rich-text-editor.d.ts.map +1 -1
  206. package/dist/types/components/rich-text/cell-rich-text-input.d.ts +1 -1
  207. package/dist/types/components/rich-text/cell-rich-text-input.d.ts.map +1 -1
  208. package/dist/types/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.d.ts.map +1 -1
  209. package/dist/types/components/text/text-view.st.css.d.ts.map +1 -1
  210. package/dist/types/utils/keyboard.d.ts +4 -0
  211. package/dist/types/utils/keyboard.d.ts.map +1 -0
  212. package/package.json +5 -5
  213. package/src/__tests__/components/cell-rich-content-input.spec.tsx +73 -0
  214. package/src/__tests__/components/cell-rich-text-editor.spec.tsx +64 -0
  215. package/src/__tests__/components/cell-rich-text-input.spec.tsx +39 -0
  216. package/src/__tests__/components/date-input/cell-date-input.spec.tsx +100 -0
  217. package/src/__tests__/components/date-input/date-picker-internals.spec.tsx +69 -0
  218. package/src/__tests__/components/date-input/form-date-input.spec.tsx +141 -0
  219. package/src/__tests__/components/datetime-input/form-date-time.spec.tsx +194 -0
  220. package/src/__tests__/components/rich-content-editor.spec.tsx +53 -0
  221. package/src/__tests__/components/text/form-short-text.spec.tsx +27 -0
  222. package/src/__tests__/form-field.driver.tsx +31 -3
  223. package/src/__tests__/hooks/use-field-value-replacement.spec.tsx +68 -0
  224. package/src/__tests__/utils/keyboard.spec.ts +45 -0
  225. package/src/components/address/input/address-input.st.css.ts +2 -2
  226. package/src/components/audio/actions/actions-menu/actions-menu.st.css.ts +2 -2
  227. package/src/components/audio/audio-field/form-audio-field.st.css.ts +2 -2
  228. package/src/components/audio/audio-player/audio-player.st.css.ts +2 -2
  229. package/src/components/boolean/cell-checkbox.tsx +33 -11
  230. package/src/components/color-view/cell-color-view.st.css.ts +2 -2
  231. package/src/components/color-view/color-view.st.css.ts +2 -2
  232. package/src/components/date-input/cell-date-input.tsx +28 -0
  233. package/src/components/date-input/date-picker-internals.ts +104 -3
  234. package/src/components/date-input/form-date-input.driver.ts +2 -0
  235. package/src/components/date-input/form-date-input.tsx +25 -3
  236. package/src/components/date-input/use-field-value-replacement.ts +63 -0
  237. package/src/components/datetime-input/form-date-time.driver.ts +3 -0
  238. package/src/components/datetime-input/form-date-time.tsx +55 -33
  239. package/src/components/delete-dialog/delete-dialog.st.css.ts +2 -2
  240. package/src/components/document/form-document-field.st.css.ts +2 -2
  241. package/src/components/exclamation/exclamation.st.css.ts +2 -2
  242. package/src/components/highlighted-text/highlighted-text.st.css.ts +3 -3
  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-image/media-image.st.css.ts +3 -3
  248. package/src/components/media-image/overlays/overlay.st.css.ts +2 -2
  249. package/src/components/media-tag/web-media-tag/media-tag.st.css.ts +2 -2
  250. package/src/components/multi-document/cell-multi-document-edit.st.css.ts +2 -2
  251. package/src/components/multi-document/multi-document-input/form-multi-document.st.css.ts +2 -2
  252. package/src/components/reference/cell-multi-reference-input.st.css.ts +2 -2
  253. package/src/components/reference/cell-reference-input.st.css.ts +2 -2
  254. package/src/components/rich-content/cell-rich-content-input.tsx +12 -13
  255. package/src/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.ts +2 -2
  256. package/src/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.ts +2 -2
  257. package/src/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.ts +2 -2
  258. package/src/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.ts +2 -2
  259. package/src/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.ts +2 -2
  260. package/src/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.ts +2 -2
  261. package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.ts +2 -2
  262. package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.tsx +9 -1
  263. package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.ts +2 -2
  264. package/src/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.ts +2 -2
  265. package/src/components/rich-text/cell-rich-text-editor.tsx +30 -1
  266. package/src/components/rich-text/cell-rich-text-input.tsx +9 -1
  267. package/src/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.ts +2 -2
  268. package/src/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.ts +2 -2
  269. package/src/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.ts +2 -2
  270. package/src/components/text/form-short-text.tsx +1 -1
  271. package/src/components/text/text-view.st.css.ts +2 -2
  272. package/src/styles.global.css +1 -1
  273. package/src/utils/keyboard.ts +7 -0
@@ -22,6 +22,200 @@ const setup = (
22
22
  };
23
23
 
24
24
  describe('FormDateTime field', () => {
25
+ it.each(['reset', 'setValue'] as const)(
26
+ 'clears stale errors on %s, even when restoring the same value',
27
+ async (method) => {
28
+ const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
29
+ const initialText = await driver.tk.getDateText();
30
+ await driver.tk.enterTimeText('not-a-time');
31
+ await driver.tk.blurTime();
32
+ await driver.tk.enterDateText('not-a-date');
33
+ await driver.tk.blurDate();
34
+ await driver.submit();
35
+ expect(driver.onSubmit).not.toHaveBeenCalled();
36
+
37
+ await driver[method]('2026-09-16T12:00:00.000Z');
38
+ expect(await driver.tk.getDateText()).toBe(initialText);
39
+ expect(await driver.tk.dateHasError()).toBe(false);
40
+ expect(await driver.tk.timeHasError()).toBe(false);
41
+ await driver.submit();
42
+ expect(driver.onSubmit).toHaveBeenCalledTimes(1);
43
+ expect(driver.onSubmit.mock.calls[0][0][driver.field.id]).toBe(
44
+ '2026-09-16T12:00:00.000Z',
45
+ );
46
+ },
47
+ );
48
+
49
+ it.each(['reset', 'setValue'] as const)(
50
+ 'shows and submits an externally replaced date via %s',
51
+ async (method) => {
52
+ const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
53
+ const initialText = await driver.tk.getDateText();
54
+ await driver.tk.enterTimeText('not-a-time');
55
+ await driver.tk.blurTime();
56
+ await driver.tk.enterDateText('not-a-date');
57
+ await driver.tk.blurDate();
58
+
59
+ await driver[method]('2026-09-18T12:00:00.000Z');
60
+ expect(await driver.tk.getDateText()).not.toBe(initialText);
61
+ expect(await driver.tk.getDateText()).not.toBe('not-a-date');
62
+ expect(await driver.tk.dateHasError()).toBe(false);
63
+ expect(await driver.tk.timeHasError()).toBe(false);
64
+ await driver.submit();
65
+ expect(driver.onSubmit.mock.calls[0][0][driver.field.id]).toBe(
66
+ '2026-09-18T12:00:00.000Z',
67
+ );
68
+ },
69
+ );
70
+
71
+ it('keeps the error when another field is replaced or removed', async () => {
72
+ const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
73
+ await driver.tk.enterDateText('not-a-date');
74
+ await driver.tk.blurDate();
75
+ await driver.setValue('2026-09-18T12:00:00.000Z', 'anotherField');
76
+ await driver.unregister('anotherField');
77
+ await driver.submit();
78
+ expect(driver.onSubmit).not.toHaveBeenCalled();
79
+ });
80
+
81
+ it.each([false, true])(
82
+ 'resets invalid input to an empty value (required=%s)',
83
+ async (required) => {
84
+ const driver = setup({
85
+ field: makeField({ type: 'DATETIME', validation: { required } }),
86
+ });
87
+ await driver.tk.enterDateText('not-a-date');
88
+ await driver.tk.blurDate();
89
+ await driver.reset(null);
90
+ expect(await driver.tk.getDateText()).toBe('');
91
+ await driver.submit();
92
+ expect(driver.onSubmit).toHaveBeenCalledTimes(required ? 0 : 1);
93
+ if (!required) {
94
+ expect(driver.onSubmit.mock.calls[0][0][driver.field.id]).toBeNull();
95
+ }
96
+ },
97
+ );
98
+
99
+ it.each([false, true])(
100
+ 'blocks submit for an invalid date (required=%s)',
101
+ async (required) => {
102
+ const driver = setup({
103
+ field: makeField({ type: 'DATETIME', validation: { required } }),
104
+ initialValue: '2026-09-16T12:00:00.000Z',
105
+ });
106
+ await driver.tk.enterDateText('not-a-date');
107
+ await driver.tk.blurDate();
108
+ expect(await driver.tk.dateHasError()).toBe(true);
109
+ expect(await driver.tk.timeHasError()).toBe(false);
110
+
111
+ await driver.submit();
112
+
113
+ expect(driver.onSubmit).not.toHaveBeenCalled();
114
+ expect(await driver.tk.timeHasError()).toBe(false);
115
+ },
116
+ );
117
+
118
+ it('allows submit after correcting an invalid date', async () => {
119
+ const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
120
+ await driver.tk.enterDateText('not-a-date');
121
+ await driver.tk.blurDate();
122
+ await driver.submit();
123
+ expect(driver.onSubmit).not.toHaveBeenCalled();
124
+
125
+ await driver.tk.enterDateText('09/17/2026');
126
+ await driver.tk.blurDate();
127
+ await driver.submit();
128
+
129
+ expect(await driver.tk.dateHasError()).toBe(false);
130
+ expect(driver.onSubmit).toHaveBeenCalledTimes(1);
131
+ expect(
132
+ new Date(driver.onSubmit.mock.calls[0][0][driver.field.id]).getDate(),
133
+ ).toBe(17);
134
+ });
135
+
136
+ it('blocks an invalid time and allows submit after correcting it', async () => {
137
+ const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
138
+ await driver.tk.enterTimeText('not-a-time');
139
+ await driver.tk.blurTime();
140
+ expect(await driver.tk.timeHasError()).toBe(true);
141
+ expect(await driver.tk.dateHasError()).toBe(false);
142
+ await driver.submit();
143
+ expect(driver.onSubmit).not.toHaveBeenCalled();
144
+ expect(await driver.tk.dateHasError()).toBe(false);
145
+
146
+ await driver.tk.enterTimeText('14:30');
147
+ await driver.tk.blurTime();
148
+ await driver.submit();
149
+
150
+ expect(await driver.tk.timeHasError()).toBe(false);
151
+ expect(driver.onSubmit).toHaveBeenCalledTimes(1);
152
+ });
153
+
154
+ it('does not clear an invalid date when the time changes', async () => {
155
+ const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
156
+ await driver.tk.enterDateText('not-a-date');
157
+ await driver.tk.blurDate();
158
+ await driver.tk.enterTimeText('14:30');
159
+ await driver.tk.blurTime();
160
+
161
+ expect(await driver.tk.dateHasError()).toBe(true);
162
+ await driver.submit();
163
+ expect(driver.onSubmit).not.toHaveBeenCalled();
164
+ });
165
+
166
+ it('shows each input’s own message when both inputs are invalid', async () => {
167
+ const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
168
+ await driver.tk.enterDateText('not-a-date');
169
+ await driver.tk.blurDate();
170
+ await driver.tk.enterTimeText('not-a-time');
171
+ await driver.tk.blurTime();
172
+ await driver.submit();
173
+
174
+ expect(driver.onSubmit).not.toHaveBeenCalled();
175
+ expect(await driver.tk.getDateErrorMessage()).toContain(
176
+ 'cairo.customFields.fieldType.date.invalid.value',
177
+ );
178
+ expect(await driver.tk.getTimeErrorMessage()).toBe(
179
+ 'CMS.formTime.invalidMessage',
180
+ );
181
+ });
182
+
183
+ it('does not clear an invalid time when the date changes', async () => {
184
+ const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
185
+ await driver.tk.enterTimeText('not-a-time');
186
+ await driver.tk.blurTime();
187
+ await driver.tk.enterDateText('09/17/2026');
188
+ await driver.tk.blurDate();
189
+
190
+ expect(await driver.tk.timeHasError()).toBe(true);
191
+ await driver.submit();
192
+ expect(driver.onSubmit).not.toHaveBeenCalled();
193
+ });
194
+
195
+ it.each([false, true])(
196
+ 'handles clearing an invalid date and time (required=%s)',
197
+ async (required) => {
198
+ const driver = setup({
199
+ field: makeField({ type: 'DATETIME', validation: { required } }),
200
+ initialValue: '2026-09-16T12:00:00.000Z',
201
+ });
202
+ await driver.tk.enterDateText('not-a-date');
203
+ await driver.tk.blurDate();
204
+ await driver.tk.enterTimeText('');
205
+ await driver.tk.blurTime();
206
+ await driver.tk.enterDateText('');
207
+ await driver.tk.blurDate();
208
+ await driver.submit();
209
+
210
+ expect(driver.onSubmit).toHaveBeenCalledTimes(required ? 0 : 1);
211
+ if (!required) {
212
+ expect(driver.onSubmit.mock.calls[0][0][driver.field.id]).toBeNull();
213
+ expect(await driver.tk.dateHasError()).toBe(false);
214
+ expect(await driver.tk.timeHasError()).toBe(false);
215
+ }
216
+ },
217
+ );
218
+
25
219
  it('renders the field displayName as the label', async () => {
26
220
  const driver = setup();
27
221
 
@@ -412,6 +412,59 @@ describe('<RichContentEditor/>', () => {
412
412
  });
413
413
  });
414
414
 
415
+ describe('Enter key', () => {
416
+ const pressEnterInText = (opts: { shiftKey?: boolean } = {}) => {
417
+ const text = document.createElement('div');
418
+ text.setAttribute('contenteditable', 'true');
419
+ document.body.appendChild(text);
420
+ fireEvent.keyDown(text, { key: 'Enter', bubbles: true, ...opts });
421
+ text.remove();
422
+ };
423
+
424
+ it('closes fullscreen on Enter in the text when closeOnEnter is set', async () => {
425
+ renderWithProps({
426
+ fullScreenOnly: true,
427
+ closeOnEnter: true,
428
+ onExitFullScreen,
429
+ });
430
+ await waitFor(() =>
431
+ expect(screen.getByTestId('fullscreen-modal')).toBeInTheDocument(),
432
+ );
433
+
434
+ pressEnterInText();
435
+
436
+ await waitFor(() => expect(onExitFullScreen).toHaveBeenCalled());
437
+ });
438
+
439
+ it('does not close on Shift+Enter', async () => {
440
+ renderWithProps({
441
+ fullScreenOnly: true,
442
+ closeOnEnter: true,
443
+ onExitFullScreen,
444
+ });
445
+ await waitFor(() =>
446
+ expect(screen.getByTestId('fullscreen-modal')).toBeInTheDocument(),
447
+ );
448
+
449
+ pressEnterInText({ shiftKey: true });
450
+
451
+ await nextRender();
452
+ expect(onExitFullScreen).not.toHaveBeenCalled();
453
+ });
454
+
455
+ it('does not close on Enter without closeOnEnter', async () => {
456
+ renderWithProps({ fullScreenOnly: true, onExitFullScreen });
457
+ await waitFor(() =>
458
+ expect(screen.getByTestId('fullscreen-modal')).toBeInTheDocument(),
459
+ );
460
+
461
+ pressEnterInText();
462
+
463
+ await nextRender();
464
+ expect(onExitFullScreen).not.toHaveBeenCalled();
465
+ });
466
+ });
467
+
415
468
  describe('fullscreen mode', () => {
416
469
  it('should open fullscreen modal when toggle button is clicked', async () => {
417
470
  renderWithProps({
@@ -61,6 +61,33 @@ describe('FormShortText field', () => {
61
61
  expect(await driver.tk.getCharCountLeft()).toBe(7);
62
62
  });
63
63
 
64
+ it.each([undefined, null])(
65
+ 'shows the full character allowance when the initial value is %p',
66
+ async (initialValue) => {
67
+ const driver = new FormFieldDriver({
68
+ Component: FormShortText,
69
+ UniDriverFactory: FormShortTextDriver,
70
+ dataHook: (f) => `short-text-field-${f.id}`,
71
+ field: makeField({
72
+ validation: { required: true, stringLengthRange: { maxLength: 10 } },
73
+ }),
74
+ initialValue: initialValue as unknown as string,
75
+ });
76
+ driver.render();
77
+
78
+ expect(await driver.tk.getValue()).toBe('');
79
+ expect(await driver.tk.getCharCountLeft()).toBe(10);
80
+
81
+ await driver.tk.enterText('abc');
82
+
83
+ expect(await driver.tk.getCharCountLeft()).toBe(7);
84
+
85
+ await driver.tk.enterText('');
86
+
87
+ expect(await driver.tk.getCharCountLeft()).toBe(10);
88
+ },
89
+ );
90
+
64
91
  it('marks the field as required when validation.required is true', async () => {
65
92
  const driver = setup({
66
93
  field: makeField({ validation: { required: true } }),
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { act, fireEvent, render, RenderResult } from '@testing-library/react';
3
3
  import Chance from 'chance';
4
4
  import { useForm } from '@wix/bex-core/form';
5
- import type { Control, FieldValues } from '@wix/bex-core/form';
5
+ import type { Control, FieldValues, UseFormReturn } from '@wix/bex-core/form';
6
6
  import type { Field } from '@wix/bex-core';
7
7
  import { UniDriver } from '@wix/wix-ui-test-utils/unidriver';
8
8
  import type { BaseUniDriver } from '@wix/wix-ui-test-utils/base-driver';
@@ -12,7 +12,6 @@ import { PatternsFieldsTestProvider } from '../testkit/patterns-fields-test-prov
12
12
  import type { BaseInputProps } from '../types/base-input';
13
13
 
14
14
  const chance = new Chance();
15
- const noop = () => {};
16
15
  const SUBMIT_HOOK = 'form-field-driver-submit';
17
16
 
18
17
  type UniDriverFactory<U> = (
@@ -31,9 +30,11 @@ export interface FormFieldDriverOptions<U extends BaseUniDriver, T> {
31
30
 
32
31
  export class FormFieldDriver<U extends BaseUniDriver, T> {
33
32
  private _renderResult?: RenderResult;
33
+ private form?: UseFormReturn<FieldValues>;
34
34
  readonly field: Field;
35
35
  readonly initialValue: T;
36
36
  readonly onChange = jest.fn<void, [T]>();
37
+ readonly onSubmit = jest.fn<void, [FieldValues]>();
37
38
  private readonly opts: FormFieldDriverOptions<U, T>;
38
39
  private readonly _dataHook: string;
39
40
 
@@ -67,6 +68,24 @@ export class FormFieldDriver<U extends BaseUniDriver, T> {
67
68
  });
68
69
  }
69
70
 
71
+ async reset(value: T): Promise<void> {
72
+ await act(async () => {
73
+ this.form!.reset({ [this.field.id]: value });
74
+ });
75
+ }
76
+
77
+ async setValue(value: T, name = this.field.id): Promise<void> {
78
+ await act(async () => {
79
+ this.form!.setValue(name, value, { shouldValidate: true });
80
+ });
81
+ }
82
+
83
+ async unregister(name: string): Promise<void> {
84
+ await act(async () => {
85
+ this.form!.unregister(name);
86
+ });
87
+ }
88
+
70
89
  render() {
71
90
  const { Component } = this.opts;
72
91
  const { field, initialValue, _dataHook: dataHook, onChange } = this;
@@ -74,6 +93,10 @@ export class FormFieldDriver<U extends BaseUniDriver, T> {
74
93
  <TestForm
75
94
  field={field}
76
95
  initialValue={initialValue}
96
+ onSubmit={this.onSubmit}
97
+ onFormReady={(form) => {
98
+ this.form = form;
99
+ }}
77
100
  renderField={(control) => (
78
101
  <Component
79
102
  field={field}
@@ -93,20 +116,25 @@ export class FormFieldDriver<U extends BaseUniDriver, T> {
93
116
  interface TestFormProps<T> {
94
117
  field: Field;
95
118
  initialValue: T;
119
+ onSubmit: (values: FieldValues) => void;
120
+ onFormReady: (form: UseFormReturn<FieldValues>) => void;
96
121
  renderField: (control: Control<FieldValues>) => React.ReactElement;
97
122
  }
98
123
 
99
124
  const TestForm = <T,>({
100
125
  field,
101
126
  initialValue,
127
+ onSubmit,
128
+ onFormReady,
102
129
  renderField,
103
130
  }: TestFormProps<T>) => {
104
131
  const methods = useForm<FieldValues>({
105
132
  mode: 'onChange',
106
133
  defaultValues: { [field.id]: initialValue },
107
134
  });
135
+ onFormReady(methods);
108
136
  return (
109
- <form onSubmit={methods.handleSubmit(noop)}>
137
+ <form onSubmit={methods.handleSubmit(onSubmit)}>
110
138
  {renderField(methods.control)}
111
139
  <button type="submit" data-hook={SUBMIT_HOOK} />
112
140
  </form>
@@ -0,0 +1,68 @@
1
+ import '../../testkit/test-polyfills';
2
+
3
+ import React, { useMemo } from 'react';
4
+ import { render } from '@testing-library/react';
5
+ import { useForm } from '@wix/bex-core/form';
6
+ import type { Control } from '@wix/bex-core/form';
7
+
8
+ import { FormDateInput } from '../../components/date-input/form-date-input';
9
+ import { FormDateTime } from '../../components/datetime-input/form-date-time';
10
+ import { useFieldValueReplacement } from '../../components/date-input/use-field-value-replacement';
11
+ import { PatternsFieldsTestProvider } from '../../testkit/patterns-fields-test-provider';
12
+ import { makeField } from '../form-field.driver';
13
+
14
+ describe('useFieldValueReplacement compatibility', () => {
15
+ it.each([
16
+ ['Date', FormDateInput, 'DATE'],
17
+ ['DateTime', FormDateTime, 'DATETIME'],
18
+ ] as const)(
19
+ 'renders %s without exposed subjects',
20
+ (_name, Component, type) => {
21
+ const field = makeField({ type });
22
+ const Example = () => {
23
+ const form = useForm();
24
+ const control = useMemo(() => {
25
+ const { _subjects, ...rest } = form.control;
26
+ return rest as Control;
27
+ }, [form.control]);
28
+ return (
29
+ <Component
30
+ field={field}
31
+ value={null}
32
+ onChange={() => {}}
33
+ data={{}}
34
+ formControl={control}
35
+ />
36
+ );
37
+ };
38
+
39
+ const result = render(<Example />, {
40
+ wrapper: PatternsFieldsTestProvider,
41
+ });
42
+
43
+ expect(result.getByText(field.displayName)).toBeTruthy();
44
+ result.unmount();
45
+ },
46
+ );
47
+
48
+ it.each([
49
+ undefined,
50
+ {},
51
+ { state: {}, array: {} },
52
+ { state: { subscribe: jest.fn() } },
53
+ { array: { subscribe: jest.fn() } },
54
+ ])('skips cleanup for an unsupported subject shape: %p', (subjects) => {
55
+ const onReplace = jest.fn();
56
+ const control = { _subjects: subjects } as unknown as Control;
57
+ const Example = () => {
58
+ const revision = useFieldValueReplacement(control, 'date', onReplace);
59
+ return <span>{revision}</span>;
60
+ };
61
+
62
+ const result = render(<Example />);
63
+
64
+ expect(result.getByText('0')).toBeTruthy();
65
+ expect(onReplace).not.toHaveBeenCalled();
66
+ result.unmount();
67
+ });
68
+ });
@@ -0,0 +1,45 @@
1
+ import { isEnterInEditableText } from '../../utils/keyboard';
2
+
3
+ const press = (target: HTMLElement, init: KeyboardEventInit = {}) => {
4
+ let result: boolean | undefined;
5
+ target.addEventListener('keydown', (e) => {
6
+ result = isEnterInEditableText(e);
7
+ });
8
+ target.dispatchEvent(
9
+ new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, ...init }),
10
+ );
11
+ return result;
12
+ };
13
+
14
+ describe('isEnterInEditableText', () => {
15
+ const editable = () => {
16
+ const outer = document.createElement('div');
17
+ outer.setAttribute('contenteditable', 'true');
18
+ const inner = document.createElement('span');
19
+ outer.appendChild(inner);
20
+ document.body.appendChild(outer);
21
+ return inner;
22
+ };
23
+
24
+ it('is true for Enter inside editable text', () => {
25
+ expect(press(editable())).toBe(true);
26
+ });
27
+
28
+ it('is false for Shift+Enter', () => {
29
+ expect(press(editable(), { shiftKey: true })).toBe(false);
30
+ });
31
+
32
+ it('is false while composing (IME)', () => {
33
+ expect(press(editable(), { isComposing: true })).toBe(false);
34
+ });
35
+
36
+ it('is false outside editable text (e.g. a toolbar input)', () => {
37
+ const input = document.createElement('input');
38
+ document.body.appendChild(input);
39
+ expect(press(input)).toBe(false);
40
+ });
41
+
42
+ it('is false for other keys', () => {
43
+ expect(press(editable(), { key: 'a' })).toBe(false);
44
+ });
45
+ });
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../stylable-esm-runtime.js"
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "addressinput1753982187";
8
+ var _namespace_ = "addressinput840205872";
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":"addressinput1753982187__root","tableAddressInput":"addressinput1753982187__tableAddressInput"};
16
+ export var classes = {"root":"addressinput840205872__root","tableAddressInput":"addressinput840205872__tableAddressInput"};
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.
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "actionsmenu132710167";
8
+ var _namespace_ = "actionsmenu994746356";
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":"actionsmenu132710167__root","action":"actionsmenu132710167__action"};
16
+ export var classes = {"root":"actionsmenu994746356__root","action":"actionsmenu994746356__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_ = "formaudiofield2070924690";
8
+ var _namespace_ = "formaudiofield1744934343";
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":"formaudiofield2070924690__root","addItem":"formaudiofield2070924690__addItem","mediaTitle":"formaudiofield2070924690__mediaTitle"};
16
+ export var classes = {"root":"formaudiofield1744934343__root","addItem":"formaudiofield1744934343__addItem","mediaTitle":"formaudiofield1744934343__mediaTitle"};
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_ = "audioplayer3409967597";
8
+ var _namespace_ = "audioplayer2787508242";
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":"audioplayer3409967597__root"};
16
+ export var classes = {"root":"audioplayer2787508242__root"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};
@@ -1,4 +1,9 @@
1
- import React, { useCallback } from 'react';
1
+ import React, {
2
+ forwardRef,
3
+ useCallback,
4
+ useImperativeHandle,
5
+ useRef,
6
+ } from 'react';
2
7
  import type { CheckboxProps } from '@wix/design-system';
3
8
  import { Checkbox } from '@wix/design-system';
4
9
 
@@ -8,20 +13,37 @@ export interface CellCheckboxProps
8
13
  onChange?(checked: boolean): void;
9
14
  }
10
15
 
16
+ export interface CellCheckboxHandle {
17
+ focus(): void;
18
+ }
19
+
11
20
  /**
12
21
  * Cell-layer Checkbox — fires onChange on toggle. Thin wrapper around
13
22
  * WDS Checkbox with cell-friendly prop types (boolean instead of event).
14
23
  */
15
- export const CellCheckbox: React.FC<CellCheckboxProps> = ({
16
- checked,
17
- onChange,
18
- ...props
19
- }) => {
20
- const handleChange = useCallback(() => {
21
- onChange?.(!checked);
22
- }, [checked, onChange]);
24
+ export const CellCheckbox = forwardRef<CellCheckboxHandle, CellCheckboxProps>(
25
+ ({ checked, onChange, ...props }, ref) => {
26
+ // WDS types this ref as an element, but it resolves to the Checkbox,
27
+ // whose focus() focuses the input and shows the keyboard focus ring.
28
+ const checkboxRef = useRef<HTMLDivElement>(null);
29
+
30
+ useImperativeHandle(ref, () => ({
31
+ focus: () => checkboxRef.current?.focus(),
32
+ }));
33
+
34
+ const handleChange = useCallback(() => {
35
+ onChange?.(!checked);
36
+ }, [checked, onChange]);
23
37
 
24
- return <Checkbox {...props} checked={checked} onChange={handleChange} />;
25
- };
38
+ return (
39
+ <Checkbox
40
+ {...props}
41
+ ref={checkboxRef}
42
+ checked={checked}
43
+ onChange={handleChange}
44
+ />
45
+ );
46
+ },
47
+ );
26
48
 
27
49
  CellCheckbox.displayName = 'CellCheckbox';
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "cellcolorview3646440040";
8
+ var _namespace_ = "cellcolorview1285518022";
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":"cellcolorview3646440040__root","hashPrefix":"cellcolorview3646440040__hashPrefix"};
16
+ export var classes = {"root":"cellcolorview1285518022__root","hashPrefix":"cellcolorview1285518022__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_ = "colorview1258591125";
8
+ var _namespace_ = "colorview1355180041";
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":"colorview1258591125__root","view":"colorview1258591125__view","fillPreview":"colorview1258591125__fillPreview"};
16
+ export var classes = {"root":"colorview1355180041__root","view":"colorview1355180041__view","fillPreview":"colorview1355180041__fillPreview"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};