Commit a2721ab4 authored by 冯超鹏's avatar 冯超鹏

初次提交

parent c315cc81
Pipeline #114 canceled with stages

Too many changes to show.

To preserve performance only 1000 of ${real_size} files are displayed.

<script>
import Vue from 'vue'
export default {
onLaunch: function() {
uni.getSystemInfo({
success: function(e) {
// #ifndef MP
Vue.prototype.StatusBar = e.statusBarHeight;
if (e.platform == 'android') {
Vue.prototype.CustomBar = e.statusBarHeight + 50;
} else {
Vue.prototype.CustomBar = e.statusBarHeight + 45;
};
// #endif
// #ifdef MP-WEIXIN || MP-QQ
Vue.prototype.StatusBar = e.statusBarHeight;
let capsule = wx.getMenuButtonBoundingClientRect();
if (capsule) {
Vue.prototype.Custom = capsule;
// Vue.prototype.capsuleSafe = uni.upx2px(750) - capsule.left + uni.upx2px(750) - capsule.right;
Vue.prototype.CustomBar = capsule.bottom + capsule.top - e.statusBarHeight;
} else {
Vue.prototype.CustomBar = e.statusBarHeight + 50;
}
// #endif
// #ifdef MP-ALIPAY
Vue.prototype.StatusBar = e.statusBarHeight;
Vue.prototype.CustomBar = e.statusBarHeight + e.titleBarHeight;
// #endif
}
})
Vue.prototype.ColorList = [{
title: '嫣红',
name: 'red',
color: '#e54d42'
},
{
title: '桔橙',
name: 'orange',
color: '#f37b1d'
},
{
title: '明黄',
name: 'yellow',
color: '#fbbd08'
},
{
title: '橄榄',
name: 'olive',
color: '#8dc63f'
},
{
title: '森绿',
name: 'green',
color: '#39b54a'
},
{
title: '天青',
name: 'cyan',
color: '#1cbbb4'
},
{
title: '海蓝',
name: 'blue',
color: '#0081ff'
},
{
title: '姹紫',
name: 'purple',
color: '#6739b6'
},
{
title: '木槿',
name: 'mauve',
color: '#9c26b0'
},
{
title: '桃粉',
name: 'pink',
color: '#e03997'
},
{
title: '棕褐',
name: 'brown',
color: '#a5673f'
},
{
title: '玄灰',
name: 'grey',
color: '#8799a3'
},
{
title: '草灰',
name: 'gray',
color: '#aaaaaa'
},
{
title: '墨黑',
name: 'black',
color: '#333333'
},
{
title: '雅白',
name: 'white',
color: '#ffffff'
},
]
},
onShow: function() {
},
onHide: function() {
}
}
</script>
<style>
@import "colorui/main.css";
@import "colorui/icon.css";
.nav-list {
display: flex;
flex-wrap: wrap;
padding: 0px 40upx 0px;
justify-content: space-between;
}
.nav-li {
padding: 30upx;
border-radius: 12upx;
width: 45%;
margin: 0 2.5% 40upx;
background-image: url(https://cdn.nlark.com/yuque/0/2019/png/280374/1552996358352-assets/web-upload/cc3b1807-c684-4b83-8f80-80e5b8a6b975.png);
background-size: cover;
background-position: center;
position: relative;
z-index: 1;
}
.nav-li::after {
content: "";
position: absolute;
z-index: -1;
background-color: inherit;
width: 100%;
height: 100%;
left: 0;
bottom: -10%;
border-radius: 10upx;
opacity: 0.2;
transform: scale(0.9, 0.9);
}
.nav-li.cur {
color: #fff;
background: rgb(94, 185, 94);
box-shadow: 4upx 4upx 6upx rgba(94, 185, 94, 0.4);
}
.nav-title {
font-size: 32upx;
font-weight: 300;
}
.nav-title::first-letter {
font-size: 40upx;
margin-right: 4upx;
}
.nav-name {
font-size: 28upx;
text-transform: Capitalize;
margin-top: 20upx;
position: relative;
}
.nav-name::before {
content: "";
position: absolute;
display: block;
width: 40upx;
height: 6upx;
background: #fff;
bottom: 0;
right: 0;
opacity: 0.5;
}
.nav-name::after {
content: "";
position: absolute;
display: block;
width: 100upx;
height: 1px;
background: #fff;
bottom: 0;
right: 40upx;
opacity: 0.3;
}
.nav-name::first-letter {
font-weight: bold;
font-size: 36upx;
margin-right: 1px;
}
.nav-li text {
position: absolute;
right: 30upx;
top: 30upx;
font-size: 52upx;
width: 60upx;
height: 60upx;
text-align: center;
line-height: 60upx;
}
.text-light {
font-weight: 300;
}
@keyframes show {
0% {
transform: translateY(-50px);
}
60% {
transform: translateY(40upx);
}
100% {
transform: translateY(0px);
}
}
@-webkit-keyframes show {
0% {
transform: translateY(-50px);
}
60% {
transform: translateY(40upx);
}
100% {
transform: translateY(0px);
}
}
</style>
/* css 滤镜 控制黑白底色gif的 */
.gif-black{
mix-blend-mode: screen;
}
.gif-white{
mix-blend-mode: multiply;
}
/* Animation css */
[class*=animation-] {
animation-duration: .5s;
animation-timing-function: ease-out;
animation-fill-mode: both
}
.animation-fade {
animation-name: fade;
animation-duration: .8s;
animation-timing-function: linear
}
.animation-scale-up {
animation-name: scale-up
}
.animation-scale-down {
animation-name: scale-down
}
.animation-slide-top {
animation-name: slide-top
}
.animation-slide-bottom {
animation-name: slide-bottom
}
.animation-slide-left {
animation-name: slide-left
}
.animation-slide-right {
animation-name: slide-right
}
.animation-shake {
animation-name: shake
}
.animation-reverse {
animation-direction: reverse
}
@keyframes fade {
0% {
opacity: 0
}
100% {
opacity: 1
}
}
@keyframes scale-up {
0% {
opacity: 0;
transform: scale(.2)
}
100% {
opacity: 1;
transform: scale(1)
}
}
@keyframes scale-down {
0% {
opacity: 0;
transform: scale(1.8)
}
100% {
opacity: 1;
transform: scale(1)
}
}
@keyframes slide-top {
0% {
opacity: 0;
transform: translateY(-100%)
}
100% {
opacity: 1;
transform: translateY(0)
}
}
@keyframes slide-bottom {
0% {
opacity: 0;
transform: translateY(100%)
}
100% {
opacity: 1;
transform: translateY(0)
}
}
@keyframes shake {
0%,
100% {
transform: translateX(0)
}
10% {
transform: translateX(-9px)
}
20% {
transform: translateX(8px)
}
30% {
transform: translateX(-7px)
}
40% {
transform: translateX(6px)
}
50% {
transform: translateX(-5px)
}
60% {
transform: translateX(4px)
}
70% {
transform: translateX(-3px)
}
80% {
transform: translateX(2px)
}
90% {
transform: translateX(-1px)
}
}
@keyframes slide-left {
0% {
opacity: 0;
transform: translateX(-100%)
}
100% {
opacity: 1;
transform: translateX(0)
}
}
@keyframes slide-right {
0% {
opacity: 0;
transform: translateX(100%)
}
100% {
opacity: 1;
transform: translateX(0)
}
}
\ No newline at end of file
<template>
<view>
<view class="cu-custom" :style="[{height:CustomBar + 'px'}]">
<view class="cu-bar fixed" :style="style" :class="[bgImage!=''?'none-bg text-white bg-img':'',bgColor]">
<view class="action" @tap="BackPage" v-if="isBack">
<text class="cuIcon-back"></text>
<slot name="backText"></slot>
</view>
<view class="content" :style="[{top:StatusBar + 'px'}]">
<slot name="content"></slot>
</view>
<slot name="right"></slot>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
StatusBar: this.StatusBar,
CustomBar: this.CustomBar
};
},
name: 'cu-custom',
computed: {
style() {
var StatusBar= this.StatusBar;
var CustomBar= this.CustomBar;
var bgImage = this.bgImage;
var style = `height:${CustomBar}px;padding-top:${StatusBar}px;`;
if (this.bgImage) {
style = `${style}background-image:url(${bgImage});`;
}
return style
}
},
props: {
bgColor: {
type: String,
default: ''
},
isBack: {
type: [Boolean, String],
default: false
},
bgImage: {
type: String,
default: ''
},
},
methods: {
BackPage() {
if (getCurrentPages().length < 2 && 'undefined' !== typeof __wxConfig) {
let url = '/' + __wxConfig.pages[0]
return uni.redirectTo({url})
}
uni.navigateBack({
delta: 1
});
}
}
}
</script>
<style>
</style>
This diff is collapsed.
This diff is collapsed.
@font-face {
font-family: uniicons;
font-weight: normal;
font-style: normal;
src: url('https://img-cdn-qiniu.dcloud.net.cn/fonts/uni.ttf?t=1536565627510') format('truetype');
}
.m-icon {
font-family: uniicons;
font-size: 24px;
font-weight: normal;
font-style: normal;
line-height: 1;
display: inline-block;
text-decoration: none;
-webkit-font-smoothing: antialiased;
}
.m-icon.uni-active {
color: #007aff;
}
.m-icon-contact:before {
content: '\e100';
}
.m-icon-person:before {
content: '\e101';
}
.m-icon-personadd:before {
content: '\e102';
}
.m-icon-contact-filled:before {
content: '\e130';
}
.m-icon-person-filled:before {
content: '\e131';
}
.m-icon-personadd-filled:before {
content: '\e132';
}
.m-icon-phone:before {
content: '\e200';
}
.m-icon-email:before {
content: '\e201';
}
.m-icon-chatbubble:before {
content: '\e202';
}
.m-icon-chatboxes:before {
content: '\e203';
}
.m-icon-phone-filled:before {
content: '\e230';
}
.m-icon-email-filled:before {
content: '\e231';
}
.m-icon-chatbubble-filled:before {
content: '\e232';
}
.m-icon-chatboxes-filled:before {
content: '\e233';
}
.m-icon-weibo:before {
content: '\e260';
}
.m-icon-weixin:before {
content: '\e261';
}
.m-icon-pengyouquan:before {
content: '\e262';
}
.m-icon-chat:before {
content: '\e263';
}
.m-icon-qq:before {
content: '\e264';
}
.m-icon-videocam:before {
content: '\e300';
}
.m-icon-camera:before {
content: '\e301';
}
.m-icon-mic:before {
content: '\e302';
}
.m-icon-location:before {
content: '\e303';
}
.m-icon-mic-filled:before,
.m-icon-speech:before {
content: '\e332';
}
.m-icon-location-filled:before {
content: '\e333';
}
.m-icon-micoff:before {
content: '\e360';
}
.m-icon-image:before {
content: '\e363';
}
.m-icon-map:before {
content: '\e364';
}
.m-icon-compose:before {
content: '\e400';
}
.m-icon-trash:before {
content: '\e401';
}
.m-icon-upload:before {
content: '\e402';
}
.m-icon-download:before {
content: '\e403';
}
.m-icon-close:before {
content: '\e404';
}
.m-icon-redo:before {
content: '\e405';
}
.m-icon-undo:before {
content: '\e406';
}
.m-icon-refresh:before {
content: '\e407';
}
.m-icon-star:before {
content: '\e408';
}
.m-icon-plus:before {
content: '\e409';
}
.m-icon-minus:before {
content: '\e410';
}
.m-icon-circle:before,
.m-icon-checkbox:before {
content: '\e411';
}
.m-icon-close-filled:before,
.m-icon-clear:before {
content: '\e434';
}
.m-icon-refresh-filled:before {
content: '\e437';
}
.m-icon-star-filled:before {
content: '\e438';
}
.m-icon-plus-filled:before {
content: '\e439';
}
.m-icon-minus-filled:before {
content: '\e440';
}
.m-icon-circle-filled:before {
content: '\e441';
}
.m-icon-checkbox-filled:before {
content: '\e442';
}
.m-icon-closeempty:before {
content: '\e460';
}
.m-icon-refreshempty:before {
content: '\e461';
}
.m-icon-reload:before {
content: '\e462';
}
.m-icon-starhalf:before {
content: '\e463';
}
.m-icon-spinner:before {
content: '\e464';
}
.m-icon-spinner-cycle:before {
content: '\e465';
}
.m-icon-search:before {
content: '\e466';
}
.m-icon-plusempty:before {
content: '\e468';
}
.m-icon-forward:before {
content: '\e470';
}
.m-icon-back:before,
.m-icon-left-nav:before {
content: '\e471';
}
.m-icon-checkmarkempty:before {
content: '\e472';
}
.m-icon-home:before {
content: '\e500';
}
.m-icon-navigate:before {
content: '\e501';
}
.m-icon-gear:before {
content: '\e502';
}
.m-icon-paperplane:before {
content: '\e503';
}
.m-icon-info:before {
content: '\e504';
}
.m-icon-help:before {
content: '\e505';
}
.m-icon-locked:before {
content: '\e506';
}
.m-icon-more:before {
content: '\e507';
}
.m-icon-flag:before {
content: '\e508';
}
.m-icon-home-filled:before {
content: '\e530';
}
.m-icon-gear-filled:before {
content: '\e532';
}
.m-icon-info-filled:before {
content: '\e534';
}
.m-icon-help-filled:before {
content: '\e535';
}
.m-icon-more-filled:before {
content: '\e537';
}
.m-icon-settings:before {
content: '\e560';
}
.m-icon-list:before {
content: '\e562';
}
.m-icon-bars:before {
content: '\e563';
}
.m-icon-loop:before {
content: '\e565';
}
.m-icon-paperclip:before {
content: '\e567';
}
.m-icon-eye:before {
content: '\e568';
}
.m-icon-arrowup:before {
content: '\e580';
}
.m-icon-arrowdown:before {
content: '\e581';
}
.m-icon-arrowleft:before {
content: '\e582';
}
.m-icon-arrowright:before {
content: '\e583';
}
.m-icon-arrowthinup:before {
content: '\e584';
}
.m-icon-arrowthindown:before {
content: '\e585';
}
.m-icon-arrowthinleft:before {
content: '\e586';
}
.m-icon-arrowthinright:before {
content: '\e587';
}
.m-icon-pulldown:before {
content: '\e588';
}
.m-icon-scan:before {
content: "\e612";
}
<template>
<view class="m-icon" :class="['m-icon-'+type]" @click="onClick()"></view>
</template>
<script>
export default {
props: {
/**
* 图标类型
*/
type: String
},
methods: {
onClick() {
this.$emit('click')
}
}
}
</script>
<style>
@import "./m-icon.css";
</style>
<template>
<view class="m-input-view">
<input :focus="focus" :type="inputType" :value="value" @input="onInput" class="m-input-input" :placeholder="placeholder"
:password="type==='password'&&!showPassword" @focus="onFocus" @blur="onBlur" />
<!-- 优先显示密码可见按钮 -->
<view v-if="clearable&&!displayable&&value.length" class="m-input-icon">
<m-icon color="#666666" type="clear" @click="clear"></m-icon>
</view>
<view v-if="displayable" class="m-input-icon">
<m-icon :style="{color:showPassword?'#666666':'#cccccc'}" type="eye" @click="display"></m-icon>
</view>
</view>
</template>
<script>
import mIcon from './m-icon/m-icon.vue'
export default {
components: {
mIcon
},
props: {
/**
* 输入类型
*/
type: String,
/**
* 值
*/
value: String,
/**
* 占位符
*/
placeholder: String,
/**
* 是否显示清除按钮
*/
clearable: {
type: [Boolean, String],
default: false
},
/**
* 是否显示密码可见按钮
*/
displayable: {
type: [Boolean, String],
default: false
},
/**
* 自动获取焦点
*/
focus: {
type: [Boolean, String],
default: false
}
},
model: {
prop: 'value',
event: 'input'
},
data() {
return {
/**
* 显示密码明文
*/
showPassword: false,
/**
* 是否获取焦点
*/
isFocus: false
}
},
computed: {
inputType() {
const type = this.type
return type === 'password' ? 'text' : type
}
},
methods: {
clear() {
this.$emit('input', '')
},
display() {
this.showPassword = !this.showPassword
},
onFocus() {
this.isFocus = true
},
onBlur() {
this.$nextTick(() => {
this.isFocus = false
})
},
onInput(e) {
this.$emit('input', e.detail.value)
}
}
}
</script>
<style>
.m-input-view {
display: inline-flex;
flex-direction: row;
align-items: center;
/* width: 100%; */
flex: 1;
padding: 0 10px;
}
.m-input-input {
flex: 1;
width: 100%;
min-height: 100%;
line-height: inherit;
background-color: rgba(0, 0, 0, 0);
}
.m-input-icon {
width: 20px;
font-size: 20px;
line-height: 20px;
color: #666666;
}
</style>
const baseUrl = 'http://36.148.1.58:81/api/';
const httpRequest = (opts, data) => {
let httpDefaultOpts = {
url: baseUrl + opts.url,
data: data,
method: opts.method,
header: opts.method == 'get' ? {
'X-Requested-With': 'XMLHttpRequest',
"Accept": "application/json",
"Content-Type": "application/json; charset=UTF-8",
"Authorization": 'Bearer' + ' ' + uni.getStorageSync('Authorization'),
} : {
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
"Authorization": 'Bearer' + ' ' + uni.getStorageSync('Authorization'),
},
dataType: 'json',
}
let promise = new Promise(function(resolve, reject) {
uni.request(httpDefaultOpts).then(
(res) => {
resolve(res[1])
}
).catch(
(response) => {
reject(response)
}
)
})
return promise
};
//登入请求
const httpTokenRequest = (opts, data) => {
let token = "";
uni.getStorage({
key: 'token',
success: function(ress) {
token = ress.data
}
});
//此token是登录成功后后台返回保存在storage中的
let httpDefaultOpts = {
url: baseUrl + opts.url,
data: data,
method: opts.method,
header: opts.method == 'get' ? {
'Token': token,
'X-Requested-With': 'XMLHttpRequest',
"Accept": "application/json",
"Content-Type": "application/json; charset=UTF-8"
} : {
'Token': token,
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
dataType: 'json',
}
let promise = new Promise(function(resolve, reject) {
uni.request(httpDefaultOpts).then(
(res) => {
resolve(res[1])
}
).catch(
(response) => {
reject(response)
}
)
})
return promise
};
export default {
baseUrl,
httpRequest,
httpTokenRequest
}
import Vue from 'vue'
import App from './App'
import basics from './pages/basics/home.vue'
Vue.component('basics',basics)
import components from './pages/component/home.vue'
Vue.component('components',components)
import plugin from './pages/plugin/home.vue'
Vue.component('plugin',plugin)
import adddevice from './pages/adddevice/home.vue'
Vue.component('adddevice',adddevice)
import userme from './pages/userme/userme.vue'
Vue.component('userme',userme)
import cuCustom from './colorui/components/cu-custom.vue'
Vue.component('cu-custom',cuCustom)
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
})
app.$mount()
{
"name" : "泽宏科技",
"appid" : "__UNI__BC980CF",
"description" : "泽宏云科技",
"versionName" : "1.0.0",
"versionCode" : "100",
"transformPx" : false,
/* 5+App特有相关 */
"app-plus" : {
"usingComponents" : true,
"compilerVersion" : 3,
/* 模块配置 */
"modules" : {
"Speech" : {}
},
/* 应用发布信息 */
"distribute" : {
/* android打包配置 */
"android" : {
"permissions" : [
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.INTERNET\"/>",
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
/* ios打包配置 */
"ios" : {},
/* SDK配置 */
"sdkConfigs" : {
"ad" : {},
"speech" : {}
}
}
},
/* 快应用特有相关 */
"quickapp" : {},
/* 小程序特有相关 */
"mp-weixin" : {
"appid" : "wx3fb24f5d2f0956d6",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
}
}
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../prettier/bin-prettier.js" "$@"
ret=$?
else
node "$basedir/../prettier/bin-prettier.js" "$@"
ret=$?
fi
exit $ret
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\prettier\bin-prettier.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\..\prettier\bin-prettier.js" %*
)
\ No newline at end of file
{
"presets": [
[
"@babel/preset-env",
{
"loose": true,
"modules": false
}
]
]
}
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
charset = utf-8
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2
[Makefile]
indent_style = tab
indent_size = 1
[*.md]
trim_trailing_whitespace = false
\ No newline at end of file
build/
coverage/
demos/assets/
dist/
lib/
mocks/
node_modules/
{
"extends": [
"egg"
],
"globals": {
"$": true,
"DataSet": true,
"G2": true,
"d3": true,
"_": true
},
"parser": "babel-eslint",
"parserOptions": {
"sourceType": "module"
},
"plugins": [
"html"
],
"rules": {
"no-bitwise": [
0
],
"experimentalDecorators": [
0
],
"comma-dangle": [
"error",
"never"
],
"no-console": [
"error",
{
"allow": [
"warn",
"error"
]
}
]
}
}
<!--
Thank you for reporting an issue.
1. It's RECOMMENDED to submit PR for typo or tiny bug fix.
2. If this's a FEATURE request, please provide: details, pseudo codes if necessary.
3. If this's a BUG, please provide: course repetition, error log and configuration. Fill in as much of the template below as you're able.
感谢您向我们反馈问题。
1. 提交问题前,请先阅读 https://antv.alipay.com 上的文档(可站内搜索 `adjust` 关键字)。
2. 我们推荐如果是小问题(错别字修改,小的 bug fix)直接提交 PR。
3. 如果是一个新需求,请提供:详细需求描述,最好是有伪代码实现。
4. 如果是一个 BUG,请提供:复现步骤,错误日志以及相关配置,并尽量填写下面的模板中的条目。
6. 扩展阅读:[如何向开源项目提交无法解答的问题](https://zhuanlan.zhihu.com/p/25795393)
-->
* **Link**:
* **Platform**:
* **Mini Showcase(like screenshots)**:
<!-- Enter your issue details below this comment. -->
<!--
Thank you for your pull request. Please review below requirements.
Bug fixes and new features should include tests and possibly benchmarks.
Contributors guide: https://github.com/antvis/g2/blob/master/CONTRIBUTING.md
感谢您贡献代码。请确认下列 checklist 的完成情况。
Bug 修复和新功能必须包含测试,必要时请附上性能测试。
Contributors guide: https://github.com/antvis/g2/blob/master/CONTRIBUTING.md
-->
##### Checklist
<!-- Remove items that do not apply. For completed items, change [ ] to [x]. -->
- [ ] `npm test` passes
- [ ] tests and/or benchmarks are included
- [ ] commit message follows commit guidelines
##### Description of change
<!-- Provide a description of the change below this comment. -->
module.exports = {
babelrc: {
presets: [
'@babel/preset-env'
],
sourceMaps: 'inline'
},
extensions: ['.js'],
include: [
'node_modules/**/src/gl-matrix/**/*.js '
],
exclude: [
'bower_components/**/*.js',
]
}
language: node_js
node_js:
- "8"
env:
matrix:
- TEST_TYPE=ci
addons:
apt:
packages:
- xvfb
install:
- export DISPLAY=':99.0'
- Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
- npm install
script:
- |
if [ "$TEST_TYPE" = ci ]; then
npm run ci
fi
#### 0.1.1 (2019-02-11)
##### Bug Fixes
* 修复只有一组数据时基础 dodge 算法偏差问题 ([9464cd75](https://github.com/antvis/adjust/commit/9464cd75d54e23cc94a5e022f531ffb6ac6d382b))
#### 0.0.1 (2018-06-25)
init.
# Contribution Guide
If you have any comment or advice, please report your [issue](https://github.com/antvis/adjust/issues),
or make any change as you wish and submit an [PR](https://github.com/antvis/adjust/pulls).
## Reporting New Issues
- Please specify what kind of issue it is.
- Before you report an issue, please search for related issues. Make sure you are not going to open a duplicate issue.
- Explain your purpose clearly in tags(see **Useful Tags**), title, or content.
AntV group members will confirm the purpose of the issue, replace more accurate tags for it, identify related milestone, and assign developers working on it.
## Submitting Code
### Pull Request Guide
If you are developer of AntV repo and you are willing to contribute, feel free to create a new branch, finish your modification and submit a PR. AntV group will review your work and merge it to master branch.
```bash
# Create a new branch for development. The name of branch should be semantic, avoiding words like 'update' or 'tmp'. We suggest to use feature/xxx, if the modification is about to implement a new feature.
$ git checkout -b branch-name
# Run the test after you finish your modification. Add new test cases or change old ones if you feel necessary
$ npm test
# If your modification pass the tests, congradulations it's time to push your work back to us. Notice that the commit message should be wirtten in the following format.
$ git add . # git add -u to delete files
$ git commit -m "fix(role): role.use must xxx"
$ git push origin branch-name
```
Then you can create a Pull Request at [adjust](https://github.com/antvis/adjust/pulls).
No one can garantee how much will be remembered about certain PR after some time. To make sure we can easily recap what happened previously, please provide the following information in your PR.
1. Need: What function you want to achieve (Generally, please point out which issue is related).
2. Updating Reason: Different with issue. Briefly describe your reason and logic about why you need to make such modification.
3. Related Testing: Briefly descirbe what part of testing is relevant to your modification.
4. User Tips: Notice for adjust users. You can skip this part, if the PR is not about update in API or potential compatibility problem.
### Style Guide
Eslint can help to identify styling issues that may exist in your code. Your code is required to pass the test from eslint. Run the test locally by `$ npm run lint`.
### Commit Message Format
You are encouraged to use [angular commit-message-format](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format) to write commit message. In this way, we could have a more trackable history and an automatically generated changelog.
```xml
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
```
(1)type
Must be one of the following:
- feat: A new feature
- fix: A bug fix
- docs: Documentation-only changes
- style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
- refactor: A code change that neither fixes a bug nor adds a feature
- perf: A code change that improves performance
- test: Adding missing tests
- chore: Changes to the build process or auxiliary tools and libraries such as documentation generation
- deps: Updates about dependencies
(2)scope
The scope could be anything specifying place of the commit change.
(3)subject
Use succinct words to describe what did you do in the commit change.
(4)body
Feel free to add more content in the body, if you think subject is not self-explanatory enough, such as what it is the purpose or reasone of you commit.
(5)footer
- **If the commit is a Breaking Change, please note it clearly in this part.**
- related issues, like `Closes #1, Closes #2, #3`
e.g.
```
fix($compile): [BREAKING_CHANGE] couple of unit tests for IE9
Older IEs serialize html uppercased, but IE9 does not...
Would be better to expect case insensitive, unfortunately jasmine does
not allow to user regexps for throw expectations.
Document change on antvis/adjust#123
Closes #392
BREAKING CHANGE:
Breaks foo.bar api, foo.baz should be used instead
```
Look at [these files](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit) for more detials.
## Release
adjust uses semantic versioning in release process based on [semver].
### Branch Strategy
`master` branch is the latest stable version.
- just checkout develop branch from `master`
- All new features will be added into `master` or `next` branch as well as all bug-fix except security issues. In such way, we can motivate developers to update to the latest stable version.
### Release Strategy
In the release of every stable version, there will be a PM who has the following responsibilities in different stages of the release.
#### Preparation
- Set up milestone. Confirm that request is related to milestone.
#### Before Release
- Confirm that performance test is passed and all issues in current Milestone are either closed or can be delayed to later versions.
- Open a new [Release Proposal MR], and write `History` as [node CHANGELOG]. Don't forget to correct content in documentation which is related to the releasing version. Commits can be generated automatically.
```
$ npm run commits
```
- Nominate PM for next stable version.
[semver]: http://semver.org/lang/zh-CN/
[Release proposal MR]: https://github.com/nodejs/node/pull/4181
[node CHANGELOG]: https://github.com/nodejs/node/blob/master/CHANGELOG.md
[『我是如何发布一个 npm 包的』]: https://fengmk2.com/blog/2016/how-i-publish-a-npm-package
# 代码贡献规范
有任何疑问,欢迎提交 [issue](https://github.com/antvis/adjust/issues)
或者直接修改提交 [PR](https://github.com/antvis/adjust/pulls)!
## 提交 issue
- 请确定 issue 的类型。
- 请避免提交重复的 issue,在提交之前搜索现有的 issue。
- 在标签(分类参考**标签分类**), 标题 或者内容中体现明确的意图。
随后 AntV 负责人会确认 issue 意图,更新合适的标签,关联 milestone,指派开发者。
## 提交代码
### 提交 Pull Request
如果你有仓库的开发者权限,而且希望贡献代码,那么你可以创建分支修改代码提交 PR,AntV 开发团队会 review 代码合并到主干。
```bash
# 先创建开发分支开发,分支名应该有含义,避免使用 update、tmp 之类的
$ git checkout -b branch-name
# 开发完成后跑下测试是否通过,必要时需要新增或修改测试用例
$ npm test
# 测试通过后,提交代码,message 见下面的规范
$ git add . # git add -u 删除文件
$ git commit -m "fix(role): role.use must xxx"
$ git push origin branch-name
```
提交后就可以在 [adjust](https://github.com/antvis/adjust/pulls) 创建 Pull Request 了。
由于谁也无法保证过了多久之后还记得多少,为了后期回溯历史的方便,请在提交 MR 时确保提供了以下信息。
1. 需求点(一般关联 issue 或者注释都算)
2. 升级原因(不同于 issue,可以简要描述下为什么要处理)
3. 框架测试点(可以关联到测试文件,不用详细描述,关键点即可)
4. 关注点(针对用户而言,可以没有,一般是不兼容更新等,需要额外提示)
### 代码风格
你的代码风格必须通过 eslint,你可以运行 `$ npm run lint` 本地测试。
### Commit 提交规范
根据 [angular 规范](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format)提交 commit,
这样 history 看起来更加清晰,还可以自动生成 changelog。
```xml
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
```
(1)type
提交 commit 的类型,包括以下几种
- feat: 新功能
- fix: 修复问题
- docs: 修改文档
- style: 修改代码格式,不影响代码逻辑
- refactor: 重构代码,理论上不影响现有功能
- perf: 提升性能
- test: 增加修改测试用例
- chore: 修改工具相关(包括但不限于文档、代码生成等)
- deps: 升级依赖
(2)scope
修改文件的范围
(3)subject
用一句话清楚的描述这次提交做了什么
(4)body
补充 subject,适当增加原因、目的等相关因素,也可不写。
(5)footer
- **当有非兼容修改(Breaking Change)时必须在这里描述清楚**
- 关联相关 issue,如 `Closes #1, Closes #2, #3`
示例
```
fix($compile): [BREAKING_CHANGE] couple of unit tests for IE9
Older IEs serialize html uppercased, but IE9 does not...
Would be better to expect case insensitive, unfortunately jasmine does
not allow to user regexps for throw expectations.
Document change on antvis/adjust#12
Closes #392
BREAKING CHANGE:
Breaks foo.bar api, foo.baz should be used instead
```
查看具体[文档](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit)
## 发布管理
adjust 基于 [semver] 语义化版本号进行发布。
`master` 分支为当前稳定发布的版本。
- 直接从 `master` 切出开发分支
- 所有 API 的废弃都需要在当前的稳定版本上 `deprecate` 提示,并保证在当前的稳定版本上一直兼容到新版本的发布。
### 发布策略
每个大版本都有一个发布经理管理(PM),他/她要做的事情
#### 准备工作:
- 建立 milestone,确认需求关联 milestone,指派和更新 issues。
#### 发布前:
- 确认当前 Milestone 所有的 issue 都已关闭或可延期,完成性能测试。
- 发起一个新的 [Release Proposal MR],按照 [node CHANGELOG] 进行 `History` 的编写,修正文档中与版本相关的内容,commits 可以自动生成。
```bash
$ npm run commits
```
- 指定下一个大版本的 PM。
#### 发布时:
- 将老的稳定版本(master)备份到以当前大版本为名字的分支上(例如 `1.x`),并设置 tag 为 {v}.x`( v 为当前版本,例如 `1.x`)。
- 发布新的稳定版本到 [npm],并通知上层框架进行更新。
- `npm publish` 之前,请先阅读[『我是如何发布一个 npm 包的』]
[semver]: http://semver.org/lang/zh-CN/
[Release proposal MR]: https://github.com/nodejs/node/pull/4181
[node CHANGELOG]: https://github.com/nodejs/node/blob/master/CHANGELOG.md
[npm]: http://npmjs.com/
[『我是如何发布一个 npm 包的』]: https://fengmk2.com/blog/2016/how-i-publish-a-npm-package
MIT License
Copyright (c) 2018 AntV team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
# adjust
[![](https://img.shields.io/travis/antvis/adjust.svg)](https://travis-ci.org/antvis/adjust)
![](https://img.shields.io/badge/language-javascript-red.svg)
![](https://img.shields.io/badge/license-MIT-000000.svg)
[![npm package](https://img.shields.io/npm/v/@antv/adjust.svg)](https://www.npmjs.com/package/@antv/adjust)
[![NPM downloads](http://img.shields.io/npm/dm/@antv/adjust.svg)](https://npmjs.org/package/@antv/adjust)
[![Percentage of issues still open](http://isitmaintained.com/badge/open/antvis/adjust.svg)](http://isitmaintained.com/project/antvis/adjust "Percentage of issues still open")
## Installing
`npm install @antv/adjust`
```js
import Adjust from '@antv/adjust';
```
## API
See details at https://antv.alipay.com
## Contributing
This diff is collapsed.
This diff is collapsed.
process.env.DEBUG = 'app:*';
const debug = require('debug')('app:demos');
const commander = require('commander');
const connect = require('connect');
const getPort = require('get-port');
const http = require('http');
const open = require('open');
const serveStatic = require('serve-static');
const bodyParser = require('body-parser');
const parseurl = require('parseurl');
const url = require('url');
const assign = require('lodash').assign;
const path = require('path');
const resolve = path.resolve;
const join = path.join;
const fs = require('fs');
const JSZip = require('jszip');
const readFileSync = fs.readFileSync;
const writeFileSync = fs.writeFileSync;
const nunjucks = require('nunjucks');
const renderString = nunjucks.renderString;
const shelljs = require('shelljs');
const webpack = require('webpack');
const webpackConfig = require('../webpack.config');
const pkg = require('../package.json');
const blocks = require('./data/blocks.json');
const template = require('./data/template');
shelljs.config.execPath = shelljs.which('node');
commander
.version(pkg.version)
.option('-w, --web')
.option('-p, --port <port>', 'specify a port number to run on', parseInt)
.parse(process.argv);
function startService(port) {
const server = connect();
server
.use(bodyParser.urlencoded({
extended: true
}))
.use((req, res, next) => { // pre-handlers
const urlInfo = url.parse(req.url, true);
const query = urlInfo.query || {};
const body = req.body || {};
req._urlInfo = urlInfo;
req._pathname = urlInfo.pathname;
// add req._params (combination of query and body)
const params = Object.assign({}, query, body);
req._params = params;
req._query = query;
req._body = body;
res._sendRes = (str, contentType) => {
const buf = new Buffer(str);
contentType = contentType || 'text/html;charset=utf-8';
res.setHeader('Content-Type', contentType);
res.setHeader('Content-Length', buf.length);
res.end(buf);
};
// res._JSONRes(data) (generate JSON response)
res._JSONRes = data => {
res._sendRes(JSON.stringify(data), 'application/json;charset=utf-8');
};
// TODO res._JSONError()
// res._HTMLRes(data) (generate HTML response)
res._HTMLRes = res._sendRes;
return next();
})
.use((req, res, next) => {
const pathname = parseurl(req).pathname;
if (req.method === 'GET') {
if (pathname === '/bundler/index.html') {
res.end(renderString(readFileSync(join(__dirname, './index.njk'), 'utf8'), {
blocks
}));
} else {
next();
}
} else if (req.method === 'POST') {
if (pathname === '/bundle') {
// step1: prepare entry __index.js
const entryPath = resolve(process.cwd(), './src/__index.js');
const ids = req.body.ids.map(id => parseInt(id, 10));
const codeBlocks = blocks
.filter((item, index) => ids.indexOf(index) !== -1)
.map(item => item.code)
.join('\n');
const entryFileContent = template(codeBlocks);
writeFileSync(entryPath, template(codeBlocks), 'utf8');
// step2: build it
const distPath = resolve(process.cwd(), './__dist');
shelljs.rm('-rf', distPath);
shelljs.mkdir('-p', distPath);
const config = Object.assign({}, webpackConfig);
config.entry = {
g2: './src/__index.js'
};
config.output.path = distPath;
webpack(config, (err, stats) => {
// shelljs.rm(entryPath);
if (err || stats.hasErrors()) {
// Handle errors here
// shelljs.rm('-rf', distPath);
shelljs.rm(entryPath);
shelljs.rm('-rf', distPath);
}
// step3: uglify
shelljs.exec('uglifyjs -c -m -o __dist/g2.min.js -- __dist/g2.js');
// step4: zipping it
const zip = new JSZip();
zip.folder('g2-dist').file('entry.js', entryFileContent);
zip.folder('g2-dist').file('g2.js', readFileSync(join(distPath, './g2.js'), 'utf8'));
zip.folder('g2-dist').file('g2.js.map', readFileSync(join(distPath, './g2.js.map'), 'utf8'));
zip.folder('g2-dist').file('g2.min.js', readFileSync(join(distPath, './g2.min.js'), 'utf8'));
res.writeHead(200, {
'Content-Type': 'application/zip'
});
zip
.generateNodeStream({ type: 'nodebuffer', streamFiles: true })
.pipe(res)
.on('finish', function() {
// step5: clear up
shelljs.rm(entryPath);
shelljs.rm('-rf', distPath);
res.end();
});
});
}
} else {
next();
}
});
server.use(serveStatic(process.cwd()));
http.createServer(server).listen(port);
const urlPath = `http://127.0.0.1:${port}/bundler/index.html`;
debug(`server started, bundler available! ${urlPath}`);
if (commander.web) {
debug('running on web!');
open(urlPath);
} else {
debug('running on electron!');
const app = require('electron').app;
const BrowserWindow = require('electron').BrowserWindow;
const windowBoundsConfig = require('torchjs/lib/windowBoundsConfig')(
resolve(app.getPath('userData'), './g2-bundler-config.json')
);
let win;
app.once('ready', () => {
win = new BrowserWindow(assign({
// transparent: true
webPreferences: {
nodeIntegration: false
}
}, windowBoundsConfig.get('bundler')));
win.loadURL(urlPath);
win.on('close', () => {
windowBoundsConfig.set('bundler', win.getBounds());
});
win.on('closed', () => {
win = null;
});
});
app.on('window-all-closed', () => {
app.quit();
});
}
}
if (commander.port) {
startService(commander.port);
} else {
getPort().then(port => {
startService(port);
});
}
.container {
margin-top: 40px;
}
.block {
border-radius: 8px;
cursor: pointer;
padding-top: 16px;
text-align: center;
background: #f9f9f9;
outline: 1px solid #fff;
}
.block.selected, .block.selected:hover {
background: #0069d9;
color: white;
}
.block:hover {
background: #dfd;
}
/* loading */
#loading {
position: absolute;
width: 100%;
height: 100%;
background: white;
top: 0;
opacity: .95;
}
.sk-cube-grid {
width: 120px;
height: 120px;
margin: calc(40vh) auto 0;
}
.sk-cube-grid .sk-cube {
width: 33%;
height: 33%;
background-color: #0069d9;
float: left;
-webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
}
.sk-cube-grid .sk-cube1 {
-webkit-animation-delay: 0.2s;
animation-delay: 0.2s;
}
.sk-cube-grid .sk-cube2 {
-webkit-animation-delay: 0.3s;
animation-delay: 0.3s;
}
.sk-cube-grid .sk-cube3 {
-webkit-animation-delay: 0.4s;
animation-delay: 0.4s;
}
.sk-cube-grid .sk-cube4 {
-webkit-animation-delay: 0.1s;
animation-delay: 0.1s;
}
.sk-cube-grid .sk-cube5 {
-webkit-animation-delay: 0.2s;
animation-delay: 0.2s;
}
.sk-cube-grid .sk-cube6 {
-webkit-animation-delay: 0.3s;
animation-delay: 0.3s;
}
.sk-cube-grid .sk-cube7 {
-webkit-animation-delay: 0s;
animation-delay: 0s;
}
.sk-cube-grid .sk-cube8 {
-webkit-animation-delay: 0.1s;
animation-delay: 0.1s;
}
.sk-cube-grid .sk-cube9 {
-webkit-animation-delay: 0.2s;
animation-delay: 0.2s;
}
@-webkit-keyframes sk-cubeGridScaleDelay {
0%, 70%, 100% {
-webkit-transform: scale3D(1, 1, 1);
transform: scale3D(1, 1, 1);
}
35% {
-webkit-transform: scale3D(0, 0, 1);
transform: scale3D(0, 0, 1);
}
}
@keyframes sk-cubeGridScaleDelay {
0%, 70%, 100% {
-webkit-transform: scale3D(1, 1, 1);
transform: scale3D(1, 1, 1);
}
35% {
-webkit-transform: scale3D(0, 0, 1);
transform: scale3D(0, 0, 1);
}
}
const $loading = $('#loading');
$loading.hide();
$(document.body).on('click', '.block', function() {
if ($(this).hasClass('selected')) {
$(this).removeClass('selected');
} else {
$(this).addClass('selected');
}
});
function JSON_to_URLEncoded(element, key, list) {
list = list || [];
if (typeof (element) === 'object') {
for (const idx in element) {
JSON_to_URLEncoded(element[idx], key ? key + '[' + idx + ']' : idx, list);
}
} else {
list.push(key + '=' + encodeURIComponent(element));
}
return list.join('&');
}
$('#select-and-build').on('click', () => {
$loading.show();
const ids = $.map($('.selected.block'), item => $(item).data('index'));
const xhr = new XMLHttpRequest();
xhr.open('POST', '/bundle', true);
// xhr.setRequestHeader('Content-type', 'application/json');
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.responseType = 'blob';
xhr.onreadystatechange = () => { // Call a function when the state changes.
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
// Request finished. Do processing here.
$loading.hide();
window.saveAs(xhr.response, 'g2-dist.zip');
}
};
xhr.send(JSON_to_URLEncoded({ ids }));
// $.ajax({
// type: 'POST',
// url: '/bundle',
// data: { ids },
// beforeSend: jqXHR => {
// jqXHR.responseType = 'binary';
// }
// }).done(data => {
// const binaryData = [];
// binaryData.push(data);
// window.saveAs(new Blob(binaryData, { type: 'application/zip' }), 'g2-dist.zip');
// });
});
$('#select-all').on('click', () => {
$('.block').addClass('selected');
});
$('#cancel-select').on('click', () => {
$('.selected').removeClass('selected');
});
[
{
"name": "sample",
"code": "require('./sample');",
"description": "FIXME: replace with actual module"
}]
module.exports = blocks => `
const adjust = require('./core');
${blocks}
module.exports = adjust;
`;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="../demos/assets/bootstrap-4.1.0/bootstrap.min.css">
<link rel="stylesheet" href="../demos/assets/bootstrap-4.1.0/bootstrap-grid.min.css">
<link rel="stylesheet" href="./assets/index.css">
<title>G2 Bundler</title>
</head>
<body>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" style="width:0;height:0;position:absolute;overflow:hidden;">
<defs>
<symbol viewBox="0 0 1024 960" aria-labelledby="si-metro-download" id="si-metro-download">
<path d="M512 512l256-256H576V0H448v256H256zm232.727-104.728l-71.74 71.742L933.067 576 512 733.018 90.934 576l260.08-96.986-71.742-71.742L0 512v256l512 192 512-192V512z"/>
</symbol>
</defs>
</svg>
<div class="container">
<div class="row">
<div class="col"></div>
<div class="col-6">
<button class="btn btn-primary btn-lg btn-block" id="select-and-build">
<svg class="si" fill="white" width="24" height="24" style="vertical-align:sub;margin:0 5px;">
<use xlink:href="#si-metro-download"></use>
</svg>
Select & Build
</button>
</div>
<div class="col"></div>
</div>
</div>
<div class="container">
<div class="btn-group" role="group" aria-label="Basic example">
<button id="select-all" class="btn btn-primary">Select All</button>
<button id="cancel-select" class="btn">Cancel Select</button>
</div>
</div>
<div class="container">
<div class="row">
{% for b in blocks %}
<div class="block col-lg-4 col-md-4 col-sm-6" data-index="{{ loop.index0 }}">
<h5>{{ b.name }}</h5>
<p>{{ b.description }}</p>
</div>
{% endfor %}
</div>
</div>
<div id="loading">
<div class="sk-cube-grid">
<div class="sk-cube sk-cube1"></div>
<div class="sk-cube sk-cube2"></div>
<div class="sk-cube sk-cube3"></div>
<div class="sk-cube sk-cube4"></div>
<div class="sk-cube sk-cube5"></div>
<div class="sk-cube sk-cube6"></div>
<div class="sk-cube sk-cube7"></div>
<div class="sk-cube sk-cube8"></div>
<div class="sk-cube sk-cube9"></div>
</div>
</div>
<script src="../demos/assets/lodash-4.17.4.min.js"></script>
<script src="../demos/assets/jquery-3.2.1.min.js"></script>
<script src="../demos/assets/popper.js-1.12.5/popper.min.js"></script>
<script src="../demos/assets/bootstrap-4.1.0/bootstrap.min.js"></script>
<script src="../demos/assets/file-saver-1.3.8.min.js"></script>
<script src="./assets/index.js"></script>
</body>
</html>
!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.adjust=n():t.adjust=n()}("undefined"!=typeof self?self:this,function(){return function(t){function n(e){if(r[e])return r[e].exports;var i=r[e]={i:e,l:!1,exports:{}};return t[e].call(i.exports,i,i.exports,n),i.l=!0,i.exports}var r={};return n.m=t,n.c=r,n.d=function(t,r,e){n.o(t,r)||Object.defineProperty(t,r,{configurable:!1,enumerable:!0,get:e})},n.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(r,"a",r),r},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=10)}([function(t,n,r){var e=r(12),i=r(1);t.exports=function(t,n){if(t)if(i(t))for(var r=0,o=t.length;r<o&&!1!==n(t[r],r);r++);else if(e(t))for(var u in t)if(t.hasOwnProperty(u)&&!1===n(t[u],u))break}},function(t,n,r){var e=r(5),i=Array.isArray?Array.isArray:function(t){return e(t,"Array")};t.exports=i},function(t,n,r){var e=r(3),i=function(){function t(t){this._initDefaultCfg(),e(this,t)}var n=t.prototype;return n._initDefaultCfg=function(){this.adjustNames=["x","y"]},n.processAdjust=function(){},t}();t.exports=i},function(t,n){function r(t,n){for(var r in n)n.hasOwnProperty(r)&&"constructor"!==r&&void 0!==n[r]&&(t[r]=n[r])}t.exports=function(t,n,e,i){return n&&r(t,n),e&&r(t,e),i&&r(t,i),t}},function(t,n){t.exports=function(t){for(var n=[],r=0;r<t.length;r++)n=n.concat(t[r]);return n}},function(t,n){var r={}.toString;t.exports=function(t,n){return r.call(t)==="[object "+n+"]"}},function(t,n){t.exports=function(t){return null===t||void 0===t}},function(t,n,r){var e=r(0),i={values:r(8)};t.exports={isAdjust:function(t){return this.adjustNames.indexOf(t)>=0},_getDimValues:function(t){var n={},r=[];if(this.xField&&this.isAdjust("x")&&r.push(this.xField),this.yField&&this.isAdjust("y")&&r.push(this.yField),e(r,function(r){var e=i.values(t,r);e.sort(function(t,n){return t-n}),n[r]=e}),!this.yField&&this.isAdjust("y")){var o=[0,1];n.y=o}return n},adjustData:function(t,n){var r=this,i=r._getDimValues(n);e(t,function(n,o){e(i,function(e,i){r.adjustDim(i,e,n,t.length,o)})})},getAdjustRange:function(t,n,r){var e,i,o=r.indexOf(n),u=r.length;return!this.yField&&this.isAdjust("y")?(e=0,i=1):u>1?(e=0===o?r[0]:r[o-1],i=o===u-1?r[u-1]:r[o+1],0!==o?e+=(n-e)/2:e-=(i-n)/2,o!==u-1?i-=(i-n)/2:i+=(n-r[u-2])/2):(e=0===n?0:n-.5,i=0===n?1:n+.5),{pre:e,next:i}},groupData:function(t,n){var r={};return e(t,function(t){var e=t[n];void 0===e&&(e=t[n]=0),r[e]||(r[e]=[]),r[e].push(t)}),r}}},function(t,n,r){var e=r(6),i=r(1),o=r(0);t.exports=function(t,n){for(var r=[],u={},s=0;s<t.length;s++){var a=t[s][n];e(a)||(i(a)||(a=[a]),o(a,function(t){u[t]||(r.push(t),u[t]=!0)}))}return r}},function(t,n,r){var e=r(5);t.exports=function(t){return e(t,"Function")}},function(t,n,r){var e=r(3),i=r(2),o=r(11),u=r(13),s=r(7),a=r(14),f=r(18);e(i.prototype,s),e(o.prototype,s,a),e(u.prototype,f),i.Jitter=r(19),i.Symmetric=r(20),i.Dodge=o,i.Stack=u,t.exports=i},function(t,n,r){var e=r(2),i=r(0),o=function(t){function n(){return t.apply(this,arguments)||this}!function(t,n){t.prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n}(n,t);var r=n.prototype;return r._initDefaultCfg=function(){this.marginRatio=.5,this.dodgeRatio=.5,this.adjustNames=["x","y"]},r.getDodgeOffset=function(t,n,r){var e=t.pre,i=t.next,o=i-e,u=o*this.dodgeRatio/r,s=this.marginRatio*u;return(e+i)/2+(.5*(o-r*u-(r-1)*s)+((n+1)*u+n*s)-.5*u-.5*o)},r.processAdjust=function(t){var n=this,r=t.length,e=n.xField;i(t,function(t,i){for(var o=0,u=t.length;o<u;o++){var s=t[o],a=s[e],f={pre:1===u?a-1:a-.5,next:1===u?a+1:a+.5},c=n.getDodgeOffset(f,i,r);s[e]=c}})},n}(e);e.Dodge=o,t.exports=o},function(t,n){var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};t.exports=function(t){var n=void 0===t?"undefined":r(t);return null!==t&&"object"===n||"function"===n}},function(t,n,r){var e=r(1),i=r(6),o=r(2),u=function(t){function n(){return t.apply(this,arguments)||this}!function(t,n){t.prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n}(n,t);var r=n.prototype;return r._initDefaultCfg=function(){this.xField=null,this.yField=null},r.processAdjust=function(t){this.processStack(t)},r.processStack=function(t){var n=this.xField,r=this.yField,o=t.length,u={positive:{},negative:{}};this.reverseOrder&&(t=t.slice(0).reverse());for(var s=0;s<o;s++)for(var a=t[s],f=0,c=a.length;f<c;f++){var p=a[f],l=p[n]||0,h=p[r],d=l.toString();if(h=e(h)?h[1]:h,!i(h)){var v=h>=0?"positive":"negative";u[v][d]||(u[v][d]=0),p[r]=[u[v][d],h+u[v][d]],u[v][d]+=h}}},n}(o);o.Stack=u,t.exports=u},function(t,n,r){var e={merge:r(4),values:r(8)},i=r(15),o=r(0);t.exports={processAdjust:function(t){var n=e.merge(t),r=this.dodgeBy,o=t;r&&(o=i(n,r)),this.cacheMap={},this.adjDataArray=o,this.mergeData=n,this.adjustData(o,n),this.adjDataArray=null,this.mergeData=null},getDistribution:function(t){var n=this.adjDataArray,r=this.cacheMap,i=r[t];return i||(i={},o(n,function(n,r){var u=e.values(n,t);u.length||u.push(0),o(u,function(t){i[t]||(i[t]=[]),i[t].push(r)})}),r[t]=i),i},adjustDim:function(t,n,r,e,i){var u=this,s=u.getDistribution(t),a=u.groupData(r,t);o(a,function(r,e){e=parseFloat(e);var a;a=1===n.length?{pre:n[0]-1,next:n[0]+1}:u.getAdjustRange(t,e,n),o(r,function(n){var r=n[t],e=s[r],o=e.indexOf(i);n[t]=u.getDodgeOffset(a,o,e.length)})})}}},function(t,n,r){var e=r(16);t.exports=function(t,n){if(!n)return[t];var r=e(t,n),i=[];for(var o in r)i.push(r[o]);return i}},function(t,n,r){var e=r(9),i=r(1),o=r(17);t.exports=function(t,n){if(!n)return{0:t};if(!e(n)){var r=i(n)?n:n.replace(/\s+/g,"").split("*");n=function(t){for(var n="_",e=0,i=r.length;e<i;e++)n+=t[r[e]]&&t[r[e]].toString();return n}}return o(t,n)}},function(t,n,r){var e=r(0),i=r(1),o=Object.prototype.hasOwnProperty;t.exports=function(t,n){if(!n||!i(t))return t;var r={},u=null;return e(t,function(t){u=n(t),o.call(r,u)?r[u].push(t):r[u]=[t]}),r}},function(t,n){t.exports={_initDefaultCfg:function(){this.xField=null,this.yField=null,this.height=null,this.size=10,this.reverseOrder=!1,this.adjustNames=["y"]},processOneDimStack:function(t){var n=this.xField,r=this.yField||"y",e=this.height,i={};this.reverseOrder&&(t=t.slice(0).reverse());for(var o=0,u=t.length;o<u;o++)for(var s=t[o],a=0,f=s.length;a<f;a++){var c=s[a],p=2*(c.size||this.size)/e,l=c[n];i[l]||(i[l]=p/2),c[r]=i[l],i[l]+=p}},processAdjust:function(t){this.yField?this.processStack(t):this.processOneDimStack(t)}}},function(t,n,r){var e=r(0),i=r(3),o={merge:r(4)},u=r(2),s=r(7),a=function(t){function n(){return t.apply(this,arguments)||this}!function(t,n){t.prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n}(n,t);var r=n.prototype;return r._initDefaultCfg=function(){this.xField=null,this.yField=null,this.adjustNames=["x","y"],this.groupFields=null},r.processAdjust=function(t){var n=o.merge(t);this.adjDataArray=t,this.mergeData=n,this.adjustData(t,n),this.adjFrames=null,this.mergeData=null},r.getAdjustOffset=function(t,n){var r=n-t;return t+.05*r+.9*r*Math.random()},r._adjustGroup=function(t,n,r,i){var o=this,u=o.getAdjustRange(n,r,i);e(t,function(t){t[n]=o.getAdjustOffset(u.pre,u.next)})},r.adjustDim=function(t,n,r){var i=this,o=i.groupData(r,t);e(o,function(r,e){e=parseFloat(e),i._adjustGroup(r,t,e,n)})},n}(u);i(a.prototype,s),u.Jitter=a,t.exports=a},function(t,n,r){var e=r(0),i=r(21),o=r(1),u={merge:r(4)},s=r(2),a=function(t){function n(){return t.apply(this,arguments)||this}!function(t,n){t.prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n}(n,t);var r=n.prototype;return r._initDefaultCfg=function(){this.xField=null,this.yField=null,this.cacheMax=null,this.adjustNames=["y"],this.groupFields=null},r._getMax=function(t){var n=this.mergeData,r=i(n,function(n){var r=n[t];return o(r)?Math.max.apply(null,r):r})[t];return o(r)?Math.max.apply(null,r):r},r._getXValuesMax=function(){var t=this.yField,n=this.xField,r={},i=this.mergeData;return e(i,function(e){var i=e[n],u=e[t],s=o(u)?Math.max.apply(null,u):u;r[i]=r[i]||0,r[i]<s&&(r[i]=s)}),r},r.processAdjust=function(t){var n=u.merge(t);this.mergeData=n,this._processSymmetric(t),this.mergeData=null},r._processSymmetric=function(t){var n,r=this.xField,i=this.yField,u=this._getMax(i),s=t[0][0];s&&o(s[i])&&(n=this._getXValuesMax()),e(t,function(t){e(t,function(t){var s,a=t[i];if(o(a)){var f=t[r],c=n[f];s=(u-c)/2;var p=[];e(a,function(t){p.push(s+t)}),t[i]=p}else s=(u-a)/2,t[i]=[s,a+s]})})},n}(s);s.Symmetric=a,t.exports=a},function(t,n,r){var e=r(1),i=r(9),o=r(0);t.exports=function(t,n){if(e(t)){var r=t[0],u=void 0;u=i(n)?n(t[0]):t[0][n];var s=void 0;return o(t,function(t){(s=i(n)?n(t):t[n])>u&&(r=t,u=s)}),r}}}])});
\ No newline at end of file
var mix = require('@antv/util/lib/mix');
var Adjust =
/*#__PURE__*/
function () {
var _proto = Adjust.prototype;
_proto._initDefaultCfg = function _initDefaultCfg() {
this.adjustNames = ['x', 'y']; // 调整的维度,默认,x,y都做调整
};
function Adjust(cfg) {
this._initDefaultCfg();
mix(this, cfg);
}
/**
* @override
*/
_proto.processAdjust = function processAdjust()
/* dataArray */
{};
return Adjust;
}();
module.exports = Adjust;
\ No newline at end of file
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
var Adjust = require('./base');
var each = require('@antv/util/lib/each');
var MARGIN_RATIO = 1 / 2;
var DODGE_RATIO = 1 / 2;
var Dodge =
/*#__PURE__*/
function (_Adjust) {
_inheritsLoose(Dodge, _Adjust);
function Dodge() {
return _Adjust.apply(this, arguments) || this;
}
var _proto = Dodge.prototype;
_proto._initDefaultCfg = function _initDefaultCfg() {
/**
* 调整过程中,2个数据的间距
* @type {Number}
*/
this.marginRatio = MARGIN_RATIO;
/**
* 调整占单位宽度的比例,例如:占2个分类间距的 1/2
* @type {Number}
*/
this.dodgeRatio = DODGE_RATIO;
this.adjustNames = ['x', 'y']; // 调整的维度,默认,x,y都做调整
};
_proto.getDodgeOffset = function getDodgeOffset(range, index, count) {
var self = this;
var pre = range.pre;
var next = range.next;
var tickLength = next - pre;
var width = tickLength * self.dodgeRatio / count;
var margin = self.marginRatio * width;
var offset = 1 / 2 * (tickLength - count * width - (count - 1) * margin) + ((index + 1) * width + index * margin) - 1 / 2 * width - 1 / 2 * tickLength;
return (pre + next) / 2 + offset;
};
_proto.processAdjust = function processAdjust(dataArray) {
var self = this;
var count = dataArray.length;
var xField = self.xField;
each(dataArray, function (data, index) {
for (var i = 0, len = data.length; i < len; i++) {
var obj = data[i];
var value = obj[xField];
var range = {
pre: len === 1 ? value - 1 : value - 0.5,
next: len === 1 ? value + 1 : value + 0.5
};
var dodgeValue = self.getDodgeOffset(range, index, count);
obj[xField] = dodgeValue;
}
});
};
return Dodge;
}(Adjust);
Adjust.Dodge = Dodge;
module.exports = Dodge;
\ No newline at end of file
// 完整版下使用支持按照某个字段进行分组的 dodge
var mix = require('@antv/util/lib/mix');
var Adjust = require('./base');
var Dodge = require('./dodge');
var Stack = require('./stack');
var AdjustMixin = require('./mixin/adjust');
var DodgeMixin = require('./mixin/dodge');
var StackMixin = require('./mixin/stack');
mix(Adjust.prototype, AdjustMixin);
mix(Dodge.prototype, AdjustMixin, DodgeMixin);
mix(Stack.prototype, StackMixin);
Adjust.Jitter = require('./jitter');
Adjust.Symmetric = require('./symmetric');
Adjust.Dodge = Dodge;
Adjust.Stack = Stack;
module.exports = Adjust;
\ No newline at end of file
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
var each = require('@antv/util/lib/each');
var mix = require('@antv/util/lib/mix');
var ArrayUtil = {
merge: require('@antv/util/lib/array/merge')
};
var Adjust = require('./base');
var AdjustMixin = require('./mixin/adjust');
var Jitter =
/*#__PURE__*/
function (_Adjust) {
_inheritsLoose(Jitter, _Adjust);
function Jitter() {
return _Adjust.apply(this, arguments) || this;
}
var _proto = Jitter.prototype;
_proto._initDefaultCfg = function _initDefaultCfg() {
this.xField = null; // 调整对应的 x 方向对应的字段名称
this.yField = null; // 调整对应的 y 方向对应的字段名称
this.adjustNames = ['x', 'y']; // 指x,y
this.groupFields = null; // 参与分组的数据维度
};
_proto.processAdjust = function processAdjust(dataArray) {
var self = this;
var mergeData = ArrayUtil.merge(dataArray);
self.adjDataArray = dataArray;
self.mergeData = mergeData;
self.adjustData(dataArray, mergeData);
self.adjFrames = null;
self.mergeData = null;
};
_proto.getAdjustOffset = function getAdjustOffset(pre, next) {
var r = Math.random(); // 随机位置,均匀分布
var avg = next - pre; // * length
var append = avg * 0.05;
return pre + append + avg * 0.9 * r;
}; // adjust group data
_proto._adjustGroup = function _adjustGroup(group, dim, key, values) {
var self = this;
var range = self.getAdjustRange(dim, key, values);
each(group, function (record) {
record[dim] = self.getAdjustOffset(range.pre, range.next); // 获取调整的位置
});
};
_proto.adjustDim = function adjustDim(dim, values, data) {
var self = this;
var groupData = self.groupData(data, dim);
each(groupData, function (group, key) {
key = parseFloat(key);
self._adjustGroup(group, dim, key, values);
});
};
return Jitter;
}(Adjust);
mix(Jitter.prototype, AdjustMixin);
Adjust.Jitter = Jitter;
module.exports = Jitter;
\ No newline at end of file
var DEFAULT_Y = 0; // 默认的y的值
var each = require('@antv/util/lib/each');
var ArrayUtil = {
values: require('@antv/util/lib/array/values-of-key')
};
module.exports = {
/**
* 对应的维度是否可以调整
* @protected
* @param {String} dimName 可以调整的维度 x,y
* @return {Boolean} 是否可以调整
*/
isAdjust: function isAdjust(dimName) {
return this.adjustNames.indexOf(dimName) >= 0;
},
/**
* @protected
* 获取可调整度量对应的值
* @param {Frame} mergeData 数据
* @return {Object} 值的映射
*/
_getDimValues: function _getDimValues(mergeData) {
var self = this;
var valuesMap = {};
var dims = [];
if (self.xField && self.isAdjust('x')) {
dims.push(self.xField);
}
if (self.yField && self.isAdjust('y')) {
dims.push(self.yField);
}
each(dims, function (dim) {
var values = ArrayUtil.values(mergeData, dim);
values.sort(function (v1, v2) {
return v1 - v2;
});
valuesMap[dim] = values;
});
if (!self.yField && self.isAdjust('y')) {
// 只有一维的情况下,同时调整y
var dim = 'y';
var values = [DEFAULT_Y, 1]; // 默认分布在y轴的 0.1 与 0.2 之间
valuesMap[dim] = values;
}
return valuesMap;
},
adjustData: function adjustData(dataArray, mergeData) {
var self = this;
var valuesMap = self._getDimValues(mergeData);
each(dataArray, function (data, index) {
// 遍历所有数据集合
each(valuesMap, function (values, dim) {
// 根据不同的度量分别调整位置
self.adjustDim(dim, values, data, dataArray.length, index);
});
});
},
getAdjustRange: function getAdjustRange(dim, key, values) {
var self = this;
var index = values.indexOf(key);
var length = values.length;
var pre;
var next;
if (!self.yField && self.isAdjust('y')) {
pre = 0;
next = 1;
} else if (length > 1) {
pre = index === 0 ? values[0] : values[index - 1];
next = index === length - 1 ? values[length - 1] : values[index + 1];
if (index !== 0) {
pre += (key - pre) / 2;
} else {
pre -= (next - key) / 2;
}
if (index !== length - 1) {
next -= (next - key) / 2;
} else {
next += (key - values[length - 2]) / 2;
}
} else {
pre = key === 0 ? 0 : key - 0.5;
next = key === 0 ? 1 : key + 0.5;
}
return {
pre: pre,
next: next
};
},
/**
* 对数据进行分组
* @param {Array} data 数据
* @param {String} dim 分组的字段
* @return {Object} 分组的键值对映射
*/
groupData: function groupData(data, dim) {
var groups = {};
each(data, function (record) {
var value = record[dim];
if (value === undefined) {
value = record[dim] = DEFAULT_Y;
}
if (!groups[value]) {
groups[value] = [];
}
groups[value].push(record);
});
return groups;
}
};
\ No newline at end of file
var ArrayUtil = {
merge: require('@antv/util/lib/array/merge'),
values: require('@antv/util/lib/array/values-of-key')
};
var group = require('@antv/util/lib/group');
var each = require('@antv/util/lib/each');
module.exports = {
/**
* @protected
* @override
*/
processAdjust: function processAdjust(dataArray) {
var self = this;
var mergeData = ArrayUtil.merge(dataArray);
var dodgeDim = self.dodgeBy;
var adjDataArray = dataArray;
if (dodgeDim) {
// 如果指定了分组dim的字段
adjDataArray = group(mergeData, dodgeDim);
}
self.cacheMap = {};
self.adjDataArray = adjDataArray;
self.mergeData = mergeData;
self.adjustData(adjDataArray, mergeData);
self.adjDataArray = null;
self.mergeData = null;
},
getDistribution: function getDistribution(dim) {
var self = this;
var dataArray = self.adjDataArray;
var cacheMap = self.cacheMap;
var map = cacheMap[dim];
if (!map) {
map = {};
each(dataArray, function (data, index) {
var values = ArrayUtil.values(data, dim);
if (!values.length) {
values.push(0);
}
each(values, function (val) {
if (!map[val]) {
map[val] = [];
}
map[val].push(index);
});
});
cacheMap[dim] = map;
}
return map;
},
adjustDim: function adjustDim(dim, values, data, frameCount, frameIndex) {
var self = this;
var map = self.getDistribution(dim);
var groupData = self.groupData(data, dim); // 根据值分组
each(groupData, function (group, key) {
key = parseFloat(key);
var range;
if (values.length === 1) {
range = {
pre: values[0] - 1,
next: values[0] + 1
};
} else {
range = self.getAdjustRange(dim, key, values);
}
each(group, function (record) {
var value = record[dim];
var valueArr = map[value];
var valIndex = valueArr.indexOf(frameIndex);
record[dim] = self.getDodgeOffset(range, valIndex, valueArr.length);
});
});
}
};
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
{
"plugins": [
"transform-remove-strict-mode"
],
"presets": [
[
"env",
{
"loose": true,
"modules": false
}
]
]
}
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
charset = utf-8
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2
[Makefile]
indent_style = tab
indent_size = 1
[*.md]
trim_trailing_whitespace = false
\ No newline at end of file
build/
coverage/
dist/
lib/
mocks/
node_modules/
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment