diff --git a/packages/components/src/components/app-settings/app-settings-menu-item.jsx b/packages/components/src/components/app-settings/app-settings-menu-item.jsx
index 636973a194fb..05aff27f1b0f 100644
--- a/packages/components/src/components/app-settings/app-settings-menu-item.jsx
+++ b/packages/components/src/components/app-settings/app-settings-menu-item.jsx
@@ -1,7 +1,7 @@
import PropTypes from 'prop-types';
import * as React from 'react';
import classNames from 'classnames';
-import Text from '../text/text.jsx';
+import Text from '../text/text';
const AppSettingsMenuItem = ({ is_active, title, refSetter, onClick }) => {
const text_colour = is_active ? 'prominent' : 'less-prominent';
diff --git a/packages/components/src/components/content-expander/content-expander.jsx b/packages/components/src/components/content-expander/content-expander.jsx
index bfabd18acd85..f223a54f3c52 100644
--- a/packages/components/src/components/content-expander/content-expander.jsx
+++ b/packages/components/src/components/content-expander/content-expander.jsx
@@ -2,8 +2,8 @@ import classNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react';
import { CSSTransition } from 'react-transition-group';
+import Text from '../text/text';
import Icon from '../icon/icon';
-import Text from '../text/text.jsx';
const ContentExpander = ({
arrow_style,
diff --git a/packages/components/src/components/dropdown/dropdown.jsx b/packages/components/src/components/dropdown/dropdown.jsx
index 7c4cc0c10b12..1ba3f952574c 100644
--- a/packages/components/src/components/dropdown/dropdown.jsx
+++ b/packages/components/src/components/dropdown/dropdown.jsx
@@ -7,7 +7,7 @@ import { mobileOSDetect, getPosition } from '@deriv/shared';
import { listPropType, findNextFocusableNode, findPreviousFocusableNode } from './dropdown';
import Items from './items.jsx';
import DisplayText from './display-text.jsx';
-import Text from '../text/text.jsx';
+import Text from '../text/text';
import { useBlockScroll, useOnClickOutside } from '../../hooks';
import ThemedScrollbars from '../themed-scrollbars/themed-scrollbars.jsx';
import Icon from '../icon/icon';
diff --git a/packages/components/src/components/input/input.jsx b/packages/components/src/components/input/input.jsx
index 3ffab0367d8a..587894f1948b 100644
--- a/packages/components/src/components/input/input.jsx
+++ b/packages/components/src/components/input/input.jsx
@@ -2,7 +2,7 @@ import classNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react';
import Field from '../field';
-import Text from '../text/text.jsx';
+import Text from '../text/text';
const InputWrapper = ({ children, has_footer }) =>
has_footer ?
{children}
: children;
diff --git a/packages/components/src/components/loading/loading.jsx b/packages/components/src/components/loading/loading.jsx
index e1356904f822..f7ea3c456c33 100644
--- a/packages/components/src/components/loading/loading.jsx
+++ b/packages/components/src/components/loading/loading.jsx
@@ -1,7 +1,7 @@
import classNames from 'classnames';
import React from 'react';
import PropTypes from 'prop-types';
-import Text from '../text/text.jsx';
+import Text from '../text/text';
const Loading = ({ className, id, is_fullscreen = true, is_slow_loading, status, theme }) => {
const theme_class = theme ? `barspinner-${theme}` : 'barspinner-light';
diff --git a/packages/components/src/components/mobile-dialog/mobile-dialog.jsx b/packages/components/src/components/mobile-dialog/mobile-dialog.jsx
index 4a472ce434d5..424a9daab3dc 100644
--- a/packages/components/src/components/mobile-dialog/mobile-dialog.jsx
+++ b/packages/components/src/components/mobile-dialog/mobile-dialog.jsx
@@ -3,8 +3,8 @@ import PropTypes from 'prop-types';
import React from 'react';
import ReactDOM from 'react-dom';
import { CSSTransition } from 'react-transition-group';
+import Text from '../text/text';
import Icon from '../icon/icon';
-import Text from '../text/text.jsx';
import Div100vhContainer from '../div100vh-container';
const MobileDialog = props => {
diff --git a/packages/components/src/components/mobile-drawer/mobile-drawer-submenu-section.jsx b/packages/components/src/components/mobile-drawer/mobile-drawer-submenu-section.jsx
index 07e39a08c488..93a5c52204be 100644
--- a/packages/components/src/components/mobile-drawer/mobile-drawer-submenu-section.jsx
+++ b/packages/components/src/components/mobile-drawer/mobile-drawer-submenu-section.jsx
@@ -1,8 +1,8 @@
import classNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react';
+import Text from '../text/text';
import Icon from '../icon/icon';
-import Text from '../text/text.jsx';
const SubMenuSection = props => {
const { submenu_toggle_class, section_title, section_icon, children } = props;
diff --git a/packages/components/src/components/mobile-drawer/mobile-drawer-submenu.jsx b/packages/components/src/components/mobile-drawer/mobile-drawer-submenu.jsx
index e0b68e93b5b5..5fc2b5d31eaf 100644
--- a/packages/components/src/components/mobile-drawer/mobile-drawer-submenu.jsx
+++ b/packages/components/src/components/mobile-drawer/mobile-drawer-submenu.jsx
@@ -2,8 +2,8 @@ import classNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react';
import { CSSTransition } from 'react-transition-group';
+import Text from '../text/text';
import Icon from '../icon/icon';
-import Text from '../text/text.jsx';
const SubMenu = ({
children,
diff --git a/packages/components/src/components/mobile-drawer/mobile-drawer.jsx b/packages/components/src/components/mobile-drawer/mobile-drawer.jsx
index a5881b2dd23b..32af5d986516 100644
--- a/packages/components/src/components/mobile-drawer/mobile-drawer.jsx
+++ b/packages/components/src/components/mobile-drawer/mobile-drawer.jsx
@@ -8,8 +8,8 @@ import SubHeader from './mobile-drawer-subheader.jsx';
import Item from './mobile-drawer-item.jsx';
import SubMenu from './mobile-drawer-submenu.jsx';
import SubMenuSection from './mobile-drawer-submenu-section.jsx';
+import Text from '../text/text';
import Icon from '../icon/icon';
-import Text from '../text/text.jsx';
const MobileDrawer = ({
className,
diff --git a/packages/components/src/components/mobile-full-page-modal/mobile-full-page-modal.jsx b/packages/components/src/components/mobile-full-page-modal/mobile-full-page-modal.jsx
index aaf888afe86c..e02e321ee369 100644
--- a/packages/components/src/components/mobile-full-page-modal/mobile-full-page-modal.jsx
+++ b/packages/components/src/components/mobile-full-page-modal/mobile-full-page-modal.jsx
@@ -4,8 +4,8 @@ import classNames from 'classnames';
import Div100vhContainer from '../div100vh-container';
import FadeWrapper from '../fade-wrapper';
import PageOverlay from '../page-overlay/page-overlay.jsx';
+import Text from '../text/text';
import Icon from '../icon/icon';
-import Text from '../text/text.jsx';
const MobileFullPageModal = ({
body_className,
diff --git a/packages/components/src/components/modal/modal.jsx b/packages/components/src/components/modal/modal.jsx
index 2f2fbae19d99..6b20c272744d 100644
--- a/packages/components/src/components/modal/modal.jsx
+++ b/packages/components/src/components/modal/modal.jsx
@@ -5,8 +5,8 @@ import ReactDOM from 'react-dom';
import { CSSTransition } from 'react-transition-group';
import Body from './modal-body.jsx';
import Footer from './modal-footer.jsx';
+import Text from '../text/text';
import Icon from '../icon/icon';
-import Text from '../text/text.jsx';
import { useOnClickOutside } from '../../hooks';
const ModalElement = ({
diff --git a/packages/components/src/components/page-error/page-error.jsx b/packages/components/src/components/page-error/page-error.jsx
index 046d0ba487d7..58e92c86a525 100644
--- a/packages/components/src/components/page-error/page-error.jsx
+++ b/packages/components/src/components/page-error/page-error.jsx
@@ -5,7 +5,7 @@ import { isMobile } from '@deriv/shared';
import ButtonLink from '../button-link/button-link.jsx';
import DesktopWrapper from '../desktop-wrapper/desktop-wrapper.jsx';
import MobileWrapper from '../mobile-wrapper/mobile-wrapper.jsx';
-import Text from '../text/text.jsx';
+import Text from '../text/text';
const PageError = ({
buttonOnClick,
diff --git a/packages/components/src/components/popover-mobile/popover-mobile.jsx b/packages/components/src/components/popover-mobile/popover-mobile.jsx
index 32a9b827791d..1357119a6679 100644
--- a/packages/components/src/components/popover-mobile/popover-mobile.jsx
+++ b/packages/components/src/components/popover-mobile/popover-mobile.jsx
@@ -5,7 +5,7 @@ import { isMobile } from '@deriv/shared';
import Modal from '../modal/modal.jsx';
import Button from '../button/button.jsx';
import Popover from '../popover/popover.jsx';
-import Text from '../text/text.jsx';
+import Text from '../text/text';
import './popover-mobile.scss';
const PopoverMobile = ({
diff --git a/packages/components/src/components/popup/popup-overlay.jsx b/packages/components/src/components/popup/popup-overlay.jsx
index 044657fc0eb5..28234bcf7de1 100644
--- a/packages/components/src/components/popup/popup-overlay.jsx
+++ b/packages/components/src/components/popup/popup-overlay.jsx
@@ -2,7 +2,7 @@ import * as React from 'react';
import { createPortal } from 'react-dom';
import PropTypes from 'prop-types';
import Button from '../button/button.jsx';
-import Text from '../text/text.jsx';
+import Text from '../text/text';
const PopupOverlay = ({ title, descriptions, overlay_ref, toggleOverlay, done_text }) =>
createPortal(
diff --git a/packages/components/src/components/select-native/select-native.jsx b/packages/components/src/components/select-native/select-native.jsx
index 72ddbb8de3ee..88e608bfc9dc 100644
--- a/packages/components/src/components/select-native/select-native.jsx
+++ b/packages/components/src/components/select-native/select-native.jsx
@@ -2,8 +2,8 @@ import classNames from 'classnames';
import React from 'react';
import PropTypes from 'prop-types';
import Field from '../field/field.jsx';
+import Text from '../text/text';
import Icon from '../icon/icon';
-import Text from '../text/text.jsx';
const getDisplayText = (list_items, value) => {
const dropdown_items = Array.isArray(list_items) ? list_items : [].concat(...Object.values(list_items));
diff --git a/packages/components/src/components/text/index.js b/packages/components/src/components/text/index.ts
similarity index 58%
rename from packages/components/src/components/text/index.js
rename to packages/components/src/components/text/index.ts
index ef0d5296ac72..b517a1d7fb82 100644
--- a/packages/components/src/components/text/index.js
+++ b/packages/components/src/components/text/index.ts
@@ -1,4 +1,4 @@
-import Text from './text.jsx';
+import Text from './text';
import './text.scss';
export default Text;
diff --git a/packages/components/src/components/text/text.jsx b/packages/components/src/components/text/text.jsx
deleted file mode 100644
index 31baa30ad150..000000000000
--- a/packages/components/src/components/text/text.jsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import classNames from 'classnames';
-import React from 'react';
-import PropTypes from 'prop-types';
-import { isEmptyObject } from '@deriv/shared';
-
-const Text = ({ children, size, color, align, weight, line_height, as, className, styles, ...props }) => {
- const class_styles = {
- '--text-size': `var(--text-size-${size || 's'})`,
- '--text-color': `var(--text-${color || 'general'})`,
- '--text-lh': `var(--text-lh-${line_height || 'm'})`,
- '--text-weight': `var(--text-weight-${weight || 'normal'})`,
- '--text-align': `var(--text-align-${align || 'left'})`,
- };
- const [style, setStyle] = React.useState(class_styles);
- React.useEffect(() => {
- if (!isEmptyObject(styles)) {
- const combined_style = { ...class_styles, ...styles };
- setStyle(combined_style);
- } else {
- setStyle(class_styles);
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [size, color, line_height, weight, align]);
- const class_names = classNames('dc-text', className);
- return React.createElement(as || 'span', { className: class_names, style, ...props }, children);
-};
-
-Text.propTypes = {
- line_height: PropTypes.string,
- size: PropTypes.string,
- children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node), PropTypes.object]),
- color: PropTypes.string,
- align: PropTypes.string,
- weight: PropTypes.string,
- as: PropTypes.string,
- className: PropTypes.string,
- styles: PropTypes.object,
-};
-
-export default Text;
diff --git a/packages/components/src/components/text/text.tsx b/packages/components/src/components/text/text.tsx
new file mode 100644
index 000000000000..c4790302e49b
--- /dev/null
+++ b/packages/components/src/components/text/text.tsx
@@ -0,0 +1,45 @@
+import classNames from 'classnames';
+import React, { CSSProperties, HTMLProps } from 'react';
+import { isEmptyObject } from '@deriv/shared';
+
+type TTextProps = Omit, 'size'> & {
+ align?: string;
+ weight?: string;
+ line_height?: string;
+ styles?: CSSProperties;
+ size: string;
+};
+const Text = ({
+ children,
+ size = 's',
+ color = 'general',
+ align = 'left',
+ weight = 'normal',
+ line_height = 'm',
+ as,
+ className,
+ styles,
+ ...props
+}: TTextProps) => {
+ const class_styles = {
+ '--text-size': `var(--text-size-${size})`,
+ '--text-color': `var(--text-${color})`,
+ '--text-lh': `var(--text-lh-${line_height})`,
+ '--text-weight': `var(--text-weight-${weight})`,
+ '--text-align': `var(--text-align-${align})`,
+ };
+ const [style, setStyle] = React.useState(class_styles);
+ React.useEffect(() => {
+ if (!isEmptyObject(styles)) {
+ const combined_style = { ...class_styles, ...styles };
+ setStyle(combined_style);
+ } else {
+ setStyle(class_styles);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [size, color, line_height, weight, align]);
+ const class_names = classNames('dc-text', className);
+ return React.createElement(as || 'span', { className: class_names, style, ...props }, children);
+};
+
+export default Text;