diff --git a/packages/ui/back-top/.eslintrc.js b/packages/ui/back-top/.eslintrc.js
new file mode 100644
index 0000000000000000000000000000000000000000..5928ca1d6479ff7d0abd9fdec53a30df884f15f2
--- /dev/null
+++ b/packages/ui/back-top/.eslintrc.js
@@ -0,0 +1,7 @@
+module.exports = {
+ extends: require.resolve('@reskript/config-lint/config/eslint'),
+ rules: {
+ 'react/jsx-uses-react': 'error',
+ },
+ root: true,
+};
diff --git a/packages/ui/back-top/.storybook/main.js b/packages/ui/back-top/.storybook/main.js
new file mode 100644
index 0000000000000000000000000000000000000000..54fb0ef7d4825ec056e2be6496d462b895877421
--- /dev/null
+++ b/packages/ui/back-top/.storybook/main.js
@@ -0,0 +1,77 @@
+const {getBabelConfig} = require('@reskript/config-babel');
+const {loaders} = require('@reskript/config-webpack');
+const path = require('path');
+
+const loaderOptions = {
+ cwd: process.cwd(),
+ srcDirectory: 'src',
+ projectSettings: {
+ build: {
+ extractCSS: false,
+ styleResources: [
+ require.resolve('@osui/theme/dist/antd-vars-patch.less'),
+ require.resolve('@osui/theme/dist/less-functions-overrides.less'),
+ ],
+ },
+ },
+};
+
+module.exports = {
+ stories: [
+ '../stories/**/*.stories.[tj]s{,x}',
+ '../stories/**/*.stories.mdx'
+ ],
+ addons: [
+ {
+ name: '@storybook/addon-docs',
+ options: {
+ configureJSX: true,
+ babelOptions: {},
+ sourceLoaderOptions: null,
+ },
+ },
+ '@storybook/addon-storysource', // https://github.com/storybookjs/storybook/tree/master/addons/storysource
+ '@storybook/addon-a11y/register', // https://github.com/storybookjs/storybook/tree/master/addons/a11y
+ '@storybook/addon-viewport/register', // https://github.com/storybookjs/storybook/tree/master/addons/viewport
+ ],
+ webpackFinal: async (config) => {
+ config.module.rules.push({
+ test: /\.(js|jsx|ts|tsx)$/,
+ use: [
+ {
+ loader: 'babel-loader',
+ options: getBabelConfig(),
+ },
+ ],
+ });
+ config.module.rules.push({
+ test: /\.less$/,
+ loaders: [
+ loaders.style(loaderOptions),
+ loaders.css(loaderOptions),
+ loaders.less(loaderOptions),
+ loaders.styleResources(loaderOptions),
+ ],
+ });
+ config.module.rules.push({
+ test: '/\.svg/',
+ loader: 'file-loader'
+ });
+ // 如果使用css modules 请打开这个,并按需匹配css modules 文件
+ // 这个同时打开了classnames loader, 可以用 import c from 'xxx.less'
+ // config.module.rules.push({
+ // test: /\.less$/,
+ // loaders: [
+ // loaders.classNames(),
+ // loaders.style(loaderOptions),
+ // loaders.cssModules(loaderOptions),
+ // loaders.less(loaderOptions),
+ // loaders.styleResources(loaderOptions),
+ // ],
+ // });
+
+ config.resolve.extensions.push('.ts', '.tsx');
+ config.resolve.alias['@'] = path.resolve(__dirname, '../src');
+ return config;
+ },
+};
diff --git a/packages/ui/back-top/.storybook/preview.js b/packages/ui/back-top/.storybook/preview.js
new file mode 100644
index 0000000000000000000000000000000000000000..faeb11a4db47f4aea0688797db1856f7738f461c
--- /dev/null
+++ b/packages/ui/back-top/.storybook/preview.js
@@ -0,0 +1,18 @@
+import {addParameters} from '@storybook/react';
+import {DocsPage, DocsContainer} from '@storybook/addon-docs/blocks';
+import {
+ INITIAL_VIEWPORTS,
+ } from '@storybook/addon-viewport';
+import '@osui/theme/dist/theme/vars.css';
+
+addParameters({
+ docs: {
+ container: DocsContainer,
+ page: DocsPage,
+ },
+ viewport: {
+ viewports: {
+ ...INITIAL_VIEWPORTS
+ }
+ },
+});
diff --git a/packages/ui/back-top/README.md b/packages/ui/back-top/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..c78e38891ccb42c56d3eb310d1fef5b770c8d3b8
--- /dev/null
+++ b/packages/ui/back-top/README.md
@@ -0,0 +1,30 @@
+# @osui/back-top
+
+## 安装说明
+
+### 方式一
+
+单包使用
+
+```
+yarn install @osui/back-top
+```
+
+```
+import BackTop from '@osui/back-top'
+```
+
+### 方式二
+
+从 `@osui/ui` 统一引入
+
+```
+yarn install @osui/ui
+```
+
+```
+import {BackTop} from '@osui/ui';
+```
+
+
+
diff --git a/packages/ui/back-top/babel.config.js b/packages/ui/back-top/babel.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..d222841daa0815ccea18188ceb097da34d13aad9
--- /dev/null
+++ b/packages/ui/back-top/babel.config.js
@@ -0,0 +1,11 @@
+const {getTransformBabelConfig} = require('@reskript/config-babel');
+
+const options = {
+ browserSupport: {},
+ usage: 'build',
+ mode: 'production',
+ polyfill: false,
+ hostType: 'library',
+};
+
+module.exports = getTransformBabelConfig(options);
diff --git a/packages/ui/back-top/package.json b/packages/ui/back-top/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..e8167f384413b3827699041b93edfc81b0674498
--- /dev/null
+++ b/packages/ui/back-top/package.json
@@ -0,0 +1,60 @@
+{
+ "name": "@osui/back-top",
+ "version": "0.1.0",
+ "description": "",
+ "main": "dist/index.js",
+ "scripts": {
+ "lint": "skr lint",
+ "build": "sh scripts/build.sh",
+ "storybook": "start-storybook -p 8700",
+ "clean": "rm -rf node_modules && rm -rf dist",
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "sideEffects": [
+ "dist/*.less"
+ ],
+ "devDependencies": {
+ "@babel/cli": "^7.10.5",
+ "@reskript/cli": "^0.9.0",
+ "@reskript/cli-lint": "^0.9.9",
+ "@reskript/config-babel": "^0.9.0",
+ "@reskript/config-lint": "^0.12.3",
+ "@reskript/config-webpack": "^0.11.2",
+ "@storybook/addon-a11y": "^5.3.19",
+ "@storybook/addon-docs": "^5.3.19",
+ "@storybook/addon-storysource": "^5.3.19",
+ "@storybook/addon-viewport": "^5.3.19",
+ "@storybook/addons": "^5.3.19",
+ "@storybook/client-api": "^5.3.19",
+ "@storybook/react": "^5.3.19",
+ "@types/classnames": "^2.2.10",
+ "@types/react-dom": "^16.9.8",
+ "antd": "^4.4.0",
+ "babel-loader": "^8.1.0",
+ "cpy-cli": "^3.1.1",
+ "husky": "^4.2.5",
+ "prop-types": "^15.7.2",
+ "react": "^16.13.1",
+ "react-dom": "^16.13.1",
+ "react-is": "^16.13.1",
+ "typescript": "^3.9.6"
+ },
+ "peerDependencies": {
+ "antd": ">=4.4.0",
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://gitee.com/yuxuanhuo/osui/tree/master"
+ },
+ "author": "huoyuxuan",
+ "license": "MIT",
+ "husky": {
+ "hooks": {
+ "pre-commit": "skr lint ./src"
+ }
+ },
+ "dependencies": {
+ }
+}
diff --git a/packages/ui/back-top/scripts/build.sh b/packages/ui/back-top/scripts/build.sh
new file mode 100644
index 0000000000000000000000000000000000000000..f1cf5724ccdec601e43fab14da4e8f9f80d5765c
--- /dev/null
+++ b/packages/ui/back-top/scripts/build.sh
@@ -0,0 +1,18 @@
+# export PATH=$NODEJS_BIN_LATEST:$YARN_BIN_LATEST:$PATH
+
+echo "node $(node -v)"
+echo "npm $(npm -v)"
+echo "yarn $(yarn -v)"
+
+rm -rf dist
+
+yarn install --production=false
+# yarn test
+
+$(npm bin)/cpy '**/*' '!**/*.ts' '!**/*.tsx' '!**/*.js' '!**/*.jsx' ../tmp/ --cwd=src/ --parents
+$(npm bin)/tsc
+$(npm bin)/babel tmp --out-dir dist --ignore "src/**/*.test.js" --copy-files --source-maps
+
+rm -rf tmp
+
+echo "build success"
diff --git a/packages/ui/back-top/src/backtop.svg b/packages/ui/back-top/src/backtop.svg
new file mode 100644
index 0000000000000000000000000000000000000000..1ebe13aeb8ef5210c7eb38a6936ee5ce16e2fc89
--- /dev/null
+++ b/packages/ui/back-top/src/backtop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/ui/back-top/src/index.less b/packages/ui/back-top/src/index.less
new file mode 100644
index 0000000000000000000000000000000000000000..4ff68112a7e925747c91542e13d59adeecb503d7
--- /dev/null
+++ b/packages/ui/back-top/src/index.less
@@ -0,0 +1,15 @@
+@osui-back-top-class-prefix: osui-back-top;
+
+.@{osui-back-top-class-prefix} {
+ background: var(--color-gray-7);
+ border-radius: 2px;
+
+ img {
+ margin: 8px 0 0 8px;
+ }
+
+ &-circle {
+ border-radius: 50%;
+ overflow: hidden;
+ }
+}
diff --git a/packages/ui/back-top/src/index.tsx b/packages/ui/back-top/src/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..6cc108c5ff90e09df536497f4be086d5506ad6d5
--- /dev/null
+++ b/packages/ui/back-top/src/index.tsx
@@ -0,0 +1,19 @@
+import * as React from 'react';
+import { BackTop as AntdBackTop } from 'antd';
+import {BackTopProps as AntdBackTopProps} from 'antd/lib/back-top';
+import classNames from 'classnames';
+import './index.less';
+// @ts-ignore
+import backTop from './backtop.svg';
+
+const clsPrefix = 'osui-back-top';
+
+export type BackTopProps = AntdBackTopProps;
+
+const OscBackTop: React.FC = props => {
+ return (
+
+ );
+};
+
+export default OscBackTop;
diff --git a/packages/ui/back-top/stories/index.stories.mdx b/packages/ui/back-top/stories/index.stories.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..d6dfbaa563a86c28757b3dac9ed6e78c209a6693
--- /dev/null
+++ b/packages/ui/back-top/stories/index.stories.mdx
@@ -0,0 +1,14 @@
+import {Meta, Story, Preview} from '@storybook/addon-docs/blocks';
+import {Demo} from './index.stories'
+
+
+
+# OSUI Alert
+
+一些给UE看的文档说明,可以放在这里
+
+
+
+ {Demo()}
+
+
diff --git a/packages/ui/back-top/stories/index.stories.tsx b/packages/ui/back-top/stories/index.stories.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..b8de48ad9807746994873cfa3b2eb565c4106485
--- /dev/null
+++ b/packages/ui/back-top/stories/index.stories.tsx
@@ -0,0 +1,17 @@
+import * as React from 'react';
+import OscBackTop from '../src';
+
+export default {
+ title: 'OSUI-BackTop',
+};
+
+export const Demo = () => {
+ return (
+
+ {/* default */}
+
+ {/* circle */}
+
+
BackTop 回到顶部
+
);
+};
diff --git a/packages/ui/back-top/tsconfig.json b/packages/ui/back-top/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..3a24a511df9639581444c76e59ea1b775c5d8ea6
--- /dev/null
+++ b/packages/ui/back-top/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../../tsconfig.json",
+ "compilerOptions": {
+ "rootDir": "./src",
+ "outDir": "./tmp"
+ },
+ "include": ["src"]
+}