@wix/patterns-fields 1.73.0 → 1.75.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.
- package/dist/cjs/components/address/form-address.js +5 -3
- package/dist/cjs/components/address/form-address.js.map +1 -1
- package/dist/cjs/components/address/input/address-input.st.css.js +3 -3
- package/dist/cjs/components/address/input/address-input.st.css.js.map +1 -1
- package/dist/cjs/components/audio/actions/actions-menu/actions-menu.st.css.js +3 -3
- package/dist/cjs/components/audio/actions/actions-menu/actions-menu.st.css.js.map +1 -1
- package/dist/cjs/components/audio/audio-field/form-audio-field.st.css.js +4 -4
- package/dist/cjs/components/audio/audio-field/form-audio-field.st.css.js.map +1 -1
- package/dist/cjs/components/audio/audio-field/form-audio.js +5 -3
- package/dist/cjs/components/audio/audio-field/form-audio.js.map +1 -1
- package/dist/cjs/components/audio/audio-player/audio-player.st.css.js +2 -2
- package/dist/cjs/components/audio/audio-player/audio-player.st.css.js.map +1 -1
- package/dist/cjs/components/boolean/form-checkbox-input.js +40 -0
- package/dist/cjs/components/boolean/form-checkbox-input.js.map +1 -0
- package/dist/cjs/components/boolean/form-checkbox.js +6 -5
- package/dist/cjs/components/boolean/form-checkbox.js.map +1 -1
- package/dist/cjs/components/boolean/index.js +6 -0
- package/dist/cjs/components/boolean/index.js.map +1 -1
- package/dist/cjs/components/color-view/cell-color-view.st.css.js +3 -3
- package/dist/cjs/components/color-view/cell-color-view.st.css.js.map +1 -1
- package/dist/cjs/components/color-view/color-input.js +6 -5
- package/dist/cjs/components/color-view/color-input.js.map +1 -1
- package/dist/cjs/components/color-view/color-view.st.css.js +4 -4
- package/dist/cjs/components/color-view/color-view.st.css.js.map +1 -1
- package/dist/cjs/components/color-view/form-color.driver.js +8 -2
- package/dist/cjs/components/color-view/form-color.driver.js.map +1 -1
- package/dist/cjs/components/controlled-input.driver.js +16 -0
- package/dist/cjs/components/controlled-input.driver.js.map +1 -0
- package/dist/cjs/components/datetime-input/form-date-time.driver.js +4 -1
- package/dist/cjs/components/datetime-input/form-date-time.driver.js.map +1 -1
- package/dist/cjs/components/datetime-input/form-date-time.js +1 -0
- package/dist/cjs/components/datetime-input/form-date-time.js.map +1 -1
- package/dist/cjs/components/delete-dialog/delete-dialog.st.css.js +3 -3
- package/dist/cjs/components/delete-dialog/delete-dialog.st.css.js.map +1 -1
- package/dist/cjs/components/document/form-document-field.st.css.js +7 -7
- package/dist/cjs/components/document/form-document-field.st.css.js.map +1 -1
- package/dist/cjs/components/document/form-document.js +5 -3
- package/dist/cjs/components/document/form-document.js.map +1 -1
- package/dist/cjs/components/exclamation/exclamation.st.css.js +5 -5
- package/dist/cjs/components/exclamation/exclamation.st.css.js.map +1 -1
- package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js +5 -5
- package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js.map +1 -1
- package/dist/cjs/components/image/form-image-input.js +6 -4
- package/dist/cjs/components/image/form-image-input.js.map +1 -1
- package/dist/cjs/components/image/thumbnail-replace-overlay.st.css.js +3 -3
- package/dist/cjs/components/image/thumbnail-replace-overlay.st.css.js.map +1 -1
- package/dist/cjs/components/media-control/cell-media-edit-shell.st.css.js +2 -2
- package/dist/cjs/components/media-control/cell-media-edit-shell.st.css.js.map +1 -1
- package/dist/cjs/components/media-control/paste-url-button.st.css.js +4 -4
- package/dist/cjs/components/media-control/paste-url-button.st.css.js.map +1 -1
- package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.js +10 -10
- package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.js.map +1 -1
- package/dist/cjs/components/media-gallery/form-media-gallery.js +5 -3
- package/dist/cjs/components/media-gallery/form-media-gallery.js.map +1 -1
- package/dist/cjs/components/media-image/media-image.st.css.js +4 -4
- package/dist/cjs/components/media-image/media-image.st.css.js.map +1 -1
- package/dist/cjs/components/media-image/overlays/overlay.st.css.js +3 -3
- package/dist/cjs/components/media-image/overlays/overlay.st.css.js.map +1 -1
- package/dist/cjs/components/media-loader/media-loader.st.css.js +3 -3
- package/dist/cjs/components/media-loader/media-loader.st.css.js.map +1 -1
- package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
- package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js.map +1 -1
- package/dist/cjs/components/multi-document/cell-multi-document-edit.st.css.js +3 -3
- package/dist/cjs/components/multi-document/cell-multi-document-edit.st.css.js.map +1 -1
- package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.js +5 -3
- package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.js.map +1 -1
- package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js +5 -5
- package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js.map +1 -1
- package/dist/cjs/components/number-input/form-number-input.js +38 -0
- package/dist/cjs/components/number-input/form-number-input.js.map +1 -0
- package/dist/cjs/components/number-input/form-number.js +7 -5
- package/dist/cjs/components/number-input/form-number.js.map +1 -1
- package/dist/cjs/components/number-input/index.js +6 -0
- package/dist/cjs/components/number-input/index.js.map +1 -1
- package/dist/cjs/components/reference/cell-multi-reference-input.st.css.js +2 -2
- package/dist/cjs/components/reference/cell-multi-reference-input.st.css.js.map +1 -1
- package/dist/cjs/components/reference/cell-reference-input.st.css.js +3 -3
- package/dist/cjs/components/reference/cell-reference-input.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +4 -4
- package/dist/cjs/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css +15 -7
- package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +11 -7
- package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
- 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
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +3 -3
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +3 -3
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +7 -7
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +5 -5
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +4 -4
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js.map +1 -1
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +18 -18
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js.map +1 -1
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css +32 -19
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +20 -12
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js.map +1 -1
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +18 -18
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js.map +1 -1
- package/dist/cjs/components/text/form-short-text-input.js +97 -0
- package/dist/cjs/components/text/form-short-text-input.js.map +1 -0
- package/dist/cjs/components/text/form-short-text.driver.js +1 -0
- package/dist/cjs/components/text/form-short-text.driver.js.map +1 -1
- package/dist/cjs/components/text/form-short-text.js +18 -80
- package/dist/cjs/components/text/form-short-text.js.map +1 -1
- package/dist/cjs/components/text/index.js +6 -0
- package/dist/cjs/components/text/index.js.map +1 -1
- package/dist/cjs/components/text/text-view.st.css.js +3 -3
- package/dist/cjs/components/text/text-view.st.css.js.map +1 -1
- package/dist/cjs/components/time-input/form-time.js +9 -10
- package/dist/cjs/components/time-input/form-time.js.map +1 -1
- package/dist/cjs/components/url/form-url-input.js +55 -0
- package/dist/cjs/components/url/form-url-input.js.map +1 -0
- package/dist/cjs/components/url/form-url.js +6 -20
- package/dist/cjs/components/url/form-url.js.map +1 -1
- package/dist/cjs/components/url/index.js +6 -0
- package/dist/cjs/components/url/index.js.map +1 -1
- package/dist/cjs/components/video/form-video.js +30 -29
- package/dist/cjs/components/video/form-video.js.map +1 -1
- package/dist/cjs/exports/unidriver.js +3 -1
- package/dist/cjs/exports/unidriver.js.map +1 -1
- package/dist/cjs/hooks/index.js +6 -0
- package/dist/cjs/hooks/index.js.map +1 -1
- package/dist/cjs/hooks/pr-5746-kobiburnley-comments.md +54 -0
- package/dist/cjs/hooks/use-field-ref.js +60 -0
- package/dist/cjs/hooks/use-field-ref.js.map +1 -0
- package/dist/cjs/hooks/use-scroll-to-error-ref.js +15 -15
- package/dist/cjs/hooks/use-scroll-to-error-ref.js.map +1 -1
- package/dist/cjs/styles.global.css +1 -1
- package/dist/cjs/types/controlled-input.js +4 -0
- package/dist/cjs/types/controlled-input.js.map +1 -0
- package/dist/esm/components/address/form-address.js +3 -1
- package/dist/esm/components/address/form-address.js.map +1 -1
- package/dist/esm/components/address/input/address-input.st.css.js +2 -2
- package/dist/esm/components/address/input/address-input.st.css.js.map +1 -1
- package/dist/esm/components/audio/actions/actions-menu/actions-menu.st.css.js +2 -2
- package/dist/esm/components/audio/actions/actions-menu/actions-menu.st.css.js.map +1 -1
- package/dist/esm/components/audio/audio-field/form-audio-field.st.css.js +2 -2
- package/dist/esm/components/audio/audio-field/form-audio-field.st.css.js.map +1 -1
- package/dist/esm/components/audio/audio-field/form-audio.js +3 -1
- package/dist/esm/components/audio/audio-field/form-audio.js.map +1 -1
- package/dist/esm/components/audio/audio-player/audio-player.st.css.js +2 -2
- package/dist/esm/components/boolean/form-checkbox-input.js +10 -0
- package/dist/esm/components/boolean/form-checkbox-input.js.map +1 -0
- package/dist/esm/components/boolean/form-checkbox.js +2 -2
- package/dist/esm/components/boolean/form-checkbox.js.map +1 -1
- package/dist/esm/components/boolean/index.js +1 -0
- package/dist/esm/components/boolean/index.js.map +1 -1
- package/dist/esm/components/color-view/cell-color-view.st.css.js +2 -2
- package/dist/esm/components/color-view/color-input.js +1 -1
- package/dist/esm/components/color-view/color-input.js.map +1 -1
- package/dist/esm/components/color-view/color-view.st.css.js +2 -2
- package/dist/esm/components/color-view/form-color.driver.js +8 -2
- package/dist/esm/components/color-view/form-color.driver.js.map +1 -1
- package/dist/esm/components/controlled-input.driver.js +12 -0
- package/dist/esm/components/controlled-input.driver.js.map +1 -0
- package/dist/esm/components/datetime-input/form-date-time.driver.js +3 -0
- package/dist/esm/components/datetime-input/form-date-time.driver.js.map +1 -1
- package/dist/esm/components/datetime-input/form-date-time.js +1 -1
- package/dist/esm/components/datetime-input/form-date-time.js.map +1 -1
- package/dist/esm/components/delete-dialog/delete-dialog.st.css.js +2 -2
- package/dist/esm/components/document/form-document-field.st.css.js +2 -2
- package/dist/esm/components/document/form-document.js +3 -1
- package/dist/esm/components/document/form-document.js.map +1 -1
- package/dist/esm/components/exclamation/exclamation.st.css.js +2 -2
- package/dist/esm/components/highlighted-text/highlighted-text.st.css.js +3 -3
- package/dist/esm/components/image/form-image-input.js +3 -1
- package/dist/esm/components/image/form-image-input.js.map +1 -1
- package/dist/esm/components/image/thumbnail-replace-overlay.st.css.js +2 -2
- package/dist/esm/components/image/thumbnail-replace-overlay.st.css.js.map +1 -1
- package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js +2 -2
- package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js.map +1 -1
- package/dist/esm/components/media-control/paste-url-button.st.css.js +2 -2
- package/dist/esm/components/media-control/paste-url-button.st.css.js.map +1 -1
- package/dist/esm/components/media-gallery/form-media-gallery-field.st.css.js +2 -2
- package/dist/esm/components/media-gallery/form-media-gallery.js +3 -1
- package/dist/esm/components/media-gallery/form-media-gallery.js.map +1 -1
- package/dist/esm/components/media-image/media-image.st.css.js +3 -3
- package/dist/esm/components/media-image/overlays/overlay.st.css.js +2 -2
- package/dist/esm/components/media-loader/media-loader.st.css.js +2 -2
- package/dist/esm/components/media-loader/media-loader.st.css.js.map +1 -1
- package/dist/esm/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
- package/dist/esm/components/multi-document/cell-multi-document-edit.st.css.js +2 -2
- package/dist/esm/components/multi-document/multi-document-input/form-multi-document.js +3 -1
- package/dist/esm/components/multi-document/multi-document-input/form-multi-document.js.map +1 -1
- package/dist/esm/components/multi-document/multi-document-input/form-multi-document.st.css.js +2 -2
- package/dist/esm/components/multi-document/multi-document-input/form-multi-document.st.css.js.map +1 -1
- package/dist/esm/components/number-input/form-number-input.js +5 -0
- package/dist/esm/components/number-input/form-number-input.js.map +1 -0
- package/dist/esm/components/number-input/form-number.js +3 -2
- package/dist/esm/components/number-input/form-number.js.map +1 -1
- package/dist/esm/components/number-input/index.js +1 -0
- package/dist/esm/components/number-input/index.js.map +1 -1
- package/dist/esm/components/reference/cell-multi-reference-input.st.css.js +2 -2
- package/dist/esm/components/reference/cell-reference-input.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css +15 -7
- package/dist/esm/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +3 -3
- package/dist/esm/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js.map +1 -1
- package/dist/esm/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
- 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
- package/dist/esm/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js.map +1 -1
- package/dist/esm/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js.map +1 -1
- package/dist/esm/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +2 -2
- package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +2 -2
- package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css +32 -19
- package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +3 -3
- package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js.map +1 -1
- package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +2 -2
- package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js.map +1 -1
- package/dist/esm/components/text/form-short-text-input.js +41 -0
- package/dist/esm/components/text/form-short-text-input.js.map +1 -0
- package/dist/esm/components/text/form-short-text.driver.js +3 -0
- package/dist/esm/components/text/form-short-text.driver.js.map +1 -1
- package/dist/esm/components/text/form-short-text.js +8 -40
- package/dist/esm/components/text/form-short-text.js.map +1 -1
- package/dist/esm/components/text/index.js +1 -0
- package/dist/esm/components/text/index.js.map +1 -1
- package/dist/esm/components/text/text-view.st.css.js +2 -2
- package/dist/esm/components/text/text-view.st.css.js.map +1 -1
- package/dist/esm/components/time-input/form-time.js +4 -3
- package/dist/esm/components/time-input/form-time.js.map +1 -1
- package/dist/esm/components/url/form-url-input.js +7 -0
- package/dist/esm/components/url/form-url-input.js.map +1 -0
- package/dist/esm/components/url/form-url.js +3 -4
- package/dist/esm/components/url/form-url.js.map +1 -1
- package/dist/esm/components/url/index.js +1 -0
- package/dist/esm/components/url/index.js.map +1 -1
- package/dist/esm/components/video/form-video.js +3 -2
- package/dist/esm/components/video/form-video.js.map +1 -1
- package/dist/esm/exports/unidriver.js +1 -0
- package/dist/esm/exports/unidriver.js.map +1 -1
- package/dist/esm/hooks/index.js +1 -0
- package/dist/esm/hooks/index.js.map +1 -1
- package/dist/esm/hooks/pr-5746-kobiburnley-comments.md +54 -0
- package/dist/esm/hooks/use-field-ref.js +36 -0
- package/dist/esm/hooks/use-field-ref.js.map +1 -0
- package/dist/esm/hooks/use-scroll-to-error-ref.js +12 -12
- package/dist/esm/hooks/use-scroll-to-error-ref.js.map +1 -1
- package/dist/esm/styles.global.css +1 -1
- package/dist/esm/types/controlled-input.js +2 -0
- package/dist/esm/types/controlled-input.js.map +1 -0
- package/dist/types/components/address/form-address.d.ts.map +1 -1
- package/dist/types/components/address/input/address-input.st.css.d.ts.map +1 -1
- package/dist/types/components/audio/actions/actions-menu/actions-menu.st.css.d.ts.map +1 -1
- package/dist/types/components/audio/audio-field/form-audio-field.st.css.d.ts.map +1 -1
- package/dist/types/components/audio/audio-field/form-audio.d.ts.map +1 -1
- package/dist/types/components/boolean/form-checkbox-input.d.ts +7 -0
- package/dist/types/components/boolean/form-checkbox-input.d.ts.map +1 -0
- package/dist/types/components/boolean/form-checkbox.d.ts.map +1 -1
- package/dist/types/components/boolean/index.d.ts +1 -0
- package/dist/types/components/boolean/index.d.ts.map +1 -1
- package/dist/types/components/color-view/color-input.d.ts.map +1 -1
- package/dist/types/components/color-view/form-color.driver.d.ts +5 -15
- package/dist/types/components/color-view/form-color.driver.d.ts.map +1 -1
- package/dist/types/components/controlled-input.driver.d.ts +502 -0
- package/dist/types/components/controlled-input.driver.d.ts.map +1 -0
- package/dist/types/components/datetime-input/form-date-time.driver.d.ts +1 -0
- package/dist/types/components/datetime-input/form-date-time.driver.d.ts.map +1 -1
- package/dist/types/components/document/form-document.d.ts.map +1 -1
- package/dist/types/components/image/form-image-input.d.ts.map +1 -1
- package/dist/types/components/image/thumbnail-replace-overlay.st.css.d.ts.map +1 -1
- package/dist/types/components/media-control/cell-media-edit-shell.st.css.d.ts.map +1 -1
- package/dist/types/components/media-control/paste-url-button.st.css.d.ts.map +1 -1
- package/dist/types/components/media-gallery/form-media-gallery.d.ts.map +1 -1
- package/dist/types/components/media-loader/media-loader.st.css.d.ts.map +1 -1
- package/dist/types/components/multi-document/multi-document-input/form-multi-document.d.ts.map +1 -1
- package/dist/types/components/multi-document/multi-document-input/form-multi-document.st.css.d.ts.map +1 -1
- package/dist/types/components/number-input/form-number-input.d.ts +9 -0
- package/dist/types/components/number-input/form-number-input.d.ts.map +1 -0
- package/dist/types/components/number-input/form-number.d.ts.map +1 -1
- package/dist/types/components/number-input/index.d.ts +1 -0
- package/dist/types/components/number-input/index.d.ts.map +1 -1
- package/dist/types/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.d.ts +7 -3
- package/dist/types/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.d.ts.map +1 -1
- 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
- package/dist/types/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.d.ts.map +1 -1
- package/dist/types/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.d.ts.map +1 -1
- package/dist/types/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.d.ts +16 -8
- package/dist/types/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.d.ts.map +1 -1
- package/dist/types/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.d.ts.map +1 -1
- package/dist/types/components/text/form-short-text-input.d.ts +15 -0
- package/dist/types/components/text/form-short-text-input.d.ts.map +1 -0
- package/dist/types/components/text/form-short-text.d.ts.map +1 -1
- package/dist/types/components/text/form-short-text.driver.d.ts +1 -0
- package/dist/types/components/text/form-short-text.driver.d.ts.map +1 -1
- package/dist/types/components/text/index.d.ts +1 -0
- package/dist/types/components/text/index.d.ts.map +1 -1
- package/dist/types/components/text/text-view.st.css.d.ts.map +1 -1
- package/dist/types/components/time-input/form-time.d.ts.map +1 -1
- package/dist/types/components/url/form-url-input.d.ts +8 -0
- package/dist/types/components/url/form-url-input.d.ts.map +1 -0
- package/dist/types/components/url/form-url.d.ts.map +1 -1
- package/dist/types/components/url/index.d.ts +1 -0
- package/dist/types/components/url/index.d.ts.map +1 -1
- package/dist/types/components/video/form-video.d.ts.map +1 -1
- package/dist/types/exports/unidriver.d.ts +1 -0
- package/dist/types/exports/unidriver.d.ts.map +1 -1
- package/dist/types/hooks/index.d.ts +1 -0
- package/dist/types/hooks/index.d.ts.map +1 -1
- package/dist/types/hooks/use-field-ref.d.ts +36 -0
- package/dist/types/hooks/use-field-ref.d.ts.map +1 -0
- package/dist/types/hooks/use-scroll-to-error-ref.d.ts +5 -5
- package/dist/types/hooks/use-scroll-to-error-ref.d.ts.map +1 -1
- package/dist/types/types/controlled-input.d.ts +10 -0
- package/dist/types/types/controlled-input.d.ts.map +1 -0
- package/package.json +4 -4
- package/src/__tests__/components/color-view/form-color.spec.tsx +46 -3
- package/src/__tests__/components/rich-editors-border.spec.ts +45 -0
- package/src/__tests__/components/text/form-short-text.spec.tsx +18 -0
- package/src/__tests__/exports/controlled-inputs.spec.tsx +138 -0
- package/src/__tests__/hooks/use-field-ref.spec.tsx +132 -0
- package/src/components/address/form-address.tsx +4 -1
- package/src/components/address/input/address-input.st.css.ts +2 -2
- package/src/components/audio/actions/actions-menu/actions-menu.st.css.ts +2 -2
- package/src/components/audio/audio-field/form-audio-field.st.css.ts +2 -2
- package/src/components/audio/audio-field/form-audio.tsx +4 -1
- package/src/components/audio/audio-player/audio-player.st.css.ts +2 -2
- package/src/components/boolean/form-checkbox-input.tsx +40 -0
- package/src/components/boolean/form-checkbox.tsx +6 -7
- package/src/components/boolean/index.ts +1 -0
- package/src/components/color-view/cell-color-view.st.css.ts +2 -2
- package/src/components/color-view/color-input.tsx +13 -2
- package/src/components/color-view/color-view.st.css.ts +2 -2
- package/src/components/color-view/form-color.driver.ts +8 -2
- package/src/components/controlled-input.driver.ts +19 -0
- package/src/components/datetime-input/form-date-time.driver.ts +3 -0
- package/src/components/datetime-input/form-date-time.tsx +1 -1
- package/src/components/delete-dialog/delete-dialog.st.css.ts +2 -2
- package/src/components/document/form-document-field.st.css.ts +2 -2
- package/src/components/document/form-document.tsx +4 -1
- package/src/components/exclamation/exclamation.st.css.ts +2 -2
- package/src/components/highlighted-text/highlighted-text.st.css.ts +3 -3
- package/src/components/image/form-image-input.tsx +4 -1
- package/src/components/image/thumbnail-replace-overlay.st.css.ts +2 -2
- package/src/components/media-control/cell-media-edit-shell.st.css.ts +2 -2
- package/src/components/media-control/paste-url-button.st.css.ts +2 -2
- package/src/components/media-gallery/form-media-gallery-field.st.css.ts +2 -2
- package/src/components/media-gallery/form-media-gallery.tsx +4 -1
- package/src/components/media-image/media-image.st.css.ts +3 -3
- package/src/components/media-image/overlays/overlay.st.css.ts +2 -2
- package/src/components/media-loader/media-loader.st.css.ts +2 -2
- package/src/components/media-tag/web-media-tag/media-tag.st.css.ts +2 -2
- package/src/components/multi-document/cell-multi-document-edit.st.css.ts +2 -2
- package/src/components/multi-document/multi-document-input/form-multi-document.st.css.ts +2 -2
- package/src/components/multi-document/multi-document-input/form-multi-document.tsx +4 -1
- package/src/components/number-input/form-number-input.tsx +37 -0
- package/src/components/number-input/form-number.tsx +6 -4
- package/src/components/number-input/index.ts +1 -0
- package/src/components/reference/cell-multi-reference-input.st.css.ts +2 -2
- package/src/components/reference/cell-reference-input.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css +15 -7
- package/src/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.ts +3 -3
- package/src/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.ts +2 -2
- package/src/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.ts +2 -2
- package/src/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css +32 -19
- package/src/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.ts +3 -3
- package/src/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.ts +2 -2
- package/src/components/text/form-short-text-input.tsx +121 -0
- package/src/components/text/form-short-text.driver.ts +4 -0
- package/src/components/text/form-short-text.tsx +20 -108
- package/src/components/text/index.ts +1 -0
- package/src/components/text/text-view.st.css.ts +2 -2
- package/src/components/time-input/form-time.tsx +9 -3
- package/src/components/url/form-url-input.tsx +42 -0
- package/src/components/url/form-url.tsx +7 -11
- package/src/components/url/index.ts +1 -0
- package/src/components/video/form-video.tsx +4 -2
- package/src/exports/unidriver.ts +1 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/pr-5746-kobiburnley-comments.md +54 -0
- package/src/hooks/use-field-ref.ts +65 -0
- package/src/hooks/use-scroll-to-error-ref.ts +15 -10
- package/src/styles.global.css +1 -1
- package/src/types/controlled-input.ts +9 -0
package/src/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../../stylable-esm-runtime.
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var _namespace_ = "
|
|
8
|
+
var _namespace_ = "richtexteditor1211455191";
|
|
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":"
|
|
16
|
+
export var classes = {"root":"richtexteditor1211455191__root","nativeInput":"richtexteditor1211455191__nativeInput","editor":"richtexteditor1211455191__editor"};
|
|
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-
|
|
21
|
+
export var vars = {"wds-input-border-color":"--wds-input-border-color","wds-input-border-color-focus":"--wds-input-border-color-focus","wds-input-shadow-focus-standard":"--wds-input-shadow-focus-standard","wds-input-shadow-focus-destructive":"--wds-input-shadow-focus-destructive","wds-input-shadow-focus-warning":"--wds-input-shadow-focus-warning","wds-input-border-radius-default-medium":"--wds-input-border-radius-default-medium","wds-color-border-destructive-secondary-active":"--wds-color-border-destructive-secondary-active","wds-color-border-warning-secondary-active":"--wds-color-border-warning-secondary-active","wsr-color-B10":"--wsr-color-B10","wsr-color-B40":"--wsr-color-B40","wsr-color-R10":"--wsr-color-R10","wsr-color-R40":"--wsr-color-R40","wsr-color-Y10":"--wsr-color-Y10","wsr-color-Y40":"--wsr-color-Y40","wsr-color-F00":"--wsr-color-F00","wsr-border-radius-06":"--wsr-border-radius-06","wds-color-black-700":"--wds-color-black-700"};
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
|
|
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../../../stylable-esm-runti
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var _namespace_ = "
|
|
8
|
+
var _namespace_ = "toolbar904415871";
|
|
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":"
|
|
16
|
+
export var classes = {"root":"toolbar904415871__root","item":"toolbar904415871__item","separator":"toolbar904415871__separator","clearFormatting":"toolbar904415871__clearFormatting","fullScreen":"toolbar904415871__fullScreen","dropdownItemContent":"toolbar904415871__dropdownItemContent","dropdownItemTitle":"toolbar904415871__dropdownItemTitle","dropdownItemSubtitle":"toolbar904415871__dropdownItemSubtitle","dropdownHeaderOne":"toolbar904415871__dropdownHeaderOne","dropdownHeaderTwo":"toolbar904415871__dropdownHeaderTwo","dropdownHeaderThree":"toolbar904415871__dropdownHeaderThree","dropdownHeaderFour":"toolbar904415871__dropdownHeaderFour","dropdownHeaderFive":"toolbar904415871__dropdownHeaderFive","dropdownHeaderSix":"toolbar904415871__dropdownHeaderSix","dropdownParagraphOne":"toolbar904415871__dropdownParagraphOne","dropdownNormalText":"toolbar904415871__dropdownNormalText","dropdownParagraphThree":"toolbar904415871__dropdownParagraphThree"};
|
|
17
17
|
export var keyframes = {};
|
|
18
18
|
export var layers = {};
|
|
19
19
|
export var containers = {};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import React, { useCallback, useMemo, useState } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
AutoComplete,
|
|
4
|
+
Input,
|
|
5
|
+
listItemSelectBuilder,
|
|
6
|
+
type DropdownLayoutValueOption,
|
|
7
|
+
} from '@wix/design-system';
|
|
8
|
+
|
|
9
|
+
import type { ControlledInputProps } from '../../types/controlled-input';
|
|
10
|
+
|
|
11
|
+
export interface FormShortTextOption {
|
|
12
|
+
id: string;
|
|
13
|
+
value: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface FormShortTextInputProps extends ControlledInputProps<string> {
|
|
17
|
+
options?: FormShortTextOption[];
|
|
18
|
+
required?: boolean;
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
emptyStateMessage?: string;
|
|
21
|
+
inputRef?: React.Ref<HTMLInputElement>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const FormShortTextInput: React.FC<FormShortTextInputProps> = ({
|
|
25
|
+
data,
|
|
26
|
+
onChange,
|
|
27
|
+
onBlur,
|
|
28
|
+
readOnly,
|
|
29
|
+
autoFocus,
|
|
30
|
+
invalid,
|
|
31
|
+
dataHook,
|
|
32
|
+
options,
|
|
33
|
+
required,
|
|
34
|
+
placeholder,
|
|
35
|
+
emptyStateMessage,
|
|
36
|
+
inputRef,
|
|
37
|
+
}) => {
|
|
38
|
+
const [searchValue, setSearchValue] = useState<string>();
|
|
39
|
+
const selectedOption = options?.find((option) => option.id === data);
|
|
40
|
+
const selectedId = selectedOption?.id;
|
|
41
|
+
const displayValue = searchValue ?? selectedOption?.value ?? data;
|
|
42
|
+
|
|
43
|
+
const dropdownOptions = useMemo(() => {
|
|
44
|
+
const source = searchValue
|
|
45
|
+
? options?.filter((option) =>
|
|
46
|
+
option.value.toLowerCase().includes(searchValue.toLowerCase()),
|
|
47
|
+
)
|
|
48
|
+
: options;
|
|
49
|
+
return (source ?? []).map((option) =>
|
|
50
|
+
listItemSelectBuilder({
|
|
51
|
+
id: option.id,
|
|
52
|
+
title: option.value,
|
|
53
|
+
selected: option.id === selectedId,
|
|
54
|
+
}),
|
|
55
|
+
);
|
|
56
|
+
}, [options, searchValue, selectedId]);
|
|
57
|
+
|
|
58
|
+
const handleSelect = useCallback(
|
|
59
|
+
(option: DropdownLayoutValueOption) => {
|
|
60
|
+
onChange(String(option.id));
|
|
61
|
+
setSearchValue(undefined);
|
|
62
|
+
},
|
|
63
|
+
[onChange],
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
const handleSearch = useCallback(
|
|
67
|
+
(event: React.ChangeEvent<HTMLInputElement>) => {
|
|
68
|
+
setSearchValue(event.target.value);
|
|
69
|
+
if (!event.target.value) {
|
|
70
|
+
onChange('');
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
[onChange],
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const handleBlur = useCallback(() => {
|
|
77
|
+
setSearchValue(undefined);
|
|
78
|
+
onBlur?.();
|
|
79
|
+
}, [onBlur]);
|
|
80
|
+
|
|
81
|
+
if (!options?.length) {
|
|
82
|
+
return (
|
|
83
|
+
<Input
|
|
84
|
+
value={data}
|
|
85
|
+
onChange={(event) => onChange(event.target.value)}
|
|
86
|
+
onBlur={onBlur}
|
|
87
|
+
readOnly={readOnly}
|
|
88
|
+
autoFocus={autoFocus}
|
|
89
|
+
status={invalid ? 'error' : undefined}
|
|
90
|
+
inputRef={inputRef}
|
|
91
|
+
placeholder={placeholder}
|
|
92
|
+
dataHook={dataHook}
|
|
93
|
+
/>
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return (
|
|
98
|
+
<AutoComplete
|
|
99
|
+
value={displayValue}
|
|
100
|
+
selectedId={selectedId}
|
|
101
|
+
options={dropdownOptions}
|
|
102
|
+
onSelect={handleSelect}
|
|
103
|
+
onChange={handleSearch}
|
|
104
|
+
onClear={() => {
|
|
105
|
+
onChange('');
|
|
106
|
+
setSearchValue(undefined);
|
|
107
|
+
}}
|
|
108
|
+
onBlur={handleBlur}
|
|
109
|
+
disabled={readOnly}
|
|
110
|
+
autoFocus={autoFocus}
|
|
111
|
+
status={invalid ? 'error' : undefined}
|
|
112
|
+
clearButton={!required}
|
|
113
|
+
placeholder={placeholder}
|
|
114
|
+
emptyStateMessage={emptyStateMessage}
|
|
115
|
+
inputRef={inputRef}
|
|
116
|
+
dataHook={dataHook}
|
|
117
|
+
/>
|
|
118
|
+
);
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
FormShortTextInput.displayName = 'FormShortTextInput';
|
|
@@ -29,6 +29,10 @@ export function FormShortTextDriver(
|
|
|
29
29
|
hasSpecificValues
|
|
30
30
|
? autocomplete.inputDriver.getValue()
|
|
31
31
|
: input.getValue(),
|
|
32
|
+
getPlaceholder: async () =>
|
|
33
|
+
hasSpecificValues
|
|
34
|
+
? autocomplete.inputDriver.getPlaceholder()
|
|
35
|
+
: input.getPlaceholder(),
|
|
32
36
|
enterText: async (value: string) =>
|
|
33
37
|
hasSpecificValues
|
|
34
38
|
? autocomplete.inputDriver.enterText(value)
|
|
@@ -1,19 +1,13 @@
|
|
|
1
|
-
import React
|
|
2
|
-
import {
|
|
3
|
-
AutoComplete,
|
|
4
|
-
FormField,
|
|
5
|
-
Input,
|
|
6
|
-
listItemSelectBuilder,
|
|
7
|
-
type DropdownLayoutValueOption,
|
|
8
|
-
} from '@wix/design-system';
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { FormField } from '@wix/design-system';
|
|
9
3
|
import { observer } from 'mobx-react-lite';
|
|
10
|
-
import type { Field, SpecificValue } from '@wix/bex-core';
|
|
11
4
|
import { useWixPatternsContainer } from '@wix/bex-core/react';
|
|
12
5
|
import { useController } from '@wix/bex-core/form';
|
|
13
6
|
|
|
14
7
|
import { BaseInputProps } from '../../types/base-input';
|
|
15
8
|
import { isEmpty, isLongerThan, isShorterThan } from '../../validations/string';
|
|
16
9
|
import { useTranslations } from '../../hooks/use-translations';
|
|
10
|
+
import { FormShortTextInput } from './form-short-text-input';
|
|
17
11
|
|
|
18
12
|
export interface FormShortTextProps extends BaseInputProps<string> {}
|
|
19
13
|
|
|
@@ -24,6 +18,7 @@ const _FormShortText = (props: FormShortTextProps) => {
|
|
|
24
18
|
const { field, dataHook, formControl, data } = props;
|
|
25
19
|
|
|
26
20
|
const { translate: t } = useWixPatternsContainer();
|
|
21
|
+
const { t: tf } = useTranslations();
|
|
27
22
|
|
|
28
23
|
const stringLengthRange = field.validation?.stringLengthRange;
|
|
29
24
|
const minLength = stringLengthRange?.minLength;
|
|
@@ -78,107 +73,24 @@ const _FormShortText = (props: FormShortTextProps) => {
|
|
|
78
73
|
statusMessage={controller.fieldState.error?.message}
|
|
79
74
|
dataHook={dataHook}
|
|
80
75
|
>
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
76
|
+
<FormShortTextInput
|
|
77
|
+
data={controller.field.value ?? ''}
|
|
78
|
+
onChange={controller.field.onChange}
|
|
79
|
+
onBlur={controller.field.onBlur}
|
|
80
|
+
options={specificValues}
|
|
81
|
+
required={field.validation?.required}
|
|
82
|
+
invalid={Boolean(controller.fieldState.error)}
|
|
83
|
+
placeholder={
|
|
84
|
+
specificValues?.length
|
|
85
|
+
? tf('auto-patterns.fields.select_placeholder')
|
|
86
|
+
: undefined
|
|
87
|
+
}
|
|
88
|
+
emptyStateMessage={tf('auto-patterns.fields.no_results_found')}
|
|
89
|
+
inputRef={controller.field.ref}
|
|
90
|
+
dataHook={`short-text-${field.id}`}
|
|
91
|
+
/>
|
|
96
92
|
</FormField>
|
|
97
93
|
);
|
|
98
94
|
};
|
|
99
95
|
|
|
100
|
-
type ShortTextController = ReturnType<typeof useController>;
|
|
101
|
-
|
|
102
|
-
interface ShortTextSpecificValuesProps {
|
|
103
|
-
field: Field;
|
|
104
|
-
controller: ShortTextController;
|
|
105
|
-
specificValues: SpecificValue[];
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const ShortTextSpecificValues = ({
|
|
109
|
-
field,
|
|
110
|
-
controller,
|
|
111
|
-
specificValues,
|
|
112
|
-
}: ShortTextSpecificValuesProps) => {
|
|
113
|
-
const { t: tf } = useTranslations();
|
|
114
|
-
const [searchValue, setSearchValue] = useState<string>();
|
|
115
|
-
const selectedOption = specificValues.find(
|
|
116
|
-
(option) => option.id === controller.field.value,
|
|
117
|
-
);
|
|
118
|
-
const selectedId = selectedOption ? selectedOption.id : undefined;
|
|
119
|
-
const displayValue =
|
|
120
|
-
searchValue ?? selectedOption?.value ?? controller.field.value ?? '';
|
|
121
|
-
|
|
122
|
-
const options = useMemo(() => {
|
|
123
|
-
const source = searchValue
|
|
124
|
-
? specificValues.filter((option) =>
|
|
125
|
-
option.value.toLowerCase().includes(searchValue.toLowerCase()),
|
|
126
|
-
)
|
|
127
|
-
: specificValues;
|
|
128
|
-
return source.map((option) =>
|
|
129
|
-
listItemSelectBuilder({
|
|
130
|
-
id: option.id,
|
|
131
|
-
title: option.value,
|
|
132
|
-
selected: option.id === selectedId,
|
|
133
|
-
}),
|
|
134
|
-
);
|
|
135
|
-
}, [searchValue, specificValues, selectedId]);
|
|
136
|
-
|
|
137
|
-
const handleSelect = useCallback(
|
|
138
|
-
(option: DropdownLayoutValueOption) => {
|
|
139
|
-
const id = String(option.id);
|
|
140
|
-
controller.field.onChange(id);
|
|
141
|
-
setSearchValue(undefined);
|
|
142
|
-
},
|
|
143
|
-
[controller.field],
|
|
144
|
-
);
|
|
145
|
-
|
|
146
|
-
const handleSearch = useCallback(
|
|
147
|
-
(e: React.ChangeEvent<HTMLInputElement>) => {
|
|
148
|
-
setSearchValue(e.target.value);
|
|
149
|
-
if (!e.target.value) {
|
|
150
|
-
controller.field.onChange('');
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
[controller.field],
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
const handleClear = useCallback(() => {
|
|
157
|
-
controller.field.onChange('');
|
|
158
|
-
setSearchValue(undefined);
|
|
159
|
-
}, [controller.field]);
|
|
160
|
-
|
|
161
|
-
const handleBlur = useCallback(() => {
|
|
162
|
-
setSearchValue(undefined);
|
|
163
|
-
controller.field.onBlur();
|
|
164
|
-
}, [controller.field]);
|
|
165
|
-
|
|
166
|
-
return (
|
|
167
|
-
<AutoComplete
|
|
168
|
-
value={displayValue}
|
|
169
|
-
selectedId={selectedId}
|
|
170
|
-
options={options}
|
|
171
|
-
onSelect={handleSelect}
|
|
172
|
-
onChange={handleSearch}
|
|
173
|
-
onClear={handleClear}
|
|
174
|
-
onBlur={handleBlur}
|
|
175
|
-
clearButton={!field.validation?.required}
|
|
176
|
-
placeholder={tf('auto-patterns.fields.select_placeholder')}
|
|
177
|
-
emptyStateMessage={tf('auto-patterns.fields.no_results_found')}
|
|
178
|
-
inputRef={controller.field.ref}
|
|
179
|
-
dataHook={`short-text-${field.id}`}
|
|
180
|
-
/>
|
|
181
|
-
);
|
|
182
|
-
};
|
|
183
|
-
|
|
184
96
|
export const FormShortText = observer(_FormShortText);
|
|
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var _namespace_ = "
|
|
8
|
+
var _namespace_ = "textview3886369445";
|
|
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":"
|
|
16
|
+
export var classes = {"root":"textview3886369445__root","textView":"textview3886369445__textView"};
|
|
17
17
|
export var keyframes = {};
|
|
18
18
|
export var layers = {};
|
|
19
19
|
export var containers = {};
|
|
@@ -6,7 +6,7 @@ import { useWixPatternsContainer } from '@wix/bex-core/react';
|
|
|
6
6
|
import { useController } from '@wix/bex-core/form';
|
|
7
7
|
|
|
8
8
|
import { BaseInputProps } from '../../types/base-input';
|
|
9
|
-
import { useTranslations } from '../../hooks';
|
|
9
|
+
import { fieldRefHandle, useTranslations } from '../../hooks';
|
|
10
10
|
import {
|
|
11
11
|
isDataValidOrNotSet,
|
|
12
12
|
timeValidation,
|
|
@@ -40,10 +40,16 @@ const _FormTime = (props: FormTimeProps) => {
|
|
|
40
40
|
|
|
41
41
|
// TimeInput has no DOM ref to hand to field.ref, so bridge its imperative
|
|
42
42
|
// focus() — lets react-hook-form's shouldFocusError scroll to this field
|
|
43
|
-
// when it blocks save.
|
|
43
|
+
// when it blocks save. TimeInputImperativeActions has no select(), so the
|
|
44
|
+
// handle absorbs the calls react-hook-form makes beyond focus.
|
|
44
45
|
const timeRef = useRef<TimeInputImperativeActions>(null);
|
|
45
46
|
useEffect(() => {
|
|
46
|
-
controller.field.ref(
|
|
47
|
+
controller.field.ref(
|
|
48
|
+
fieldRefHandle(
|
|
49
|
+
() => timeRef.current?.focus(),
|
|
50
|
+
() => timeRef.current,
|
|
51
|
+
),
|
|
52
|
+
);
|
|
47
53
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
48
54
|
}, []);
|
|
49
55
|
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Input } from '@wix/design-system';
|
|
3
|
+
import { Link } from '@wix/wix-ui-icons-common/lazy';
|
|
4
|
+
|
|
5
|
+
import type { ControlledInputProps } from '../../types/controlled-input';
|
|
6
|
+
|
|
7
|
+
export interface FormUrlInputProps extends ControlledInputProps<string> {
|
|
8
|
+
inputRef?: React.Ref<HTMLInputElement>;
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const FormUrlInput: React.FC<FormUrlInputProps> = ({
|
|
13
|
+
data,
|
|
14
|
+
onChange,
|
|
15
|
+
onBlur,
|
|
16
|
+
readOnly,
|
|
17
|
+
autoFocus,
|
|
18
|
+
invalid,
|
|
19
|
+
dataHook,
|
|
20
|
+
inputRef,
|
|
21
|
+
placeholder,
|
|
22
|
+
}) => (
|
|
23
|
+
<Input
|
|
24
|
+
prefix={
|
|
25
|
+
<Input.IconAffix>
|
|
26
|
+
<Link />
|
|
27
|
+
</Input.IconAffix>
|
|
28
|
+
}
|
|
29
|
+
type="url"
|
|
30
|
+
value={data}
|
|
31
|
+
onChange={(event) => onChange(event.target.value)}
|
|
32
|
+
onBlur={onBlur}
|
|
33
|
+
readOnly={readOnly}
|
|
34
|
+
autoFocus={autoFocus}
|
|
35
|
+
status={invalid ? 'error' : undefined}
|
|
36
|
+
inputRef={inputRef}
|
|
37
|
+
placeholder={placeholder}
|
|
38
|
+
dataHook={dataHook}
|
|
39
|
+
/>
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
FormUrlInput.displayName = 'FormUrlInput';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { FormField
|
|
2
|
+
import { FormField } from '@wix/design-system';
|
|
3
3
|
import { observer } from 'mobx-react-lite';
|
|
4
|
-
import { Link } from '@wix/wix-ui-icons-common/lazy';
|
|
5
4
|
import { useWixPatternsContainer } from '@wix/bex-core/react';
|
|
6
5
|
import { useController } from '@wix/bex-core/form';
|
|
7
6
|
|
|
8
7
|
import { BaseInputProps } from '../../types/base-input';
|
|
9
8
|
import { isEmpty } from '../../validations/string';
|
|
10
9
|
import { isValidUri } from '../../validations/url';
|
|
10
|
+
import { FormUrlInput } from './form-url-input';
|
|
11
11
|
|
|
12
12
|
export interface FormUrlProps extends BaseInputProps<string> {}
|
|
13
13
|
|
|
@@ -39,18 +39,14 @@ const _FormUrl = (props: FormUrlProps) => {
|
|
|
39
39
|
status={controller.fieldState.error ? 'error' : undefined}
|
|
40
40
|
statusMessage={controller.fieldState.error?.message}
|
|
41
41
|
>
|
|
42
|
-
<
|
|
43
|
-
prefix={
|
|
44
|
-
<Input.IconAffix>
|
|
45
|
-
<Link />
|
|
46
|
-
</Input.IconAffix>
|
|
47
|
-
}
|
|
42
|
+
<FormUrlInput
|
|
48
43
|
placeholder={t('cairo.customFields.url-input.placeholder')}
|
|
49
44
|
dataHook={`url-${field.id}`}
|
|
50
|
-
|
|
51
|
-
onChange={
|
|
45
|
+
data={controller.field.value ?? ''}
|
|
46
|
+
onChange={controller.field.onChange}
|
|
52
47
|
onBlur={controller.field.onBlur}
|
|
53
|
-
|
|
48
|
+
inputRef={controller.field.ref}
|
|
49
|
+
invalid={Boolean(controller.fieldState.error)}
|
|
54
50
|
/>
|
|
55
51
|
</FormField>
|
|
56
52
|
);
|
|
@@ -22,7 +22,7 @@ import { observer } from 'mobx-react-lite';
|
|
|
22
22
|
import { useIsMobile, useWixPatternsContainer } from '@wix/bex-core/react';
|
|
23
23
|
import { useController } from '@wix/bex-core/form';
|
|
24
24
|
import { BaseInputProps } from '../../types/base-input';
|
|
25
|
-
import { useTranslations } from '../../hooks';
|
|
25
|
+
import { useFieldRef, useTranslations } from '../../hooks';
|
|
26
26
|
import { isEmpty } from '../../validations/string';
|
|
27
27
|
import { isDataValidOrNotSet } from '../../validations/validations';
|
|
28
28
|
import * as videoValidation from '../../validations/video';
|
|
@@ -64,6 +64,8 @@ const _FormVideo = (props: FormVideoProps) => {
|
|
|
64
64
|
},
|
|
65
65
|
});
|
|
66
66
|
|
|
67
|
+
const setFieldRef = useFieldRef(controller.field.ref);
|
|
68
|
+
|
|
67
69
|
async function openMedia() {
|
|
68
70
|
if (!openMediaManager) return;
|
|
69
71
|
try {
|
|
@@ -204,7 +206,7 @@ const _FormVideo = (props: FormVideoProps) => {
|
|
|
204
206
|
<ImageViewer
|
|
205
207
|
// Only the empty state can fail `required`, so the add button is
|
|
206
208
|
// always the right target for react-hook-form's shouldFocusError.
|
|
207
|
-
ref={
|
|
209
|
+
ref={setFieldRef}
|
|
208
210
|
dataHook={`video-${field.id}`}
|
|
209
211
|
onAddImage={isMobile ? undefined : () => openMedia()}
|
|
210
212
|
addImageInfo={t('auto-patterns.fields.add_video_tooltip')}
|
package/src/exports/unidriver.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { FormMediaGalleryFieldUniDriver } from '../components/media-gallery/form-media-gallery-field.uni.driver';
|
|
2
2
|
export { ColorViewUniDriver } from '../components/color-view/color-view.uni.driver';
|
|
3
|
+
export { ControlledInputUniDriver } from '../components/controlled-input.driver';
|
package/src/hooks/index.ts
CHANGED
|
@@ -7,5 +7,6 @@ export * from './use-translations';
|
|
|
7
7
|
export * from './use-with-callback';
|
|
8
8
|
export * from './use-resize-effect';
|
|
9
9
|
export * from './use-cell-edit-keyboard';
|
|
10
|
+
export * from './use-field-ref';
|
|
10
11
|
export * from './use-merged-ref';
|
|
11
12
|
export * from './use-scroll-to-error-ref';
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# PR #5746 — kobiburnley review
|
|
2
|
+
|
|
3
|
+
[fix(fields): register a field ref that answers every call react-hook-form makes](https://github.com/wix-private/cairo/pull/5746)
|
|
4
|
+
|
|
5
|
+
> **Verdict: Request changes** — 1 blocker. (Posted as a comment review because GitHub will not let the
|
|
6
|
+
> author formally request changes on their own PR.)
|
|
7
|
+
>
|
|
8
|
+
> The diagnosis is right, and I checked it against the installed `react-hook-form` (7.56.4) rather than
|
|
9
|
+
> taking it on trust […] `fieldRefHandle` / `useFieldRef` are a clean way to close it […] I also confirmed
|
|
10
|
+
> the integration test is a real guard, not decoration.
|
|
11
|
+
>
|
|
12
|
+
> One blocker: the audit missed a call site with exactly the shape the helper exists for.
|
|
13
|
+
>
|
|
14
|
+
> — [pullrequestreview-5002194499](https://github.com/wix-private/cairo/pull/5746#pullrequestreview-5002194499)
|
|
15
|
+
|
|
16
|
+
All claims below were checked against the branch before being written down. Every one holds.
|
|
17
|
+
|
|
18
|
+
| # | Comment link | Description | Severity | Status | Resolution recommendation |
|
|
19
|
+
|---|---|---|---|---|---|
|
|
20
|
+
| 1 | [discussion_r3838295772](https://github.com/wix-private/cairo/pull/5746#discussion_r3838295772) — `packages/fields/src/components/time-input/form-time.tsx:46` | `form-time` registers a hand-rolled focus-only object, `controller.field.ref({ focus: () => timeRef.current?.focus() })`. Exactly the shape the helper exists for, missed by the audit, so it ships still broken while the PR reads as closing the trap. | Blocker | done | Fixed in `23dc894` — wrapped with `fieldRefHandle` as suggested. Missed originally because `form-time` calls `controller.field.ref(...)` directly in a `useEffect`, so the `inputRef=`/`ref=` grep never matched it. Covered by the table-driven `setFocus` guard. |
|
|
21
|
+
| 2 | [review summary](https://github.com/wix-private/cairo/pull/5746#pullrequestreview-5002194499) | PR body claims "audited all nine that register directly"; there are ~23 `controller.field.ref` sites. The 7 passing `ref=` to a WDS `Input`/`InputArea` get `InputImperativeActions`, which has `select` but no `setCustomValidity`/`reportValidity` — so the `shouldUseNativeValidation` half stays open in `form-url`, `form-email`, `form-short-text` (Input branch), `form-long-text`, `form-color`, `form-array`, `form-object`. | Major (accuracy) | done | PR description rewritten with the full 23-site table. `InputImperativeActions` confirmed as `{ focus, blur, select, setSelectionRange, clear, input }`. The `shouldUseNativeValidation` gap in the 7 `ref=`-on-`Input` sites is left open and stated as a follow-up rather than implied fixed. |
|
|
22
|
+
| 3 | [review summary](https://github.com/wix-private/cairo/pull/5746#pullrequestreview-5002194499) | Fix it once in `packages/core` instead. `packages/core/src/exports/form.ts` is `export * from 'react-hook-form'`, so core owns the entry point; a `useController` there installing the safe handle would cover all sites and every future one, making `useFieldRef` and the seven adopting edits unnecessary. As it stands the fix is opt-in — which is how `form-time` got missed. | Major (design) | dismiss | Not implemented; kept per-site by decision. Rationale recorded in the PR reply: core's `exports/form.ts` is a bare re-export, so wrapping `useController` there would turn it into real implementation and change behaviour for every consumer of `@wix/bex-core/form`, not just Cairo renderers. Filed as a follow-up — if it lands, `useFieldRef` and all adopting edits should be deleted and the `Input` group closes for free. |
|
|
23
|
+
| 4 | [review summary](https://github.com/wix-private/cairo/pull/5746#pullrequestreview-5002194499) | The same 3-line comment is copy-pasted verbatim into seven files; the `fieldRefHandle` docblock already says it, and `AGENTS.md` asks for a comment only when it tells the reader something the code cannot. | Nit | done | Removed from all seven files in `b64bfc4`. |
|
|
24
|
+
| 5 | [review summary](https://github.com/wix-private/cairo/pull/5746#pullrequestreview-5002194499) | `useFieldRef`'s type parameter `T` appears only in the return type, so every call site infers `FieldControl` and the annotation buys nothing. | Minor | done | `T` dropped in `a51e9c6`; takes and returns `FieldControl`. |
|
|
25
|
+
| 6 | [review summary](https://github.com/wix-private/cairo/pull/5746#pullrequestreview-5002194499) | Lint is not clean: `use-field-ref.ts:56` trips `prettier/prettier`. | Minor | done | Fixed in `c6406f6`. Root cause of the false "clean" report: all changed files were passed as one joined argument, so eslint matched nothing. Re-verified one file at a time. `form-video.tsx:73` `curly` warning remains but is unchanged from master. |
|
|
26
|
+
| 7 | [review summary](https://github.com/wix-private/cairo/pull/5746#pullrequestreview-5002194499) | Only `form-address` has an integration guard; the other six conversions would not notice a revert. | Test gap | done | Fixed in `94baa17`. Table-driven over one renderer per control shape: address, time, `FormDocument` (`AddItemActions`, shared with audio/multi-document/media-gallery), `FormImageInput` (`ImageViewer`, shared with video). Each verified failing via `git checkout origin/master -- <file>` — note `git checkout -- <file>` restores from HEAD and silently proves nothing once the change is committed. |
|
|
27
|
+
| 8 | [review summary](https://github.com/wix-private/cairo/pull/5746#pullrequestreview-5002194499) | In `EntityPageCustomField`, the new `control` closure and the `focus` callback each resolve consumer-then-`querySelector` separately; not wrong (focus needs `scrollIntoView` between the steps) but they will drift. | Nit | done | Fixed in `91147ff`. Both paths read one `control()`. The identity check I first wrote was also wrong, not just duplicative: with nothing focusable, `target` and `consumerRef.current` were both `null`, so it skipped the scroll in exactly the case needing it. Now keyed off `!consumerRef.current`. |
|
|
28
|
+
|
|
29
|
+
## Notes
|
|
30
|
+
|
|
31
|
+
- #3 is the pivot. If the fix moves into core's `useController`, then #1, #2, #4, #5 and #7 mostly evaporate and this
|
|
32
|
+
PR shrinks to deleting `useFieldRef` and reverting the seven adopting edits. Worth settling before spending
|
|
33
|
+
effort on the others.
|
|
34
|
+
- #1 is a blocker on its own terms and is a one-line fix either way, since `form-time` is broken today
|
|
35
|
+
regardless of which mechanism wins.
|
|
36
|
+
- The reviewer independently reproduced the address integration test (revert → `1 failed, 3 passed`), so the
|
|
37
|
+
guard is trusted; the gap is coverage of the other six (#7), not the approach.
|
|
38
|
+
|
|
39
|
+
## Outcome
|
|
40
|
+
|
|
41
|
+
All eight resolved: seven fixed, one (row 3) dismissed with rationale. Commits on `fix/delegating-field-ref`,
|
|
42
|
+
all pushed:
|
|
43
|
+
|
|
44
|
+
| Commit | Row |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `23dc894` fix(TimeInput): give form-time a field ref that answers every call | 1 |
|
|
47
|
+
| `c6406f6` style(fields): format the fieldRefHandle call in useFieldRef | 6 |
|
|
48
|
+
| `a51e9c6` refactor(fields): drop useFieldRef's unusable type parameter | 5 |
|
|
49
|
+
| `b64bfc4` refactor(fields): drop the repeated useFieldRef comment | 4 |
|
|
50
|
+
| `91147ff` refactor(EntityPageCustomField): resolve the control once | 8 |
|
|
51
|
+
| `94baa17` test(fields): guard the other converted renderers against setFocus | 7 |
|
|
52
|
+
|
|
53
|
+
Row 2 was a PR-description correction, not code. Row 3 answered in
|
|
54
|
+
[issuecomment-5385655358](https://github.com/wix-private/cairo/pull/5746#issuecomment-5385655358).
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { MutableRefObject } from 'react';
|
|
2
|
+
import { useCallback, useRef } from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* What a field's control may offer react-hook-form. A real input has all of
|
|
6
|
+
* it; a component handle usually has only `focus`.
|
|
7
|
+
*/
|
|
8
|
+
export interface FieldControl {
|
|
9
|
+
focus?: () => void;
|
|
10
|
+
select?: () => void;
|
|
11
|
+
setCustomValidity?: (message: string) => void;
|
|
12
|
+
reportValidity?: () => boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Handle to register with react-hook-form, covering every method it may call.
|
|
17
|
+
*
|
|
18
|
+
* `useController` rewrites whatever is registered into
|
|
19
|
+
* `{ focus, select, setCustomValidity, reportValidity }` and calls all four
|
|
20
|
+
* through to the target. The guards check that wrapper rather than the target,
|
|
21
|
+
* so registering a control that only has `focus` makes `setFocus` with
|
|
22
|
+
* `shouldSelect`, or `shouldUseNativeValidation`, throw on the way to it.
|
|
23
|
+
*
|
|
24
|
+
* @param focus What to do when the field has to be reached.
|
|
25
|
+
* @param getControl The control the remaining calls go to, when there is one.
|
|
26
|
+
*/
|
|
27
|
+
export const fieldRefHandle = (
|
|
28
|
+
focus: () => void,
|
|
29
|
+
getControl: () => FieldControl | null | undefined,
|
|
30
|
+
) => ({
|
|
31
|
+
focus,
|
|
32
|
+
select: () => getControl()?.select?.(),
|
|
33
|
+
setCustomValidity: (message: string) =>
|
|
34
|
+
getControl()?.setCustomValidity?.(message),
|
|
35
|
+
reportValidity: () => getControl()?.reportValidity?.() ?? true,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Callback ref for a field's control. Pass it where the control lands and
|
|
40
|
+
* react-hook-form gets a handle that reaches it.
|
|
41
|
+
*
|
|
42
|
+
* @param registerRef `controller.field.ref` from useController.
|
|
43
|
+
*/
|
|
44
|
+
export const useFieldRef = (
|
|
45
|
+
registerRef: (instance: unknown) => void,
|
|
46
|
+
): ((instance: FieldControl | null) => void) => {
|
|
47
|
+
const control: MutableRefObject<FieldControl | null> =
|
|
48
|
+
useRef<FieldControl | null>(null);
|
|
49
|
+
|
|
50
|
+
return useCallback(
|
|
51
|
+
(instance: FieldControl | null) => {
|
|
52
|
+
control.current = instance;
|
|
53
|
+
if (!instance) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
registerRef(
|
|
57
|
+
fieldRefHandle(
|
|
58
|
+
() => control.current?.focus?.(),
|
|
59
|
+
() => control.current,
|
|
60
|
+
),
|
|
61
|
+
);
|
|
62
|
+
},
|
|
63
|
+
[registerRef],
|
|
64
|
+
);
|
|
65
|
+
};
|