diff --git a/components/_util/transButton.jsx b/components/_util/transButton.jsx deleted file mode 100644 index cfece1a0d..000000000 --- a/components/_util/transButton.jsx +++ /dev/null @@ -1,77 +0,0 @@ -import { defineComponent } from 'vue'; -/** - * Wrap of sub component which need use as Button capacity (like Icon component). - * This helps accessibility reader to tread as a interactive button to operation. - */ -import KeyCode from './KeyCode'; -import PropTypes from './vue-types'; - -const inlineStyle = { - border: 0, - background: 'transparent', - padding: 0, - lineHeight: 'inherit', - display: 'inline-block', -}; - -const TransButton = defineComponent({ - name: 'TransButton', - inheritAttrs: false, - props: { - noStyle: PropTypes.looseBool, - onClick: PropTypes.func, - }, - - methods: { - onKeyDown(event) { - const { keyCode } = event; - if (keyCode === KeyCode.ENTER) { - event.preventDefault(); - } - }, - - onKeyUp(event) { - const { keyCode } = event; - if (keyCode === KeyCode.ENTER) { - this.$emit('click', event); - } - }, - - setRef(btn) { - this.$refs.div = btn; - }, - - focus() { - if (this.$refs.div) { - this.$refs.div.focus(); - } - }, - - blur() { - if (this.$refs.div) { - this.$refs.div.blur(); - } - }, - }, - - render() { - const { noStyle, onClick } = this.$props; - - return ( -
- {this.$slots.default?.()} -
- ); - }, -}); - -export default TransButton; diff --git a/components/_util/transButton.tsx b/components/_util/transButton.tsx new file mode 100644 index 000000000..2def5816f --- /dev/null +++ b/components/_util/transButton.tsx @@ -0,0 +1,102 @@ +import { defineComponent, CSSProperties, ref, onMounted } from 'vue'; +/** + * Wrap of sub component which need use as Button capacity (like Icon component). + * This helps accessibility reader to tread as a interactive button to operation. + */ +import KeyCode from './KeyCode'; +import PropTypes from './vue-types'; + +const inlineStyle = { + border: 0, + background: 'transparent', + padding: 0, + lineHeight: 'inherit', + display: 'inline-block', +}; + +const TransButton = defineComponent({ + name: 'TransButton', + inheritAttrs: false, + props: { + noStyle: PropTypes.looseBool, + onClick: PropTypes.func, + disabled: PropTypes.looseBool, + autofocus: PropTypes.looseBool, + }, + setup(props, { slots, emit, attrs, expose }) { + const domRef = ref(); + const onKeyDown = (event: KeyboardEvent) => { + const { keyCode } = event; + if (keyCode === KeyCode.ENTER) { + event.preventDefault(); + } + }; + + const onKeyUp = (event: KeyboardEvent) => { + const { keyCode } = event; + if (keyCode === KeyCode.ENTER) { + emit('click', event); + } + }; + const onClick = (e: Event) => { + emit('click', e); + }; + const focus = () => { + if (domRef.value) { + domRef.value.focus(); + } + }; + + const blur = () => { + if (domRef.value) { + domRef.value.blur(); + } + }; + onMounted(() => { + if (props.autofocus) { + focus(); + } + }); + + expose({ + focus, + blur, + }); + const { noStyle, disabled, ...restProps } = props; + + let mergedStyle: CSSProperties = {}; + + if (!noStyle) { + mergedStyle = { + ...inlineStyle, + }; + } + + if (disabled) { + mergedStyle.pointerEvents = 'none'; + } + + return () => { + return ( +
+ {slots.default?.()} +
+ ); + }; + }, +}); + +export default TransButton;