@wordpress/components 19.13.0 → 19.14.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/CHANGELOG.md +38 -1
- package/build/alignment-matrix-control/utils.js +1 -7
- package/build/alignment-matrix-control/utils.js.map +1 -1
- package/build/autocomplete/autocompleter-ui.js +4 -2
- package/build/autocomplete/autocompleter-ui.js.map +1 -1
- package/build/autocomplete/autocompleter-ui.native.js +9 -3
- package/build/autocomplete/autocompleter-ui.native.js.map +1 -1
- package/build/autocomplete/index.js +4 -2
- package/build/autocomplete/index.js.map +1 -1
- package/build/border-box-control/border-box-control/component.js +2 -1
- package/build/border-box-control/border-box-control/component.js.map +1 -1
- package/build/border-box-control/border-box-control-split-controls/component.js +2 -1
- package/build/border-box-control/border-box-control-split-controls/component.js.map +1 -1
- package/build/border-control/border-control/component.js +40 -4
- package/build/border-control/border-control/component.js.map +1 -1
- package/build/box-control/utils.js +3 -3
- package/build/box-control/utils.js.map +1 -1
- package/build/color-indicator/index.js +27 -10
- package/build/color-indicator/index.js.map +1 -1
- package/build/color-indicator/types.js +6 -0
- package/build/color-indicator/types.js.map +1 -0
- package/build/color-palette/index.js +2 -1
- package/build/color-palette/index.js.map +1 -1
- package/build/color-picker/component.js +6 -9
- package/build/color-picker/component.js.map +1 -1
- package/build/color-picker/input-with-slider.js +1 -2
- package/build/color-picker/input-with-slider.js.map +1 -1
- package/build/color-picker/styles.js +34 -16
- package/build/color-picker/styles.js.map +1 -1
- package/build/custom-gradient-picker/index.js +8 -8
- package/build/custom-gradient-picker/index.js.map +1 -1
- package/build/custom-gradient-picker/index.native.js +8 -9
- package/build/custom-gradient-picker/index.native.js.map +1 -1
- package/build/custom-gradient-picker/serializer.js +4 -7
- package/build/custom-gradient-picker/serializer.js.map +1 -1
- package/build/date-time/date/index.js +3 -1
- package/build/date-time/date/index.js.map +1 -1
- package/build/date-time/date-time/index.js +3 -1
- package/build/date-time/date-time/index.js.map +1 -1
- package/build/duotone-picker/duotone-picker.js +42 -29
- package/build/duotone-picker/duotone-picker.js.map +1 -1
- package/build/elevation/hook.js +13 -13
- package/build/elevation/hook.js.map +1 -1
- package/build/focal-point-picker/index.native.js +4 -4
- package/build/focal-point-picker/index.native.js.map +1 -1
- package/build/form-toggle/index.js +28 -5
- package/build/form-toggle/index.js.map +1 -1
- package/build/form-toggle/types.js +6 -0
- package/build/form-toggle/types.js.map +1 -0
- package/build/h-stack/utils.js +3 -3
- package/build/h-stack/utils.js.map +1 -1
- package/build/heading/component.js +0 -1
- package/build/heading/component.js.map +1 -1
- package/build/heading/hook.js.map +1 -1
- package/build/heading/types.js +6 -0
- package/build/heading/types.js.map +1 -0
- package/build/mobile/bottom-sheet/keyboard-avoiding-view.native.js +0 -1
- package/build/mobile/bottom-sheet/keyboard-avoiding-view.native.js.map +1 -1
- package/build/mobile/link-picker/index.native.js +4 -4
- package/build/mobile/link-picker/index.native.js.map +1 -1
- package/build/mobile/segmented-control/index.native.js +2 -4
- package/build/mobile/segmented-control/index.native.js.map +1 -1
- package/build/navigation/group/index.js +4 -7
- package/build/navigation/group/index.js.map +1 -1
- package/build/navigation/item/base.js +3 -3
- package/build/navigation/item/base.js.map +1 -1
- package/build/navigation/item/use-navigation-tree-item.js +2 -1
- package/build/navigation/item/use-navigation-tree-item.js.map +1 -1
- package/build/navigation/menu/menu-title-search.js +1 -7
- package/build/navigation/menu/menu-title-search.js.map +1 -1
- package/build/navigation/menu/search-no-results-found.js +1 -7
- package/build/navigation/menu/search-no-results-found.js.map +1 -1
- package/build/navigation/use-navigation-tree-nodes.js +18 -10
- package/build/navigation/use-navigation-tree-nodes.js.map +1 -1
- package/build/navigation/utils.js +4 -2
- package/build/navigation/utils.js.map +1 -1
- package/build/range-control/index.js +3 -3
- package/build/range-control/index.js.map +1 -1
- package/build/range-control/utils.js +3 -7
- package/build/range-control/utils.js.map +1 -1
- package/build/spacer/component.js +5 -5
- package/build/spacer/component.js.map +1 -1
- package/build/spinner/index.js +26 -13
- package/build/spinner/index.js.map +1 -1
- package/build/spinner/styles.js +10 -10
- package/build/spinner/styles.js.map +1 -1
- package/build/truncate/component.js +7 -8
- package/build/truncate/component.js.map +1 -1
- package/build/truncate/hook.js +3 -10
- package/build/truncate/hook.js.map +1 -1
- package/build/truncate/index.js.map +1 -1
- package/build/truncate/styles.js +1 -1
- package/build/truncate/styles.js.map +1 -1
- package/build/truncate/utils.js +3 -16
- package/build/truncate/utils.js.map +1 -1
- package/build/utils/math.js +17 -7
- package/build/utils/math.js.map +1 -1
- package/build/v-stack/component.js +9 -9
- package/build/v-stack/component.js.map +1 -1
- package/build/v-stack/hook.js +0 -5
- package/build/v-stack/hook.js.map +1 -1
- package/build/v-stack/index.js.map +1 -1
- package/build-module/alignment-matrix-control/utils.js +1 -6
- package/build-module/alignment-matrix-control/utils.js.map +1 -1
- package/build-module/autocomplete/autocompleter-ui.js +4 -2
- package/build-module/autocomplete/autocompleter-ui.js.map +1 -1
- package/build-module/autocomplete/autocompleter-ui.native.js +9 -3
- package/build-module/autocomplete/autocompleter-ui.native.js.map +1 -1
- package/build-module/autocomplete/index.js +4 -2
- package/build-module/autocomplete/index.js.map +1 -1
- package/build-module/border-box-control/border-box-control/component.js +2 -1
- package/build-module/border-box-control/border-box-control/component.js.map +1 -1
- package/build-module/border-box-control/border-box-control-split-controls/component.js +2 -1
- package/build-module/border-box-control/border-box-control-split-controls/component.js.map +1 -1
- package/build-module/border-control/border-control/component.js +38 -3
- package/build-module/border-control/border-control/component.js.map +1 -1
- package/build-module/box-control/utils.js +4 -4
- package/build-module/box-control/utils.js.map +1 -1
- package/build-module/color-indicator/index.js +29 -8
- package/build-module/color-indicator/index.js.map +1 -1
- package/build-module/color-indicator/types.js +2 -0
- package/build-module/color-indicator/types.js.map +1 -0
- package/build-module/color-palette/index.js +2 -1
- package/build-module/color-palette/index.js.map +1 -1
- package/build-module/color-picker/component.js +7 -8
- package/build-module/color-picker/component.js.map +1 -1
- package/build-module/color-picker/input-with-slider.js +1 -2
- package/build-module/color-picker/input-with-slider.js.map +1 -1
- package/build-module/color-picker/styles.js +28 -14
- package/build-module/color-picker/styles.js.map +1 -1
- package/build-module/custom-gradient-picker/index.js +8 -7
- package/build-module/custom-gradient-picker/index.js.map +1 -1
- package/build-module/custom-gradient-picker/index.native.js +8 -8
- package/build-module/custom-gradient-picker/index.native.js.map +1 -1
- package/build-module/custom-gradient-picker/serializer.js +4 -6
- package/build-module/custom-gradient-picker/serializer.js.map +1 -1
- package/build-module/date-time/date/index.js +3 -1
- package/build-module/date-time/date/index.js.map +1 -1
- package/build-module/date-time/date-time/index.js +3 -1
- package/build-module/date-time/date-time/index.js.map +1 -1
- package/build-module/duotone-picker/duotone-picker.js +42 -29
- package/build-module/duotone-picker/duotone-picker.js.map +1 -1
- package/build-module/elevation/hook.js +12 -12
- package/build-module/elevation/hook.js.map +1 -1
- package/build-module/focal-point-picker/index.native.js +1 -1
- package/build-module/focal-point-picker/index.native.js.map +1 -1
- package/build-module/form-toggle/index.js +30 -6
- package/build-module/form-toggle/index.js.map +1 -1
- package/build-module/form-toggle/types.js +2 -0
- package/build-module/form-toggle/types.js.map +1 -0
- package/build-module/h-stack/utils.js +3 -3
- package/build-module/h-stack/utils.js.map +1 -1
- package/build-module/heading/component.js +0 -1
- package/build-module/heading/component.js.map +1 -1
- package/build-module/heading/hook.js.map +1 -1
- package/build-module/heading/types.js +2 -0
- package/build-module/heading/types.js.map +1 -0
- package/build-module/mobile/bottom-sheet/keyboard-avoiding-view.native.js +0 -1
- package/build-module/mobile/bottom-sheet/keyboard-avoiding-view.native.js.map +1 -1
- package/build-module/mobile/link-picker/index.native.js +4 -3
- package/build-module/mobile/link-picker/index.native.js.map +1 -1
- package/build-module/mobile/segmented-control/index.native.js +2 -3
- package/build-module/mobile/segmented-control/index.native.js.map +1 -1
- package/build-module/navigation/group/index.js +3 -6
- package/build-module/navigation/group/index.js.map +1 -1
- package/build-module/navigation/item/base.js +2 -2
- package/build-module/navigation/item/base.js.map +1 -1
- package/build-module/navigation/item/use-navigation-tree-item.js +2 -1
- package/build-module/navigation/item/use-navigation-tree-item.js.map +1 -1
- package/build-module/navigation/menu/menu-title-search.js +1 -6
- package/build-module/navigation/menu/menu-title-search.js.map +1 -1
- package/build-module/navigation/menu/search-no-results-found.js +1 -6
- package/build-module/navigation/menu/search-no-results-found.js.map +1 -1
- package/build-module/navigation/use-navigation-tree-nodes.js +18 -9
- package/build-module/navigation/use-navigation-tree-nodes.js.map +1 -1
- package/build-module/navigation/utils.js +2 -2
- package/build-module/navigation/utils.js.map +1 -1
- package/build-module/range-control/index.js +1 -1
- package/build-module/range-control/index.js.map +1 -1
- package/build-module/range-control/utils.js +1 -5
- package/build-module/range-control/utils.js.map +1 -1
- package/build-module/spacer/component.js +3 -4
- package/build-module/spacer/component.js.map +1 -1
- package/build-module/spinner/index.js +22 -13
- package/build-module/spinner/index.js.map +1 -1
- package/build-module/spinner/styles.js +10 -10
- package/build-module/spinner/styles.js.map +1 -1
- package/build-module/truncate/component.js +7 -8
- package/build-module/truncate/component.js.map +1 -1
- package/build-module/truncate/hook.js +3 -10
- package/build-module/truncate/hook.js.map +1 -1
- package/build-module/truncate/index.js.map +1 -1
- package/build-module/truncate/styles.js +1 -1
- package/build-module/truncate/styles.js.map +1 -1
- package/build-module/truncate/utils.js +3 -16
- package/build-module/truncate/utils.js.map +1 -1
- package/build-module/utils/math.js +15 -6
- package/build-module/utils/math.js.map +1 -1
- package/build-module/v-stack/component.js +9 -9
- package/build-module/v-stack/component.js.map +1 -1
- package/build-module/v-stack/hook.js +0 -5
- package/build-module/v-stack/hook.js.map +1 -1
- package/build-module/v-stack/index.js.map +1 -1
- package/build-style/style-rtl.css +16 -0
- package/build-style/style.css +16 -0
- package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -1
- package/build-types/border-box-control/border-box-control-split-controls/component.d.ts.map +1 -1
- package/build-types/border-control/border-control/component.d.ts +36 -2
- package/build-types/border-control/border-control/component.d.ts.map +1 -1
- package/build-types/border-control/stories/index.d.ts +33 -0
- package/build-types/border-control/stories/index.d.ts.map +1 -0
- package/build-types/color-indicator/index.d.ts +16 -5
- package/build-types/color-indicator/index.d.ts.map +1 -1
- package/build-types/color-indicator/stories/index.d.ts +12 -0
- package/build-types/color-indicator/stories/index.d.ts.map +1 -0
- package/build-types/color-indicator/test/index.d.ts +2 -0
- package/build-types/color-indicator/test/index.d.ts.map +1 -0
- package/build-types/color-indicator/types.d.ts +12 -0
- package/build-types/color-indicator/types.d.ts.map +1 -0
- package/build-types/color-palette/index.d.ts.map +1 -1
- package/build-types/color-palette/styles.d.ts +4 -2
- package/build-types/color-palette/styles.d.ts.map +1 -1
- package/build-types/color-picker/component.d.ts.map +1 -1
- package/build-types/color-picker/styles.d.ts +17 -0
- package/build-types/color-picker/styles.d.ts.map +1 -1
- package/build-types/date-time/date/index.d.ts +1 -1
- package/build-types/date-time/date/index.d.ts.map +1 -1
- package/build-types/date-time/date-time/index.d.ts.map +1 -1
- package/build-types/date-time/types.d.ts +6 -0
- package/build-types/date-time/types.d.ts.map +1 -1
- package/build-types/form-toggle/index.d.ts +29 -0
- package/build-types/form-toggle/index.d.ts.map +1 -0
- package/build-types/form-toggle/stories/index.d.ts +12 -0
- package/build-types/form-toggle/stories/index.d.ts.map +1 -0
- package/build-types/form-toggle/test/index.d.ts +2 -0
- package/build-types/form-toggle/test/index.d.ts.map +1 -0
- package/build-types/form-toggle/types.d.ts +22 -0
- package/build-types/form-toggle/types.d.ts.map +1 -0
- package/build-types/form-token-field/test/lib/token-field-wrapper.d.ts +3 -0
- package/build-types/form-token-field/test/lib/token-field-wrapper.d.ts.map +1 -1
- package/build-types/heading/component.d.ts +1 -2
- package/build-types/heading/component.d.ts.map +1 -1
- package/build-types/heading/hook.d.ts +1 -28
- package/build-types/heading/hook.d.ts.map +1 -1
- package/build-types/heading/stories/index.d.ts.map +1 -1
- package/build-types/heading/test/index.d.ts +2 -0
- package/build-types/heading/test/index.d.ts.map +1 -0
- package/build-types/heading/types.d.ts +16 -0
- package/build-types/heading/types.d.ts.map +1 -0
- package/build-types/range-control/utils.d.ts.map +1 -1
- package/build-types/spacer/component.d.ts +2 -3
- package/build-types/spacer/component.d.ts.map +1 -1
- package/build-types/spacer/stories/index.d.ts +12 -0
- package/build-types/spacer/stories/index.d.ts.map +1 -0
- package/build-types/spinner/index.d.ts +16 -15
- package/build-types/spinner/index.d.ts.map +1 -1
- package/build-types/spinner/stories/index.d.ts +13 -0
- package/build-types/spinner/stories/index.d.ts.map +1 -0
- package/build-types/spinner/styles.d.ts +4 -3
- package/build-types/spinner/styles.d.ts.map +1 -1
- package/build-types/text/types.d.ts +1 -1
- package/build-types/text/types.d.ts.map +1 -1
- package/build-types/truncate/component.d.ts +3 -3
- package/build-types/truncate/component.d.ts.map +1 -1
- package/build-types/truncate/hook.d.ts +5 -2
- package/build-types/truncate/hook.d.ts.map +1 -1
- package/build-types/truncate/index.d.ts +2 -2
- package/build-types/truncate/index.d.ts.map +1 -1
- package/build-types/truncate/stories/index.d.ts +13 -0
- package/build-types/truncate/stories/index.d.ts.map +1 -0
- package/build-types/truncate/styles.d.ts +1 -1
- package/build-types/truncate/styles.d.ts.map +1 -1
- package/build-types/truncate/test/index.d.ts +2 -0
- package/build-types/truncate/test/index.d.ts.map +1 -0
- package/build-types/truncate/types.d.ts +22 -11
- package/build-types/truncate/types.d.ts.map +1 -1
- package/build-types/truncate/utils.d.ts +17 -28
- package/build-types/truncate/utils.d.ts.map +1 -1
- package/build-types/ui/form-group/use-form-group.d.ts +2 -2
- package/build-types/utils/math.d.ts +10 -0
- package/build-types/utils/math.d.ts.map +1 -1
- package/build-types/v-stack/component.d.ts +5 -4
- package/build-types/v-stack/component.d.ts.map +1 -1
- package/build-types/v-stack/hook.d.ts +5 -3
- package/build-types/v-stack/hook.d.ts.map +1 -1
- package/build-types/v-stack/index.d.ts +2 -2
- package/build-types/v-stack/index.d.ts.map +1 -1
- package/build-types/v-stack/stories/index.d.ts +9 -0
- package/build-types/v-stack/stories/index.d.ts.map +1 -0
- package/build-types/v-stack/test/index.d.ts +2 -0
- package/build-types/v-stack/test/index.d.ts.map +1 -0
- package/build-types/v-stack/types.d.ts +21 -1
- package/build-types/v-stack/types.d.ts.map +1 -1
- package/package.json +18 -17
- package/src/alignment-matrix-control/utils.js +1 -6
- package/src/autocomplete/autocompleter-ui.js +4 -1
- package/src/autocomplete/autocompleter-ui.native.js +8 -2
- package/src/autocomplete/index.js +4 -8
- package/src/border-box-control/border-box-control/component.tsx +1 -0
- package/src/border-box-control/border-box-control-split-controls/component.tsx +1 -0
- package/src/border-control/border-control/component.tsx +41 -4
- package/src/border-control/stories/index.tsx +150 -0
- package/src/box-control/utils.js +4 -4
- package/src/color-indicator/README.md +7 -9
- package/src/color-indicator/index.tsx +47 -0
- package/src/color-indicator/stories/index.tsx +37 -0
- package/src/color-indicator/test/__snapshots__/index.tsx.snap +11 -0
- package/src/color-indicator/test/{index.js → index.tsx} +4 -4
- package/src/color-indicator/types.ts +12 -0
- package/src/color-palette/index.js +5 -1
- package/src/color-picker/component.tsx +12 -11
- package/src/color-picker/input-with-slider.tsx +2 -2
- package/src/color-picker/styles.ts +20 -1
- package/src/custom-gradient-picker/index.js +4 -11
- package/src/custom-gradient-picker/index.native.js +3 -11
- package/src/custom-gradient-picker/serializer.js +5 -11
- package/src/date-time/README.md +7 -0
- package/src/date-time/date/index.tsx +2 -0
- package/src/date-time/date-time/index.tsx +2 -0
- package/src/date-time/types.ts +7 -0
- package/src/dimension-control/README.md +5 -2
- package/src/dimension-control/test/index.test.js +7 -7
- package/src/duotone-picker/duotone-picker.js +58 -37
- package/src/duotone-picker/style.scss +19 -0
- package/src/elevation/hook.js +8 -8
- package/src/flex/flex/README.md +5 -10
- package/src/flex/flex-item/README.md +1 -1
- package/src/focal-point-picker/index.native.js +1 -1
- package/src/form-toggle/README.md +10 -11
- package/src/form-toggle/index.tsx +71 -0
- package/src/form-toggle/stories/index.tsx +52 -0
- package/src/form-toggle/test/__snapshots__/index.tsx.snap +54 -0
- package/src/form-toggle/test/index.tsx +102 -0
- package/src/form-toggle/types.ts +22 -0
- package/src/form-token-field/test/index.js +6 -9
- package/src/form-token-field/test/lib/token-field-wrapper.tsx +2 -2
- package/src/h-stack/utils.js +3 -3
- package/src/heading/README.md +4 -3
- package/src/heading/component.tsx +2 -2
- package/src/heading/hook.ts +1 -42
- package/src/heading/stories/index.tsx +5 -1
- package/src/heading/test/__snapshots__/{index.js.snap → index.tsx.snap} +0 -0
- package/src/heading/test/index.tsx +68 -0
- package/src/heading/types.ts +29 -0
- package/src/input-control/test/index.js +106 -31
- package/src/mobile/bottom-sheet/keyboard-avoiding-view.native.js +2 -7
- package/src/mobile/link-picker/index.native.js +2 -3
- package/src/mobile/segmented-control/index.native.js +6 -5
- package/src/navigation/group/index.js +8 -3
- package/src/navigation/item/base.js +3 -2
- package/src/navigation/item/use-navigation-tree-item.js +2 -0
- package/src/navigation/menu/menu-title-search.js +3 -6
- package/src/navigation/menu/search-no-results-found.js +3 -6
- package/src/navigation/use-navigation-tree-nodes.js +11 -10
- package/src/navigation/utils.js +2 -2
- package/src/number-control/stories/index.js +24 -24
- package/src/range-control/index.js +1 -1
- package/src/range-control/utils.js +1 -4
- package/src/slot-fill/test/slot.js +2 -3
- package/src/spacer/component.tsx +3 -4
- package/src/spacer/stories/index.tsx +70 -0
- package/src/spinner/{index.js → index.tsx} +23 -9
- package/src/spinner/stories/index.tsx +32 -0
- package/src/spinner/{styles.js → styles.ts} +0 -0
- package/src/style.scss +1 -0
- package/src/text/types.ts +1 -1
- package/src/truncate/README.md +16 -12
- package/src/truncate/{component.js → component.tsx} +13 -9
- package/src/truncate/{hook.js → hook.ts} +8 -10
- package/src/truncate/{index.js → index.ts} +0 -0
- package/src/truncate/stories/index.tsx +49 -0
- package/src/truncate/{styles.js → styles.ts} +0 -0
- package/src/truncate/test/{index.js → index.tsx} +4 -4
- package/src/truncate/types.ts +28 -10
- package/src/truncate/{utils.js → utils.ts} +19 -19
- package/src/utils/math.js +14 -5
- package/src/utils/test/math.js +22 -1
- package/src/v-stack/README.md +6 -18
- package/src/v-stack/{component.js → component.tsx} +15 -10
- package/src/v-stack/{hook.js → hook.ts} +5 -6
- package/src/v-stack/{index.js → index.ts} +0 -0
- package/src/v-stack/stories/index.tsx +41 -0
- package/src/v-stack/test/__snapshots__/{index.js.snap → index.tsx.snap} +0 -0
- package/src/v-stack/test/{index.js → index.tsx} +0 -0
- package/src/v-stack/types.ts +21 -1
- package/tsconfig.json +1 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/src/border-control/stories/index.js +0 -119
- package/src/color-indicator/index.js +0 -16
- package/src/color-indicator/stories/index.js +0 -22
- package/src/color-indicator/test/__snapshots__/index.js.snap +0 -13
- package/src/form-toggle/index.js +0 -38
- package/src/form-toggle/stories/index.js +0 -28
- package/src/form-toggle/test/index.js +0 -74
- package/src/heading/test/index.js +0 -67
- package/src/spacer/stories/index.js +0 -59
- package/src/spinner/stories/index.js +0 -43
- package/src/truncate/stories/index.js +0 -38
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`FormToggle basic rendering should render a span element with an unchecked checkbox 1`] = `
|
|
4
|
+
<span
|
|
5
|
+
class="components-form-toggle"
|
|
6
|
+
>
|
|
7
|
+
<input
|
|
8
|
+
class="components-form-toggle__input"
|
|
9
|
+
type="checkbox"
|
|
10
|
+
/>
|
|
11
|
+
<span
|
|
12
|
+
class="components-form-toggle__track"
|
|
13
|
+
/>
|
|
14
|
+
<span
|
|
15
|
+
class="components-form-toggle__thumb"
|
|
16
|
+
/>
|
|
17
|
+
</span>
|
|
18
|
+
`;
|
|
19
|
+
|
|
20
|
+
exports[`FormToggle basic rendering should render an id prop for the input checkbox 1`] = `
|
|
21
|
+
Snapshot Diff:
|
|
22
|
+
- First value
|
|
23
|
+
+ Second value
|
|
24
|
+
|
|
25
|
+
@@ -2,10 +2,11 @@
|
|
26
|
+
<span
|
|
27
|
+
class="components-form-toggle"
|
|
28
|
+
>
|
|
29
|
+
<input
|
|
30
|
+
class="components-form-toggle__input"
|
|
31
|
+
+ id="test"
|
|
32
|
+
type="checkbox"
|
|
33
|
+
/>
|
|
34
|
+
<span
|
|
35
|
+
class="components-form-toggle__track"
|
|
36
|
+
/>
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
exports[`FormToggle basic rendering should render with an additional className 1`] = `
|
|
40
|
+
Snapshot Diff:
|
|
41
|
+
- First value
|
|
42
|
+
+ Second value
|
|
43
|
+
|
|
44
|
+
@@ -1,8 +1,8 @@
|
|
45
|
+
<div>
|
|
46
|
+
<span
|
|
47
|
+
- class="components-form-toggle"
|
|
48
|
+
+ class="components-form-toggle testing"
|
|
49
|
+
>
|
|
50
|
+
<input
|
|
51
|
+
class="components-form-toggle__input"
|
|
52
|
+
type="checkbox"
|
|
53
|
+
/>
|
|
54
|
+
`;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { render, screen } from '@testing-library/react';
|
|
5
|
+
import userEvent from '@testing-library/user-event';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* WordPress dependencies
|
|
9
|
+
*/
|
|
10
|
+
import { useState } from '@wordpress/element';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Internal dependencies
|
|
14
|
+
*/
|
|
15
|
+
import FormToggle, { noop } from '..';
|
|
16
|
+
import type { FormToggleProps } from '../types';
|
|
17
|
+
|
|
18
|
+
const getInput = () => screen.getByRole( 'checkbox' ) as HTMLInputElement;
|
|
19
|
+
|
|
20
|
+
const ControlledFormToggle = ( { onChange }: FormToggleProps ) => {
|
|
21
|
+
const [ isChecked, setChecked ] = useState( false );
|
|
22
|
+
return (
|
|
23
|
+
<FormToggle
|
|
24
|
+
checked={ isChecked }
|
|
25
|
+
onChange={ ( value ) => {
|
|
26
|
+
setChecked( ( state ) => ! state );
|
|
27
|
+
onChange( value );
|
|
28
|
+
} }
|
|
29
|
+
/>
|
|
30
|
+
);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
describe( 'FormToggle', () => {
|
|
34
|
+
describe( 'basic rendering', () => {
|
|
35
|
+
it( 'should render a span element with an unchecked checkbox', () => {
|
|
36
|
+
const { container } = render( <FormToggle onChange={ noop } /> );
|
|
37
|
+
|
|
38
|
+
expect( getInput() ).not.toBeChecked();
|
|
39
|
+
expect( container.firstChild ).toMatchSnapshot();
|
|
40
|
+
} );
|
|
41
|
+
|
|
42
|
+
it( 'should render a checked checkbox when providing checked prop', () => {
|
|
43
|
+
render( <FormToggle onChange={ noop } checked /> );
|
|
44
|
+
|
|
45
|
+
expect( getInput() ).toBeChecked();
|
|
46
|
+
} );
|
|
47
|
+
|
|
48
|
+
it( 'should render with an additional className', () => {
|
|
49
|
+
const { container: containerDefault } = render(
|
|
50
|
+
<FormToggle onChange={ noop } />
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const { container: containerWithClassName } = render(
|
|
54
|
+
<FormToggle onChange={ noop } className="testing" />
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// Expect the diff snapshot to be mostly about the className.
|
|
58
|
+
expect( containerDefault ).toMatchDiffSnapshot(
|
|
59
|
+
containerWithClassName
|
|
60
|
+
);
|
|
61
|
+
} );
|
|
62
|
+
|
|
63
|
+
it( 'should render an id prop for the input checkbox', () => {
|
|
64
|
+
const { container: containerDefault } = render(
|
|
65
|
+
<FormToggle onChange={ noop } />
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
const { container: containerWithID } = render(
|
|
69
|
+
// Disabled because of our rule restricting literal IDs, preferring
|
|
70
|
+
// `withInstanceId`. In this case, it's fine to use literal IDs.
|
|
71
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
72
|
+
<FormToggle onChange={ noop } id="test" />
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
// Expect the diff snapshot to be mostly about the ID.
|
|
76
|
+
expect( containerDefault ).toMatchDiffSnapshot( containerWithID );
|
|
77
|
+
} );
|
|
78
|
+
} );
|
|
79
|
+
|
|
80
|
+
describe( 'Value', () => {
|
|
81
|
+
it( 'should flip the checked property when clicked', async () => {
|
|
82
|
+
const user = userEvent.setup( {
|
|
83
|
+
advanceTimers: jest.advanceTimersByTime,
|
|
84
|
+
} );
|
|
85
|
+
|
|
86
|
+
const onChange = jest.fn();
|
|
87
|
+
render( <ControlledFormToggle onChange={ onChange } /> );
|
|
88
|
+
|
|
89
|
+
const input = getInput();
|
|
90
|
+
|
|
91
|
+
await user.click( input );
|
|
92
|
+
expect( onChange.mock.calls[ 0 ][ 0 ].target ).toBeInTheDocument();
|
|
93
|
+
expect( input ).toBeChecked();
|
|
94
|
+
|
|
95
|
+
await user.click( input );
|
|
96
|
+
expect( onChange.mock.calls[ 1 ][ 0 ].target ).toBeInTheDocument();
|
|
97
|
+
expect( input ).not.toBeChecked();
|
|
98
|
+
|
|
99
|
+
expect( onChange ).toHaveBeenCalledTimes( 2 );
|
|
100
|
+
} );
|
|
101
|
+
} );
|
|
102
|
+
} );
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import type { ChangeEvent } from 'react';
|
|
5
|
+
|
|
6
|
+
export type FormToggleProps = {
|
|
7
|
+
/**
|
|
8
|
+
* If checked is true the toggle will be checked. If checked is false the
|
|
9
|
+
* toggle will be unchecked. If no value is passed the toggle will be
|
|
10
|
+
* unchecked.
|
|
11
|
+
*/
|
|
12
|
+
checked?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* If disabled is true the toggle will be disabled and apply the appropriate
|
|
15
|
+
* styles.
|
|
16
|
+
*/
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* A callback function invoked when the toggle is clicked.
|
|
20
|
+
*/
|
|
21
|
+
onChange: ( event: ChangeEvent< HTMLInputElement > ) => void;
|
|
22
|
+
};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* External dependencies
|
|
3
3
|
*/
|
|
4
|
-
import { filter, map } from 'lodash';
|
|
5
4
|
import TestUtils, { act } from 'react-dom/test-utils';
|
|
6
5
|
import ReactDOM from 'react-dom';
|
|
7
6
|
|
|
@@ -56,7 +55,7 @@ describe( 'FormTokenField', () => {
|
|
|
56
55
|
const textNodes = wrapperElement().querySelectorAll(
|
|
57
56
|
'.components-form-token-field__token-text span[aria-hidden]'
|
|
58
57
|
);
|
|
59
|
-
return
|
|
58
|
+
return Array.from( textNodes ).map( ( node ) => node.innerHTML );
|
|
60
59
|
}
|
|
61
60
|
|
|
62
61
|
function getSuggestionsText( selector ) {
|
|
@@ -64,7 +63,7 @@ describe( 'FormTokenField', () => {
|
|
|
64
63
|
selector || '.components-form-token-field__suggestion'
|
|
65
64
|
);
|
|
66
65
|
|
|
67
|
-
return
|
|
66
|
+
return Array.from( suggestionNodes ).map( getSuggestionNodeText );
|
|
68
67
|
}
|
|
69
68
|
|
|
70
69
|
function getSuggestionNodeText( node ) {
|
|
@@ -77,13 +76,11 @@ describe( 'FormTokenField', () => {
|
|
|
77
76
|
// match).
|
|
78
77
|
const div = document.createElement( 'div' );
|
|
79
78
|
div.innerHTML = node.querySelector( 'span' ).outerHTML;
|
|
80
|
-
return
|
|
81
|
-
filter(
|
|
82
|
-
div.firstChild.childNodes,
|
|
79
|
+
return Array.from( div.firstChild.childNodes )
|
|
80
|
+
.filter(
|
|
83
81
|
( childNode ) => childNode.nodeType !== childNode.COMMENT_NODE
|
|
84
|
-
)
|
|
85
|
-
( childNode ) => childNode.textContent
|
|
86
|
-
);
|
|
82
|
+
)
|
|
83
|
+
.map( ( childNode ) => childNode.textContent );
|
|
87
84
|
}
|
|
88
85
|
|
|
89
86
|
function getSelectedSuggestion() {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* External dependencies
|
|
3
3
|
*/
|
|
4
|
-
import { unescape } from 'lodash';
|
|
5
4
|
import type { ComponentProps } from 'react';
|
|
6
5
|
|
|
7
6
|
/**
|
|
@@ -22,7 +21,8 @@ const {
|
|
|
22
21
|
|
|
23
22
|
function unescapeAndFormatSpaces( str: string ) {
|
|
24
23
|
const nbsp = String.fromCharCode( 160 );
|
|
25
|
-
|
|
24
|
+
const escaped = new DOMParser().parseFromString( str, 'text/html' );
|
|
25
|
+
return escaped.documentElement.textContent?.replace( / /g, nbsp ) ?? '';
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
class TokenFieldWrapper extends Component<
|
package/src/h-stack/utils.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Internal dependencies
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { isValueDefined } from '../utils/values';
|
|
5
5
|
|
|
6
6
|
/** @type {import('./types').Alignments} */
|
|
7
7
|
const ALIGNMENTS = {
|
|
@@ -41,7 +41,7 @@ const V_ALIGNMENTS = {
|
|
|
41
41
|
*/
|
|
42
42
|
/* eslint-enable jsdoc/valid-types */
|
|
43
43
|
export function getAlignmentProps( alignment, direction = 'row' ) {
|
|
44
|
-
if (
|
|
44
|
+
if ( ! isValueDefined( alignment ) ) {
|
|
45
45
|
return {};
|
|
46
46
|
}
|
|
47
47
|
const isVertical = direction === 'column';
|
package/src/heading/README.md
CHANGED
|
@@ -20,8 +20,9 @@ function Example() {
|
|
|
20
20
|
|
|
21
21
|
`Heading` uses `Text` underneath, so we have access to all of `Text`'s props except for `size` which is replaced by `level`. For a complete list of those props, check out [`Text`](/packages/components/src/text/README.md#props).
|
|
22
22
|
|
|
23
|
-
##### level
|
|
24
|
-
|
|
25
|
-
**Type**: `1 | 2 | 3 | 4 | 5 | 6`
|
|
23
|
+
##### `level`: `1 | 2 | 3 | 4 | 5 | 6 | '1' | '2' | '3' | '4' | '5' | '6'`
|
|
26
24
|
|
|
27
25
|
Passing any of the heading levels to `level` will both render the correct typographic text size as well as the semantic element corresponding to the level (`h1` for `1` for example).
|
|
26
|
+
|
|
27
|
+
- Required: No
|
|
28
|
+
- Default: `2`
|
|
@@ -8,7 +8,8 @@ import type { ForwardedRef } from 'react';
|
|
|
8
8
|
*/
|
|
9
9
|
import { contextConnect, WordPressComponentProps } from '../ui/context';
|
|
10
10
|
import { View } from '../view';
|
|
11
|
-
import { useHeading
|
|
11
|
+
import { useHeading } from './hook';
|
|
12
|
+
import type { HeadingProps } from './types';
|
|
12
13
|
|
|
13
14
|
function UnconnectedHeading(
|
|
14
15
|
props: WordPressComponentProps< HeadingProps, 'h1' >,
|
|
@@ -22,7 +23,6 @@ function UnconnectedHeading(
|
|
|
22
23
|
/**
|
|
23
24
|
* `Heading` renders headings and titles using the library's typography system.
|
|
24
25
|
*
|
|
25
|
-
* @example
|
|
26
26
|
* ```jsx
|
|
27
27
|
* import { __experimentalHeading as Heading } from "@wordpress/components";
|
|
28
28
|
*
|
package/src/heading/hook.ts
CHANGED
|
@@ -2,51 +2,10 @@
|
|
|
2
2
|
* Internal dependencies
|
|
3
3
|
*/
|
|
4
4
|
import { useContextSystem, WordPressComponentProps } from '../ui/context';
|
|
5
|
-
import type { Props as TextProps } from '../text/types';
|
|
6
5
|
import { useText } from '../text';
|
|
7
6
|
import { getHeadingFontSize } from '../ui/utils/font-size';
|
|
8
7
|
import { CONFIG, COLORS } from '../utils';
|
|
9
|
-
|
|
10
|
-
export type HeadingSize =
|
|
11
|
-
| 1
|
|
12
|
-
| 2
|
|
13
|
-
| 3
|
|
14
|
-
| 4
|
|
15
|
-
| 5
|
|
16
|
-
| 6
|
|
17
|
-
| '1'
|
|
18
|
-
| '2'
|
|
19
|
-
| '3'
|
|
20
|
-
| '4'
|
|
21
|
-
| '5'
|
|
22
|
-
| '6';
|
|
23
|
-
|
|
24
|
-
export interface HeadingProps extends Omit< TextProps, 'size' > {
|
|
25
|
-
/**
|
|
26
|
-
* `Heading` will typically render the sizes `1`, `2`, `3`, `4`, `5`, or `6`, which map to `h1`-`h6`.
|
|
27
|
-
*
|
|
28
|
-
* @default 2
|
|
29
|
-
*
|
|
30
|
-
* @example
|
|
31
|
-
* ```jsx
|
|
32
|
-
* import { __experimentalHeading as Heading } from `@wordpress/components`
|
|
33
|
-
*
|
|
34
|
-
* function Example() {
|
|
35
|
-
* return (
|
|
36
|
-
* <div>
|
|
37
|
-
* <Heading level="1">Code is Poetry</Heading>
|
|
38
|
-
* <Heading level="2">Code is Poetry</Heading>
|
|
39
|
-
* <Heading level="3">Code is Poetry</Heading>
|
|
40
|
-
* <Heading level="4">Code is Poetry</Heading>
|
|
41
|
-
* <Heading level="5">Code is Poetry</Heading>
|
|
42
|
-
* <Heading level="6">Code is Poetry</Heading>
|
|
43
|
-
* </div>
|
|
44
|
-
* );
|
|
45
|
-
* }
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
level: HeadingSize;
|
|
49
|
-
}
|
|
8
|
+
import type { HeadingProps } from './types';
|
|
50
9
|
|
|
51
10
|
export function useHeading(
|
|
52
11
|
props: WordPressComponentProps< HeadingProps, 'h1' >
|
|
@@ -19,7 +19,11 @@ const meta: ComponentMeta< typeof Heading > = {
|
|
|
19
19
|
letterSpacing: { control: { type: 'text' } },
|
|
20
20
|
lineHeight: { control: { type: 'text' } },
|
|
21
21
|
optimizeReadabilityFor: { control: { type: 'color' } },
|
|
22
|
-
variant: {
|
|
22
|
+
variant: {
|
|
23
|
+
control: { type: 'radio' },
|
|
24
|
+
options: [ 'undefined', 'muted' ],
|
|
25
|
+
mapping: { undefined, muted: 'muted' },
|
|
26
|
+
},
|
|
23
27
|
weight: { control: { type: 'text' } },
|
|
24
28
|
},
|
|
25
29
|
parameters: {
|
|
File without changes
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { render, screen } from '@testing-library/react';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Internal dependencies
|
|
8
|
+
*/
|
|
9
|
+
import { Heading } from '../';
|
|
10
|
+
|
|
11
|
+
describe( 'props', () => {
|
|
12
|
+
test( 'should render correctly', () => {
|
|
13
|
+
render( <Heading>Code is Poetry</Heading> );
|
|
14
|
+
expect( screen.getByRole( 'heading' ) ).toMatchSnapshot();
|
|
15
|
+
} );
|
|
16
|
+
|
|
17
|
+
test( 'should render level as a number', () => {
|
|
18
|
+
render( <Heading>Code is Poetry</Heading> );
|
|
19
|
+
render( <Heading level={ 4 }>Code is Poetry</Heading> );
|
|
20
|
+
expect(
|
|
21
|
+
screen.getByRole( 'heading', { level: 4 } )
|
|
22
|
+
).toMatchStyleDiffSnapshot(
|
|
23
|
+
screen.getByRole( 'heading', { level: 2 } )
|
|
24
|
+
);
|
|
25
|
+
} );
|
|
26
|
+
|
|
27
|
+
test( 'should render level as a string', () => {
|
|
28
|
+
render( <Heading>Code is Poetry</Heading> );
|
|
29
|
+
render( <Heading level="4">Code is Poetry</Heading> );
|
|
30
|
+
expect(
|
|
31
|
+
screen.getByRole( 'heading', { level: 4 } )
|
|
32
|
+
).toMatchStyleDiffSnapshot(
|
|
33
|
+
screen.getByRole( 'heading', { level: 2 } )
|
|
34
|
+
);
|
|
35
|
+
} );
|
|
36
|
+
|
|
37
|
+
test( 'should allow as prop', () => {
|
|
38
|
+
render(
|
|
39
|
+
<Heading level="1" as="span">
|
|
40
|
+
Code is Poetry
|
|
41
|
+
</Heading>
|
|
42
|
+
);
|
|
43
|
+
expect( screen.getByRole( 'heading' ).tagName ).toBe( 'SPAN' );
|
|
44
|
+
} );
|
|
45
|
+
|
|
46
|
+
test( 'should render a11y props when not using a semantic element', () => {
|
|
47
|
+
render(
|
|
48
|
+
<Heading level="3" as="div">
|
|
49
|
+
Code is Poetry
|
|
50
|
+
</Heading>
|
|
51
|
+
);
|
|
52
|
+
expect(
|
|
53
|
+
screen.getByRole( 'heading', { level: 3 } )
|
|
54
|
+
).toBeInTheDocument();
|
|
55
|
+
} );
|
|
56
|
+
|
|
57
|
+
test( 'should not render a11y props when using a semantic element', () => {
|
|
58
|
+
render(
|
|
59
|
+
<Heading level="1" as="h4">
|
|
60
|
+
Code is Poetry
|
|
61
|
+
</Heading>
|
|
62
|
+
);
|
|
63
|
+
expect( screen.getByRole( 'heading' ) ).not.toHaveAttribute( 'role' );
|
|
64
|
+
expect( screen.getByRole( 'heading' ) ).not.toHaveAttribute(
|
|
65
|
+
'aria-level'
|
|
66
|
+
);
|
|
67
|
+
} );
|
|
68
|
+
} );
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal dependencies
|
|
3
|
+
*/
|
|
4
|
+
import type { Props as TextProps } from '../text/types';
|
|
5
|
+
|
|
6
|
+
export type HeadingSize =
|
|
7
|
+
| 1
|
|
8
|
+
| 2
|
|
9
|
+
| 3
|
|
10
|
+
| 4
|
|
11
|
+
| 5
|
|
12
|
+
| 6
|
|
13
|
+
| '1'
|
|
14
|
+
| '2'
|
|
15
|
+
| '3'
|
|
16
|
+
| '4'
|
|
17
|
+
| '5'
|
|
18
|
+
| '6';
|
|
19
|
+
|
|
20
|
+
export type HeadingProps = Omit< TextProps, 'size' > & {
|
|
21
|
+
/**
|
|
22
|
+
* Passing any of the heading levels to `level` will both render the correct
|
|
23
|
+
* typographic text size as well as the semantic element corresponding to
|
|
24
|
+
* the level (`h1` for `1` for example).
|
|
25
|
+
*
|
|
26
|
+
* @default 2
|
|
27
|
+
*/
|
|
28
|
+
level?: HeadingSize;
|
|
29
|
+
};
|
|
@@ -1,13 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* External dependencies
|
|
3
3
|
*/
|
|
4
|
-
import { render, screen
|
|
4
|
+
import { render, screen } from '@testing-library/react';
|
|
5
|
+
import userEvent from '@testing-library/user-event';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* WordPress dependencies
|
|
9
|
+
*/
|
|
10
|
+
import { useState } from '@wordpress/element';
|
|
5
11
|
|
|
6
12
|
/**
|
|
7
13
|
* Internal dependencies
|
|
8
14
|
*/
|
|
9
15
|
import BaseInputControl from '../';
|
|
10
16
|
|
|
17
|
+
const setupUser = () =>
|
|
18
|
+
userEvent.setup( {
|
|
19
|
+
advanceTimers: jest.advanceTimersByTime,
|
|
20
|
+
} );
|
|
21
|
+
|
|
11
22
|
const getInput = () => screen.getByTestId( 'input' );
|
|
12
23
|
|
|
13
24
|
describe( 'InputControl', () => {
|
|
@@ -42,49 +53,66 @@ describe( 'InputControl', () => {
|
|
|
42
53
|
} );
|
|
43
54
|
|
|
44
55
|
describe( 'Ensurance of focus for number inputs', () => {
|
|
45
|
-
it( 'should focus its input on mousedown events', () => {
|
|
56
|
+
it( 'should focus its input on mousedown events', async () => {
|
|
57
|
+
const user = setupUser();
|
|
46
58
|
const spy = jest.fn();
|
|
47
59
|
render( <InputControl type="number" onFocus={ spy } /> );
|
|
60
|
+
const target = getInput();
|
|
48
61
|
|
|
49
|
-
|
|
50
|
-
|
|
62
|
+
// Hovers the input and presses (without releasing) primary button.
|
|
63
|
+
await user.pointer( [
|
|
64
|
+
{ target },
|
|
65
|
+
{ keys: '[MouseLeft]', target },
|
|
66
|
+
] );
|
|
51
67
|
|
|
52
68
|
expect( spy ).toHaveBeenCalledTimes( 1 );
|
|
53
69
|
} );
|
|
54
70
|
} );
|
|
55
71
|
|
|
56
72
|
describe( 'Value', () => {
|
|
57
|
-
it( 'should update value onChange', () => {
|
|
73
|
+
it( 'should update value onChange', async () => {
|
|
74
|
+
const user = setupUser();
|
|
58
75
|
const spy = jest.fn();
|
|
59
|
-
render(
|
|
60
|
-
|
|
76
|
+
render(
|
|
77
|
+
<InputControl value="Hello" onChange={ ( v ) => spy( v ) } />
|
|
78
|
+
);
|
|
61
79
|
const input = getInput();
|
|
62
|
-
input.focus();
|
|
63
|
-
fireEvent.change( input, { target: { value: 'There' } } );
|
|
64
80
|
|
|
65
|
-
|
|
66
|
-
|
|
81
|
+
await user.type( input, ' there' );
|
|
82
|
+
|
|
83
|
+
expect( input ).toHaveValue( 'Hello there' );
|
|
84
|
+
expect( spy ).toHaveBeenCalledTimes( ' there'.length );
|
|
85
|
+
expect( spy ).toHaveBeenLastCalledWith( 'Hello there' );
|
|
67
86
|
} );
|
|
68
87
|
|
|
69
|
-
it( 'should work as a controlled component', () => {
|
|
88
|
+
it( 'should work as a controlled component', async () => {
|
|
89
|
+
const user = setupUser();
|
|
70
90
|
const spy = jest.fn();
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
91
|
+
const Example = () => {
|
|
92
|
+
const [ state, setState ] = useState( 'one' );
|
|
93
|
+
const onChange = ( value ) => {
|
|
94
|
+
setState( value );
|
|
95
|
+
spy( value );
|
|
96
|
+
};
|
|
97
|
+
const onKeyDown = ( { key } ) => {
|
|
98
|
+
if ( key === 'Escape' ) setState( 'three' );
|
|
99
|
+
};
|
|
100
|
+
return (
|
|
101
|
+
<InputControl
|
|
102
|
+
value={ state }
|
|
103
|
+
onChange={ onChange }
|
|
104
|
+
onKeyDown={ onKeyDown }
|
|
105
|
+
/>
|
|
106
|
+
);
|
|
107
|
+
};
|
|
108
|
+
render( <Example /> );
|
|
75
109
|
const input = getInput();
|
|
76
110
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// Ensuring <InputControl /> is controlled.
|
|
81
|
-
fireEvent.blur( input );
|
|
82
|
-
|
|
83
|
-
// Updating the value.
|
|
84
|
-
rerender( <InputControl value="three" onChange={ spy } /> );
|
|
85
|
-
|
|
86
|
-
expect( input.value ).toBe( 'three' );
|
|
111
|
+
await user.type( input, '2' );
|
|
112
|
+
// Make a controlled update.
|
|
113
|
+
await user.keyboard( '{Escape}' );
|
|
87
114
|
|
|
115
|
+
expect( input ).toHaveValue( 'three' );
|
|
88
116
|
/*
|
|
89
117
|
* onChange called only once. onChange is not called when a
|
|
90
118
|
* parent component explicitly passed a (new value) change down to
|
|
@@ -98,21 +126,68 @@ describe( 'InputControl', () => {
|
|
|
98
126
|
const { rerender } = render(
|
|
99
127
|
<InputControl value="Original" onChange={ spy } />
|
|
100
128
|
);
|
|
101
|
-
|
|
102
129
|
const input = getInput();
|
|
103
130
|
|
|
104
|
-
// Assuming <InputControl /> is controlled (not focused)
|
|
105
|
-
|
|
106
131
|
// Updating the value.
|
|
107
132
|
rerender( <InputControl value="New" onChange={ spy } /> );
|
|
108
133
|
|
|
109
|
-
expect( input
|
|
134
|
+
expect( input ).toHaveValue( 'New' );
|
|
110
135
|
|
|
111
136
|
// Change it back to the original value.
|
|
112
137
|
rerender( <InputControl value="Original" onChange={ spy } /> );
|
|
113
138
|
|
|
114
|
-
expect( input
|
|
139
|
+
expect( input ).toHaveValue( 'Original' );
|
|
115
140
|
expect( spy ).toHaveBeenCalledTimes( 0 );
|
|
116
141
|
} );
|
|
142
|
+
|
|
143
|
+
it( 'should not commit value until blurred when isPressEnterToChange is true', async () => {
|
|
144
|
+
const user = setupUser();
|
|
145
|
+
const spy = jest.fn();
|
|
146
|
+
render(
|
|
147
|
+
<InputControl
|
|
148
|
+
value=""
|
|
149
|
+
onChange={ ( v ) => spy( v ) }
|
|
150
|
+
isPressEnterToChange
|
|
151
|
+
/>
|
|
152
|
+
);
|
|
153
|
+
const input = getInput();
|
|
154
|
+
|
|
155
|
+
await user.type( input, 'that was then' );
|
|
156
|
+
// Clicking document.body to trigger a blur event on the input.
|
|
157
|
+
await user.click( document.body );
|
|
158
|
+
|
|
159
|
+
expect( spy ).toHaveBeenCalledTimes( 1 );
|
|
160
|
+
expect( spy ).toHaveBeenCalledWith( 'that was then' );
|
|
161
|
+
} );
|
|
162
|
+
|
|
163
|
+
it( 'should commit value when blurred if value is invalid', async () => {
|
|
164
|
+
const user = setupUser();
|
|
165
|
+
const spyChange = jest.fn();
|
|
166
|
+
render(
|
|
167
|
+
<InputControl
|
|
168
|
+
value="this is"
|
|
169
|
+
onChange={ ( v ) => spyChange( v ) }
|
|
170
|
+
// If the value contains 'now' it is not valid.
|
|
171
|
+
pattern="(?!.*now)^.*$"
|
|
172
|
+
__unstableStateReducer={ ( state, action ) => {
|
|
173
|
+
let { value } = state;
|
|
174
|
+
if (
|
|
175
|
+
action.type === 'COMMIT' &&
|
|
176
|
+
action.payload.event.type === 'blur'
|
|
177
|
+
)
|
|
178
|
+
value = value.replace( /\bnow\b/, 'meow' );
|
|
179
|
+
|
|
180
|
+
return { ...state, value };
|
|
181
|
+
} }
|
|
182
|
+
/>
|
|
183
|
+
);
|
|
184
|
+
const input = getInput();
|
|
185
|
+
|
|
186
|
+
await user.type( input, ' now' );
|
|
187
|
+
// Clicking document.body to trigger a blur event on the input.
|
|
188
|
+
await user.click( document.body );
|
|
189
|
+
|
|
190
|
+
expect( spyChange ).toHaveBeenLastCalledWith( 'this is meow' );
|
|
191
|
+
} );
|
|
117
192
|
} );
|
|
118
193
|
} );
|
|
@@ -98,13 +98,8 @@ class KeyboardAvoidingView extends Component {
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
render() {
|
|
101
|
-
const {
|
|
102
|
-
|
|
103
|
-
enabled,
|
|
104
|
-
keyboardVerticalOffset, // eslint-disable-line no-unused-vars
|
|
105
|
-
style,
|
|
106
|
-
...props
|
|
107
|
-
} = this.props;
|
|
101
|
+
const { children, enabled, keyboardVerticalOffset, style, ...props } =
|
|
102
|
+
this.props;
|
|
108
103
|
|
|
109
104
|
let finalStyle = style;
|
|
110
105
|
if ( Platform.OS === 'ios' ) {
|