From f21ab41244cf42d4ce3b7762c863970f15857ea8 Mon Sep 17 00:00:00 2001 From: Nathan Bierema Date: Sat, 27 Jun 2020 09:18:26 -0400 Subject: [PATCH] Convert --- packages/devui/.babelrc | 11 +- packages/devui/.eslintignore | 2 + packages/devui/.eslintrc.js | 21 ++ packages/devui/.prettierignore | 2 + packages/devui/.storybook/config.js | 6 +- packages/devui/.storybook/themeAddon/Panel.js | 2 +- packages/devui/.storybook/webpack.config.js | 14 +- packages/devui/package.json | 43 ++-- packages/devui/src/Button/Button.js | 92 --------- packages/devui/src/Button/Button.tsx | 128 ++++++++++++ .../devui/src/Button/{index.js => index.ts} | 0 .../Button/stories/{index.js => index.tsx} | 55 +++--- .../Button/styles/{common.js => common.ts} | 52 +++-- .../Button/styles/{default.js => default.ts} | 23 ++- .../src/Button/styles/{index.js => index.ts} | 0 .../styles/{material.js => material.ts} | 10 +- .../src/Container/{index.js => index.tsx} | 21 +- .../Container/styles/{index.js => index.ts} | 0 .../{ContextMenu.js => ContextMenu.tsx} | 62 +++--- packages/devui/src/ContextMenu/index.js | 1 - packages/devui/src/ContextMenu/index.ts | 1 + .../ContextMenu/stories/{data.js => data.ts} | 0 .../stories/{index.js => index.tsx} | 0 .../ContextMenu/styles/{index.js => index.ts} | 16 +- .../src/Dialog/{Dialog.js => Dialog.tsx} | 84 +++++--- .../devui/src/Dialog/{index.js => index.ts} | 0 .../Dialog/stories/{index.js => index.tsx} | 0 .../Dialog/styles/{default.js => default.ts} | 14 +- .../src/Dialog/styles/{index.js => index.ts} | 0 .../styles/{material.js => material.ts} | 10 +- packages/devui/src/Editor/Editor.js | 88 --------- packages/devui/src/Editor/Editor.tsx | 108 ++++++++++ .../devui/src/Editor/{index.js => index.ts} | 0 .../stories/{WithTabs.js => WithTabs.tsx} | 21 +- .../Editor/stories/{index.js => index.tsx} | 0 .../src/Editor/styles/{index.js => index.ts} | 3 +- packages/devui/src/Form/{Form.js => Form.tsx} | 44 +++-- .../devui/src/Form/{index.js => index.ts} | 0 .../src/Form/stories/{index.js => index.tsx} | 0 packages/devui/src/Form/stories/schema.js | 89 --------- packages/devui/src/Form/stories/schema.ts | 91 +++++++++ .../src/Form/styles/{index.js => index.ts} | 5 +- packages/devui/src/Form/widgets.js | 31 --- packages/devui/src/Form/widgets.tsx | 31 +++ .../{Notification.js => Notification.tsx} | 36 ++-- .../src/Notification/{index.js => index.ts} | 0 .../stories/{index.js => index.tsx} | 3 +- .../styles/{index.js => index.ts} | 12 +- ...gmentedControl.js => SegmentedControl.tsx} | 37 ++-- .../SegmentedControl/{index.js => index.ts} | 0 .../stories/{index.js => index.tsx} | 0 .../styles/{index.js => index.ts} | 12 +- packages/devui/src/Select/Select.js | 34 ---- packages/devui/src/Select/Select.tsx | 42 ++++ packages/devui/src/Select/index.js | 1 - packages/devui/src/Select/index.ts | 1 + .../Select/stories/{index.js => index.tsx} | 0 .../Select/stories/{options.js => options.ts} | 0 .../src/Select/styles/{index.js => index.ts} | 14 +- .../src/Slider/{Slider.js => Slider.tsx} | 47 +++-- packages/devui/src/Slider/index.js | 1 - packages/devui/src/Slider/index.ts | 1 + .../Slider/stories/{index.js => index.tsx} | 0 .../Slider/styles/{common.js => common.ts} | 5 +- .../Slider/styles/{default.js => default.ts} | 20 +- .../src/Slider/styles/{index.js => index.ts} | 0 .../styles/{material.js => material.ts} | 11 +- packages/devui/src/Tabs/{Tabs.js => Tabs.tsx} | 71 ++++--- .../Tabs/{TabsHeader.js => TabsHeader.tsx} | 95 +++++---- packages/devui/src/Tabs/index.js | 1 - packages/devui/src/Tabs/index.ts | 1 + .../src/Tabs/stories/{data.js => data.tsx} | 8 +- .../src/Tabs/stories/{index.js => index.tsx} | 13 +- .../src/Tabs/styles/{common.js => common.ts} | 21 +- .../Tabs/styles/{default.js => default.ts} | 21 +- .../src/Tabs/styles/{index.js => index.ts} | 0 .../Tabs/styles/{material.js => material.ts} | 18 +- packages/devui/src/Toolbar/index.js | 3 - packages/devui/src/Toolbar/index.ts | 3 + .../Toolbar/stories/{index.js => index.tsx} | 185 +++++++++++------- .../Toolbar/styles/{Divider.js => Divider.ts} | 0 .../Toolbar/styles/{Spacer.js => Spacer.ts} | 0 .../Toolbar/styles/{Toolbar.js => Toolbar.ts} | 19 +- packages/devui/src/base16.ts | 61 ++++++ .../{atom-one-dark.js => atom-one-dark.ts} | 0 .../colorSchemes/{default.js => default.ts} | 0 .../colorSchemes/{dracula.js => dracula.ts} | 0 .../src/colorSchemes/{github.js => github.ts} | 0 .../src/colorSchemes/{index.js => index.ts} | 0 .../colorSchemes/{ir-black.js => ir-black.ts} | 0 .../{macintosh.js => macintosh.ts} | 0 .../colorSchemes/{materia.js => materia.ts} | 0 .../{oceanic-next.js => oceanic-next.ts} | 0 .../devui/src/colorSchemes/{phd.js => phd.ts} | 0 .../src/colorSchemes/{pico.js => pico.ts} | 0 .../{solar-flare.js => solar-flare.ts} | 0 .../{spacemacs.js => spacemacs.ts} | 0 .../colorSchemes/{unikitty.js => unikitty.ts} | 0 .../colorSchemes/{woodland.js => woodland.ts} | 0 packages/devui/src/{index.js => index.ts} | 2 +- packages/devui/src/redux-devtools-themes.ts | 5 + .../src/simple-element-resize-detector.ts | 6 + packages/devui/src/themes/default.js | 14 -- packages/devui/src/themes/default.ts | 34 ++++ .../devui/src/themes/{index.js => index.ts} | 0 .../src/themes/{material.js => material.ts} | 4 +- .../utils/{animations.js => animations.ts} | 9 +- packages/devui/src/utils/autoPrefix.js | 2 - packages/devui/src/utils/autoPrefix.ts | 5 + .../devui/src/utils/{color.js => color.ts} | 10 +- .../devui/src/utils/createStyledComponent.js | 19 -- .../devui/src/utils/createStyledComponent.ts | 92 +++++++++ .../{invertColors.js => invertColors.ts} | 4 +- .../devui/src/utils/{theme.js => theme.ts} | 23 ++- packages/devui/tests/tsconfig.json | 4 + packages/devui/tsconfig.json | 7 + 116 files changed, 1461 insertions(+), 757 deletions(-) create mode 100644 packages/devui/.eslintignore create mode 100644 packages/devui/.eslintrc.js create mode 100644 packages/devui/.prettierignore mode change 100755 => 100644 packages/devui/.storybook/webpack.config.js delete mode 100644 packages/devui/src/Button/Button.js create mode 100644 packages/devui/src/Button/Button.tsx rename packages/devui/src/Button/{index.js => index.ts} (100%) rename packages/devui/src/Button/stories/{index.js => index.tsx} (61%) mode change 100755 => 100644 rename packages/devui/src/Button/styles/{common.js => common.ts} (81%) rename packages/devui/src/Button/styles/{default.js => default.ts} (70%) rename packages/devui/src/Button/styles/{index.js => index.ts} (100%) rename packages/devui/src/Button/styles/{material.js => material.ts} (78%) rename packages/devui/src/Container/{index.js => index.tsx} (63%) rename packages/devui/src/Container/styles/{index.js => index.ts} (100%) rename packages/devui/src/ContextMenu/{ContextMenu.js => ContextMenu.tsx} (58%) delete mode 100644 packages/devui/src/ContextMenu/index.js create mode 100644 packages/devui/src/ContextMenu/index.ts rename packages/devui/src/ContextMenu/stories/{data.js => data.ts} (100%) rename packages/devui/src/ContextMenu/stories/{index.js => index.tsx} (100%) rename packages/devui/src/ContextMenu/styles/{index.js => index.ts} (74%) rename packages/devui/src/Dialog/{Dialog.js => Dialog.tsx} (59%) rename packages/devui/src/Dialog/{index.js => index.ts} (100%) rename packages/devui/src/Dialog/stories/{index.js => index.tsx} (100%) mode change 100755 => 100644 rename packages/devui/src/Dialog/styles/{default.js => default.ts} (88%) rename packages/devui/src/Dialog/styles/{index.js => index.ts} (100%) rename packages/devui/src/Dialog/styles/{material.js => material.ts} (89%) delete mode 100644 packages/devui/src/Editor/Editor.js create mode 100644 packages/devui/src/Editor/Editor.tsx rename packages/devui/src/Editor/{index.js => index.ts} (100%) rename packages/devui/src/Editor/stories/{WithTabs.js => WithTabs.tsx} (64%) rename packages/devui/src/Editor/stories/{index.js => index.tsx} (100%) mode change 100755 => 100644 rename packages/devui/src/Editor/styles/{index.js => index.ts} (97%) rename packages/devui/src/Form/{Form.js => Form.tsx} (50%) rename packages/devui/src/Form/{index.js => index.ts} (100%) rename packages/devui/src/Form/stories/{index.js => index.tsx} (100%) mode change 100755 => 100644 delete mode 100644 packages/devui/src/Form/stories/schema.js create mode 100644 packages/devui/src/Form/stories/schema.ts rename packages/devui/src/Form/styles/{index.js => index.ts} (97%) delete mode 100644 packages/devui/src/Form/widgets.js create mode 100644 packages/devui/src/Form/widgets.tsx rename packages/devui/src/Notification/{Notification.js => Notification.tsx} (66%) rename packages/devui/src/Notification/{index.js => index.ts} (100%) rename packages/devui/src/Notification/stories/{index.js => index.tsx} (91%) rename packages/devui/src/Notification/styles/{index.js => index.ts} (76%) rename packages/devui/src/SegmentedControl/{SegmentedControl.js => SegmentedControl.tsx} (56%) rename packages/devui/src/SegmentedControl/{index.js => index.ts} (100%) rename packages/devui/src/SegmentedControl/stories/{index.js => index.tsx} (100%) rename packages/devui/src/SegmentedControl/styles/{index.js => index.ts} (79%) delete mode 100644 packages/devui/src/Select/Select.js create mode 100644 packages/devui/src/Select/Select.tsx delete mode 100644 packages/devui/src/Select/index.js create mode 100644 packages/devui/src/Select/index.ts rename packages/devui/src/Select/stories/{index.js => index.tsx} (100%) mode change 100755 => 100644 rename packages/devui/src/Select/stories/{options.js => options.ts} (100%) rename packages/devui/src/Select/styles/{index.js => index.ts} (96%) rename packages/devui/src/Slider/{Slider.js => Slider.tsx} (66%) delete mode 100644 packages/devui/src/Slider/index.js create mode 100644 packages/devui/src/Slider/index.ts rename packages/devui/src/Slider/stories/{index.js => index.tsx} (100%) mode change 100755 => 100644 rename packages/devui/src/Slider/styles/{common.js => common.ts} (60%) rename packages/devui/src/Slider/styles/{default.js => default.ts} (85%) rename packages/devui/src/Slider/styles/{index.js => index.ts} (100%) rename packages/devui/src/Slider/styles/{material.js => material.ts} (87%) rename packages/devui/src/Tabs/{Tabs.js => Tabs.tsx} (52%) rename packages/devui/src/Tabs/{TabsHeader.js => TabsHeader.tsx} (66%) delete mode 100644 packages/devui/src/Tabs/index.js create mode 100644 packages/devui/src/Tabs/index.ts rename packages/devui/src/Tabs/stories/{data.js => data.tsx} (74%) rename packages/devui/src/Tabs/stories/{index.js => index.tsx} (78%) mode change 100755 => 100644 rename packages/devui/src/Tabs/styles/{common.js => common.ts} (61%) rename packages/devui/src/Tabs/styles/{default.js => default.ts} (82%) rename packages/devui/src/Tabs/styles/{index.js => index.ts} (100%) rename packages/devui/src/Tabs/styles/{material.js => material.ts} (77%) delete mode 100644 packages/devui/src/Toolbar/index.js create mode 100644 packages/devui/src/Toolbar/index.ts rename packages/devui/src/Toolbar/stories/{index.js => index.tsx} (64%) mode change 100755 => 100644 rename packages/devui/src/Toolbar/styles/{Divider.js => Divider.ts} (100%) rename packages/devui/src/Toolbar/styles/{Spacer.js => Spacer.ts} (100%) rename packages/devui/src/Toolbar/styles/{Toolbar.js => Toolbar.ts} (70%) create mode 100644 packages/devui/src/base16.ts rename packages/devui/src/colorSchemes/{atom-one-dark.js => atom-one-dark.ts} (100%) rename packages/devui/src/colorSchemes/{default.js => default.ts} (100%) rename packages/devui/src/colorSchemes/{dracula.js => dracula.ts} (100%) rename packages/devui/src/colorSchemes/{github.js => github.ts} (100%) rename packages/devui/src/colorSchemes/{index.js => index.ts} (100%) rename packages/devui/src/colorSchemes/{ir-black.js => ir-black.ts} (100%) rename packages/devui/src/colorSchemes/{macintosh.js => macintosh.ts} (100%) rename packages/devui/src/colorSchemes/{materia.js => materia.ts} (100%) rename packages/devui/src/colorSchemes/{oceanic-next.js => oceanic-next.ts} (100%) rename packages/devui/src/colorSchemes/{phd.js => phd.ts} (100%) rename packages/devui/src/colorSchemes/{pico.js => pico.ts} (100%) rename packages/devui/src/colorSchemes/{solar-flare.js => solar-flare.ts} (100%) rename packages/devui/src/colorSchemes/{spacemacs.js => spacemacs.ts} (100%) rename packages/devui/src/colorSchemes/{unikitty.js => unikitty.ts} (100%) rename packages/devui/src/colorSchemes/{woodland.js => woodland.ts} (100%) rename packages/devui/src/{index.js => index.ts} (88%) mode change 100755 => 100644 create mode 100644 packages/devui/src/redux-devtools-themes.ts create mode 100644 packages/devui/src/simple-element-resize-detector.ts delete mode 100644 packages/devui/src/themes/default.js create mode 100644 packages/devui/src/themes/default.ts rename packages/devui/src/themes/{index.js => index.ts} (100%) rename packages/devui/src/themes/{material.js => material.ts} (76%) rename packages/devui/src/utils/{animations.js => animations.ts} (83%) delete mode 100644 packages/devui/src/utils/autoPrefix.js create mode 100644 packages/devui/src/utils/autoPrefix.ts rename packages/devui/src/utils/{color.js => color.ts} (57%) delete mode 100644 packages/devui/src/utils/createStyledComponent.js create mode 100644 packages/devui/src/utils/createStyledComponent.ts rename packages/devui/src/utils/{invertColors.js => invertColors.ts} (76%) rename packages/devui/src/utils/{theme.js => theme.ts} (60%) create mode 100644 packages/devui/tests/tsconfig.json create mode 100644 packages/devui/tsconfig.json diff --git a/packages/devui/.babelrc b/packages/devui/.babelrc index 645cc56e..912790c1 100755 --- a/packages/devui/.babelrc +++ b/packages/devui/.babelrc @@ -1,4 +1,11 @@ { - "presets": ["@babel/preset-env", "@babel/preset-react"], - "plugins": ["@babel/plugin-proposal-class-properties", "@babel/plugin-proposal-export-default-from"] + "presets": [ + "@babel/env", + "@babel/react", + "@babel/typescript" + ], + "plugins": [ + "@babel/proposal-class-properties" + ], + "sourceType": "unambiguous" } diff --git a/packages/devui/.eslintignore b/packages/devui/.eslintignore new file mode 100644 index 00000000..b1e0862f --- /dev/null +++ b/packages/devui/.eslintignore @@ -0,0 +1,2 @@ +lib +demo diff --git a/packages/devui/.eslintrc.js b/packages/devui/.eslintrc.js new file mode 100644 index 00000000..72e1f8dd --- /dev/null +++ b/packages/devui/.eslintrc.js @@ -0,0 +1,21 @@ +module.exports = { + extends: '../../.eslintrc', + overrides: [ + { + files: ['*.ts', '*.tsx'], + extends: '../../eslintrc.ts.react.base.json', + parserOptions: { + tsconfigRootDir: __dirname, + project: ['./tsconfig.json'] + } + }, + { + files: ['test/*.ts', 'test/*.tsx'], + extends: '../../eslintrc.ts.react.jest.base.json', + parserOptions: { + tsconfigRootDir: __dirname, + project: ['./test/tsconfig.json'] + } + } + ] +}; diff --git a/packages/devui/.prettierignore b/packages/devui/.prettierignore new file mode 100644 index 00000000..b1e0862f --- /dev/null +++ b/packages/devui/.prettierignore @@ -0,0 +1,2 @@ +lib +demo diff --git a/packages/devui/.storybook/config.js b/packages/devui/.storybook/config.js index eefdbad6..4c8be1fa 100755 --- a/packages/devui/.storybook/config.js +++ b/packages/devui/.storybook/config.js @@ -1,9 +1,9 @@ -import { configure, setAddon, addDecorator } from '@storybook/react'; +import { configure, addDecorator } from '@storybook/react'; import { withOptions } from '@storybook/addon-options'; import { withInfo } from '@storybook/addon-info'; import { withKnobs } from '@storybook/addon-knobs'; import { withTheme } from './themeAddon/theme'; -import '../src/presets.js'; +import '../src/presets'; addDecorator( withOptions({ @@ -21,7 +21,7 @@ addDecorator(withTheme); addDecorator(withKnobs); addDecorator(withInfo); -const req = require.context('../src/', true, /stories\/index\.js$/); +const req = require.context('../src/', true, /stories\/index\.tsx$/); function loadStories() { req.keys().forEach(filename => req(filename)); diff --git a/packages/devui/.storybook/themeAddon/Panel.js b/packages/devui/.storybook/themeAddon/Panel.js index 7e0ee5f4..44b1e5ba 100644 --- a/packages/devui/.storybook/themeAddon/Panel.js +++ b/packages/devui/.storybook/themeAddon/Panel.js @@ -2,7 +2,7 @@ import React from 'react'; import Form from '@storybook/addon-knobs/dist/components/PropForm'; import styled from 'styled-components'; import { EVENT_ID_DATA, DEFAULT_THEME_STATE } from './constant'; -import { listSchemes, listThemes } from '../../src/utils/theme'; +import { listSchemes, listThemes } from '../../lib/utils/theme'; const FormWrapper = styled.div` width: 100%; diff --git a/packages/devui/.storybook/webpack.config.js b/packages/devui/.storybook/webpack.config.js old mode 100755 new mode 100644 index 9fc16d31..3b3be188 --- a/packages/devui/.storybook/webpack.config.js +++ b/packages/devui/.storybook/webpack.config.js @@ -1,8 +1,12 @@ const path = require('path'); +const TSDocgenPlugin = require('react-docgen-typescript-webpack-plugin'); -module.exports = (baseConfig, env, defaultConfig) => { - // Add custom webpack config here like: - // defaultConfig.module.rules.push - - return defaultConfig; +module.exports = (baseConfig, env, config) => { + config.module.rules.push({ + test: /\.(ts|tsx)$/, + loader: require.resolve('babel-loader') + }); + config.plugins.push(new TSDocgenPlugin()); // optional + config.resolve.extensions.push('.ts', '.tsx'); + return config; }; diff --git a/packages/devui/package.json b/packages/devui/package.json index 7de9ccb9..a591b3fe 100755 --- a/packages/devui/package.json +++ b/packages/devui/package.json @@ -12,13 +12,22 @@ }, "author": "Mihail Diordiev (https://github.com/zalmoxisus)", "license": "MIT", + "main": "lib/index.js", + "types": "lib/index.d.ts", "scripts": { + "type-check": "tsc --noEmit", + "type-check:watch": "npm run type-check -- --watch", "start": "npm run storybook", - "build": "rimraf ./lib && babel ./src --out-dir ./lib --ignore tests,stories", + "clean": "rimraf lib", + "build": "npm run build:types && npm run build:js", + "build:types": "tsc --emitDeclarationOnly", + "build:js": "babel src --out-dir lib --ignore tests,stories --extensions \".ts,.tsx\" --source-maps inline", + "lint": "eslint . --ext .js,.jsx,.ts,.tsx", + "lint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix", "lint:css": "stylelint './src/**/styles/*.js'", "test:update": "npm run jest -- -u", "test": "jest --no-cache", - "storybook": "start-storybook -p 9001 -c .storybook -s ./fonts", + "storybook": "npm run build && start-storybook -p 9001 -c .storybook -s ./fonts", "publish-storybook": "bash .scripts/publish_storybook.sh", "prepare": "npm run build", "prepublishOnly": "npm run test && npm run build" @@ -36,11 +45,22 @@ "@babel/plugin-transform-runtime": "^7.2.0", "@babel/preset-env": "^7.3.1", "@babel/preset-react": "^7.0.0", - "@storybook/addon-actions": "^4.1.4", - "@storybook/addon-info": "^4.1.4", - "@storybook/addon-knobs": "^4.1.4", - "@storybook/addon-options": "^4.1.4", - "@storybook/react": "4.0.9", + "@storybook/addon-actions": "^4.1.18", + "@storybook/addon-info": "^4.1.18", + "@storybook/addon-knobs": "^4.1.18", + "@storybook/addon-options": "^4.1.18", + "@storybook/react": "^4.1.18", + "@types/codemirror": "^0.0.95", + "@types/color": "^2.0.1", + "@types/json-schema": "^7.0.4", + "@types/react-icons": "^2.2.7", + "@types/react-jsonschema-form": "^1.7.3", + "@types/react-select": "^1.3.4", + "@types/storybook__addon-actions": "^3.4.3", + "@types/storybook__addon-knobs": "^4.0.5", + "@types/storybook__react": "^4.0.2", + "babel-loader": "^8.1.0", + "csstype": "^2.6.10", "enzyme": "^3.1.0", "enzyme-adapter-react-16": "^1.0.2", "enzyme-to-json": "^3.1.4", @@ -48,18 +68,20 @@ "jest": "^24.1.0", "jsdom": "^11.3.0", "react": "^16.0.0", - "react-addons-test-utils": "^15.6.2", + "react-docgen-typescript-webpack-plugin": "^1.1.0", "react-dom": "^16.0.0", "react-test-renderer": "^16.0.0", "rimraf": "^2.6.2", "stylelint": "^7.6.0", "stylelint-config-standard": "^15.0.0", - "stylelint-processor-styled-components": "^0.0.4" + "stylelint-processor-styled-components": "^0.0.4", + "typescript": "^3.8.3" }, "peerDependencies": { "react": "^0.14.9 || ^15.3.0" }, "dependencies": { + "@types/prop-types": "^15.6.0", "base16": "^1.0.0", "codemirror": "^5.21.0", "color": "^2.0.0", @@ -73,6 +95,5 @@ }, "jest": { "setupTestFrameworkScriptFile": "/tests/setup.js" - }, - "main": "lib/index.js" + } } diff --git a/packages/devui/src/Button/Button.js b/packages/devui/src/Button/Button.js deleted file mode 100644 index a5211eaa..00000000 --- a/packages/devui/src/Button/Button.js +++ /dev/null @@ -1,92 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import createStyledComponent from '../utils/createStyledComponent'; -import * as styles from './styles'; -import { commonStyle, tooltipStyle } from './styles/common'; - -const ButtonWrapper = createStyledComponent(styles, 'button'); -const TooltipWrapper = createStyledComponent(tooltipStyle); -const CommonWrapper = createStyledComponent(commonStyle); - -export default class Button extends Component { - shouldComponentUpdate(nextProps) { - return ( - nextProps.children !== this.props.children || - nextProps.disabled !== this.props.disabled || - nextProps.mark !== this.props.mark || - nextProps.size !== this.props.size || - nextProps.primary !== this.props.primary || - nextProps.tooltipPosition !== this.props.tooltipPosition || - nextProps.title !== this.props.title - ); - } - - onMouseUp = e => { - e.target.blur(); - }; - - render() { - const button = ( - - {this.props.children} - - ); - - const Wrapper = this.props.title ? TooltipWrapper : CommonWrapper; - return ( - - {button} - - ); - } -} - -Button.propTypes = { - children: PropTypes.any.isRequired, - title: PropTypes.string, - tooltipPosition: PropTypes.oneOf([ - 'top', - 'bottom', - 'left', - 'right', - 'bottom-left', - 'bottom-right', - 'top-left', - 'top-right' - ]), - onClick: PropTypes.func, - type: PropTypes.string, - disabled: PropTypes.bool, - primary: PropTypes.bool, - size: PropTypes.oneOf(['big', 'normal', 'small']), - mark: PropTypes.oneOf([ - false, - 'base08', - 'base09', - 'base0A', - 'base0B', - 'base0C', - 'base0D', - 'base0E', - 'base0F' - ]), - theme: PropTypes.object -}; - -Button.defaultProps = { - tooltipPosition: 'top' -}; diff --git a/packages/devui/src/Button/Button.tsx b/packages/devui/src/Button/Button.tsx new file mode 100644 index 00000000..15b188bd --- /dev/null +++ b/packages/devui/src/Button/Button.tsx @@ -0,0 +1,128 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import createStyledComponent from '../utils/createStyledComponent'; +import * as styles from './styles'; +import { commonStyle, tooltipStyle } from './styles/common'; +import { Theme } from '../themes/default'; + +const ButtonWrapper = createStyledComponent(styles, 'button'); +const TooltipWrapper = createStyledComponent(tooltipStyle); +const CommonWrapper = createStyledComponent(commonStyle); + +export type TooltipPosition = + | 'top' + | 'bottom' + | 'left' + | 'right' + | 'bottom-left' + | 'bottom-right' + | 'top-left' + | 'top-right'; + +export type Size = 'big' | 'normal' | 'small'; + +export type Mark = + | 'base08' + | 'base09' + | 'base0A' + | 'base0B' + | 'base0C' + | 'base0D' + | 'base0E' + | 'base0F'; + +interface Props { + children: unknown; + title?: string; + tooltipPosition: TooltipPosition; + onClick?: React.MouseEventHandler; + type?: 'button' | 'reset' | 'submit'; + disabled?: boolean; + primary?: boolean; + size?: Size; + mark?: Mark | false; + theme?: Theme; +} + +export default class Button extends Component { + shouldComponentUpdate(nextProps: Props) { + return ( + nextProps.children !== this.props.children || + nextProps.disabled !== this.props.disabled || + nextProps.mark !== this.props.mark || + nextProps.size !== this.props.size || + nextProps.primary !== this.props.primary || + nextProps.tooltipPosition !== this.props.tooltipPosition || + nextProps.title !== this.props.title + ); + } + + onMouseUp: React.MouseEventHandler = e => { + e.currentTarget.blur(); + }; + + render() { + const button = ( + + {this.props.children} + + ); + + const Wrapper = this.props.title ? TooltipWrapper : CommonWrapper; + return ( + + {button} + + ); + } + + static propTypes = { + children: PropTypes.any.isRequired, + title: PropTypes.string, + tooltipPosition: PropTypes.oneOf([ + 'top', + 'bottom', + 'left', + 'right', + 'bottom-left', + 'bottom-right', + 'top-left', + 'top-right' + ]), + onClick: PropTypes.func, + type: PropTypes.string, + disabled: PropTypes.bool, + primary: PropTypes.bool, + size: PropTypes.oneOf(['big', 'normal', 'small']), + mark: PropTypes.oneOf([ + false, + 'base08', + 'base09', + 'base0A', + 'base0B', + 'base0C', + 'base0D', + 'base0E', + 'base0F' + ]), + theme: PropTypes.object + }; + + static defaultProps = { + tooltipPosition: 'top' + }; +} diff --git a/packages/devui/src/Button/index.js b/packages/devui/src/Button/index.ts similarity index 100% rename from packages/devui/src/Button/index.js rename to packages/devui/src/Button/index.ts diff --git a/packages/devui/src/Button/stories/index.js b/packages/devui/src/Button/stories/index.tsx old mode 100755 new mode 100644 similarity index 61% rename from packages/devui/src/Button/stories/index.js rename to packages/devui/src/Button/stories/index.tsx index 29a89650..b6831a4d --- a/packages/devui/src/Button/stories/index.js +++ b/packages/devui/src/Button/stories/index.tsx @@ -5,6 +5,7 @@ import { action } from '@storybook/addon-actions'; import { withKnobs, text, boolean, select } from '@storybook/addon-knobs'; import MdFiberManualRecord from 'react-icons/lib/md/fiber-manual-record'; import Button from '../'; +import { Mark, Size, TooltipPosition } from '../Button'; export const Container = styled.div` display: flex; @@ -20,18 +21,22 @@ storiesOf('Button', module)