diff --git a/.eslintignore b/.eslintignore
index 3c3629e..f8842e8 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1 +1,3 @@
node_modules
+doc
+docs
\ No newline at end of file
diff --git a/ActionSheet/ActionSheet.md b/ActionSheet/ActionSheet.md
new file mode 100644
index 0000000..f9c1117
--- /dev/null
+++ b/ActionSheet/ActionSheet.md
@@ -0,0 +1,27 @@
+#### Demo
+
+
+
+#### Example
+
+```JavaScript
+import ActionSheet from 'rnx-ui/ActionSheet';
+
+function Example(props) {
+ return (
+
+ );
+}
+```
+
+
diff --git a/ActionSheet/README.md b/ActionSheet/README.md
deleted file mode 100644
index d1a38fb..0000000
--- a/ActionSheet/README.md
+++ /dev/null
@@ -1,89 +0,0 @@
-# ActionSheet
-
-**上拉按钮组**
-
-## Demo
-
-
-
-
-## Example
-
-```js
-import ActionSheet from 'rnx-ui/ActionSheet';
-
-function Example(props) {
- return (
-
- );
-}
-```
-
-## Props
-
-```js
-ActionSheet.propTypes = {
- // 显示开关
- visible: Sheet.propTypes.visible,
- // 按钮组
- btnList: PropTypes.arrayOf(PropTypes.shape({
- // 按钮样式
- style: View.propTypes.style,
- // 按钮文字
- text: PropTypes.string,
- // 按钮文字样式
- textStyle: Text.propTypes.style,
- // 按钮点击回调
- onPress: PropTypes.func,
- })),
- // 统一按钮样式
- btnStyle: View.propTypes.style,
- // 统一按钮文字样式
- btnTextStyle: Text.propTypes.style,
- // 取消按钮样式
- cancelBtnStyle: View.propTypes.style,
- // 取消按钮文字
- cancelBtnText: PropTypes.string,
- // 取消按钮文字样式
- cancelBtnTextStyle: Text.propTypes.style,
- // 遮罩层样式
- overlayStyle: Sheet.propTypes.overlayStyle,
- // 关闭回调(动画结束时)
- onClose: Sheet.propTypes.onClose,
- // 动画时长
- duration: Sheet.propTypes.duration,
- // 自定义样式
- style: View.propTypes.style,
- // 按钮点击透明度变化
- underlayColor: PropTypes.string,
-};
-ActionSheet.defaultProps = {
- visible: false,
- btnList: [{
- style: null,
- text: '确定',
- textStyle: null,
- onPress: NOOP,
- }],
- btnStyle: null,
- btnTextStyle: null,
- cancelBtnStyle: null,
- cancelBtnText: '取消',
- cancelBtnTextStyle: null,
- overlayStyle: null,
- onClose: NOOP,
- duration: 200,
- style: null,
- underlayColor: '#eee',
-};
-```
diff --git a/ActionSheet/index.js b/ActionSheet/index.js
index 1e7c5a3..3255ae4 100644
--- a/ActionSheet/index.js
+++ b/ActionSheet/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component ActionSheet
+ * @version 0.11.7
+ * @description 上拉按钮组
+ *
+ * @instructions {instruInfo: ./ActionSheet/ActionSheet.md}
+ */
import React, { Component, PropTypes } from 'react';
import {
Platform,
@@ -75,40 +82,110 @@ class ActionSheet extends Component {
}
ActionSheet.propTypes = {
- // 显示开关
+ /**
+ * @property visible
+ * @type Boolean
+ * @default false
+ * @description 显示开关
+ */
visible: Sheet.propTypes.visible,
// 按钮组
+ /**
+ * @property btnList
+ * @type Object
+ * @default [{
+ * style: null,
+ * text: '确定',
+ * textStyle: null,
+ * onPress: NOOP,
+ * }]
+ * @param {Object} style 按钮样式
+ * @param {String} text 按钮文字
+ * @param {Object} textStyle 按钮文字样式
+ * @param {Function} onPress 按钮点击回调
+ * @description 按钮组
+ */
btnList: PropTypes.arrayOf(PropTypes.shape({
/* eslint-disable */
- // 按钮样式
+
style: View.propTypes.style,
- // 按钮文字
+
text: PropTypes.string,
- // 按钮文字样式
+
textStyle: Text.propTypes.style,
- // 按钮点击回调
+
onPress: PropTypes.func,
/* eslint-enable */
})),
- // 统一按钮样式
+ /**
+ * @property btnStyle
+ * @type Object
+ * @default null
+ * @description 统一按钮样式
+ */
btnStyle: View.propTypes.style,
- // 统一按钮文字样式
+ /**
+ * @property btnTextStyle
+ * @type Object
+ * @default null
+ * @description 统一按钮文字样式
+ */
btnTextStyle: Text.propTypes.style,
- // 取消按钮样式
+ /**
+ * @property cancelBtnStyle
+ * @type Object
+ * @default null
+ * @description 取消按钮样式
+ */
cancelBtnStyle: View.propTypes.style,
- // 取消按钮文字
+ /**
+ * @property cancelBtnText
+ * @type String
+ * @default '取消'
+ * @description 取消按钮文字
+ */
cancelBtnText: PropTypes.string,
- // 取消按钮文字样式
+ /**
+ * @property cancelBtnTextStyle
+ * @type Object
+ * @default null
+ * @description 取消按钮文字样式
+ */
cancelBtnTextStyle: Text.propTypes.style,
- // 遮罩层样式
+ /**
+ * @property overlayStyle
+ * @type Object
+ * @default null
+ * @description 遮罩层样式
+ */
overlayStyle: Sheet.propTypes.overlayStyle,
- // 关闭回调(动画结束时)
+ /**
+ * @property onClose
+ * @type Function
+ * @default NOOP
+ * @description 关闭回调(动画结束时)
+ */
onClose: Sheet.propTypes.onClose,
- // 动画时长
+ /**
+ * @property duration
+ * @type Number
+ * @default 200
+ * @description 动画时长
+ */
duration: Sheet.propTypes.duration,
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 按钮点击透明度变化
+ /**
+ * @property underlayColor
+ * @type String
+ * @default '#eee'
+ * @description 按钮点击透明度变化
+ */
underlayColor: PropTypes.string,
};
ActionSheet.defaultProps = {
diff --git a/AddAndSubtract/AddAndSubtract.md b/AddAndSubtract/AddAndSubtract.md
new file mode 100644
index 0000000..173fb2e
--- /dev/null
+++ b/AddAndSubtract/AddAndSubtract.md
@@ -0,0 +1,20 @@
+#### Demo
+
+
+
+#### Example
+
+```JavaScript
+import Template from 'rnx-ui/Template';
+
+function Example(props) {
+ return (
+
+ );
+}
+```
+
diff --git a/AddAndSubtract/README.md b/AddAndSubtract/README.md
deleted file mode 100644
index bd787bb..0000000
--- a/AddAndSubtract/README.md
+++ /dev/null
@@ -1,93 +0,0 @@
-# AddAndSubtract
-
-**加减法动画组件**
-
-带有动画的加减法组件
-
-## Demo
-
-
-
-## Example
-
-```js
-import Template from 'rnx-ui/Template';
-
-function Example(props) {
- return (
-
- );
-}
-```
-
-## Props
-
-```js
-AddAndSubtract.propTypes = {
- // 数字
- num(props, propName) {
- const num = props[propName];
- if (typeof num !== 'number') {
- return new Error('AddAndSubtract.props.num must be a number.');
- }
- if (num < 0) {
- return new Error('AddAndSubtract.props.num must be greater than 0.');
- }
- return null;
- },
- // 加法按钮点击事件
- onPressAdder: PropTypes.func,
- // 减法按钮点击事件
- onPressSubtracter: PropTypes.func,
- // 动画时间
- duration: PropTypes.number,
- // 减法按钮移动距离
- distance: PropTypes.number,
- // 减法旋转角度
- deg: PropTypes.number,
- // 动画函数
- easing: PropTypes.func,
- // 按钮宽度
- btnWidth: PropTypes.number,
- // 自定义样式
- style: View.propTypes.style,
- // 加法按钮样式
- adderStyle: View.propTypes.style,
- // 减法按钮样式
- subtracterStyle: View.propTypes.style,
- // 自定义字体样式
- textStyle: Text.propTypes.style,
- // 加法按钮
- adder: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 减法按钮
- subtracter: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 按钮热区
- hitSlop: TouchableHighlight.propTypes.hitSlop,
-};
-AddAndSubtract.defaultProps = {
- num: 0,
- onPressAdder: NOOP,
- onPressSubtracter: NOOP,
- duration: 200,
- distance: 30,
- deg: 180,
- easing: t => t,
- btnWidth: 30,
- style: null,
- adderStyle: null,
- subtracterStyle: null,
- textStyle: null,
- adder: +,
- subtracter: -,
- hitSlop: {
- top: 5,
- left: 5,
- right: 5,
- bottom: 5,
- },
-};
-```
diff --git a/AddAndSubtract/index.js b/AddAndSubtract/index.js
index 2df764e..957b0aa 100644
--- a/AddAndSubtract/index.js
+++ b/AddAndSubtract/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component AddAndSubtract
+ * @version 0.17.0
+ * @description 加减法动画组件
+ *
+ * @instructions {instruInfo: ./AddAndSubtract/AddAndSubtract.md}
+ */
import React, {
PropTypes,
Component,
@@ -136,7 +143,12 @@ class AddAndSubtract extends Component {
}
AddAndSubtract.propTypes = {
- // 数字
+ /**
+ * @property num
+ * @type Number
+ * @default 0
+ * @description 数字
+ */
num(props, propName) {
const num = props[propName];
if (typeof num !== 'number') {
@@ -147,39 +159,129 @@ AddAndSubtract.propTypes = {
}
return null;
},
- // 加法按钮点击事件
+ /**
+ * @property onPressAdder
+ * @type Function
+ * @default NOOP
+ * @description 加法按钮点击事件
+ */
onPressAdder: PropTypes.func,
- // 减法按钮点击事件
+ /**
+ * @property onPressSubtracter
+ * @type Function
+ * @default NOOP
+ * @description 减法按钮点击事件
+ */
onPressSubtracter: PropTypes.func,
- // 动画时间
+ /**
+ * @property duration
+ * @type Number
+ * @default 200
+ * @description 动画时间
+ */
duration: PropTypes.number,
- // 减法按钮移动距离
+ /**
+ * @property distance
+ * @type Number
+ * @default 30
+ * @description 减法按钮移动距离
+ */
distance: PropTypes.number,
- // 减法旋转角度
+ /**
+ * @property deg
+ * @type Number
+ * @default 180
+ * @description 减法旋转角度
+ */
deg: PropTypes.number,
- // 动画函数
+ /**
+ * @property easing
+ * @type Function
+ * @default t => t
+ * @description 动画函数
+ */
easing: PropTypes.func,
- // 按钮宽度
+ /**
+ * @property btnWidth
+ * @type Number
+ * @default 30
+ * @description 按钮宽度
+ */
btnWidth: PropTypes.number,
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 加法按钮样式
+ /**
+ * @property adderBtnStyle
+ * @type Object
+ * @default null
+ * @description 加法按钮样式
+ */
adderBtnStyle: View.propTypes.style,
- // 加法元素样式
+ /**
+ * @property adderStyle
+ * @type Object
+ * @default null
+ * @description 加法元素样式
+ */
adderStyle: View.propTypes.style,
- // 减法按钮容器样式
+ /**
+ * @property subtracterWrapperStyle
+ * @type Object
+ * @default null
+ * @description 减法按钮容器样式
+ */
subtracterWrapperStyle: View.propTypes.style,
- // 减法按钮样式
+ /**
+ * @property subtracterBtnStyle
+ * @type Object
+ * @default null
+ * @description 减法按钮样式
+ */
subtracterBtnStyle: View.propTypes.style,
- // 减法元素样式
+ /**
+ * @property subtracterStyle
+ * @type Object
+ * @default null
+ * @description 减法元素样式
+ */
subtracterStyle: View.propTypes.style,
- // 自定义字体样式
+ /**
+ * @property textStyle
+ * @type Object
+ * @default null
+ * @description 自定义字体样式
+ */
textStyle: Text.propTypes.style,
- // 加法按钮
+ /**
+ * @property adder
+ * @type Element Array
+ * @default null
+ * @description 加法按钮
+ */
adder: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 减法按钮
+ /**
+ * @property subtracter
+ * @type Element Array
+ * @default +
+ * @description 减法按钮
+ */
subtracter: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 按钮热区
+ /**
+ * @property hitSlop
+ * @type Object
+ * @default {
+ * top: 5,
+ * left: 5,
+ * right: 5,
+ * bottom: 5,
+ * },
+ * @description 按钮热区
+ */
hitSlop: TouchableHighlight.propTypes.hitSlop,
};
AddAndSubtract.defaultProps = {
diff --git a/Alert/Alert.md b/Alert/Alert.md
new file mode 100644
index 0000000..9f9cd68
--- /dev/null
+++ b/Alert/Alert.md
@@ -0,0 +1,8 @@
+
+#### Demo
+
+
+
+#### Other Points
+
+- 内部封装了 Dialog 组件,覆盖了 Dialog 的 `buttons` 属性,其他不变,请参考 [Dialog](https://github.com/dragonwong/rnx-ui/tree/master/Dialog)
diff --git a/Alert/README.md b/Alert/README.md
deleted file mode 100644
index 6694116..0000000
--- a/Alert/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Alert
-
-**警告弹框组件**
-
-## Demo
-
-
-
-## Props
-
-```js
-Alert.propTypes = {
- ...Dialog.propTypes,
- // 按钮文本
- buttonText: PropTypes.string,
- // 按钮文本样式
- buttonTextStyle: Text.propTypes.style,
- // 按钮点击回调
- onPress: PropTypes.func,
-};
-Alert.defaultProps = {
- ...Dialog.defaultProps,
- buttonText: '好',
- buttonTextStyle: null,
- onPress: NOOP,
-};
-```
-
-## Other Points
-
-- 内部封装了 Dialog 组件,覆盖了 Dialog 的 `buttons` 属性,其他不变,请参考 [Dialog](https://github.com/dragonwong/rnx-ui/tree/master/Dialog)
diff --git a/Alert/index.js b/Alert/index.js
index 9e9f643..cd7e38a 100644
--- a/Alert/index.js
+++ b/Alert/index.js
@@ -1,3 +1,11 @@
+/**
+ * @component Alert
+ * @version 0.17.0
+ * @description 警告弹框组件
+ *
+ *
+ * @instructions {instruInfo: ./Alert/Alert.md}
+ */
import React, {
PropTypes,
} from 'react';
@@ -26,11 +34,26 @@ class Alert extends Dialog {
Alert.propTypes = {
...Dialog.propTypes,
- // 按钮文本
+ /**
+ * @property buttonText
+ * @type String
+ * @default '好'
+ * @description 按钮文本
+ */
buttonText: PropTypes.string,
- // 按钮文本样式
+ /**
+ * @property buttonTextStyle
+ * @type Object
+ * @default null
+ * @description 按钮文本样式
+ */
buttonTextStyle: Text.propTypes.style,
- // 按钮点击回调
+ /**
+ * @property onPress
+ * @type Function
+ * @default NOOP
+ * @description 按钮点击回调
+ */
onPress: PropTypes.func,
};
Alert.defaultProps = {
diff --git a/All/All.md b/All/All.md
new file mode 100644
index 0000000..2ed65f7
--- /dev/null
+++ b/All/All.md
@@ -0,0 +1,13 @@
+#### Example
+
+```JavaScript
+import All from 'rnx-ui/All';
+
+function Example(props) {
+ return (
+
+ );
+}
+```
+
+
diff --git a/All/README.md b/All/README.md
deleted file mode 100644
index 39ec0f8..0000000
--- a/All/README.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# All
-
-**页面容器**
-
-页面级容器,内置了 `StatusBar`。
-
-## Example
-
-```js
-import All from 'rnx-ui/All';
-
-function Example(props) {
- return (
-
- );
-}
-```
-
-## Props
-
-```js
-All.propTypes = {
- // 子元素
- children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 自定义样式
- style: View.propTypes.style,
- // StatusBar 背景色
- statusBarBgColor: PropTypes.string,
- // StatusBar 样式类型
- statusBarStyle: PropTypes.string,
-};
-All.defaultProps = {
- children: null,
- style: null,
- statusBarBgColor: 'transparent',
- statusBarStyle: 'light-content',
-};
-```
diff --git a/All/index.js b/All/index.js
index fe4bd1b..4447574 100644
--- a/All/index.js
+++ b/All/index.js
@@ -1,5 +1,8 @@
/**
- * 页面容器组件
+ * @component All
+ * @description 页面级容器,内置了 `StatusBar`。
+ *
+ * @instructions {instruInfo: ./All/All.md}
*/
import React, {
PropTypes,
@@ -34,13 +37,33 @@ class All extends Component {
}
All.propTypes = {
- // 子元素
+ /**
+ * @property children
+ * @type Element Array
+ * @default null
+ * @description 子元素
+ */
children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // StatusBar 背景色
+ /**
+ * @property statusBarBgColor
+ * @type String
+ * @default 'transparent'
+ * @description StatusBar 背景色
+ */
statusBarBgColor: PropTypes.string,
- // StatusBar 样式类型
+ /**
+ * @property statusBarBgStyle
+ * @type Stirng
+ * @default 'light-content'
+ * @description StatusBar 样式类型
+ */
statusBarStyle: PropTypes.string,
};
All.defaultProps = {
diff --git a/Badge/Badge.md b/Badge/Badge.md
new file mode 100644
index 0000000..b1332aa
--- /dev/null
+++ b/Badge/Badge.md
@@ -0,0 +1,24 @@
+
+#### Demo
+
+
+
+#### Example
+
+```JavaScript
+import Badge from 'rnx-ui/Badge';
+
+function Example(props) {
+ return (
+
+
+
+ )
+}
+```
+### ⚠️ 注意
+
+1. 角标宽度是动态计算的,随角标内容的增长而变长。当你通过 `textStyle` 改变角标内容的字体大小时,注意配置相符的 `characterWidth`。
+
+2. Badge 没有宽度,宽度随外部容器变化。
+
diff --git a/Badge/README.md b/Badge/README.md
deleted file mode 100644
index 683fd3d..0000000
--- a/Badge/README.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# Badge
-
-**角标**
-
-通常用来显示未读消息数目。
-
-### ⚠️ 注意
-
-1. 角标宽度是动态计算的,随角标内容的增长而变长。当你通过 `textStyle` 改变角标内容的字体大小时,注意配置相符的 `characterWidth`。
-
-2. Badge 没有宽度,宽度随外部容器变化。
-
-## Demo
-
-
-
-## Example
-
-```js
-import Badge from 'rnx-ui/Badge';
-
-function Example(props) {
- return (
-
-
-
- )
-}
-```
-
-## Props
-
-```js
-Badge.propTypes = {
- // 自定义样式
- style: View.propTypes.style,
- // 自定义文本容器样式
- textContainerStyle: View.propTypes.style,
- // 自定义文本样式
- textStyle: Text.propTypes.style,
- // 单个字符宽度
- characterWidth: PropTypes.number,
- // 角标文本内容
- text: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
- // 主体元素
- children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
-};
-Badge.defaultProps = {
- style: null,
- textContainerStyle: null,
- textStyle: null,
- characterWidth: 7,
- text: '',
- children: null,
-};
-```
diff --git a/Badge/index.js b/Badge/index.js
index 45eeba0..dbeac5d 100644
--- a/Badge/index.js
+++ b/Badge/index.js
@@ -1,7 +1,9 @@
/**
- * 角标组件
- * 注意:
- * 1. Badge 没有宽度,跨度随外部容器变化
+ * @component Badge
+ * @version 0.11.4
+ * @description 角标组件 通常用来显示未读消息数目。
+ *
+ * @instructions {instruInfo: ./Badge/Badge.md}
*/
import React, {
PropTypes,
@@ -74,17 +76,47 @@ class Badge extends Component {
}
Badge.propTypes = {
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 自定义文本容器样式
+ /**
+ * @property textContainerStyle
+ * @type Object
+ * @default null
+ * @description 自定义文本容器样式
+ */
textContainerStyle: View.propTypes.style,
- // 自定义文本样式
+ /**
+ * @property textStyle
+ * @type Object
+ * @default null
+ * @description 自定义文本样式
+ */
textStyle: Text.propTypes.style,
- // 单个字符宽度
+ /**
+ * @property characterWidth
+ * @type Number
+ * @default 7
+ * @description 单个字符宽度
+ */
characterWidth: PropTypes.number,
- // 角标文本内容
+ /**
+ * @property text
+ * @type String Number
+ * @default ''
+ * @description 角标文本内容
+ */
text: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
- // 主体元素
+ /**
+ * @property children
+ * @type Element Array
+ * @default null
+ * @description 主体元素
+ */
children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
};
Badge.defaultProps = {
diff --git a/Btn/Btn.md b/Btn/Btn.md
new file mode 100644
index 0000000..158d7d2
--- /dev/null
+++ b/Btn/Btn.md
@@ -0,0 +1,16 @@
+#### Demo
+
+
+
+#### Example
+
+```JavaScript
+import Btn from 'rnx-ui/Btn';
+
+function Example(props) {
+ return (
+ 自定义样式
+ );
+}
+```
+
diff --git a/Btn/README.md b/Btn/README.md
deleted file mode 100644
index 8004762..0000000
--- a/Btn/README.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# Btn
-
-**按钮**
-
-## Demo
-
-
-
-## Example
-
-```js
-import Btn from 'rnx-ui/Btn';
-
-function Example(props) {
- return (
- 自定义样式
- );
-}
-```
-
-## Props
-
-```js
-Btn.propTypes = {
- // 自定义样式
- style: View.propTypes.style,
- // 内部容器样式
- contentContainerStyle: View.propTypes.style,
- // 按钮文本样式(children 为字符串时才生效)
- textStyle: Text.propTypes.style,
- // 点击回调
- onPress: PropTypes.func,
- // 按钮内容
- children: PropTypes.oneOfType([PropTypes.string, PropTypes.element, PropTypes.array]),
- // 点击时透明度反馈
- activeOpacity: PropTypes.number,
- // 是否禁用,为 true 时,activeOpacity 为 1,onPress 为 null
- disabled: PropTypes.bool,
- // 按钮热区
- hitSlop: TouchableOpacity.propTypes.hitSlop,
-};
-Btn.defaultProps = {
- style: null,
- contentContainerStyle: null,
- textStyle: null,
- onPress: null,
- children: '下一步',
- activeOpacity: ACTIVE_OPACITY,
- disabled: false,
- hitSlop: {},
-};
-```
diff --git a/Btn/demo.png b/Btn/btn.png
similarity index 100%
rename from Btn/demo.png
rename to Btn/btn.png
diff --git a/Btn/index.js b/Btn/index.js
index e560fb6..0dc1ee0 100644
--- a/Btn/index.js
+++ b/Btn/index.js
@@ -1,5 +1,9 @@
/**
- * 按钮
+ * @component Btn
+ * @version 0.17.0
+ * @description 按钮
+ *
+ * @instructions {instruInfo: ./Btn/Btn.md}
*/
import React, {
Component,
@@ -70,21 +74,66 @@ class Btn extends Component {
}
Btn.propTypes = {
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 内部容器样式
+ /**
+ * @property contentContainerStyle
+ * @type Object
+ * @default null
+ * @description 内部容器样式
+ */
contentContainerStyle: View.propTypes.style,
- // 按钮文本样式(children 为字符串时才生效)
+ /**
+ * @property textStyle
+ * @type Obejct
+ * @default null
+ * @description 按钮文本样式(children 为字符串时才生效)
+ */
textStyle: Text.propTypes.style,
- // 点击回调
+ /**
+ * @property onPress
+ * @type Function
+ * @default null
+ * @description 点击回调
+ */
onPress: PropTypes.func,
- // 按钮内容
+ /**
+ * @property children
+ * @type String Array
+ * @default '下一步'
+ * @description 按钮内容
+ */
children: PropTypes.oneOfType([PropTypes.string, PropTypes.element, PropTypes.array]),
- // 点击时透明度反馈
+ /**
+ * @property activeOpacity
+ * @type Number
+ * @default ACTIVE_OPACITY
+ * @description 点击时透明度反馈
+ */
activeOpacity: PropTypes.number,
- // 是否禁用,为 true 时,activeOpacity 为 1,onPress 为 null
+ /**
+ * @property disabled
+ * @type Boolean
+ * @default ACTIVE_OPACITY
+ * @description 是否禁用,为 true 时,activeOpacity 为 1,onPress 为 null
+ */
disabled: PropTypes.bool,
- // 按钮热区
+ /**
+ * @property hitSlop
+ * @type Object
+ * @default {
+ * top: 0,
+ * bottom: 0,
+ * left: 0,
+ * right: 0,
+ * }
+ * @description 按钮热区
+ */
hitSlop: TouchableOpacity.propTypes.hitSlop,
};
Btn.defaultProps = {
diff --git a/CardView/CardView.md b/CardView/CardView.md
new file mode 100644
index 0000000..831efdd
--- /dev/null
+++ b/CardView/CardView.md
@@ -0,0 +1,30 @@
+
+#### 基本用法
+以卡片样式浏览,并可以设置激活卡片样式。
+
+#### Demo
+
+
+
+#### Example
+
+```JavaScript
+import CardView from 'rnx-ui/CardView';
+
+function Example(props) {
+ return (
+
+ );
+}
+```
+
+### ⚠️ 注意
+
+CardView 会为卡片添加 `isActiveRnxUiCardView` 属性,激活卡片值为 `true`,其他卡片是 `false`。
+
+
diff --git a/CardView/README.md b/CardView/README.md
deleted file mode 100644
index 0855fcd..0000000
--- a/CardView/README.md
+++ /dev/null
@@ -1,101 +0,0 @@
-# CardView
-
-**卡片视图**
-
-以卡片样式浏览,并可以设置激活卡片样式。
-
-通过 `getEl` 属性获取 CardView 实例,调用 `scrollToCard` 方法可以
-
-### ⚠️ 注意
-
-CardView 会为卡片添加 `isActiveRnxUiCardView` 属性,激活卡片值为 `true`,其他卡片是 `false`。
-
-## Demo
-
-
-
-## Example
-
-```js
-import CardView from 'rnx-ui/CardView';
-
-function Example(props) {
- return (
-
- );
-}
-```
-
-## Props
-
-```js
-CardView.propTypes = {
- // 样式
- style: View.propTypes.style,
- // 缩放系数
- scaleCoefficient: PropTypes.number,
- // 当前卡片样式
- activeCardStyle: View.propTypes.style,
- // 卡片数组
- cards: PropTypes.arrayOf(PropTypes.shape({
- /* eslint-disable */
- // 数组循环优化标示 key
- key: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
- // 卡片元素
- card: PropTypes.element,
- /* eslint-enable */
- })),
- // 卡片宽度
- cardWidth: PropTypes.number,
- // 卡片间隔
- cardGap: PropTypes.number,
- // 自定义内容容器样式
- contentContainerStyle: View.propTypes.style,
- // 卡片切换时的回调,参数为当前激活的卡片序号
- onChange: PropTypes.func,
- // 卡片经过时的回调,参数为当前经过的卡片序号
- onPass: PropTypes.func,
- // 速度指数
- v: PropTypes.number,
- // 手势滑动触发最小距离(默认需要滑动卡片一半的距离)
- minGestureDistance: PropTypes.number,
- // 最大可访问的卡片序号
- maxIndex: PropTypes.number,
- // 获取元素回调
- getEl: PropTypes.func,
- // 到达顶部回调
- onStartReached: PropTypes.func,
- // 到达底部回调
- onEndReached: PropTypes.func,
-};
-CardView.defaultProps = {
- style: null,
- scaleCoefficient: 0.1,
- activeCardStyle: null,
- cards: [],
- cardWidth: 200,
- cardGap: 0,
- contentContainerStyle: null,
- onChange: NOOP,
- onPass: NOOP,
- v: 20,
- minGestureDistance: null,
- maxIndex: null,
- getEl: NOOP,
- onStartReached: NOOP,
- onEndReached: NOOP,
-};
-```
-
-## Methods
-
-### scrollToCard(index)
-
-- **index**: {Number} 卡片序号
-
-跳转至指定卡片
diff --git a/CardView/index.js b/CardView/index.js
index cfa1837..2ecbebb 100644
--- a/CardView/index.js
+++ b/CardView/index.js
@@ -1,3 +1,12 @@
+/**
+ * @component CardView
+ * @version 0.17.0
+ * @description 卡片视图
+ * 以卡片样式浏览,并可以设置激活卡片样式。
+ *
+ * @instructions {instruInfo: ./CardView/CardView.md}
+ *
+ */
import React, {
Component,
PropTypes,
@@ -24,7 +33,6 @@ class CardView extends Component {
super(props);
props.getEl(this);
-
// 滚动坐标
this.x = 0;
// 每张卡片所占空间宽度
@@ -288,13 +296,33 @@ class CardView extends Component {
}
CardView.propTypes = {
- // 样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 样式
+ */
style: View.propTypes.style,
- // 缩放系数
+ /**
+ * @property scaleCoefficient
+ * @type Number
+ * @default 0.1
+ * @description 缩放系数
+ */
scaleCoefficient: PropTypes.number,
- // 当前卡片样式
+ /**
+ * @property activeCardStyle
+ * @type Object
+ * @default null
+ * @description 当前卡片样式
+ */
activeCardStyle: View.propTypes.style,
- // 卡片数组
+ /**
+ * @property cards
+ * @type Array
+ * @default []
+ * @description 卡片数组
+ */
cards: PropTypes.arrayOf(PropTypes.shape({
/* eslint-disable */
// 数组循环优化标示 key
@@ -303,27 +331,87 @@ CardView.propTypes = {
card: PropTypes.element,
/* eslint-enable */
})),
- // 卡片宽度
+ /**
+ * @property cardWidth
+ * @type Number
+ * @default 200
+ * @description 卡片宽度
+ */
cardWidth: PropTypes.number,
- // 卡片间隔
+ /**
+ * @property cardGap
+ * @type Number
+ * @default 0
+ * @description 卡片间隔
+ */
cardGap: PropTypes.number,
- // 自定义内容容器样式
+ /**
+ * @property contentContainerStyle
+ * @type Object
+ * @default null
+ * @description 自定义内容容器样式
+ */
contentContainerStyle: View.propTypes.style,
- // 卡片切换时的回调,参数为当前激活的卡片序号
+ /**
+ * @property onChange
+ * @type Function
+ * @default NOOP
+ * @description 卡片切换时的回调,参数为当前激活的卡片序号
+ */
onChange: PropTypes.func,
- // 卡片经过时的回调,参数为当前经过的卡片序号
+ /**
+ * @property onPass
+ * @type Function
+ * @default NOOP
+ * @description 卡片经过时的回调,参数为当前经过的卡片序号
+ */
onPass: PropTypes.func,
- // 速度指数
+ /**
+ * @property v
+ * @type Number
+ * @default 20
+ * @description 速度指数
+ */
v: PropTypes.number,
- // 手势滑动触发最小距离(默认需要滑动卡片一半的距离)
+ /**
+ * @property minGestureDistance
+ * @type Number
+ * @default null
+ * @description 手势滑动触发最小距离(默认需要滑动卡片一半的距离)
+ */
minGestureDistance: PropTypes.number,
- // 最大可访问的卡片序号
+ /**
+ * @property maxIndex
+ * @type Number
+ * @default null
+ * @description 最大可访问的卡片序号
+ */
maxIndex: PropTypes.number,
- // 获取元素回调
+ /**
+ * @property getEl
+ * @type Function
+ * @default NOOP
+ * @description 获取元素回调
+ */
getEl: PropTypes.func,
- // 到达顶部回调
+ /**
+ * @property onStartReached
+ * @type Function
+ * @default NOOP
+ * @description 到达顶部回调
+ */
onStartReached: PropTypes.func,
- // 到达底部回调
+ /**
+ * @property onEndReached
+ * @type Function
+ * @default NOOP
+ * @description 到达底部回调
+ */
+ /**
+ * @method scrollToCard(index)
+ * @param {Number} index 卡片序号 跳转至指定卡片
+ *
+ */
onEndReached: PropTypes.func,
};
CardView.defaultProps = {
diff --git a/Confirm/Confirm.md b/Confirm/Confirm.md
new file mode 100644
index 0000000..158f6cb
--- /dev/null
+++ b/Confirm/Confirm.md
@@ -0,0 +1,9 @@
+
+#### Demo
+
+
+
+
+#### Other Points
+
+- 内部封装了 Dialog 组件,覆盖了 Dialog 的 `buttons` 属性,其他不变,请参考 [Dialog](https://github.com/dragonwong/rnx-ui/tree/master/Dialog)
diff --git a/Confirm/README.md b/Confirm/README.md
deleted file mode 100644
index e526541..0000000
--- a/Confirm/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# Confirm
-
-**确认弹框组件**
-
-## Demo
-
-
-
-## Props
-
-```js
-Confirm.propTypes = {
- ...Dialog.propTypes,
- // 取消按钮文本
- cancelText: PropTypes.string,
- // 取消按钮文本样式
- cancelTextStyle: Text.propTypes.style,
- // 取消按钮点击回调
- onCancel: PropTypes.func,
- // 确认按钮文本
- confirmText: PropTypes.string,
- // 确认按钮文本样式
- confirmTextStyle: Text.propTypes.style,
- // 确认按钮点击回调
- onConfirm: PropTypes.func,
-};
-Confirm.defaultProps = {
- ...Dialog.defaultProps,
- cancelText: '取消',
- cancelTextStyle: null,
- onCancel: NOOP,
- confirmText: '确认',
- confirmTextStyle: null,
- onConfirm: NOOP,
-};
-```
-
-## Other Points
-
-- 内部封装了 Dialog 组件,覆盖了 Dialog 的 `buttons` 属性,其他不变,请参考 [Dialog](https://github.com/dragonwong/rnx-ui/tree/master/Dialog)
diff --git a/Confirm/index.js b/Confirm/index.js
index ab93add..577b7ed 100644
--- a/Confirm/index.js
+++ b/Confirm/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component Confirm
+ * @version 0.17.0
+ * @description 确认弹框组件
+ *
+ * @instructions {instruInfo: ./Confirm/Confirm.md}
+ */
import React, {
PropTypes,
} from 'react';
@@ -37,17 +44,47 @@ class Confirm extends Dialog {
Confirm.propTypes = {
...Dialog.propTypes,
- // 取消按钮文本
+ /**
+ * @property cancelText
+ * @type String
+ * @default '取消'
+ * @description 取消按钮文本
+ */
cancelText: PropTypes.string,
- // 取消按钮文本样式
+ /**
+ * @property cancelTextStyle
+ * @type Object
+ * @default null
+ * @description 取消按钮文本样式
+ */
cancelTextStyle: Text.propTypes.style,
- // 取消按钮点击回调
+ /**
+ * @property onCancel
+ * @type Function
+ * @default NOOP
+ * @description 取消按钮点击回调
+ */
onCancel: PropTypes.func,
- // 确认按钮文本
+ /**
+ * @property confirmText
+ * @type String
+ * @default '确认'
+ * @description 确认按钮文本
+ */
confirmText: PropTypes.string,
- // 确认按钮文本样式
+ /**
+ * @property confirmTextStyle
+ * @type Object
+ * @default null
+ * @description 确认按钮文本样式
+ */
confirmTextStyle: Text.propTypes.style,
- // 确认按钮点击回调
+ /**
+ * @property onConfirm
+ * @type Function
+ * @default NOOP
+ * @description 确认按钮点击回调
+ */
onConfirm: PropTypes.func,
};
Confirm.defaultProps = {
diff --git a/Dialog/Dialog.md b/Dialog/Dialog.md
new file mode 100644
index 0000000..a97477c
--- /dev/null
+++ b/Dialog/Dialog.md
@@ -0,0 +1,25 @@
+
+#### Demo
+
+
+
+#### Example
+
+```JavaScript
+import Dialog from 'rnx-ui/Dialog';
+
+function Example(props) {
+ return (
+
+ );
+}
+```
+
diff --git a/Dialog/README.md b/Dialog/README.md
deleted file mode 100644
index bf02176..0000000
--- a/Dialog/README.md
+++ /dev/null
@@ -1,73 +0,0 @@
-# Dialog
-
-**警告弹框**
-
-## Demo
-
-
-
-## Example
-
-```js
-import Dialog from 'rnx-ui/Dialog';
-
-function Example(props) {
- return (
-
- );
-}
-```
-
-## Props
-
-```js
-Dialog.propTypes = {
- // 是否显示
- visible: PropTypes.bool,
- // 标题
- title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 标题文本样式(title 为字符串时才生效)
- titleStyle: Text.propTypes.style,
- // 内容
- message: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 标题文本样式(title 为字符串时才生效)
- messageStyle: Text.propTypes.style,
- // 按钮容器样式
- buttonsContainerStyle: View.propTypes.style,
- // 按钮
- buttons: PropTypes.arrayOf(PropTypes.shape({
- // 按钮文本
- text: PropTypes.string,
- // 按钮样式
- style: Text.propTypes.style,
- // 按钮点击回调
- onPress: PropTypes.func,
- })),
- // 弹框样式
- style: View.propTypes.style,
- // 遮罩层样式
- overlayStyle: View.propTypes.style,
- // 是否使用 Overlay 动画
- useOverlayAnimation: PropTypes.bool,
-};
-Dialog.defaultProps = {
- visible: false,
- title: '',
- titleStyle: null,
- message: '',
- messageStyle: null,
- buttonsContainerStyle: null,
- buttons: [],
- style: null,
- overlayStyle: null,
- useOverlayAnimation: true,
-};
-```
diff --git a/Dialog/index.js b/Dialog/index.js
index 77d0935..2c218d5 100644
--- a/Dialog/index.js
+++ b/Dialog/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component Dialog
+ * @version 0.17.1
+ * @description 警告弹框
+ *
+ * @instructions {instruInfo: ./Dialog/Dialog.md}
+ */
import React, {
Component,
PropTypes,
@@ -108,19 +115,57 @@ class Dialog extends Component {
}
Dialog.propTypes = {
- // 是否显示
+ /**
+ * @property visible
+ * @type Boolean
+ * @default false
+ * @description 是否显示
+ */
visible: PropTypes.bool,
- // 标题
+ /**
+ * @property title
+ * @type String Element
+ * @default ''
+ * @description 标题
+ */
title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 标题文本样式(title 为字符串时才生效)
+ /**
+ * @property titleStyle
+ * @type Object
+ * @default null
+ * @description 标题文本样式(title 为字符串时才生效)
+ */
titleStyle: Text.propTypes.style,
- // 内容
+ /**
+ * @property message
+ * @type String Element
+ * @default ''
+ * @description 内容
+ */
message: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 标题文本样式(title 为字符串时才生效)
+ /**
+ * @property messageStyle
+ * @type Object
+ * @default null
+ * @description 标题文本样式(title 为字符串时才生效)
+ */
messageStyle: Text.propTypes.style,
- // 按钮容器样式
+ /**
+ * @property buttonsContainerStyle
+ * @type Object
+ * @default null
+ * @description 按钮容器样式
+ */
buttonsContainerStyle: View.propTypes.style,
- // 按钮
+ /**
+ * @property buttons
+ * @type Array
+ * @default []
+ * @param {String} text 按钮文本
+ * @param {Object} style 按钮样式
+ * @param {Function} onPress 按钮点击回调
+ * @description 按钮
+ */
buttons: PropTypes.arrayOf(PropTypes.shape({
/* eslint-disable */
// 按钮文本
@@ -131,11 +176,26 @@ Dialog.propTypes = {
onPress: PropTypes.func,
/* eslint-enable */
})),
- // 弹框样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 弹框样式
+ */
style: View.propTypes.style,
- // 遮罩层样式
+ /**
+ * @property overlayStyle
+ * @type Object
+ * @default null
+ * @description 遮盖层样式
+ */
overlayStyle: View.propTypes.style,
- // 是否使用 Overlay 动画
+ /**
+ * @property useOverlayAnimation
+ * @type Boolean
+ * @default true
+ * @description 是否使用 Overlay 动画
+ */
useOverlayAnimation: PropTypes.bool,
};
Dialog.defaultProps = {
diff --git a/Drop/README.md b/Drop/Drop.md
similarity index 100%
rename from Drop/README.md
rename to Drop/Drop.md
diff --git a/Drop/Dropper/Dropper.md b/Drop/Dropper/Dropper.md
new file mode 100644
index 0000000..f43c1a7
--- /dev/null
+++ b/Drop/Dropper/Dropper.md
@@ -0,0 +1,39 @@
+#### Example
+
+```JavaScript
+import {
+ Dropper,
+} from 'rnx-ui/Drop';
+
+function DropperImg(props) {
+ return (
+
+
+
+ );
+}
+```
+
+### ⚠️ 注意
+
+1. 必须提供起点和终点坐标,起点和终点坐标可以通过 `Emitter` 和 `Receiver` 非常方便地获取到。
+
+2. 强烈建议提供掉落元素的宽高,这样,`Dropper` 会将自身的中心置于起点,否则置于起点的将是 `Dropper` 的左上角。
\ No newline at end of file
diff --git a/Drop/Dropper/index.js b/Drop/Dropper/index.js
index 2a37481..158e420 100644
--- a/Drop/Dropper/index.js
+++ b/Drop/Dropper/index.js
@@ -1,3 +1,11 @@
+/**
+ * @component Dropper
+ * @version 0.17.0
+ * @description 掉落组件
+ * 用来包裹掉落元素,提供抛物线运动的动画。
+ *
+ * @instructions {instruInfo: ./Drop/Dropper/Dropper.md}
+ */
import React, {
Component,
PropTypes,
@@ -144,45 +152,124 @@ class Dropper extends Component {
}
Dropper.propTypes = {
- // 起点位置
+ /**
+ * @property startPosition
+ * @param {Number} x 水平坐标
+ * @param {Number} y 垂直坐标
+ * @type Object
+ * @default {0,0}
+ * @description 起点位置
+ */
startPosition: PropTypes.shape({
// 水平坐标
x: PropTypes.number,
// 垂直坐标
y: PropTypes.number,
}).isRequired,
- // 终点位置
+ /**
+ * @property endPosition
+ * @param {Number} x 水平坐标
+ * @param {Number} y 垂直坐标
+ * @type Object
+ * @default {0,0}
+ * @description 终点位置
+ */
endPosition: PropTypes.shape({
// 水平坐标
x: PropTypes.number,
// 垂直坐标
y: PropTypes.number,
}).isRequired,
- // 掉落元素宽度
+ /**
+ * @property width
+ * @type Number
+ * @default 0
+ * @description 掉落元素宽度
+ */
width: PropTypes.number,
- // 掉落元素高度
+ /**
+ * @property height
+ * @type Number
+ * @default 0
+ * @description 掉落元素高度
+ */
height: PropTypes.number,
- // 动画时间
+ /**
+ * @property duration
+ * @type Number
+ * @default 1000
+ * @description 动画时间
+ */
duration: PropTypes.number,
- // 弹跳的高度
+ /**
+ * @property jumpHeight
+ * @type Number
+ * @default 60
+ * @description 弹跳的高度
+ */
jumpHeight: PropTypes.number,
- // 缩放值
+ /**
+ * @property scale
+ * @type Number
+ * @default 1
+ * @description 缩放值
+ */
scale: PropTypes.number,
- // 旋转角度,如 360
+ /**
+ * @property rotate
+ * @type Number
+ * @default 360
+ * @description 旋转角度
+ */
rotate: PropTypes.number,
- // 动画刚开始由透明变化至不透明的时间
+ /**
+ * @property showDuration
+ * @type Number
+ * @default 100
+ * @description 动画刚开始由透明变化至不透明的时间
+ */
showDuration: PropTypes.number,
- // 动画结束回调
+ /**
+ * @property onEnd
+ * @type Function
+ * @default NOOP
+ * @description 动画结束回调
+ */
onEnd: PropTypes.func,
- // 是否需要收尾动画
+ /**
+ * @property endAnimation
+ * @type Boolean
+ * @default true
+ * @description 是否需要收尾动画
+ */
endAnimation: PropTypes.bool,
- // 收尾弹跳的高度
+ /**
+ * @property endJumpHeight
+ * @type Number
+ * @default 40
+ * @description 收尾弹跳的高度
+ */
endJumpHeight: PropTypes.number,
- // 收尾动画时间
+ /**
+ * @property endAnimationDuration
+ * @type Number
+ * @default 400
+ * @description 收尾动画时间
+ */
endAnimationDuration: PropTypes.number,
- // 子元素
+ /**
+ * @property children
+ * @type Element
+ * @default null
+ * @description 子元素
+ */
children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
};
Dropper.defaultProps = {
diff --git a/Drop/Emitter/Emitter.md b/Drop/Emitter/Emitter.md
new file mode 100644
index 0000000..3ca7c73
--- /dev/null
+++ b/Drop/Emitter/Emitter.md
@@ -0,0 +1,19 @@
+#### Example
+
+```JavaScript
+import {
+ Emitter,
+} from 'rnx-ui/Drop';
+
+function CartEmitter(props) {
+ return (
+
+
+
+ );
+}
+```
\ No newline at end of file
diff --git a/Drop/Emitter/index.js b/Drop/Emitter/index.js
index f9c6cb0..8605b3b 100644
--- a/Drop/Emitter/index.js
+++ b/Drop/Emitter/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component Emitter
+ * @version 0.17.0
+ * @description 掉落事件点击发射组件
+ * 用来包裹掉落事件点击发射元素,提供元素中心坐标,以作为掉落动画的起点。
+ * @instructions {instruInfo: ./Drop/Emitter/Emitter.md}
+ */
import React, {
Component,
PropTypes,
@@ -51,11 +58,26 @@ class Emitter extends Component {
}
Emitter.propTypes = {
- // 点击回调,参数为点击元素中心坐标,如:{x: 0, y: 0}
+ /**
+ * @property onPress
+ * @type Function
+ * @default NOOP
+ * @description 点击回调,参数为点击元素中心坐标,如:{x: 0, y: 0}
+ */
onPress: PropTypes.func,
- // 子元素
+ /**
+ * @property children
+ * @type Element Array
+ * @default null
+ * @description 子元素
+ */
children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
};
Emitter.defaultProps = {
diff --git a/Drop/Receiver/Receiver.md b/Drop/Receiver/Receiver.md
new file mode 100644
index 0000000..0f2e3f3
--- /dev/null
+++ b/Drop/Receiver/Receiver.md
@@ -0,0 +1,28 @@
+#### Example
+
+```JavaScript
+import {
+ Receiver,
+} from 'rnx-ui/Drop';
+import Badge from 'rnx-ui/Drop';
+
+function CartReceiver(props) {
+ return (
+
+
+
+
+
+ );
+}
+```
diff --git a/Drop/Receiver/index.js b/Drop/Receiver/index.js
index dc347c4..733ef29 100644
--- a/Drop/Receiver/index.js
+++ b/Drop/Receiver/index.js
@@ -1,3 +1,14 @@
+/**
+ * @component Receiver
+ * @version 0.17.0
+ * @description 掉落元素接受组件
+ *
+ * 用来包裹掉落元素接受元素,如果该元素是绝对定位,定位的样式应该写在 `Receiver` 或父元素上,而不应该写在子元素上。`Receiver` 主要提供以下功能:
+ * 1. 提供元素中心坐标,以作为掉落动画的终点;
+ * 2. 提供掉落组件到达时的响应动画,需要在 `Dropper` 元素的 `onEnd` 回调中手动调用 `Receiver` 元素的 `animate` 方法。
+ *
+ * @instructions {instruInfo: ./Drop/Receiver/Receiver.md}
+ */
import React, {
PropTypes,
Component,
@@ -83,19 +94,54 @@ class Receiver extends Component {
}
Receiver.propTypes = {
- // 获取中心位置回调
+ /**
+ * @property getCenterPosition
+ * @type Function
+ * @default NOOP
+ * @description 获取中心位置回调
+ */
getCenterPosition: PropTypes.func,
- // 获取元素回调
+ /**
+ * @property getEl
+ * @type Function
+ * @default NOOP
+ * @description 获取元素回调
+ */
getEl: PropTypes.func,
- // 缩放值
+ /**
+ * @property scale
+ * @type Number
+ * @default 1.1
+ * @description 缩放值
+ */
scale: PropTypes.number,
- // 动画时间
+ /**
+ * @property duration
+ * @type Number
+ * @default 1.1
+ * @description 动画时间
+ */
duration: PropTypes.number,
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 子元素
+ /**
+ * @property children
+ * @type Element Array
+ * @default null
+ * @description 子元素
+ */
children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 布局回调
+ /**
+ * @property onLayout
+ * @type Function
+ * @default NOOP
+ * @description 布局回调
+ */
onLayout: PropTypes.func,
};
Receiver.defaultProps = {
diff --git a/Drop/index.js b/Drop/index.js
index 820cf66..2e34aff 100644
--- a/Drop/index.js
+++ b/Drop/index.js
@@ -1,3 +1,13 @@
+/**
+ * @component Drop
+ * @version 0.17.0
+ * @description 掉落动画组件
+ * 抛物线掉落动画组件,通常用于购物类交互。除了掉落组件 `Dropper` 外,Drop 还提供了另外两个非常有用的辅助组件 `Emitter` 和 `Receiver`。
+ *
+ * 
+ *
+ */
+
export { default as Dropper } from './Dropper';
export { default as Emitter } from './Emitter';
export { default as Receiver } from './Receiver';
diff --git a/DynamicText/DynamicText.md b/DynamicText/DynamicText.md
new file mode 100644
index 0000000..a97be6e
--- /dev/null
+++ b/DynamicText/DynamicText.md
@@ -0,0 +1,18 @@
+#### Demo
+
+
+
+#### Example
+
+```JavaScript
+import DynamicText from 'rnx-ui/DynamicText';
+
+function Example(props) {
+ return (
+ 自定义文字
+ );
+}
+```
+### ⚠️ 注意
+
+DynamicText 有 `maxWidth` 属性可以配置支持的最大的文本长度,当文本长度超过配置时,文本会显示为多行,此时需要配置更大的长度。
diff --git a/DynamicText/README.md b/DynamicText/README.md
deleted file mode 100644
index 9e10e17..0000000
--- a/DynamicText/README.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# DynamicText
-
-**自动滚动的文本框**
-
-文字超长时可以自动滚动
-
-### ⚠️ 注意
-
-DynamicText 有 `maxWidth` 属性可以配置支持的最大的文本长度,当文本长度超过配置时,文本会显示为多行,此时需要配置更大的长度。
-
-## Demo
-
-
-
-## Example
-
-```js
-import DynamicText from 'rnx-ui/DynamicText';
-
-function Example(props) {
- return (
- 自定义文字
- );
-}
-```
-
-## Props
-
-```js
-DynamicText.propTypes = {
- // 自定义wrapper样式
- style: View.propTypes.style,
- // 自定义文本样式
- textStyle: Text.propTypes.style,
- // 显示文本
- children: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
- // 文字循环模式,默认reverse
- // reverse:轮转到末尾后再轮转回开头
- // restart: 轮转到末尾后返回至开头重新循环
- mode: PropTypes.oneOf([MODE_RESTART, MODE_REVERSE]),
- // 动画间隔时间,默认500
- bufferTime: PropTypes.number,
- // 文字滚动速度,默认5,数字越大,速度越快
- speed: PropTypes.number,
- // 文本最大宽度
- maxWidth: PropTypes.number,
-};
-DynamicText.defaultProps = {
- style: null,
- textStyle: null,
- children: null,
- mode: MODE_REVERSE,
- bufferTime: 1000,
- speed: 5,
- maxWidth: 1000,
-};
-```
diff --git a/DynamicText/index.js b/DynamicText/index.js
index 99fe130..9a5e0b3 100644
--- a/DynamicText/index.js
+++ b/DynamicText/index.js
@@ -1,5 +1,9 @@
/**
- * 文本框,文字超长时滚动显示
+ * @component DynamicText
+ * @version 0.17.0
+ * @description 自动滚动的文本框:文字超长时滚动显示
+ *
+ * @instructions {instruInfo: ./DynamicText/DynamicText.md}
*/
import React, {
Component,
@@ -146,21 +150,58 @@ class DynamicText extends Component {
}
DynamicText.propTypes = {
- // 自定义wrapper样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义wrapper样式
+ */
style: View.propTypes.style,
- // 自定义文本样式
+ /**
+ * @property textStyle
+ * @type Object
+ * @default null
+ * @description 自定义文本样式
+ */
textStyle: Text.propTypes.style,
- // 显示文本
+ /**
+ * @property children
+ * @type String Number
+ * @default null
+ * @description 显示文本
+ */
children: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
- // 文字循环模式,默认reverse
- // reverse:轮转到末尾后再轮转回开头
- // restart: 轮转到末尾后返回至开头重新循环
+ /**
+ * @property mode
+ * @type String
+ * @default MODE_REVERSE
+ * @param {String} MODE_RESTART 轮转到末尾后返回至开头重新循环
+ * @param {String} MODE_REVERSE 轮转到末尾后再轮转回开头
+ * @description 文字循环模式,默认reverse
+ * reverse:轮转到末尾后再轮转回开头
+ * restart: 轮转到末尾后返回至开头重新循环
+ */
mode: PropTypes.oneOf([MODE_RESTART, MODE_REVERSE]),
- // 动画间隔时间,默认500
+ /**
+ * @property bufferTime
+ * @type Number
+ * @default 1000
+ * @description 动画间隔时间
+ */
bufferTime: PropTypes.number,
- // 文字滚动速度,默认5,数字越大,速度越快
+ /**
+ * @property speed
+ * @type Number
+ * @default 5
+ * @description 文字滚动速度,数字越大,速度越快
+ */
speed: PropTypes.number,
- // 文本最大宽度
+ /**
+ * @property maxWidth
+ * @type Number
+ * @default 2000
+ * @description 文本最大宽度
+ */
maxWidth: PropTypes.number,
};
DynamicText.defaultProps = {
diff --git a/HeaderedSheet/demo.gif b/HeaderedSheet/HeaderedSheet.gif
similarity index 100%
rename from HeaderedSheet/demo.gif
rename to HeaderedSheet/HeaderedSheet.gif
diff --git a/HeaderedSheet/HeaderedSheet.md b/HeaderedSheet/HeaderedSheet.md
new file mode 100644
index 0000000..a899605
--- /dev/null
+++ b/HeaderedSheet/HeaderedSheet.md
@@ -0,0 +1,7 @@
+#### Demo
+
+
+
+#### Other Points
+
+- 内部封装了 Overlay 组件,请参考 [Overlay](https://github.com/dragonwong/rnx-ui/tree/master/Overlay)
diff --git a/HeaderedSheet/README.md b/HeaderedSheet/README.md
deleted file mode 100644
index d036713..0000000
--- a/HeaderedSheet/README.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# HeaderedSheet
-
-**有标题栏的底部弹层**
-
-## Demo
-
-
-
-## Props
-
-```js
-HeaderedSheet.propTypes = {
- // 显示开关
- visible: Sheet.propTypes.visible,
- // 遮罩层样式
- overlayStyle: Sheet.propTypes.overlayStyle,
- // 关闭回调(动画结束时)
- onClose: Sheet.propTypes.onClose,
- // 遮罩点击事件
- onPressOverlay: Sheet.propTypes.onPressOverlay,
- // 动画时长
- duration: Sheet.propTypes.duration,
- // 自定容器义样式(包含 header 区域)
- containerStyle: Sheet.propTypes.style,
- // 自定义样式
- style: View.propTypes.style,
- // 自定义 header 样式
- headerStyle: View.propTypes.style,
- // 标题
- title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 标题文本样式(title 为字符串时才生效)
- titleStyle: Text.propTypes.style,
- // 标题到左右两边的距离
- titleGap: PropTypes.number,
- // 左侧按钮
- leftBtn: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 左侧点击事件
- onPressLeftBtn: PropTypes.func,
- // 左侧按钮文本样式(leftBtn 为字符串时才生效)
- leftBtnStyle: Text.propTypes.style,
- // 右侧按钮
- rightBtn: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 右侧点击事件
- onPressRightBtn: PropTypes.func,
- // 右侧按钮文本样式(rightBtn 为字符串时才生效)
- rightBtnStyle: Text.propTypes.style,
- // 按钮点击透明度变化
- activeOpacity: PropTypes.number,
- // 子元素
- children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
-};
-HeaderedSheet.defaultProps = {
- visible: false,
- overlayStyle: null,
- onClose: NOOP,
- onPressOverlay: NOOP,
- duration: 200,
- style: null,
- headerHeight: null,
- title: '',
- titleStyle: null,
- titleGap: 50,
- leftBtn: null,
- onPressLeftBtn: NOOP,
- leftBtnStyle: null,
- rightBtn: null,
- onPressRightBtn: NOOP,
- rightBtnStyle: null,
- activeOpacity: ACTIVE_OPACITY,
- children: null,
-};
-```
-
-## Other Points
-
-- 内部封装了 Overlay 组件,请参考 [Overlay](https://github.com/dragonwong/rnx-ui/tree/master/Overlay)
diff --git a/HeaderedSheet/index.js b/HeaderedSheet/index.js
index 66d697f..fd32b02 100644
--- a/HeaderedSheet/index.js
+++ b/HeaderedSheet/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component HeaderedSheet
+ * @version 0.12.0
+ * @description 有标题栏的底部弹层
+ *
+ * @instructions {instruInfo: ./HeaderedSheet/HeaderedSheet.md}
+ */
import React, { Component, PropTypes } from 'react';
import {
View,
@@ -111,43 +118,138 @@ class HeaderedSheet extends Component {
}
HeaderedSheet.propTypes = {
- // 显示开关
+ /**
+ * @property visible
+ * @type Boolean
+ * @default false
+ * @description 显示开关
+ */
visible: Sheet.propTypes.visible,
- // 遮罩层样式
+ /**
+ * @property overlayStyle
+ * @type Object
+ * @default null
+ * @description 遮罩层样式
+ */
overlayStyle: Sheet.propTypes.overlayStyle,
- // 关闭回调(动画结束时)
+ /**
+ * @property onClose
+ * @type Function
+ * @default NOOP
+ * @description 关闭回调(动画结束时)
+ */
onClose: Sheet.propTypes.onClose,
- // 遮罩点击事件
+ /**
+ * @property onPressOverlay
+ * @type Function
+ * @default NOOP
+ * @description 遮罩点击事件
+ */
onPressOverlay: Sheet.propTypes.onPressOverlay,
- // 动画时长
+ /**
+ * @property duration
+ * @type Number
+ * @default 200
+ * @description 动画时长
+ */
duration: Sheet.propTypes.duration,
- // 自定容器义样式(包含 header 区域)
+ /**
+ * @property containerStyle
+ * @type Object
+ * @default null
+ * @description 自定容器义样式(包含 header 区域)
+ */
containerStyle: Sheet.propTypes.style,
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 自定义 header 样式
+ /**
+ * @property headerStyle
+ * @type Object
+ * @default null
+ * @description 自定义 header 样式
+ */
headerStyle: View.propTypes.style,
- // 标题
+ /**
+ * @property title
+ * @type String Element
+ * @default ''
+ * @description 标题
+ */
title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 标题文本样式(title 为字符串时才生效)
+ /**
+ * @property titleStyle
+ * @type Object
+ * @default null
+ * @description 标题文本样式(title 为字符串时才生效)
+ */
titleStyle: Text.propTypes.style,
- // 标题到左右两边的距离
+ /**
+ * @property titleGap
+ * @type Number
+ * @default 50
+ * @description 标题到左右两边的距离
+ */
titleGap: PropTypes.number,
- // 左侧按钮
+ /**
+ * @property leftBtn
+ * @type String Element
+ * @default null
+ * @description 左侧按钮
+ */
leftBtn: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 左侧点击事件
+ /**
+ * @property onPressLeftBtn
+ * @type Function
+ * @default NOOP
+ * @description 左侧点击事件
+ */
onPressLeftBtn: PropTypes.func,
- // 左侧按钮文本样式(leftBtn 为字符串时才生效)
+ /**
+ * @property leftBtnStyle
+ * @type Object
+ * @default null
+ * @description 左侧按钮文本样式(leftBtn 为字符串时才生效)
+ */
leftBtnStyle: Text.propTypes.style,
- // 右侧按钮
+ /**
+ * @property rightBtn
+ * @type String Element
+ * @default null
+ * @description 右侧按钮
+ */
rightBtn: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 右侧点击事件
+ /**
+ * @property onPressRightBtn
+ * @type Function
+ * @default NOOP
+ * @description 右侧点击事件
+ */
onPressRightBtn: PropTypes.func,
- // 右侧按钮文本样式(rightBtn 为字符串时才生效)
+ /**
+ * @property rightBtnStyle
+ * @type Object
+ * @default null
+ * @description 右侧按钮文本样式(leftBtn 为字符串时才生效)
+ */
rightBtnStyle: Text.propTypes.style,
- // 按钮点击透明度变化
+ /**
+ * @property activeOpacity
+ * @type Number
+ * @default ACTIVE_OPACITY
+ * @description 按钮点击透明度变化
+ */
activeOpacity: PropTypes.number,
- // 子元素
+ /**
+ * @property children
+ * @type Element Array
+ * @default null
+ * @description 子元素
+ */
children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
};
HeaderedSheet.defaultProps = {
diff --git a/ImgHolder/demo.gif b/ImgHolder/ImgHolder.gif
similarity index 100%
rename from ImgHolder/demo.gif
rename to ImgHolder/ImgHolder.gif
diff --git a/ImgHolder/ImgHolder.md b/ImgHolder/ImgHolder.md
new file mode 100644
index 0000000..0579eb2
--- /dev/null
+++ b/ImgHolder/ImgHolder.md
@@ -0,0 +1,3 @@
+#### Demo
+
+
diff --git a/ImgHolder/README.md b/ImgHolder/README.md
deleted file mode 100644
index d6ca208..0000000
--- a/ImgHolder/README.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# ImgHolder
-
-**带占位的图片组件**
-
-## Demo
-
-
-
-## Props
-
-```js
-ImgHolder.propTypes = {
- // 自定义样式
- style: View.propTypes.style,
- // 图片样式
- imgStyle: Image.propTypes.style,
- // 占位元素
- holder: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 图片资源
- source: PropTypes.oneOfType([PropTypes.object, PropTypes.number]).isRequired,
-};
-ImgHolder.defaultProps = {
- style: null,
- imgStyle: null,
- holder: null,
- source: {
- uri: '',
- },
-};
-```
diff --git a/ImgHolder/index.js b/ImgHolder/index.js
index dfcbf28..3a853c7 100644
--- a/ImgHolder/index.js
+++ b/ImgHolder/index.js
@@ -1,5 +1,9 @@
/**
- * 带占位的图片组件
+ * @component ImgHolder
+ * @version 0.17.0
+ * @description 带占位的图片组件
+ *
+ * @instructions {instruInfo: ./ImgHolder/ImgHolder.md}
*/
import React, {
PropTypes,
@@ -45,13 +49,35 @@ class ImgHolder extends Component {
}
ImgHolder.propTypes = {
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 图片样式
+ /**
+ * @property imgStyle
+ * @type Object
+ * @default null
+ * @description 图片样式
+ */
imgStyle: Image.propTypes.style,
- // 占位元素
+ /**
+ * @property holder
+ * @type Element Array
+ * @default null
+ * @description 占位元素
+ */
holder: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 图片资源
+ /**
+ * @property source
+ * @type Object Number
+ * @default {
+ * uri: ''
+ * },
+ * @description 图片资源
+ */
source: PropTypes.oneOfType([PropTypes.object, PropTypes.number]).isRequired,
};
ImgHolder.defaultProps = {
diff --git a/ImgPicker/ImgPicker.md b/ImgPicker/ImgPicker.md
new file mode 100644
index 0000000..cdb7c90
--- /dev/null
+++ b/ImgPicker/ImgPicker.md
@@ -0,0 +1,30 @@
+#### Demo
+
+
+
+#### Example
+
+```JavaScript
+import ImgPicker from 'rnx-ui/ImgPicker';
+
+function Example(props) {
+ return (
+
+ }
+ adderVisible={this.state.images.length < MAX_PHOTOS_NUMBER}
+ imgDisplayerProps={{
+ onImgPress: this.showPhoto,
+ deleter: (
+
+ ),
+ onDeleterPress: this.removePhoto,
+ }}
+ onAdderPress={this.openCameraActionSheet}
+ />
+ );
+}
+```
+
diff --git a/ImgPicker/ImgPicker.png b/ImgPicker/ImgPicker.png
new file mode 100644
index 0000000..91ec560
Binary files /dev/null and b/ImgPicker/ImgPicker.png differ
diff --git a/ImgPicker/README.md b/ImgPicker/README.md
deleted file mode 100644
index dae3cf9..0000000
--- a/ImgPicker/README.md
+++ /dev/null
@@ -1,65 +0,0 @@
-# ImgPicker
-
-**图片选择组件**
-
-## Example
-
-```js
-import ImgPicker from 'rnx-ui/ImgPicker';
-
-function Example(props) {
- return (
-
- }
- adderVisible={this.state.images.length < MAX_PHOTOS_NUMBER}
- imgDisplayerProps={{
- onImgPress: this.showPhoto,
- deleter: (
-
- ),
- onDeleterPress: this.removePhoto,
- }}
- onAdderPress={this.openCameraActionSheet}
- />
- );
-}
-```
-
-## Props
-
-```js
-ImgPicker.propTypes = {
- // 图片 uri 数组
- images: PropTypes.arrayOf(PropTypes.string),
- // ImgDisplayer 属性
- imgDisplayerProps: PropTypes.shape(ImgDisplayer.propTypes),
- // 自定义样式
- style: View.propTypes.style,
- // 每项自定义样式
- itemStyle: View.propTypes.style,
- // 添加按钮自定义样式
- adderBtnStyle: View.propTypes.style,
- // 添加按钮点击回调
- onAdderPress: PropTypes.func,
- // 添加按钮内容元素
- adder: PropTypes.element,
- // 是否显示添加按钮
- adderVisible: PropTypes.bool,
- // 添加按钮点击颜色反馈
- deleterUnderlayColor: PropTypes.string,
-};
-ImgPicker.defaultProps = {
- images: [],
- imgDisplayerProps: ImgDisplayer.defaultProps,
- style: null,
- itemStyle: null,
- adderBtnStyle: null,
- onAdderPress: NOOP,
- adder: +,
- adderVisible: true,
- deleterUnderlayColor: '#dfdfdf',
-};
-```
diff --git a/ImgPicker/index.js b/ImgPicker/index.js
index 3c64230..2c92676 100644
--- a/ImgPicker/index.js
+++ b/ImgPicker/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component ImgPicker
+ * @version 0.11.7
+ * @description 图片选择组件
+ *
+ * @instructions {instruInfo: ./ImgPicker/ImgPicker.md}
+ */
import React, {
Component,
PropTypes,
@@ -47,23 +54,68 @@ class ImgPicker extends Component {
}
ImgPicker.propTypes = {
- // 图片 uri 数组
+ /**
+ * @property images
+ * @type Array
+ * @default []
+ * @description 图片 uri
+ */
images: PropTypes.arrayOf(PropTypes.string),
- // ImgDisplayer 属性
+ /**
+ * @property ImgDisplayerProps
+ * @type Object
+ * @default ImgDisplayer.defaultProps
+ * @description ImgDisplayer 属性
+ */
imgDisplayerProps: PropTypes.shape(ImgDisplayer.propTypes),
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 每项自定义样式
+ /**
+ * @property itemStyle
+ * @type Object
+ * @default null
+ * @description 每项自定义样式
+ */
itemStyle: View.propTypes.style,
- // 添加按钮自定义样式
+ /**
+ * @property adderBtnStyle
+ * @type Object
+ * @default null
+ * @description 添加按钮自定义样式
+ */
adderBtnStyle: View.propTypes.style,
- // 添加按钮点击回调
+ /**
+ * @property onAdderPress
+ * @type Function
+ * @default NOOP
+ * @description 添加按钮点击回调
+ */
onAdderPress: PropTypes.func,
- // 添加按钮内容元素
+ /**
+ * @property adder
+ * @type Element
+ * @default +
+ * @description 添加按钮内容元素
+ */
adder: PropTypes.element,
- // 是否显示添加按钮
+ /**
+ * @property adderVisible
+ * @type Boolean
+ * @default true
+ * @description 是否显示添加按钮
+ */
adderVisible: PropTypes.bool,
- // 添加按钮点击颜色反馈
+ /**
+ * @property deleterUnderlayColor
+ * @type Function
+ * @default NOOP
+ * @description 添加按钮点击颜色反馈
+ */
deleterUnderlayColor: PropTypes.string,
};
ImgPicker.defaultProps = {
diff --git a/ImgRollView/ImgRollView.md b/ImgRollView/ImgRollView.md
new file mode 100644
index 0000000..b138965
--- /dev/null
+++ b/ImgRollView/ImgRollView.md
@@ -0,0 +1,22 @@
+#### Example
+
+```JavaScript
+import ImgRollView from 'rnx-ui/ImgPicker';
+
+function Example(props) {
+ return (
+ }
+ iconUnSelected={}
+ />
+ );
+}
+```
+
+### ⚠️ 注意
+
+CameraRoll 提供了访问本地相册的功能。在iOS上使用这个模块之前,你需要先链接 RCTCameraRoll 库,具体做法请参考[链接原生库文档](https://reactnative.cn/docs/0.42/linking-libraries-ios.html)。另外,从 iOS10 开始,访问相册需要用户授权。你需要在 `Info.plist` 中添加一条名为 `NSCameraUsageDescription` 的键,然后在其值中填写向用户请求权限的具体描述。编辑完成后这个键在 Xcode 中实际会显示为 `Privacy - Camera Usage Description`。
+
diff --git a/ImgRollView/README.md b/ImgRollView/README.md
deleted file mode 100644
index a3174b6..0000000
--- a/ImgRollView/README.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# ImgRollView
-
-**图片多选组件**
-
-### ⚠️ 注意
-
-CameraRoll 提供了访问本地相册的功能。在iOS上使用这个模块之前,你需要先链接 RCTCameraRoll 库,具体做法请参考[链接原生库文档](https://reactnative.cn/docs/0.42/linking-libraries-ios.html)。另外,从 iOS10 开始,访问相册需要用户授权。你需要在 `Info.plist` 中添加一条名为 `NSCameraUsageDescription` 的键,然后在其值中填写向用户请求权限的具体描述。编辑完成后这个键在 Xcode 中实际会显示为 `Privacy - Camera Usage Description`。
-
-## Example
-
-```js
-import ImgRollView from 'rnx-ui/ImgPicker';
-
-function Example(props) {
- return (
- }
- iconUnSelected={}
- />
- );
-}
-```
-
-## Props
-
-```js
-ImgRollView.propTypes = {
- // 最大照片选择条数
- maxSelected: PropTypes.number,
- // 图片间像素间隔
- gap: PropTypes.number,
- // 每行显示的图片数量
- imagesPerRow: PropTypes.number,
- // 静态资源类型,默认为 Photos
- assetType: PropTypes.oneOf([
- 'Photos',
- 'Videos',
- 'All',
- ]),
- // 用户选择图片时触发的回调,返回参数为 node/uri/selected/uriSelected
- onSelect: PropTypes.func,
- // 选中图标
- iconSelected: PropTypes.element,
- // 未选中图标
- iconUnSelected: PropTypes.element,
- // 初始选中 uri
- uriList: PropTypes.arrayOf(PropTypes.string),
- // 外层容器样式
- style: styleShape,
- // 选中图标外框样式
- iconSelectedStyle: styleShape,
- // 未选中图标外框样式
- iconUnSelectedStyle: styleShape,
-};
-
-ImgRollView.defaultProps = {
- maxSelected: 10,
- gap: 8,
- imagesPerRow: 4,
- assetType: 'Photos',
- iconSelected: v,
- iconUnSelected: x,
- onSelect: () => {},
- uriList: [],
-};
-```
diff --git a/ImgRollView/index.js b/ImgRollView/index.js
index 86fddef..c09570b 100644
--- a/ImgRollView/index.js
+++ b/ImgRollView/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component ImgRollView
+ * @version 0.13.0
+ * @description 图片多选组件
+ *
+ * @instructions {instruInfo: ./ImgRollView/ImgRollView.md}
+ */
import React, { Component, PropTypes } from 'react';
import {
Text,
@@ -26,12 +33,17 @@ class ImgRollView extends Component {
},
});
const { imagesPerRow, gap } = props;
-
- // 根据屏幕宽度与每行图片树计算图片宽度
+ /**
+ * @description 根据屏幕宽度与每行图片树计算图片宽
+ */
this.sideLength = ((width + gap) / imagesPerRow) - gap;
- // 根据屏幕高度获取首屏要加载的图片数量
+ /**
+ * @description 根据屏幕高度获取首屏要加载的图片数量
+ */
this.pageSize = Math.ceil((height + gap) / (this.sideLength + gap)) * imagesPerRow;
- // 记录已经选择的 uri
+ /**
+ * @description 记录已经选择的 uri
+ */
this.uriSelected = props.uriList;
this.state = {
@@ -39,7 +51,9 @@ class ImgRollView extends Component {
dataSource: ds.cloneWithRows([]),
};
- // autobind
+ /**
+ * @description autobind
+ */
this.onEndReached = this.onEndReached.bind(this);
this.onSelectImage = this.onSelectImage.bind(this);
this.renderRow = this.renderRow.bind(this);
@@ -254,31 +268,89 @@ const styleShape = PropTypes.oneOfType([
]);
ImgRollView.propTypes = {
- // 最大照片选择条数
+ /**
+ * @property maxSelected
+ * @type Number
+ * @default 10
+ * @description 最大照片选择条数
+ */
maxSelected: PropTypes.number,
- // 图片间像素间隔
+ /**
+ * @property gap
+ * @type Number
+ * @default 8
+ * @description 图片间像素间隔
+ */
gap: PropTypes.number,
- // 每行显示的图片数量
+ /**
+ * @property imagesPerRow
+ * @type Number
+ * @default 4
+ * @description 每行显示的图片数量
+ */
imagesPerRow: PropTypes.number,
- // 静态资源类型,默认为 Photos
+ /**
+ * @property assetType
+ * @type String
+ * @default 'Photos'
+ * @param {String} 'Photos' 图片资源
+ * @param {String} 'Videos' 视频资源
+ * @param {String} 'All'
+ * @description 静态资源类型
+ */
assetType: PropTypes.oneOf([
'Photos',
'Videos',
'All',
]),
- // 用户选择图片时触发的回调,返回参数为 node/uri/selected/uriSelected
+ /**
+ * @property onSelect
+ * @type Function
+ * @default () => {}
+ * @description 用户选择图片时触发的回调,返回参数为 node/uri/selected/uriSelected
+ */
onSelect: PropTypes.func,
- // 选中图标
+ /**
+ * @property iconSelected
+ * @type Element
+ * @default v
+ * @description 选中图标
+ */
iconSelected: PropTypes.element,
- // 未选中图标
+ /**
+ * @property iconUnSelected
+ * @type Element
+ * @default x
+ * @description 未选中图标
+ */
iconUnSelected: PropTypes.element,
- // 初始选中 uri
+ /**
+ * @property uriList
+ * @type Array
+ * @default []
+ * @description 初始选中 uri
+ */
uriList: PropTypes.arrayOf(PropTypes.string),
- // 外层容器样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 外层容器样式
+ */
style: styleShape,
- // 选中图标外框样式
+ /**
+ * @property iconSelectedStyle
+ * @type Object
+ * @default null
+ * @description 选中图标外框样式
+ */
iconSelectedStyle: styleShape,
- // 未选中图标外框样式
+ /**
+ * @property iconUnSelectedStyle
+ * @type Object
+ * @default null
+ * @description 未选中图标外框样式
+ */
iconUnSelectedStyle: styleShape,
};
diff --git a/KeyboardAdaptiveView/README.md b/KeyboardAdaptiveView/KeyboardAdaptiveView.md
similarity index 78%
rename from KeyboardAdaptiveView/README.md
rename to KeyboardAdaptiveView/KeyboardAdaptiveView.md
index fd91513..63e41d6 100644
--- a/KeyboardAdaptiveView/README.md
+++ b/KeyboardAdaptiveView/KeyboardAdaptiveView.md
@@ -1,7 +1,4 @@
-# KeyboardAdaptiveView
-
-**适应键盘的容器**
-
+#### 基本用法
> 当你找到这个组件时,你应该是遇到输入框被键盘遮挡的问题了。**请你再三跟产品/设计/开发确认,是否真的有必要将输入框放在页面的偏下位置**,这是 APP 开发历史悠久的坑,**任何经验丰富的从业者/主流的 APP 都会极力避免这种场景**,考虑下从根本解决这个问题,比如上移输入框的位置或者干脆新开一个页面?
> 当然不是说 `KeyboardAdaptiveView` 这个组件不好,相反,`KeyboardAdaptiveView` 非常有效,完全碾压 react-native 官方组件 `KeyboardAvoidingView`(既然来找 `KeyboardAdaptiveView` 相信你一定是被官方的那个组件坑了😄)。
@@ -18,13 +15,13 @@
具体操作请参考 Example。
-## Demo
+#### Demo

-## Example
+#### Example
-```js
+```JavaScript
import KeyboardAdaptiveView, {
keyboardDismissMode,
} from 'rnx-ui/Drop';
@@ -66,29 +63,3 @@ class Example extends Component {
}
```
-## Props
-
-```js
-KeyboardAdaptiveView.propTypes = {
- // 获取元素回调
- getEl: PropTypes.func,
- // 自定义样式
- style: View.propTypes.style,
- // 子元素
- children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 更多距离。iOS 系统键盘可能会出现 suggest 行,导致键盘高度获取不准确。
- moreDistance: PropTypes.number,
- // 最小键盘高度
- minKbdHeight: PropTypes.number,
- // 安卓系统是否处理
- handlerAndroid: PropTypes.bool,
-};
-KeyboardAdaptiveView.defaultProps = {
- getEl: NOOP,
- style: null,
- children: null,
- moreDistance: 40,
- minKbdHeight: 250,
- handlerAndroid: false,
-};
-```
diff --git a/KeyboardAdaptiveView/index.js b/KeyboardAdaptiveView/index.js
index 8eb9b24..18c8966 100644
--- a/KeyboardAdaptiveView/index.js
+++ b/KeyboardAdaptiveView/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component KeyboardAdaptiveView
+ * @version 0.13.0
+ * @description
+ * 适应键盘的容器
+ * @instructions {instruInfo: ./KeyboardAdaptiveView/KeyboardAdaptiveView.md}
+ */
import React, {
PropTypes,
Component,
@@ -135,17 +142,47 @@ class KeyboardAdaptiveView extends Component {
}
KeyboardAdaptiveView.propTypes = {
- // 获取元素回调
+ /**
+ * @property getEl
+ * @type Function
+ * @default NOOP
+ * @description 获取元素回调
+ */
getEl: PropTypes.func,
- // 自定义样式
+ /**
+ * @property style
+ * @type Objectt
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 子元素
+ /**
+ * @property children
+ * @type Element Array
+ * @default null
+ * @description 子元素
+ */
children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 更多距离。iOS 系统键盘可能会出现 suggest 行,导致键盘高度获取不准确。
+ /**
+ * @property moreDistance
+ * @type Number
+ * @default 40
+ * @description 更多距离。iOS 系统键盘可能会出现 suggest 行,导致键盘高度获取不准确。
+ */
moreDistance: PropTypes.number,
- // 最小键盘高度
+ /**
+ * @property minkbdHeight
+ * @type Number
+ * @default 250
+ * @description 最小键盘高度
+ */
minKbdHeight: PropTypes.number,
- // 安卓系统是否处理
+ /**
+ * @property handlerAndroid
+ * @type Boolean
+ * @default false
+ * @description 安卓系统是否处理
+ */
handlerAndroid: PropTypes.bool,
};
KeyboardAdaptiveView.defaultProps = {
diff --git a/Loading/Loading.md b/Loading/Loading.md
new file mode 100644
index 0000000..065775c
--- /dev/null
+++ b/Loading/Loading.md
@@ -0,0 +1,7 @@
+#### Demo
+
+ 
+
+#### Other Points
+
+- 内部封装了 Overlay 组件,请参考 [Overlay](https://github.com/dragonwong/rnx-ui/tree/master/Overlay)
diff --git a/Loading/demo.png b/Loading/Loading.png
similarity index 100%
rename from Loading/demo.png
rename to Loading/Loading.png
diff --git a/Loading/README.md b/Loading/README.md
deleted file mode 100644
index d792b19..0000000
--- a/Loading/README.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# Loading
-
-**菊花加载器**
-
-## Demo
-
-
-
-## Props
-
-```js
-Loading.propTypes = {
- // 显示开关
- visible: PropTypes.bool.isRequired,
- // 遮罩层样式
- overlayStyle: View.propTypes.style,
- // 菊花容器样式
- loaderStyle: View.propTypes.style,
- // 菊花图标的颜色
- color: ActivityIndicator.propTypes.color,
- // 菊花图标的大小
- size: ActivityIndicator.propTypes.size,
- // 是否使用 Overlay 动画
- useOverlayAnimation: PropTypes.bool,
-};
-Loading.defaultProps = {
- visible: false,
- overlayStyle: null,
- loaderStyle: null,
- color: '#fff',
- size: 'small',
- useOverlayAnimation: true,
-};
-```
-
-## Other Points
-
-- 内部封装了 Overlay 组件,请参考 [Overlay](https://github.com/dragonwong/rnx-ui/tree/master/Overlay)
diff --git a/Loading/index.js b/Loading/index.js
index 226d4c7..a7b6e18 100644
--- a/Loading/index.js
+++ b/Loading/index.js
@@ -1,5 +1,9 @@
/**
- * 菊花加载中组件
+ * @component Loading
+ * @version 0.17.1
+ * @description 菊花加载中组件
+ *
+ * @instructions {instruInfo: ./Loading/Loading.md}
*/
import React, {
PropTypes,
@@ -50,17 +54,47 @@ class Loading extends Component {
}
Loading.propTypes = {
- // 显示开关
+ /**
+ * @property visible
+ * @type Boolean
+ * @default false
+ * @description 显示开关
+ */
visible: PropTypes.bool.isRequired,
- // 遮罩层样式
+ /**
+ * @property overlayStyle
+ * @type Object
+ * @default Null
+ * @description 遮罩层样式
+ */
overlayStyle: View.propTypes.style,
- // 菊花容器样式
+ /**
+ * @property loaderStyle
+ * @type Object
+ * @default Null
+ * @description 菊花容器样式
+ */
loaderStyle: View.propTypes.style,
- // 菊花图标的颜色
+ /**
+ * @property color
+ * @type String
+ * @default '#fff'
+ * @description 菊花图标的颜色
+ */
color: ActivityIndicator.propTypes.color,
- // 菊花图标的大小
+ /**
+ * @property size
+ * @type String
+ * @default 'small'
+ * @description 菊花图标的大小
+ */
size: ActivityIndicator.propTypes.size,
- // 是否使用 Overlay 动画
+ /**
+ * @property useOverlayAnimation
+ * @type String
+ * @default 'small'
+ * @description 是否使用 Overlay 动画
+ */
useOverlayAnimation: PropTypes.bool,
};
Loading.defaultProps = {
diff --git a/NavBar/NavBar.md b/NavBar/NavBar.md
new file mode 100755
index 0000000..72e19b9
--- /dev/null
+++ b/NavBar/NavBar.md
@@ -0,0 +1,9 @@
+#### Demo
+
+
+
+#### Other Points
+
+- NavBar 的高度由 `statusBarHeight` 和 `headerHeight` 两部分组成。`statusBarHeight` 默认 iOS 为 20,Android 为 0;`headerHeight` 默认 iOS 为 44,Android 为 56。
+
+- `titleGap` 用来控制 `title` 到左右两边的距离。在 `title` 为字符串且宽度超过这个距离时,标题会显示为自动剪切,并以 ‘...’ 结束。
diff --git a/NavBar/demo.png b/NavBar/NavBar.png
similarity index 100%
rename from NavBar/demo.png
rename to NavBar/NavBar.png
diff --git a/NavBar/README.md b/NavBar/README.md
deleted file mode 100755
index a5b4701..0000000
--- a/NavBar/README.md
+++ /dev/null
@@ -1,67 +0,0 @@
-# NavBar
-
-**导航栏**
-
-## Demo
-
-
-
-## Props
-
-```js
-NavBar.propTypes = {
- // 自定义样式
- style: View.propTypes.style,
- // statusBar 高度
- statusBarHeight: PropTypes.number,
- // header 高度
- headerHeight: PropTypes.number,
- // 标题
- title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 标题文本样式(title 为字符串时才生效)
- titleStyle: Text.propTypes.style,
- // 标题到左右两边的距离
- titleGap: PropTypes.number,
- // 左侧按钮
- leftBtn: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 左侧按钮点击事件
- leftEvent: PropTypes.func,
- // 左侧按钮文本样式(leftBtn 为字符串时才生效)
- leftBtnStyle: Text.propTypes.style,
- // 左侧按钮禁用
- leftBtnDisabled: PropTypes.bool,
- // 右侧按钮
- rightBtn: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 右侧按钮点击事件
- rightEvent: PropTypes.func,
- // 右侧按钮文本样式(rightBtn 为字符串时才生效)
- rightBtnStyle: Text.propTypes.style,
- // 右侧按钮禁用
- rightBtnDisabled: PropTypes.bool,
- // 按钮点击透明度变化
- activeOpacity: PropTypes.number,
-};
-NavBar.defaultProps = {
- style: null,
- statusBarHeight: STATUS_BAR_HEIGHT,
- headerHeight: HEADER_HEIGHT,
- title: '',
- titleStyle: null,
- titleGap: 50,
- leftBtn: null,
- leftEvent: NOOP,
- leftBtnStyle: null,
- leftBtnDisabled: false,
- rightBtn: null,
- rightEvent: NOOP,
- rightBtnStyle: null,
- rightBtnDisabled: false,
- activeOpacity: ACTIVE_OPACITY,
-};
-```
-
-## Other Points
-
-- NavBar 的高度由 `statusBarHeight` 和 `headerHeight` 两部分组成。`statusBarHeight` 默认 iOS 为 20,Android 为 0;`headerHeight` 默认 iOS 为 44,Android 为 56。
-
-- `titleGap` 用来控制 `title` 到左右两边的距离。在 `title` 为字符串且宽度超过这个距离时,标题会显示为自动剪切,并以 ‘...’ 结束。
diff --git a/NavBar/index.js b/NavBar/index.js
index 0d14f10..dd34970 100755
--- a/NavBar/index.js
+++ b/NavBar/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component NavBar
+ * @version 0.11.6
+ * @description 导航栏
+ *
+ * @instructions {instruInfo: ./NavBar/NavBar.md}
+ */
import React, { Component, PropTypes } from 'react';
import {
Platform,
@@ -106,35 +113,110 @@ class NavBar extends Component {
}
NavBar.propTypes = {
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default Null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // statusBar 高度
+ /**
+ * @property statusBarHeight
+ * @type Number
+ * @default STATUS_BAR_HEIGHT
+ * @description statusBar 高度
+ */
statusBarHeight: PropTypes.number,
- // header 高度
+ /**
+ * @property headerHeight
+ * @type Number
+ * @default HEADER_HEIGHT
+ * @description header 高度
+ */
headerHeight: PropTypes.number,
- // 标题
+ /**
+ * @property title
+ * @type String Element
+ * @default ''
+ * @description 标题
+ */
title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 标题文本样式(title 为字符串时才生效)
+ /**
+ * @property titleStyle
+ * @type Object
+ * @default null
+ * @description 标题文本样式(title 为字符串时才生效)
+ */
titleStyle: Text.propTypes.style,
- // 标题到左右两边的距离
+ /**
+ * @property titleGap
+ * @type Number
+ * @default 50
+ * @description 标题到左右两边的距离
+ */
titleGap: PropTypes.number,
- // 左侧按钮
+ /**
+ * @property leftBtn
+ * @type String Element
+ * @default null
+ * @description 左侧按钮
+ */
leftBtn: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 左侧按钮点击事件
+ /**
+ * @property leftEvent
+ * @type Function
+ * @default NOOP
+ * @description 左侧按钮点击事件
+ */
leftEvent: PropTypes.func,
- // 左侧按钮文本样式(leftBtn 为字符串时才生效)
+ /**
+ * @property leftBtnStyle
+ * @type Object
+ * @default null
+ * @description 左侧按钮文本样式(leftBtn 为字符串时才生效)
+ */
leftBtnStyle: Text.propTypes.style,
- // 左侧按钮禁用
+ /**
+ * @property leftBtnDisabled
+ * @type Boolean
+ * @default false
+ * @description 左侧按钮禁用
+ */
leftBtnDisabled: PropTypes.bool,
- // 右侧按钮
+ /**
+ * @property rightBtn
+ * @type String Element
+ * @default null
+ * @description 右侧按钮
+ */
rightBtn: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 右侧按钮点击事件
+ /**
+ * @property rightEvent
+ * @type Function
+ * @default NOOP
+ * @description 右侧按钮文本样式
+ */
rightEvent: PropTypes.func,
- // 右侧按钮文本样式(rightBtn 为字符串时才生效)
+ /**
+ * @property rightBtnStyle
+ * @type Object
+ * @default null
+ * @description 右侧按钮文本样式(rightBtn 为字符串时才生效)
+ */
rightBtnStyle: Text.propTypes.style,
- // 右侧按钮禁用
+ /**
+ * @property rightBtnDisabled
+ * @type Boolean
+ * @default false
+ * @description 右侧按钮禁用
+ */
rightBtnDisabled: PropTypes.bool,
- // 按钮点击透明度变化
+ /**
+ * @property activeOpacity
+ * @type Number
+ * @default ACTIVE_OPACITY
+ * @description 按钮点击透明度变化
+ */
activeOpacity: PropTypes.number,
};
NavBar.defaultProps = {
diff --git a/NumericKeyboard/README.md b/NumericKeyboard/NumericKeyboardar.md
similarity index 51%
rename from NumericKeyboard/README.md
rename to NumericKeyboard/NumericKeyboardar.md
index 7e39576..98fdb1d 100644
--- a/NumericKeyboard/README.md
+++ b/NumericKeyboard/NumericKeyboardar.md
@@ -1,16 +1,12 @@
-# NumericKeyboard
-
-**虚拟数字键盘**
-
很多情况下系统的数字键盘不能满足我们的要求,比如不同平台数字键盘表现不一致,比如有的数字键盘存在小数点,比如需要配合虚拟输入框而系统的键盘又不易控制...
-## Demo
+#### Demo

-## Example
+#### Example
-```js
+```JavaScript
import NumericKeyboard from 'rnx-ui/NumericKeyboard';
function Example(props) {
@@ -22,20 +18,3 @@ function Example(props) {
}
```
-## Props
-
-```js
-NumericKeyboard.propTypes = {
- // 自定义样式
- style: View.propTypes.style,
- // 按键回调
- onPress: PropTypes.func,
- // 删除键内容
- deleteKeyContent: PropTypes.oneOfType([PropTypes.string, PropTypes.element, PropTypes.array]),
-};
-NumericKeyboard.defaultProps = {
- style: null,
- onPress: NOOP,
- deleteKeyContent: ,
-};
-```
diff --git a/NumericKeyboard/index.js b/NumericKeyboard/index.js
index 654c16e..0f0ea42 100644
--- a/NumericKeyboard/index.js
+++ b/NumericKeyboard/index.js
@@ -1,3 +1,9 @@
+/**
+ * @component NumericKeyboardar
+ * @version 0.17.0
+ * @description 虚拟数字键盘
+ * @instructions {instruInfo: ./NumericKeyboard/NumericKeyboardar.md}
+ */
import React, {
Component,
PropTypes,
@@ -96,11 +102,26 @@ class NumericKeyboard extends Component {
}
NumericKeyboard.propTypes = {
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default Null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 按键回调
+ /**
+ * @property onPress
+ * @type Function
+ * @default NOOP
+ * @description 按键回调
+ */
onPress: PropTypes.func,
- // 删除键内容
+ /**
+ * @property deleteKeyContent
+ * @type String Element Array
+ * @default
+ * @description 删除键内容
+ */
deleteKeyContent: PropTypes.oneOfType([PropTypes.string, PropTypes.element, PropTypes.array]),
};
NumericKeyboard.defaultProps = {
diff --git a/Overlay/Overlay.md b/Overlay/Overlay.md
new file mode 100644
index 0000000..3f94451
--- /dev/null
+++ b/Overlay/Overlay.md
@@ -0,0 +1,12 @@
+#### Demo
+
+
+
+### ⚠️ 注意
+
+1. 点击 Overlay 内部元素时也会触发 Overlay 的 `onPress` 回调。如果需要避免该情况,请在内部元素外包裹 `Touchable*` 元素,用来捕获点击事件并阻止其冒泡。
+
+1. Overlay 默认撑满父容器,且父容器需要设置样式属性 `position` 为 `'absolute'` 或 `'relative'`。
+
+1. Overlay 不会阻止安卓物理返回键。
+
diff --git a/Overlay/README.md b/Overlay/README.md
deleted file mode 100644
index b9e8319..0000000
--- a/Overlay/README.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# Overlay
-
-**遮罩层**
-
-具有渐隐渐显动画效果的遮罩层组件。
-
-### ⚠️ 注意
-
-1. 点击 Overlay 内部元素时也会触发 Overlay 的 `onPress` 回调。如果需要避免该情况,请在内部元素外包裹 `Touchable*` 元素,用来捕获点击事件并阻止其冒泡。
-
-1. Overlay 默认撑满父容器,且父容器需要设置样式属性 `position` 为 `'absolute'` 或 `'relative'`。
-
-1. Overlay 不会阻止安卓物理返回键。
-
-## Demo
-
-
-
-## Props
-
-```js
-Overlay.propTypes = {
- // 显示开关
- visible: PropTypes.bool.isRequired,
- // 点击回调
- onPress: PropTypes.func,
- // 自定义样式
- style: View.propTypes.style,
- // 子元素
- children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 控制 Overlay 是否可以作为触控事件的目标(参考 https://facebook.github.io/react-native/docs/view.html#pointerevents)
- pointerEvents: View.propTypes.pointerEvents,
- // 动画时长
- duration: PropTypes.number,
- // 是否使用动画
- useAnimation: PropTypes.bool,
-};
-Overlay.defaultProps = {
- visible: false,
- onPress: NOOP,
- style: null,
- children: null,
- pointerEvents: 'auto',
- duration: 200,
- useAnimation: true,
-};
-```
diff --git a/Overlay/index.js b/Overlay/index.js
index e35055c..18e48de 100644
--- a/Overlay/index.js
+++ b/Overlay/index.js
@@ -1,5 +1,11 @@
/**
* 遮罩层
+ * @component Overlay
+ * @version 0.16.0
+ * @description 遮罩层
+ * 具有渐隐渐显动画效果的遮罩层组件。
+ *
+ * @instructions {instruInfo: ./Overlay/Overlay.md}
*/
import React, {
PropTypes,
@@ -121,19 +127,54 @@ class Overlay extends Component {
}
Overlay.propTypes = {
- // 显示开关
+ /**
+ * @property visible
+ * @type Boolean
+ * @default false
+ * @description 显示开关
+ */
visible: PropTypes.bool.isRequired,
- // 点击回调
+ /**
+ * @property onPress
+ * @type Function
+ * @default NOOP
+ * @description 点击回调
+ */
onPress: PropTypes.func,
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 子元素
+ /**
+ * @property children
+ * @type Element Array
+ * @default null
+ * @description 子元素
+ */
children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 控制 Overlay 是否可以作为触控事件的目标(参考 https://facebook.github.io/react-native/docs/view.html#pointerevents)
+ /**
+ * @property pointerEvents
+ * @type String
+ * @default 'auto'
+ * @description 控制 Overlay 是否可以作为触控事件的目标(参考 https://facebook.github.io/react-native/docs/view.html#pointerevents)
+ */
pointerEvents: View.propTypes.pointerEvents,
- // 动画时长
+ /**
+ * @property duration
+ * @type Number
+ * @default 200
+ * @description 动画时长
+ */
duration: PropTypes.number,
- // 是否使用动画
+ /**
+ * @property useAnimation
+ * @type Boolean
+ * @default true
+ * @description 是否使用动画
+ */
useAnimation: PropTypes.bool,
};
Overlay.defaultProps = {
diff --git a/PhoneNumInput/PhoneNumInput.md b/PhoneNumInput/PhoneNumInput.md
new file mode 100644
index 0000000..0991429
--- /dev/null
+++ b/PhoneNumInput/PhoneNumInput.md
@@ -0,0 +1,8 @@
+#### 基本说明
+
+> rnx-ui 表单校验工具 [Validator](https://github.com/dragonwong/rnx-ui/tree/master/util/Validator) 现已支持该组件。
+
+#### Demo
+
+
+
diff --git a/PhoneNumInput/README.md b/PhoneNumInput/README.md
deleted file mode 100644
index 2f4fb82..0000000
--- a/PhoneNumInput/README.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# PhoneNumInput
-
-**手机号码输入框**
-
-> rnx-ui 表单校验工具 [Validator](https://github.com/dragonwong/rnx-ui/tree/master/util/Validator) 现已支持该组件。
-
-## Demo
-
-
-
-## Props
-
-```js
-PhoneNumInput.propTypes = {
- // 自定义样式
- style: View.propTypes.style,
- // 自定义输入框样式
- inputStyle: TextInput.propTypes.style,
- // 提示文字
- placeholder: PropTypes.string,
- // 提示文字颜色
- placeholderTextColor: PropTypes.string,
- // 校验器接口
- collectValidate: PropTypes.func,
- // 默认值
- defaultValue: PropTypes.oneOfType([
- PropTypes.number,
- PropTypes.string,
- ]),
- // 用来在校验器中做标识
- name: PropTypes.string,
- // 用来在校验器中组成错误信息
- readableName: PropTypes.string,
- // 改变回调
- onChangeText: PropTypes.func,
-};
-PhoneNumInput.defaultProps = {
- style: null,
- inputStyle: null,
- placeholder: '手机号',
- placeholderTextColor: COLOR_PLACEHOLDER,
- collectValidate: NOOP,
- defaultValue: '',
- name: 'PHONE_NUM_INPUT',
- readableName: '手机号',
- onChangeText: NOOP,
-};
-```
diff --git a/PhoneNumInput/index.js b/PhoneNumInput/index.js
index 0a3d693..2613ed8 100644
--- a/PhoneNumInput/index.js
+++ b/PhoneNumInput/index.js
@@ -1,5 +1,9 @@
/**
- * 手机号码输入框组件
+ * @component PhoneNumInput
+ * @version 0.13.1
+ * @description 手机号码输入框组件
+ *
+ * @instructions {instruInfo: ./PhoneNumInput/PhoneNumInput.md}
*/
import React, { Component, PropTypes } from 'react';
import {
@@ -91,26 +95,71 @@ class PhoneNumInput extends Component {
}
PhoneNumInput.propTypes = {
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 自定义输入框样式
+ /**
+ * @property inputStyle
+ * @type Object
+ * @default null
+ * @description 自定义输入框样式
+ */
inputStyle: TextInput.propTypes.style,
- // 提示文字
+ /**
+ * @property placeholder
+ * @type String
+ * @default '手机号'
+ * @description 提示文字
+ */
placeholder: PropTypes.string,
- // 提示文字颜色
+ /**
+ * @property placeholderTextColor
+ * @type String
+ * @default COLOR_PLACEHOLDER
+ * @description 提示文字颜色
+ */
placeholderTextColor: PropTypes.string,
- // 校验器接口
+ /**
+ * @property collectValidate
+ * @type Function
+ * @default NOOP
+ * @description 校验器接口
+ */
collectValidate: PropTypes.func,
- // 默认值
+ /**
+ * @property defaultValue
+ * @type String
+ * @default ''
+ * @description 默认值
+ */
defaultValue: PropTypes.oneOfType([
PropTypes.number,
PropTypes.string,
]),
- // 用来在校验器中做标识
+ /**
+ * @property name
+ * @type String
+ * @default 'PHONE_NUM_INPUT'
+ * @description 用来在校验器中做标识
+ */
name: PropTypes.string,
- // 用来在校验器中组成错误信息
+ /**
+ * @property readableName
+ * @type String
+ * @default '手机号'
+ * @description 用来在校验器中组成错误信息
+ */
readableName: PropTypes.string,
- // 改变回调
+ /**
+ * @property onChangeText
+ * @type Function
+ * @default NOOP
+ * @description 改变回调
+ */
onChangeText: PropTypes.func,
};
PhoneNumInput.defaultProps = {
diff --git a/PhoneNumInput/demo.png b/PhoneNumInput/phoneNumInput.png
similarity index 100%
rename from PhoneNumInput/demo.png
rename to PhoneNumInput/phoneNumInput.png
diff --git a/PlaceholderInput/PlaceholderInput.md b/PlaceholderInput/PlaceholderInput.md
new file mode 100644
index 0000000..aadc7b0
--- /dev/null
+++ b/PlaceholderInput/PlaceholderInput.md
@@ -0,0 +1,13 @@
+#### Example
+
+```JavaScript
+import PlaceholderInput from 'rnx-ui/PlaceholderInput';
+
+function Example(props) {
+ return (
+
+ );
+}
+```
+
+
diff --git a/PlaceholderInput/README.md b/PlaceholderInput/README.md
deleted file mode 100644
index eb3f3f3..0000000
--- a/PlaceholderInput/README.md
+++ /dev/null
@@ -1,65 +0,0 @@
-# PlaceholderInput
-
-**可以自定义占位元素的输入框**
-
-React Native 提供的 `TextInput` 组件的 `placeholder` 可定制程度太低了,`PlaceholderInput` 应运而生。
-
-## Example
-
-```js
-import PlaceholderInput from 'rnx-ui/PlaceholderInput';
-
-function Example(props) {
- return (
-
- );
-}
-```
-
-## Props
-
-```js
-PlaceholderInput.propTypes = {
- // 自定义样式
- style: View.propTypes.style,
- // 初始值
- defaultValue: PropTypes.string,
- // 自定义输入框样式
- inputStyle: TextInput.propTypes.style,
- // 占位元素
- placeholder: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 占位元素样式(placeholder 为字符串时才生效)
- placeholderStyle: Text.propTypes.style,
- // onChangeText 的第二个参数,同时在校验器中做标识
- name: PropTypes.string,
- // 用来在校验器中组成错误信息
- readableName: PropTypes.string,
- // 校验器接口
- collectValidate: PropTypes.func,
- // 是否必要
- required: PropTypes.bool,
- // 是否可禁用
- disabled: PropTypes.bool,
- // 输入回调
- onChangeText: PropTypes.func,
- // TextInput 属性
- textInputProps: PropTypes.object,
- // 获取 TextInput 元素
- getInput: PropTypes.func,
-};
-PlaceholderInput.defaultProps = {
- style: null,
- defaultValue: '',
- inputStyle: null,
- placeholder: '',
- placeholderStyle: null,
- name: '',
- readableName: '',
- collectValidate: NOOP,
- required: false,
- disabled: false,
- onChangeText: NOOP,
- textInputProps: {},
- getInput: NOOP,
-};
-```
diff --git a/PlaceholderInput/index.js b/PlaceholderInput/index.js
index a99843a..7313fc2 100644
--- a/PlaceholderInput/index.js
+++ b/PlaceholderInput/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component PlaceholderInput
+ * @version 0.11.9
+ * @description 可以自定义占位元素的输入框
+ * React Native 提供的 `TextInput` 组件的 `placeholder` 可定制程度太低了,`PlaceholderInput` 应运而生。
+ * @instructions {instruInfo: ./PlaceholderInput/PlaceholderInput.md}
+ */
import React, {
PropTypes,
Component,
@@ -113,31 +120,92 @@ class PlaceholderInput extends Component {
}
PlaceholderInput.propTypes = {
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 初始值
+ /**
+ * @property defaultValue
+ * @type String
+ * @default ''
+ * @description 初始值
+ */
defaultValue: PropTypes.string,
- // 自定义输入框样式
+ /**
+ * @property inputStyle
+ * @type Object
+ * @default null
+ * @description 自定义输入框样式
+ */
inputStyle: TextInput.propTypes.style,
- // 占位元素
+ /**
+ * @property placeholder
+ * @type String Element
+ * @default ''
+ * @description 占位元素
+ */
placeholder: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 占位元素样式(placeholder 为字符串时才生效)
+ /**
+ * @property placeholderStyle
+ * @type Object
+ * @default null
+ * @description 占位元素样式 (placeholder 为字符串时才生效)
+ */
placeholderStyle: Text.propTypes.style,
- // onChangeText 的第二个参数,同时在校验器中做标识
+ /**
+ * @property name
+ * @type String
+ * @default ''
+ * @description onChangeText 的第二个参数,同时在校验器中做标识
+ */
name: PropTypes.string,
- // 用来在校验器中组成错误信息
+ /**
+ * @property readableName
+ * @type String
+ * @default ''
+ * @description 用来在校验器中组成错误信息
+ */
readableName: PropTypes.string,
- // 校验器接口
+ /**
+ * @property collectValidate
+ * @type Function
+ * @default NOOP
+ * @description 校验器接口
+ */
collectValidate: PropTypes.func,
- // 是否必要
+ /**
+ * @property required
+ * @type Boolean
+ * @default false
+ * @description 是否必要
+ */
required: PropTypes.bool,
- // 输入回调
+ /**
+ * @property onChangeText
+ * @type Function
+ * @default NOOP
+ * @description 输入回调
+ */
onChangeText: PropTypes.func,
/* eslint-disable */
- // TextInput 属性
+ /**
+ * @property textInputProps
+ * @type Object
+ * @default {}
+ * @description TextInput 属性
+ */
textInputProps: PropTypes.object,
/* eslint-enable */
// 获取 TextInput 元素
+ /**
+ * @property getInput
+ * @type Funciton
+ * @default NOOP
+ * @description 获取 TextInput 元素
+ */
getInput: PropTypes.func,
};
PlaceholderInput.defaultProps = {
diff --git a/PlaceholderText/PlaceholderText.md b/PlaceholderText/PlaceholderText.md
new file mode 100644
index 0000000..cd0180c
--- /dev/null
+++ b/PlaceholderText/PlaceholderText.md
@@ -0,0 +1,14 @@
+#### Example
+
+```JavaScript
+import PlaceholderText from 'rnx-ui/PlaceholderText';
+
+function Example(props) {
+ return (
+
+ );
+}
+```
+
diff --git a/PlaceholderText/README.md b/PlaceholderText/README.md
deleted file mode 100644
index 1025a38..0000000
--- a/PlaceholderText/README.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# PlaceholderText
-
-**有占位元素的文本显示组件**
-
-## Example
-
-```js
-import PlaceholderText from 'rnx-ui/PlaceholderText';
-
-function Example(props) {
- return (
-
- );
-}
-```
-
-## Props
-
-```js
-PlaceholderText.propTypes = {
- // 值
- value: PropTypes.string,
- // 值自定义样式
- valueStyle: Text.propTypes.style,
- // 自定义样式
- style: View.propTypes.style,
- // 占位元素
- placeholder: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 占位元素样式(placeholder 为字符串时才生效)
- placeholderStyle: Text.propTypes.style,
- // 点击回调
- onPress: PropTypes.func,
- // 用来在校验器中做标识
- name: PropTypes.string,
- // 用来在校验器中组成错误信息
- readableName: PropTypes.string,
- // 校验器接口
- collectValidate: PropTypes.func,
- // 是否必要
- required: PropTypes.bool,
-};
-PlaceholderText.defaultProps = {
- value: '',
- valueStyle: null,
- style: null,
- placeholder: '',
- placeholderStyle: null,
- onPress: NOOP,
- name: '',
- readableName: '',
- collectValidate: NOOP,
- required: false,
-};
-```
diff --git a/PlaceholderText/index.js b/PlaceholderText/index.js
index b181aa4..8e68f0f 100644
--- a/PlaceholderText/index.js
+++ b/PlaceholderText/index.js
@@ -1,3 +1,9 @@
+/**
+ * @component PlaceholderText
+ * @version 0.11.9
+ * @description 有占位元素的文本显示组件
+ * @instructions {instruInfo: ./PlaceholderText/PlaceholderText.md}
+ */
import React, {
PropTypes,
Component,
@@ -85,25 +91,75 @@ class PlaceholderText extends Component {
}
PlaceholderText.propTypes = {
- // 值
+ /**
+ * @property value
+ * @type String
+ * @default ''
+ * @description 值
+ */
value: PropTypes.string,
- // 值自定义样式
+ /**
+ * @property valueStyle
+ * @type Object
+ * @default null
+ * @description 值自定义样式
+ */
valueStyle: Text.propTypes.style,
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 占位元素
+ /**
+ * @property placeholder
+ * @type String Element
+ * @default ''
+ * @description 占位元素
+ */
placeholder: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
- // 占位元素样式(placeholder 为字符串时才生效)
+ /**
+ * @property placeholderStyle
+ * @type Object
+ * @default null
+ * @description 占位元素样式(placeholder 为字符串时才生效)
+ */
placeholderStyle: Text.propTypes.style,
- // 点击回调
+ /**
+ * @property onPress
+ * @type Function
+ * @default NOOP
+ * @description 点击回调
+ */
onPress: PropTypes.func,
- // 用来在校验器中做标识
+ /**
+ * @property name
+ * @type String
+ * @default ''
+ * @description 用来在校验器中做标识
+ */
name: PropTypes.string,
- // 用来在校验器中组成错误信息
+ /**
+ * @property readablename
+ * @type String
+ * @default ''
+ * @description 用来在校验器中组成错误信息
+ */
readableName: PropTypes.string,
- // 校验器接口
+ /**
+ * @property collectValidate
+ * @type String
+ * @default ''
+ * @description 校验器接口
+ */
collectValidate: PropTypes.func,
- // 是否必要
+ /**
+ * @property required
+ * @type Boolean
+ * @default false
+ * @description 是否必要
+ */
required: PropTypes.bool,
};
PlaceholderText.defaultProps = {
diff --git a/RefreshView/README.md b/RefreshView/README.md
deleted file mode 100644
index c8647cd..0000000
--- a/RefreshView/README.md
+++ /dev/null
@@ -1,67 +0,0 @@
-# RefreshView
-
-**滚动框**
-
-带惯性、下拉刷新功能。官版的 ScrollView 下拉刷新的功能几乎没有可定制空间,而 RefreshView 可以对 RefreshControl 进行完全的自定义,包括控件的本身,下拉状态的实时响应等,具有极大的可定制空间。
-
-配套组件:[RefreshControl](./RefreshControl/README.md)
-
-## Demo
-
-
-
-## Props
-
-```js
-RefreshView.propTypes = {
- // 滚动回调,参数为滚动距离
- onScroll: PropTypes.func,
- // 调用 onEndReached 之前的临界值,描述距底部的距离
- onEndReachedThreshold: PropTypes.number,
- // 当滚动至距离底部 onEndReachedThreshold 的范围内,会持续触发的回调
- onEndReached: PropTypes.func,
- // 超出范围时的减速度
- overA: PropTypes.number,
- // 超出范围时最大速度
- maxOverV: PropTypes.number,
- // 拖拽超出范围时的减速度
- dragOverA: PropTypes.number,
- // 渲染间隔时间
- renderInterval: PropTypes.number,
- // 弹性恢复时间
- recoverTime: PropTypes.number,
- // 刷新控件恢复时间
- refreshControlRecoverTime: PropTypes.number,
- // 到达刷新状态所需的距离
- refreshDistance: PropTypes.number,
- // 下拉刷新控件
- refreshControl: (props, propName, componentName) => {
- const type = props[propName].type;
- if (!type || type !== RefreshControl) {
- throw new Error(
- `${componentName}'s props \`refreshControl\` should be an instance of \`RefreshControl\``
- );
- }
- },
- // 子元素
- children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
-};
-RefreshView.defaultProps = {
- onScroll: NOOP,
- onEndReachedThreshold: 0,
- onEndReached: NOOP,
- overA: 0.05,
- maxOverV: 3,
- dragOverA: 2.5,
- renderInterval: 16,
- recoverTime: 200,
- refreshControlRecoverTime: 100,
- refreshDistance: 60,
- refreshControl: null,
- children: null,
-};
-```
-
-## Todo
-
-1. 初始状态即为 loading 状态
diff --git a/RefreshView/demo.gif b/RefreshView/RefreshView.gif
similarity index 100%
rename from RefreshView/demo.gif
rename to RefreshView/RefreshView.gif
diff --git a/RefreshView/RefreshView.md b/RefreshView/RefreshView.md
new file mode 100644
index 0000000..ebd5f10
--- /dev/null
+++ b/RefreshView/RefreshView.md
@@ -0,0 +1,18 @@
+#### Demo
+
+ 
+
+#### Example
+```JavaScript
+ import PlaceholderText from 'rnx-ui/PlaceholderText';
+ function Example(props) {
+ return (
+
+ );
+ }
+```
+#### Todo
+
+1. 初始状态即为 loading 状态
diff --git a/RefreshView/index.js b/RefreshView/index.js
index 4ccd1dd..9802b1b 100644
--- a/RefreshView/index.js
+++ b/RefreshView/index.js
@@ -1,3 +1,14 @@
+/**
+ * @component RefreshView
+ * @version 0.17.0
+ * @description 滚动框
+ * 带惯性、下拉刷新功能。官版的 ScrollView 下拉刷新的功能几乎没有可定制空间,而 RefreshView 可以对 RefreshControl 进行完全的自定义,
+ * 包括控件的本身,下拉状态的实时响应等,具有极大的可定制空间。
+ *
+ * 配套组件:[RefreshControl](./RefreshControl/README.md)
+ *
+ * @instructions {instruInfo: ./RefreshView/RefreshView.md}
+ */
import React, {
Component,
PropTypes,
@@ -27,24 +38,18 @@ class RefreshView extends Component {
refreshControlY: 0,
};
- // 滚动坐标
+
this.y = 0;
- // 内部容器长度
+
this.innerLen = 0;
- // 外部容器长宽
+
this.outerLen = 0;
- // 滚动条容器长宽
+
this.scrollBarContainerLen = 0;
- // 刷新控件高度
+
this.refreshControlHeight = 0;
this.RCOnReadyToRefreshLock = false;
- /**
- * 刷新控件状态
- * 0: 「下拉刷新」初始状态,可下拉
- * 1: 「松开刷新」下拉距离到达刷新点
- * 2: 「刷新中...」正在刷新
- * @type {Number}
- */
+
this.refreshControlStatus = 0;
this.lastRefreshControlStatus = 0;
@@ -67,7 +72,6 @@ class RefreshView extends Component {
componentWillMount() {
this.panResponder = PanResponder.create({
onStartShouldSetPanResponderCapture: () => {
- // 触摸时立刻停止当前动作
clearInterval(this.intervalId);
clearInterval(this.refreshControlIntervalId);
return false;
@@ -75,16 +79,10 @@ class RefreshView extends Component {
onStartShouldSetPanResponder: () => true,
onMoveShouldSetPanResponderCapture: () => false,
onMoveShouldSetPanResponder: (evt, gestureState) => {
- // 冒泡劫持
- // 本来应该直接 return true 劫持
- // 但是 iPhone 6s 及其以上版本有 bug,会导致子组件无法响应事件
- // (很奇怪,在冒泡阶段,子组件响应事件的时机应该在父组件之前)
- // https://github.com/facebook/react-native/issues/3082
const res = gestureState.dy !== 0;
return res;
},
onPanResponderMove: (evt, gestureState) => {
- // 开始移动
const { dy } = gestureState;
const dragOverA = this.props.dragOverA;
const topThreshold = this.getTopThreshold();
@@ -92,15 +90,13 @@ class RefreshView extends Component {
let p = y + dy;
if (p > topThreshold) {
- // 超出顶部范围,触发减速
const p0 = this.lastRefreshControlStatus === 0 ? 0 : topThreshold;
p = p0 + ((p - p0) / dragOverA);
- // 处理下拉刷新逻辑
+
const refreshControl = this.props.refreshControl;
if (refreshControl) {
if (p >= this.props.refreshDistance) {
- // 到达刷新点
if (this.refreshControlStatus === 0 && refreshControl.props.onReadyToRefresh) {
this.refreshControlStatus = 1;
this.props.refreshControl.props.onReadyToRefresh();
@@ -118,7 +114,6 @@ class RefreshView extends Component {
} else {
const d = this.outerLen - this.innerLen;
if (p < d) {
- // 超出底部范围,触发减速
p = d + ((p - d) / dragOverA);
}
}
@@ -126,17 +121,14 @@ class RefreshView extends Component {
this.position(p);
},
onPanResponderRelease: (evt, gestureState) => {
- // 停止移动
const { vy } = gestureState;
const topThreshold = this.getTopThreshold();
const y = this.state.y;
this.y = y;
if (y > topThreshold) {
- // 超出顶部范围,触发回弹
let s = y - topThreshold;
if (this.refreshControlStatus !== 2 && y >= this.props.refreshDistance) {
- // 到达刷新点
s = y - this.refreshControlHeight;
if (this.props.refreshControl && this.props.refreshControl.props.onRefresh) {
this.refreshControlStatus = 2;
@@ -145,7 +137,6 @@ class RefreshView extends Component {
}
this.recover(s);
} else {
- // 超出底部范围,触发回弹
const d = this.outerLen - this.innerLen;
if (y < d) {
if (d < 0) {
@@ -154,7 +145,6 @@ class RefreshView extends Component {
this.recover(y);
}
} else {
- // 判定没有超出范围,触发惯性
this.inertialScroll(vy);
}
}
@@ -172,10 +162,6 @@ class RefreshView extends Component {
const nextRefreshing = nextRefreshControl.props.refreshing;
if (prevRefreshing === true && nextRefreshing === false) {
- // * 0: 「下拉刷新」初始状态,可下拉
- // * 1: 「松开刷新」下拉距离到达刷新点
- // * 2: 「刷新中...」正在刷新
- // 2「刷新中...」结束,进入 0
this.refreshControlStatus = 0;
this.lastRefreshControlStatus = 0;
this.refreshControlRecover();
@@ -219,13 +205,13 @@ class RefreshView extends Component {
return 0;
}
- // 定位
+
setPosition(p) {
this.y = p;
this.position(p);
}
- // 检查 onEndReached 触发时机
+
checkEndReached(p) {
const distanceToBottom = (this.innerLen - this.outerLen) + p;
if (distanceToBottom <= this.props.onEndReachedThreshold) {
@@ -241,7 +227,7 @@ class RefreshView extends Component {
this.renderScrollBar(p);
}
- // 惯性滚动
+
inertialScroll(initalV) {
const t = this.props.renderInterval;
const towards = initalV > 0 ? 1 : -1;
@@ -255,7 +241,7 @@ class RefreshView extends Component {
n += 1;
v = vMaker.getV(n * t);
- // 趋近于 0,取 0
+
if (v < 0.07) {
clearInterval(this.intervalId);
return;
@@ -265,14 +251,12 @@ class RefreshView extends Component {
const topThreshold = this.getTopThreshold();
if (p > topThreshold) {
- // 到达顶部,停止惯性,进入超出范围滚动
p = topThreshold;
clearInterval(this.intervalId);
this.overScroll(v, towards);
} else {
const d = this.outerLen - this.innerLen;
if (p < d) {
- // 到达底部,停止惯性,进入超出范围滚动
p = d;
clearInterval(this.intervalId);
this.overScroll(towards * v, towards);
@@ -283,8 +267,7 @@ class RefreshView extends Component {
}, t);
}
- // 超出范围滚动
- // v = initalV - a*t
+
overScroll(initalV, towards = 1) {
const maxOverV = this.props.maxOverV;
let v0;
@@ -306,12 +289,10 @@ class RefreshView extends Component {
n += 1;
v = v0 - (towards * (a * n * t));
if (towards === 1 && v <= 0) {
- // 向下,速度降为 0
clearInterval(this.intervalId);
this.recover(this.y - this.getTopThreshold());
return;
} else if (towards === -1 && v >= 0) {
- // 向上,速度降为 0
clearInterval(this.intervalId);
const d = this.outerLen - this.innerLen;
this.recover(this.y - d);
@@ -323,13 +304,12 @@ class RefreshView extends Component {
}, t);
}
- // 超出范围后恢复
+
recover(S) {
if (S === 0) {
return;
}
- // const towards = S > 0 ? 1 : -1;
const t = this.props.renderInterval;
const T = this.props.recoverTime;
const N = Math.floor(T / t);
@@ -337,16 +317,6 @@ class RefreshView extends Component {
this.intervalId = setInterval(() => {
if (n >= N) {
- // 按理来说,此时滚动位置已经到达目标位置
- // 保险其间,再强制到达目标位置
- // if (towards === 1) {
- // // 向下滚动超出顶部,需要回到顶部
- // this.setPosition(0);
- // } else {
- // // 向上滚动超出底部,需要回到底部
- // const d = this.outerLen - this.innerLen;
- // this.setPosition(d);
- // }
clearInterval(this.intervalId);
return;
}
@@ -361,19 +331,18 @@ class RefreshView extends Component {
}, t);
}
- // 显示滚动条
showScrollBar() {
this.aniHideScrollBar.stop();
this.aniShowScrollBar.start();
}
- // 隐藏滚动条
+
hideScrollBar() {
this.aniShowScrollBar.stop();
this.aniHideScrollBar.start();
}
- // 刷新控件恢复
+
refreshControlRecover() {
const y = this.y;
let S = y;
@@ -390,16 +359,6 @@ class RefreshView extends Component {
this.refreshControlIntervalId = setInterval(() => {
if (n >= N) {
- // 按理来说,此时滚动位置已经到达目标位置
- // 保险其间,再强制到达目标位置
- // if (towards === 1) {
- // // 向下滚动超出顶部,需要回到顶部
- // this.setPosition(0);
- // } else {
- // // 向上滚动超出底部,需要回到底部
- // const d = this.outerLen - this.innerLen;
- // this.setPosition(d);
- // }
clearInterval(this.refreshControlIntervalId);
return;
}
@@ -414,18 +373,17 @@ class RefreshView extends Component {
}, t);
}
- // 计算滚动条长度
renderScrollBar(thisY) {
if (this.innerLen <= this.outerLen) {
return;
}
- // 显示滚动条
+
this.showScrollBar();
const maxLen = this.scrollBarContainerLen;
- // 内容长度
+
let contentLen = this.innerLen;
- // 容器长度
+
const containerLen = this.outerLen;
const d = containerLen - contentLen;
let len;
@@ -439,14 +397,14 @@ class RefreshView extends Component {
}
/**
- * 计算滚动条高度
+ * @description 计算滚动条高度
*/
if (y > 0) {
contentLen += y;
} else if (y < d) {
contentLen = containerLen - y;
}
- // 长度比例
+
const p = containerLen / contentLen;
if (p >= 1) {
@@ -456,13 +414,13 @@ class RefreshView extends Component {
}
/**
- * 计算滚动条位置
+ * @description 计算滚动条位置
*/
if (p >= 1) {
top = 0;
} else {
const maxTop = maxLen - len;
- // 位置比例
+
let pTop = y / d;
if (pTop < 0) {
pTop = 0;
@@ -477,7 +435,6 @@ class RefreshView extends Component {
scrollBarY: top,
});
- // 隐藏滚动条
this.hideScrollBar();
}
@@ -524,27 +481,82 @@ class RefreshView extends Component {
}
RefreshView.propTypes = {
- // 滚动回调,参数为滚动距离
+ /**
+ * @property onScroll
+ * @type Function
+ * @default NOOP
+ * @description 滚动回调,参数为滚动距离
+ */
onScroll: PropTypes.func,
- // 调用 onEndReached 之前的临界值,描述距底部的距离
+ /**
+ * @property onEndReachedThreShold
+ * @type Number
+ * @default 0
+ * @description 调用 onEndReached 之前的临界值,描述距底部的距离
+ */
onEndReachedThreshold: PropTypes.number,
- // 当滚动至距离底部 onEndReachedThreshold 的范围内,会持续触发的回调
+ /**
+ * @property onEndReached
+ * @type Function
+ * @default NOOP
+ * @description 当滚动至距离底部 onEndReachedThreshold 的范围内,会持续触发的回调
+ */
onEndReached: PropTypes.func,
- // 超出范围时的减速度
+ /**
+ * @property overA
+ * @type Number
+ * @default 0.05
+ * @description 超出范围时的减速度
+ */
overA: PropTypes.number,
- // 超出范围时最大速度
+ /**
+ * @property maxOverV
+ * @type Number
+ * @default 3
+ * @description 超出范围时最大速度
+ */
maxOverV: PropTypes.number,
- // 拖拽超出范围时的减速度
+ /**
+ * @property dragOverA
+ * @type Number
+ * @default 2.5
+ * @description 拖拽超出范围时的减速度
+ */
dragOverA: PropTypes.number,
- // 渲染间隔时间
+ /**
+ * @property renderInterval
+ * @type Number
+ * @default 16
+ * @description 渲染间隔时间
+ */
renderInterval: PropTypes.number,
- // 弹性恢复时间
+ /**
+ * @property recoverTime
+ * @type Number
+ * @default 200
+ * @description 弹性恢复时间
+ */
recoverTime: PropTypes.number,
- // 刷新控件恢复时间
+ /**
+ * @property refreshControlRecoverTime
+ * @type Number
+ * @default 100
+ * @description 刷新控件恢复时间
+ */
refreshControlRecoverTime: PropTypes.number,
- // 到达刷新状态所需的距离
+ /**
+ * @property refreshDistance
+ * @type Number
+ * @default 60
+ * @description 刷新控件恢复时间
+ */
refreshDistance: PropTypes.number,
- // 下拉刷新控件
+ /**
+ * @property refreshControl
+ * @type Function
+ * @default null
+ * @description 下拉刷新控件
+ */
refreshControl: (props, propName, componentName) => {
const type = props[propName].type;
if (!type || type !== RefreshControl) {
@@ -553,7 +565,12 @@ RefreshView.propTypes = {
);
}
},
- // 子元素
+ /**
+ * @property children
+ * @type Element Array
+ * @default null
+ * @description 子元素
+ */
children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
};
RefreshView.defaultProps = {
diff --git a/Sheet/README.md b/Sheet/README.md
deleted file mode 100644
index 700fafc..0000000
--- a/Sheet/README.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# Sheet
-
-**底部弹层**
-
-底部弹层弹出会有动画。
-
-## Demo
-
-
-
-## Props
-
-```js
-Sheet.propTypes = {
- // 自定义样式
- style: View.propTypes.style,
- // 显示开关
- visible: PropTypes.bool.isRequired,
- // 遮罩层样式
- overlayStyle: View.propTypes.style,
- // 关闭回调(动画结束时)
- onClose: PropTypes.func,
- // 遮罩点击事件
- onPressOverlay: PropTypes.func,
- // 子元素
- children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 动画时长
- duration: PropTypes.number,
-};
-Sheet.defaultProps = {
- style: null,
- visible: false,
- overlayStyle: null,
- onClose: NOOP,
- onPressOverlay: NOOP,
- children: null,
- duration: 200,
-};
-```
-
-## Other Points
-
-- 子组件点击事件会穿透从而被遮罩层捕获,如需处理,请在子组件上加上点击事件进行拦截
-- 内部封装了 Overlay 组件,请参考 [Overlay](https://github.com/dragonwong/rnx-ui/tree/master/Overlay)
-
-## Todo
-
-- bugfix:`visible` 初始状态为 true 时只有遮罩
diff --git a/Sheet/demo.gif b/Sheet/Sheet.gif
similarity index 100%
rename from Sheet/demo.gif
rename to Sheet/Sheet.gif
diff --git a/Sheet/Sheet.md b/Sheet/Sheet.md
new file mode 100644
index 0000000..838cca4
--- /dev/null
+++ b/Sheet/Sheet.md
@@ -0,0 +1,12 @@
+#### Demo
+
+
+
+#### Other Points
+
+- 子组件点击事件会穿透从而被遮罩层捕获,如需处理,请在子组件上加上点击事件进行拦截
+- 内部封装了 Overlay 组件,请参考 [Overlay](https://github.com/dragonwong/rnx-ui/tree/master/Overlay)
+
+#### Todo
+
+- bugfix:`visible` 初始状态为 true 时只有遮罩
diff --git a/Sheet/index.js b/Sheet/index.js
index edee397..372de06 100644
--- a/Sheet/index.js
+++ b/Sheet/index.js
@@ -1,3 +1,11 @@
+/**
+ * @component Sheet
+ * @version 0.17.0
+ * @description 底部弹层
+ * 底部弹层弹出会有动画。
+ *
+ * @instructions {instruInfo: ./Sheet/Sheet.md}
+ */
import React, {
Component,
PropTypes,
@@ -125,19 +133,54 @@ class Sheet extends Component {
}
Sheet.propTypes = {
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 显示开关
+ /**
+ * @property visible
+ * @type Boolean
+ * @default false
+ * @description 显示开关
+ */
visible: PropTypes.bool.isRequired,
- // 遮罩层样式
+ /**
+ * @property overlayStyle
+ * @type Object
+ * @default null
+ * @description 遮盖层样式
+ */
overlayStyle: View.propTypes.style,
- // 关闭回调(动画结束时)
+ /**
+ * @property onClose
+ * @type Function
+ * @default NOOP
+ * @description 关闭回调(动画结束时)
+ */
onClose: PropTypes.func,
- // 遮罩点击事件
+ /**
+ * @property onPressOverlay
+ * @type Function
+ * @default NOOP
+ * @description 遮罩点击事件
+ */
onPressOverlay: PropTypes.func,
- // 子元素
+ /**
+ * @property children
+ * @type Element Array
+ * @default null
+ * @description 子元素
+ */
children: PropTypes.oneOfType([PropTypes.element, PropTypes.array]),
- // 动画时长
+ /**
+ * @property duration
+ * @type Number
+ * @default 200
+ * @description 动画时长
+ */
duration: PropTypes.number,
};
Sheet.defaultProps = {
diff --git a/SmsCaptchaInput/README.md b/SmsCaptchaInput/README.md
deleted file mode 100644
index 65779da..0000000
--- a/SmsCaptchaInput/README.md
+++ /dev/null
@@ -1,100 +0,0 @@
-# SmsCaptchaInput
-
-**短信验证码输入框**
-
-提供发送短信按钮和倒计时功能。
-
-短信验证码输入框组件有4种状态:
-
-1. 初始状态
-2. 发送短信中状态
-3. 倒计时状态
-4. 倒计时结束状态
-
-点击按钮会使组件由 `1. 初始状态` 进入 `2. 发送短信中状态`,此时需要根据接口状况进行判断:
-
-1. 如果发送短信成功:手动调起组件的 `start()` 方法,进入 `3. 倒计时状态`,在倒计时结束时组件会自动进入 `4. 倒计时结束状态`;
-
-2. 如果发送短信失败:手动调起组件的 `stop()` 方法,进入 `4. 倒计时结束状态`。
-
-> rnx-ui 表单校验工具 [Validator](https://github.com/dragonwong/rnx-ui/tree/master/util/Validator) 现已支持该组件。
-
-## Demo
-
-
-
-## Props
-
-```js
-SmsCaptchaInput.propTypes = {
- // 自定义样式
- style: View.propTypes.style,
- // 自定义输入框样式
- inputStyle: TextInput.propTypes.style,
- // 自定义按钮样式
- btnStyle: View.propTypes.style,
- // 按钮文字:初始状态
- btnTextInital: PropTypes.string,
- // 按钮文字:发送短信中
- btnTextSending: PropTypes.string,
- // 按钮文字:倒计时中,`{time}` 将会被替换为倒计时数字
- btnTextTiming: PropTypes.string,
- // 按钮文字:倒计时结束
- btnTextTimed: PropTypes.string,
- // 自定义按钮文本样式
- btnTextStyle: Text.propTypes.style,
- // 提示文字
- placeholder: PropTypes.string,
- // 提示文字颜色
- placeholderTextColor: PropTypes.string,
- // 按钮点击透明度
- activeOpacity: PropTypes.number,
- // 倒计时时间
- intervalTime: PropTypes.number,
- // 点击发送短信按钮回调,当返回 false 时,可以阻止倒计时开始;
- // 该回调接受两个参数:开始倒计时方法:`start` 和结束倒计时方法 `stop`
- onPressBtn: PropTypes.func,
- // 倒计时结束回调
- onStop: PropTypes.func,
- // 验证码校验长度
- captchaLength: PropTypes.number,
- // 校验器接口,值通常为叫校验器的校验手机方法
- collectValidate: PropTypes.func,
- // 用来在校验器中做标识
- name: PropTypes.string,
- // 用来在校验器中组成错误信息
- readableName: PropTypes.string,
- // 改变回调
- onChangeText: PropTypes.func,
- // 是否开启自动获取焦点(在 start 被调用时)
- autoFocus: PropTypes.bool,
- // 获取输入框
- getInput: PropTypes.func,
- // 发送短信按钮热区
- hitSlop: TouchableOpacity.propTypes.hitSlop,
-};
-SmsCaptchaInput.defaultProps = {
- style: null,
- inputStyle: null,
- btnStyle: null,
- btnTextInital: '获取验证码',
- btnTextSending: '正在发送短信',
- btnTextTiming: '{time}秒后可重发',
- btnTextTimed: '重新获取',
- btnTextStyle: null,
- placeholder: '短信验证码',
- placeholderTextColor: COLOR_PLACEHOLDER,
- activeOpacity: ACTIVE_OPACITY,
- intervalTime: 60,
- onPressBtn: NOOP,
- onStop: NOOP,
- captchaLength: 6,
- collectValidate: NOOP,
- name: 'SMS_CODE_INPUT',
- readableName: '短信验证码',
- onChangeText: NOOP,
- autoFocus: true,
- getInput: NOOP,
- hitSlop: null,
-};
-```
diff --git a/SmsCaptchaInput/SmsCaptchaInput.md b/SmsCaptchaInput/SmsCaptchaInput.md
new file mode 100644
index 0000000..5364cc3
--- /dev/null
+++ b/SmsCaptchaInput/SmsCaptchaInput.md
@@ -0,0 +1,4 @@
+#### Demo
+
+
+
diff --git a/SmsCaptchaInput/demo.png b/SmsCaptchaInput/SmsCaptchaInput.png
similarity index 100%
rename from SmsCaptchaInput/demo.png
rename to SmsCaptchaInput/SmsCaptchaInput.png
diff --git a/SmsCaptchaInput/index.js b/SmsCaptchaInput/index.js
index 5b6077d..7723108 100644
--- a/SmsCaptchaInput/index.js
+++ b/SmsCaptchaInput/index.js
@@ -1,18 +1,28 @@
/**
- * 短信验证码输入框组件
+ * @component SmsCaptchaInput
+ * @version 0.13.1
+ * @description 短信验证码输入框
+ * 短信验证码输入框组件有三种状态:
*
- * 短信验证码输入框组件有三种状态:
- * 0:初始状态
- * 1:发送短信中状态
- * 2:倒计时状态
- * 3:倒计时结束状态
+ * 0:初始状态
*
- * 点击按钮会使组件由 `0:初始状态` 进入 `1:发送短信中状态`,
- * 此时需要根据接口状况进行判断:
- * 1、如果发送短信成功:手动调起组件的 `start` 方法,进入 `2:倒计时状态`,
- * 在倒计时结束时组件会自动进入 `3:倒计时结束状态`;
- * 2、如果发送短信失败:手动调起组件的 `stop` 方法,进入 `3:倒计时结束状态`;
+ * 1:发送短信中状态
+ *
+ * 2:倒计时状态
+ *
+ * 3:倒计时结束状态
+ *
+ * 点击按钮会使组件由 `0:初始状态` 进入 `1:发送短信中状态`,
+ * 此时需要根据接口状况进行判断:
+ * 1、如果发送短信成功:手动调起组件的 `start` 方法,进入 `2:倒计时状态`,
+ * 在倒计时结束时组件会自动进入 `3:倒计时结束状态`;
+ * 2、如果发送短信失败:手动调起组件的 `stop` 方法,进入 `3:倒计时结束状态`;
+ *
+ * >rnx-ui 表单校验工具[Validator](https://github.com/dragonwong/rnx-ui/tree/master/util/Validator) 现已支持该组件。
+ *
+ * @instructions {instruInfo: ./SmsCaptchaInput/SmsCaptchaInput.md}
*/
+
import React, { Component, PropTypes } from 'react';
import {
Platform,
@@ -83,11 +93,15 @@ class SmsCaptchaInput extends Component {
}
onPress() {
- // 检测是否处于点击发送短信状态
+ /**
+ * @description 检测是否处于点击发送短信状态
+ */
if (this.state.isRunning) {
return;
}
- // 运行点击按钮回调
+ /**
+ * @description 运行点击按钮回调
+ */
if (this.props.onPressBtn(this.start, this.stop) === false) {
return;
}
@@ -103,7 +117,9 @@ class SmsCaptchaInput extends Component {
this.input = el;
}
- // 开始倒计时
+ /**
+ * @description 开始倒计时
+ */
start() {
this.time = this.props.intervalTime;
this.interval = setInterval(this.timer, 1000);
@@ -112,7 +128,9 @@ class SmsCaptchaInput extends Component {
this.input.focus();
}
}
- // 结束倒计时
+ /**
+ * @description 结束倒计时
+ */
stop() {
clearInterval(this.interval);
this.setState({
@@ -122,7 +140,9 @@ class SmsCaptchaInput extends Component {
this.props.onStop();
}
- // 倒计时函数
+ /**
+ * @description 倒计时函数
+ */
timer() {
if (this.time > 0) {
this.setState({
@@ -202,50 +222,161 @@ class SmsCaptchaInput extends Component {
}
SmsCaptchaInput.propTypes = {
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
- // 自定义输入框样式
+ /**
+ * @property inputStyle
+ * @type Object
+ * @default null
+ * @description 自定义输入框样式
+ */
inputStyle: TextInput.propTypes.style,
- // 自定义按钮样式
+ /**
+ * @property btnStyle
+ * @type Object
+ * @default null
+ * @description 自定义按钮样式
+ */
btnStyle: View.propTypes.style,
- // 按钮文字:初始状态
+ /**
+ * @property btnTextInital
+ * @type String
+ * @default '获取验证码'
+ * @description 按钮文字:初始状态
+ */
btnTextInital: PropTypes.string,
- // 按钮文字:发送短信中
+ /**
+ * @property btnTextSending
+ * @type String
+ * @default '正在发送短信'
+ * @description 按钮文字:发送短信中
+ */
btnTextSending: PropTypes.string,
- // 按钮文字:倒计时中,`{time}` 将会被替换为倒计时数字
+ /**
+ * @property btnTextTiming
+ * @type String
+ * @default'{time}秒后可重发'
+ * @description 按钮文字:倒计时中,`{time}` 将会被替换为倒计时数字
+ */
btnTextTiming: PropTypes.string,
- // 按钮文字:倒计时结束
+ /**
+ * @property btnTextTimed
+ * @type String
+ * @default '重新获取'
+ * @description 按钮文字:倒计时结束
+ */
btnTextTimed: PropTypes.string,
- // 自定义按钮文本样式
+ /**
+ * @property btnTextStyle
+ * @type Object
+ * @default null
+ * @description 自定义按钮文本样式
+ */
btnTextStyle: Text.propTypes.style,
- // 提示文字
+ /**
+ * @property placeholder
+ * @type String
+ * @default '短信验证码'
+ * @description 提示文字
+ */
placeholder: PropTypes.string,
- // 提示文字颜色
+ /**
+ * @property placeholderTextColor
+ * @type String
+ * @default COLOR_PLACEHOLDER
+ * @description 提示文字颜色
+ */
placeholderTextColor: PropTypes.string,
- // 按钮点击透明度
+ /**
+ * @property activeOpacity
+ * @type Number
+ * @default ACTIVE_OPACITY
+ * @description 按钮点击透明度
+ */
activeOpacity: PropTypes.number,
- // 倒计时时间
+ /**
+ * @property intervalTime
+ * @type Number
+ * @default 60
+ * @description 倒计时时间
+ */
intervalTime: PropTypes.number,
- // 点击发送短信按钮回调,当返回 false 时,可以阻止倒计时开始;
- // 该回调接受两个参数:开始倒计时方法:`start` 和结束倒计时方法 `stop`
+ /**
+ * @property onPressBtn
+ * @type Function
+ * @default NOOP
+ * @description
+ * 点击发送短信按钮回调,当返回 false 时,可以阻止倒计时开始;
+ * 该回调接受两个参数:开始倒计时方法:`start` 和结束倒计时方法 `stop`
+ */
onPressBtn: PropTypes.func,
- // 倒计时结束回调
+ /**
+ * @property onStop
+ * @type Function
+ * @default NOOP
+ * @description 倒计时结束回调
+ */
onStop: PropTypes.func,
- // 验证码校验长度
+ /**
+ * @property captchaLength
+ * @type Number
+ * @default 6
+ * @description 验证码校验长度
+ */
captchaLength: PropTypes.number,
- // 校验器接口,值通常为叫校验器的校验手机方法
+ /**
+ * @property collectValidate
+ * @type Function
+ * @default NOOP
+ * @description 校验器接口,值通常为叫校验器的校验手机方法
+ */
collectValidate: PropTypes.func,
- // 用来在校验器中做标识
+ /**
+ * @property name
+ * @type String
+ * @default 'SMS_CODE_INPUT'
+ * @description 用来在校验器中做标识
+ */
name: PropTypes.string,
- // 用来在校验器中组成错误信息
+ /**
+ * @property readablename
+ * @type String
+ * @default '短信验证码'
+ * @description 用来在校验器中组成错误信息
+ */
readableName: PropTypes.string,
- // 改变回调
+ /**
+ * @property onChangeText
+ * @type Function
+ * @default NOOP
+ * @description 改变回调
+ */
onChangeText: PropTypes.func,
- // 是否开启自动获取焦点(在 start 被调用时)
+ /**
+ * @property autoFocus
+ * @type Boolean
+ * @default true
+ * @description 是否开启自动获取焦点(在 start 被调用时)
+ */
autoFocus: PropTypes.bool,
- // 获取输入框
+ /**
+ * @property getInput
+ * @type Function
+ * @default NOOP
+ * @description 获取输入框
+ */
getInput: PropTypes.func,
- // 发送短信按钮热区
+ /**
+ * @property hitSlop
+ * @type Object
+ * @default null
+ * @description 发送短信按钮热区
+ */
hitSlop: TouchableOpacity.propTypes.hitSlop,
};
SmsCaptchaInput.defaultProps = {
diff --git a/TabBar/README.md b/TabBar/README.md
deleted file mode 100644
index 1bd3a78..0000000
--- a/TabBar/README.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# TabBar
-
-**横向点击栏**
-
-## Demo
-
-
-
-## Props
-
-```js
-TabBar.propTypes = {
- // 激活项的 Id,必须是 items 项的 id 属性
- activeId: PropTypes.string,
- // 自定义样式
- style: View.propTypes.style,
- // tab 项
- items: PropTypes.arrayOf(PropTypes.shape({
- // tab 项 id
- id: PropTypes.string,
- // tab 项默认元素
- defaultComponent: PropTypes.element,
- // tab 项激活元素
- activedComponent: PropTypes.element,
- })),
- // tab 项点击时透明度
- activeOpacity: PropTypes.number,
- // 改变激活项时的回调,点击项的 id 会作为参数传入。
- onPress: PropTypes.func,
-};
-TabBar.defaultProps = {
- activeId: '',
- style: null,
- items: [{}],
- activeOpacity: 1,
- onPress: NOOP,
-};
-```
-
-## Other Points
-
-- TabBar 默认不设高度
-- 为防止 `defaultComponent` 和 `activedComponent` 不被刷新,强烈建议加上 `key`
diff --git a/TabBar/TabBar.md b/TabBar/TabBar.md
new file mode 100644
index 0000000..514c251
--- /dev/null
+++ b/TabBar/TabBar.md
@@ -0,0 +1,8 @@
+#### Demo
+
+
+
+#### Other Points
+
+- TabBar 默认不设高度
+- 为防止 `defaultComponent` 和 `activedComponent` 不被刷新,强烈建议加上 `key`
diff --git a/TabBar/demo.png b/TabBar/TabBar.png
similarity index 100%
rename from TabBar/demo.png
rename to TabBar/TabBar.png
diff --git a/TabBar/index.js b/TabBar/index.js
index da00bba..4e64205 100644
--- a/TabBar/index.js
+++ b/TabBar/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component TabBar
+ * @version 0.17.0
+ * @description 横向点击栏
+ *
+ * @instructions {instruInfo: ./TabBar/TabBar.md}
+ */
import React, {
PropTypes,
Component,
@@ -53,12 +60,30 @@ class TabBar extends Component {
}
TabBar.propTypes = {
- // 激活项的 Id,必须是 items 项的 id 属性
+ /**
+ * @property activeId
+ * @type String
+ * @default ''
+ * @description 激活项的 Id,必须是 items 项的 id 属性
+ */
activeId: PropTypes.string,
- // 自定义样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 自定义样式
+ */
style: View.propTypes.style,
/* eslint-disable */
- // tab 项
+ /**
+ * @property items
+ * @type Object
+ * @default [{}]
+ * @param {String} id tab 项 id
+ * @param {Element} defaultComponent tab 项默认元素
+ * @param {Element} activedComponent tab 项激活元素
+ * @description tab 项
+ */
items: PropTypes.arrayOf(PropTypes.shape({
// tab 项 id
id: PropTypes.string,
@@ -68,10 +93,20 @@ TabBar.propTypes = {
activedComponent: PropTypes.element,
})),
/* eslint-enable */
- // tab 项点击时透明度
+ /**
+ * @property activeOpacity
+ * @type Number
+ * @default 1
+ * @description tab 项点击时透明度
+ */
activeOpacity: PropTypes.number,
/* eslint-disable */
- // 改变激活项时的回调,点击项的 id 会作为参数传入。
+ /**
+ * @property onPress
+ * @type Function
+ * @default NOOP
+ * @description 改变激活项时的回调,点击项的 id 会作为参数传入。
+ */
onPress: PropTypes.func,
/* eslint-enable */
};
diff --git a/ToolTip/README.md b/ToolTip/README.md
deleted file mode 100644
index 9091c84..0000000
--- a/ToolTip/README.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# ToolTip
-
-**提示框**
-
-## Demo
-
-
-
-## Example
-
-```js
-import ToolTip from 'rnx-ui/ToolTip';
-
-function Example(props) {
- return (
-
- );
-}
-```
-
-## Props
-
-```js
-ToolTip.propTypes = {
- // 显示开关
- visible: PropTypes.bool.isRequired,
- // 显示文本
- text: PropTypes.string.isRequired,
- // 遮罩层样式
- overlayStyle: View.propTypes.style,
- // 文本容器样式
- textWrapperStyle: View.propTypes.style,
- // 文本样式
- textStyle: Text.propTypes.style,
- // 控制 Overlay 是否可以作为触控事件的目标(参考 https://facebook.github.io/react-native/docs/view.html#pointerevents)
- pointerEvents: Overlay.propTypes.pointerEvents,
- // 是否使用 Overlay 动画
- useOverlayAnimation: PropTypes.bool,
-};
-ToolTip.defaultProps = {
- visible: false,
- text: '',
- overlayStyle: null,
- textWrapperStyle: null,
- textStyle: null,
- pointerEvents: 'none',
- useOverlayAnimation: true,
-};
-```
-
-## Other Points
-
-- 内部封装了 Overlay 组件,请参考 [Overlay](https://github.com/dragonwong/rnx-ui/tree/master/Overlay)
diff --git a/ToolTip/ToolTip.md b/ToolTip/ToolTip.md
new file mode 100644
index 0000000..f37dbdf
--- /dev/null
+++ b/ToolTip/ToolTip.md
@@ -0,0 +1,7 @@
+#### Demo
+
+
+
+#### Other Points
+
+- 内部封装了 Overlay 组件,请参考 [Overlay](https://github.com/dragonwong/rnx-ui/tree/master/Overlay)
diff --git a/ToolTip/index.js b/ToolTip/index.js
index e6ee481..aa3be11 100644
--- a/ToolTip/index.js
+++ b/ToolTip/index.js
@@ -1,3 +1,10 @@
+/**
+ * @component ToolTip
+ * @version 0.16.0
+ * @description 提示框
+ *
+ * @instructions {instruInfo: ./ToolTip/ToolTip.md}
+ */
import React, {
Component,
PropTypes,
@@ -52,19 +59,54 @@ class ToolTip extends Component {
}
ToolTip.propTypes = {
- // 显示开关
+ /**
+ * @property visible
+ * @type Boolean
+ * @default false
+ * @description 显示开关
+ */
visible: PropTypes.bool.isRequired,
- // 显示文本
+ /**
+ * @property text
+ * @type String
+ * @default ''
+ * @description 显示文本
+ */
text: PropTypes.string.isRequired,
- // 遮罩层样式
+ /**
+ * @property overlayStyle
+ * @type Object
+ * @default null
+ * @description 遮罩层样式
+ */
overlayStyle: View.propTypes.style,
- // 文本容器样式
+ /**
+ * @property textWrapperStyle
+ * @type Object
+ * @default null
+ * @description 文本容器样式
+ */
textWrapperStyle: View.propTypes.style,
- // 文本样式
+ /**
+ * @property textStyle
+ * @type Object
+ * @default null
+ * @description 文本样式
+ */
textStyle: Text.propTypes.style,
- // 控制 Overlay 是否可以作为触控事件的目标(参考 https://facebook.github.io/react-native/docs/view.html#pointerevents)
+ /**
+ * @property pointerEvents
+ * @type String
+ * @default 'none'
+ * @description 控制 Overlay 是否可以作为触控事件的目标(参考 https://facebook.github.io/react-native/docs/view.html#pointerevents)
+ */
pointerEvents: Overlay.propTypes.pointerEvents,
- // 是否使用 Overlay 动画
+ /**
+ * @property useOverlayAnimation
+ * @type Boolean
+ * @default true
+ * @description 是否使用 Overlay 动画
+ */
useOverlayAnimation: PropTypes.bool,
};
ToolTip.defaultProps = {
diff --git a/VirtualPasswordInput/README.md b/VirtualPasswordInput/README.md
deleted file mode 100644
index c35b5f9..0000000
--- a/VirtualPasswordInput/README.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# VirtualPasswordInput
-
-**虚拟密码输入框**
-
-## Demo
-
-
-
-## Example
-
-```js
-import VirtualPasswordInput from 'rnx-ui/VirtualPasswordInput';
-
-function Example(props) {
- return (
-
- );
-}
-```
-
-## Props
-
-```js
-VirtualPasswordInput.propTypes = {
- // 值
- value: PropTypes.string,
- // 是否启用安全输入
- secureTextEntry: PropTypes.bool,
- // 最外层样式
- style: View.propTypes.style,
- // 容器样式
- containerStyle: View.propTypes.style,
- // 单个输入框样式
- cellStyle: View.propTypes.style,
- // 安全码样式
- secureStyle: View.propTypes.style,
- // 文本样式
- textStyle: Text.propTypes.style,
- // 最大长度
- maxLength: PropTypes.number,
- // 点击回调
- onPress: PropTypes.func,
-};
-VirtualPasswordInput.defaultProps = {
- value: '',
- secureTextEntry: true,
- style: null,
- containerStyle: null,
- cellStyel: null,
- secureStyle: null,
- textStyle: null,
- maxLength: 6,
- onPress: NOOP,
-};
-```
diff --git a/VirtualPasswordInput/VirtualPasswordInput.md b/VirtualPasswordInput/VirtualPasswordInput.md
new file mode 100644
index 0000000..ab22ea3
--- /dev/null
+++ b/VirtualPasswordInput/VirtualPasswordInput.md
@@ -0,0 +1,19 @@
+#### Demo
+
+
+
+#### Example
+
+```JavaScript
+import VirtualPasswordInput from 'rnx-ui/VirtualPasswordInput';
+
+function Example(props) {
+ return (
+
+ );
+}
+```
+
diff --git a/VirtualPasswordInput/index.js b/VirtualPasswordInput/index.js
index 4edba41..ac6e006 100644
--- a/VirtualPasswordInput/index.js
+++ b/VirtualPasswordInput/index.js
@@ -1,3 +1,11 @@
+/**
+ * @component VirtualPasswordInput
+ * @version 0.17.0
+ * @description 虚拟密码输入框
+ *
+ * @instructions {instruInfo: ./VirtualPasswordInput/VirtualPasswordInput.md}
+ */
+
import React, { Component, PropTypes } from 'react';
import {
TouchableWithoutFeedback,
@@ -56,23 +64,68 @@ class VirtualPasswordInput extends Component {
}
VirtualPasswordInput.propTypes = {
- // 值
+ /**
+ * @property value
+ * @type String
+ * @default ''
+ * @description 值
+ */
value: PropTypes.string,
- // 是否启用安全输入
+ /**
+ * @property secureTextEntry
+ * @type Boolean
+ * @default true
+ * @description 是否启用安全输入
+ */
secureTextEntry: PropTypes.bool,
- // 最外层样式
+ /**
+ * @property style
+ * @type Object
+ * @default null
+ * @description 最外层样式
+ */
style: View.propTypes.style,
- // 容器样式
+ /**
+ * @property containerStyle
+ * @type Object
+ * @default null
+ * @description 容器样式
+ */
containerStyle: View.propTypes.style,
- // 单个输入框样式
+ /**
+ * @property cellStyle
+ * @type Object
+ * @default null
+ * @description 单个输入框样式
+ */
cellStyle: View.propTypes.style,
- // 安全码样式
+ /**
+ * @property secureStyle
+ * @type Object
+ * @default null
+ * @description 安全码样式
+ */
secureStyle: View.propTypes.style,
- // 文本样式
+ /**
+ * @property textStyle
+ * @type Object
+ * @default null
+ * @description 文本样式
+ */
textStyle: Text.propTypes.style,
- // 最大长度
+ /**
+ * @property maxLength
+ * @type Number
+ * @default 6
+ * @description 最大长度
+ */
maxLength: PropTypes.number,
- // 点击回调
+ /**
+ * @property onPress
+ * @type Function
+ * @default NOOP
+ * @description 点击回调
+ */
onPress: PropTypes.func,
};
VirtualPasswordInput.defaultProps = {
diff --git a/docs/CHANGELOG.html b/docs/CHANGELOG.html
new file mode 100644
index 0000000..99e43fb
--- /dev/null
+++ b/docs/CHANGELOG.html
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 版本
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
版本
+
RNX-UI 的历史版本发布时间及变更记录,帮助你追溯到每个版本的演进过程。
+
+
+
+
+
+
+
+
+
+
+ CHANGELOG #
{n1}.{n2}.{n3}
+
+n1:❤️ 重大更新
+n2:💛 影响之前版本使用方式的更新(需要用户适配)
+n3:💚 不影响之前版本使用方式的更新(不需要用户适配)
+
0.17.1 #
Overlay #
+- 💚 新增属性
useAnimation
:是否使用动画
+Dialog #
+- 💚 新增属性
useOverlayAnimation
:是否使用 Overlay 动画
+Loading #
+- 💚 新增属性
useOverlayAnimation
:是否使用 Overlay 动画
+
+- 💚 新增属性
useOverlayAnimation
:是否使用 Overlay 动画
+0.17.0 #
CardView #
+- 💚 现在自带鱼眼效果
- 💛 修改方法
scrollToCard
:更名为 scrollTo
,并接受第二个参数,标示是否使用动画 - 💚 新增属性
scaleCoefficient
:当前项放大比率
+Btn #
+NumericKeyboard #
+0.16.0 #
+- 💛 原
Alert
组件更名为 Dialog
- 💚 新增警告弹框组件:
Alert
- 💚 新增确认弹框组件:
Confirm
- 💚 新增自动滚动的文本框组件:
DynamicText
+CardView #
+- 💚 新增属性
onPass
:卡片经过时的回调,参数为当前经过的卡片序号 - 💚 新增属性
onStartReached
:到达顶部回调 - 💚 新增属性
onEndReached
:到达底部回调
+Overlay #
+- 💚 添加属性
pointerEvents
:允许遮罩层不作为触控事件目标
+
+- 💚 添加属性
pointerEvents
:允许遮罩层不作为触控事件目标
+0.15.2 #
CardView #
+- 💚 优化 CardView 滚动效果:不再是一次只能移动一个了
+0.15.1 #
CardView #
+- 💚 修复在 iPhone 6s 以上苹果手机内部元素点击失效的 bug
+0.15.0 #
+Overlay #
+
+- 💛 删除属性
pointerEvents
- 💚 修改样式:文字黑色背景默认有 5dp 的圆角
+0.14.0 #
All #
+- 💚 修改属性
statusBarBgColor
:默认值改为 transparent
+0.13.1 #
+- 💚 修改属性
onChangeText
:新增第二个参数,传入 name
属性值
+
+- 💚 修改属性
onChangeText
:新增第二个参数,传入 name
属性值
+0.13.0 #
+- 💚 新增页面容器组件:
All
- 💚 新增页面容器组件:
ImgRollView
+KeyboardAdaptiveView #
+- 💛 兼容至 react-native
0.41.2
+0.12.0 #
+0.11.9 #
+- 💚 新增有占位元素的文本显示组件:
PlaceholderText
+
+0.11.7 #
+- 💚 新增上拉按钮组组件:
ActionSheet
- 💚 新增图片选择组件:
ImgPicker
+
+- 💚 修正更改
defaultValue
不会触发 placeholder
显隐的 bug
+0.11.6 #
+- 💚 新增可以自定义占位元素的输入框组件:
PlaceholderInput
+NavBar #
+- 💚 新增属性
leftBtnDisabled
:左侧按钮禁用 - 💚 新增属性
rightBtnDisabled
:右侧按钮禁用
+0.11.4 #
Badge #
+- 💚 新增属性
characterWidth
:单个字符宽度
+0.0.1 #
❤️ Hello RNX UI.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-ActionSheet.html b/docs/component-ActionSheet.html
new file mode 100644
index 0000000..99c0743
--- /dev/null
+++ b/docs/component-ActionSheet.html
@@ -0,0 +1,775 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ActionSheet
+
+ 0.11.7
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Example
+
import ActionSheet from 'rnx-ui/ActionSheet';
+
+function Example(props) {
+ return (
+ <ActionSheet
+ visible={this.state.visible}
+ onClose={this.hide}
+ btnList={[{
+ text: '默认',
+ onPress: this.hide,
+ }, {
+ text: '相册',
+ onPress: this.hide,
+ }]}
+ />
+ );
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ visible
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: false
+
+
+
+
+
+
+
+ btnList
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: [{
+style: null,
+text: '确定',
+textStyle: null,
+onPress: NOOP,
+}]
+
+
+
+
+
+
+
+ btnStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ btnTextStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ cancelBtnStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ cancelBtnText
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '取消'
+
+
+
+
+
+
+
+ cancelBtnTextStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ overlayStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ onClose
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ duration
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 200
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ underlayColor
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '#eee'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-AddAndSubtract.html b/docs/component-AddAndSubtract.html
new file mode 100644
index 0000000..34c0eca
--- /dev/null
+++ b/docs/component-AddAndSubtract.html
@@ -0,0 +1,895 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AddAndSubtract
+
+ 0.17.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Example
+
import Template from 'rnx-ui/Template';
+
+function Example(props) {
+ return (
+ <AddAndSubtract
+ num={this.state.num}
+ onPressAdder={this.add}
+ onPressSubtracter={this.subtract}
+ />
+ );
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ num
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 0
+
+
+
+
+
+
+
+ onPressAdder
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ onPressSubtracter
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ duration
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 200
+
+
+
+
+
+
+
+ distance
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 30
+
+
+
+
+
+
+
+ deg
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 180
+
+
+
+
+
+
+
+ easing
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: t => t
+
+
+
+
+
+
+
+ btnWidth
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 30
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ adderBtnStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ adderStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ subtracterWrapperStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ subtracterBtnStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ subtracterStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ textStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ adder
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ subtracter
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: +
+
+
+
+
+
+
+
+ hitSlop
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: {
+top: 5,
+left: 5,
+right: 5,
+bottom: 5,
+},
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Alert.html b/docs/component-Alert.html
new file mode 100644
index 0000000..71852d3
--- /dev/null
+++ b/docs/component-Alert.html
@@ -0,0 +1,566 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Alert
+
+ 0.17.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Other Points
+
+- 内部封装了 Dialog 组件,覆盖了 Dialog 的
buttons
属性,其他不变,请参考 Dialog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ buttonText
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '好'
+
+
+
+
+
+
+
+ buttonTextStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ onPress
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-All.html b/docs/component-All.html
new file mode 100644
index 0000000..75b6355
--- /dev/null
+++ b/docs/component-All.html
@@ -0,0 +1,590 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Example
+
import All from 'rnx-ui/All';
+
+function Example(props) {
+ return (
+ <All />
+ );
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ children
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ statusBarBgColor
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: 'transparent'
+
+
+
+
+
+
+
+ statusBarBgStyle
+ { Stirng }
+
+ #
+
+
+
+
+
+ 默认值: 'light-content'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Badge.html b/docs/component-Badge.html
new file mode 100644
index 0000000..e2c2e89
--- /dev/null
+++ b/docs/component-Badge.html
@@ -0,0 +1,643 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Badge
+
+ 0.11.4
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Example
+
import Badge from 'rnx-ui/Badge';
+
+function Example(props) {
+ return (
+ <Badge text={8}>
+ <Icon name="commenting-o" style={styles.icon} />
+ </Badge>
+ )
+}
+
+
⚠️ 注意
+
+角标宽度是动态计算的,随角标内容的增长而变长。当你通过 textStyle
改变角标内容的字体大小时,注意配置相符的 characterWidth
。
+
+Badge 没有宽度,宽度随外部容器变化。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ textContainerStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ textStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ characterWidth
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 7
+
+
+
+
+
+
+
+ text
+ { String Number }
+
+ #
+
+
+
+
+
+ 默认值: ''
+
+
+
+
+
+
+
+ children
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Btn.html b/docs/component-Btn.html
new file mode 100644
index 0000000..04b35b4
--- /dev/null
+++ b/docs/component-Btn.html
@@ -0,0 +1,681 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Btn
+
+ 0.17.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Example
+
import Btn from 'rnx-ui/Btn';
+
+function Example(props) {
+ return (
+ <Btn>自定义样式</Btn>
+ );
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ contentContainerStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ textStyle
+ { Obejct }
+
+ #
+
+
+
+
按钮文本样式(children 为字符串时才生效)
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ onPress
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ children
+ { String Array }
+
+ #
+
+
+
+
+
+ 默认值: '下一步'
+
+
+
+
+
+
+
+ activeOpacity
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: ACTIVE_OPACITY
+
+
+
+
+
+
+
+ disabled
+ { Boolean }
+
+ #
+
+
+
+
是否禁用,为 true 时,activeOpacity 为 1,onPress 为 null
+
+
+
+
+
+ 默认值: ACTIVE_OPACITY
+
+
+
+
+
+
+
+ hitSlop
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: {
+top: 0,
+bottom: 0,
+left: 0,
+right: 0,
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-CardView.html b/docs/component-CardView.html
new file mode 100644
index 0000000..7d6f5f1
--- /dev/null
+++ b/docs/component-CardView.html
@@ -0,0 +1,883 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CardView
+
+ 0.17.0
+
+
卡片视图
+以卡片样式浏览,并可以设置激活卡片样式。
+
+
+
+
+
使用说明
+
+
+
+
+
+
基本用法
+
以卡片样式浏览,并可以设置激活卡片样式。
+
Demo
+

+
Example
+
import CardView from 'rnx-ui/CardView';
+
+function Example(props) {
+ return (
+ <CardView
+ style={styles.cardView}
+ cards={this.state.cards}
+ cardGap={20}
+ onChange={this.onChange}
+ />
+ );
+}
+
+
⚠️ 注意
+
CardView 会为卡片添加 isActiveRnxUiCardView
属性,激活卡片值为 true
,其他卡片是 false
。
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ scaleCoefficient
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 0.1
+
+
+
+
+
+
+
+ activeCardStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ cards
+ { Array }
+
+ #
+
+
+
+
+
+ 默认值: []
+
+
+
+
+
+
+
+ cardWidth
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 200
+
+
+
+
+
+
+
+ cardGap
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 0
+
+
+
+
+
+
+
+ contentContainerStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ onChange
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ onPass
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ v
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 20
+
+
+
+
+
+
+
+ minGestureDistance
+ { Number }
+
+ #
+
+
+
+
手势滑动触发最小距离(默认需要滑动卡片一半的距离)
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ maxIndex
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ getEl
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ onStartReached
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ onEndReached
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+
方法
+
+
+
+
+
+
+
+ 方法参数:
+
+
+
+
+
+
+
+
+
+
+
+ 参数名 |
+ 类型 |
+ 描述 |
+ 必选 |
+ 版本 |
+
+
+
+
+ index |
+ Number |
+ 卡片序号 跳转至指定卡片 |
+
+
+
+ |
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Confirm.html b/docs/component-Confirm.html
new file mode 100644
index 0000000..2d8494d
--- /dev/null
+++ b/docs/component-Confirm.html
@@ -0,0 +1,629 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Confirm
+
+ 0.17.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Other Points
+
+- 内部封装了 Dialog 组件,覆盖了 Dialog 的
buttons
属性,其他不变,请参考 Dialog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ cancelText
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '取消'
+
+
+
+
+
+
+
+ cancelTextStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ onCancel
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ confirmText
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '确认'
+
+
+
+
+
+
+
+ confirmTextStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ onConfirm
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Dialog.html b/docs/component-Dialog.html
new file mode 100644
index 0000000..3dbc175
--- /dev/null
+++ b/docs/component-Dialog.html
@@ -0,0 +1,726 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dialog
+
+ 0.17.1
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Example
+
import Dialog from 'rnx-ui/Dialog';
+
+function Example(props) {
+ return (
+ <Dialog
+ visible={this.state.visible}
+ title="无法连接服务器"
+ message="未能完成所请求的操作,因为与服务器的通信出错。"
+ buttons={[{
+ text: '吼啊',
+ onPress: this.hide,
+ }]}
+ />
+ );
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ visible
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: false
+
+
+
+
+
+
+
+ title
+ { String Element }
+
+ #
+
+
+
+
+
+ 默认值: ''
+
+
+
+
+
+
+
+ titleStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ message
+ { String Element }
+
+ #
+
+
+
+
+
+ 默认值: ''
+
+
+
+
+
+
+
+ messageStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+
+
+
+
+ 默认值: []
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ overlayStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ useOverlayAnimation
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Drop.html b/docs/component-Drop.html
new file mode 100644
index 0000000..828a487
--- /dev/null
+++ b/docs/component-Drop.html
@@ -0,0 +1,480 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Drop
+
+ 0.17.0
+
+
掉落动画组件
+抛物线掉落动画组件,通常用于购物类交互。除了掉落组件 Dropper
外,Drop 还提供了另外两个非常有用的辅助组件 Emitter
和 Receiver
。
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Dropper.html b/docs/component-Dropper.html
new file mode 100644
index 0000000..595ec24
--- /dev/null
+++ b/docs/component-Dropper.html
@@ -0,0 +1,851 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dropper
+
+ 0.17.0
+
+
掉落组件
+用来包裹掉落元素,提供抛物线运动的动画。
+
+
+
+
+
使用说明
+
+
+
+
+
+
Example
+
import {
+ Dropper,
+} from 'rnx-ui/Drop';
+
+function DropperImg(props) {
+ return (
+ <Dropper
+ style={[styles.dropper, {
+ overflow: 'hidden',
+ backgroundColor: 'pink',
+ }]}
+ startPosition={props.startPosition}
+ endPosition={props.endPosition}
+ width={50}
+ height={50}
+ onEnd={props.onEnd}
+ >
+ <Image
+ source={{
+ uri: 'http://tva1.sinaimg.cn/crop.0.0.217.217.180/4c8b519djw8fa45br0vpxj2062062q33.jpg',
+ }}
+ style={{
+ width: 50,
+ height: 50,
+ }}
+ />
+ </Dropper>
+ );
+}
+
+
⚠️ 注意
+
+必须提供起点和终点坐标,起点和终点坐标可以通过 Emitter
和 Receiver
非常方便地获取到。
+
+强烈建议提供掉落元素的宽高,这样,Dropper
会将自身的中心置于起点,否则置于起点的将是 Dropper
的左上角。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ startPosition
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: {0,0}
+
+
+
+
+
+
+
+ endPosition
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: {0,0}
+
+
+
+
+
+
+
+ width
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 0
+
+
+
+
+
+
+
+ height
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 0
+
+
+
+
+
+
+
+ duration
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 1000
+
+
+
+
+
+
+
+ jumpHeight
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 60
+
+
+
+
+
+
+
+ scale
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 1
+
+
+
+
+
+
+
+ rotate
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 360
+
+
+
+
+
+
+
+ showDuration
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 100
+
+
+
+
+
+
+
+ onEnd
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ endAnimation
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: true
+
+
+
+
+
+
+
+ endJumpHeight
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 40
+
+
+
+
+
+
+
+ endAnimationDuration
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 400
+
+
+
+
+
+
+
+ children
+ { Element }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-DynamicText.html b/docs/component-DynamicText.html
new file mode 100644
index 0000000..b34e565
--- /dev/null
+++ b/docs/component-DynamicText.html
@@ -0,0 +1,705 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DynamicText
+
+ 0.17.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Example
+
import DynamicText from 'rnx-ui/DynamicText';
+
+function Example(props) {
+ return (
+ <DynamicText>自定义文字</DynamicText>
+ );
+}
+
+
⚠️ 注意
+
DynamicText 有 maxWidth
属性可以配置支持的最大的文本长度,当文本长度超过配置时,文本会显示为多行,此时需要配置更大的长度。
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ textStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ children
+ { String Number }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ mode
+ { String }
+
+ #
+
+
+
+
文字循环模式,默认reverse
+reverse:轮转到末尾后再轮转回开头
+restart: 轮转到末尾后返回至开头重新循环
+
+
+
+
+
+ 默认值: MODE_REVERSE
+
+
+
+
+ 方法参数:
+
+
+
+
+
+
+
+
+
+
+
+ 参数名 |
+ 类型 |
+ 描述 |
+
+ 版本 |
+
+
+
+
+ MODE_RESTART |
+ String |
+ 轮转到末尾后返回至开头重新循环 |
+
+ |
+
+
+
+ MODE_REVERSE |
+ String |
+ 轮转到末尾后再轮转回开头 |
+
+ |
+
+
+
+
+
+
+
+
+
+ bufferTime
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 1000
+
+
+
+
+
+
+
+ speed
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 5
+
+
+
+
+
+
+
+ maxWidth
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 2000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Emitter.html b/docs/component-Emitter.html
new file mode 100644
index 0000000..02fcf1e
--- /dev/null
+++ b/docs/component-Emitter.html
@@ -0,0 +1,578 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Emitter
+
+ 0.17.0
+
+
掉落事件点击发射组件
+用来包裹掉落事件点击发射元素,提供元素中心坐标,以作为掉落动画的起点。
+
+
+
+
+
使用说明
+
+
+
+
+
+
Example
+
import {
+ Emitter,
+} from 'rnx-ui/Drop';
+
+function CartEmitter(props) {
+ return (
+ <Emitter
+ ref={this.getEl}
+ style={styles.all}
+ onPress={props.onPress}
+ >
+ <Cart />
+ </Emitter>
+ );
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ onPress
+ { Function }
+
+ #
+
+
+
+
点击回调,参数为点击元素中心坐标,如:{x: 0, y: 0}
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ children
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-HeaderedSheet.html b/docs/component-HeaderedSheet.html
new file mode 100644
index 0000000..de6bec8
--- /dev/null
+++ b/docs/component-HeaderedSheet.html
@@ -0,0 +1,902 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Other Points
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ visible
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: false
+
+
+
+
+
+
+
+ overlayStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ onClose
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ onPressOverlay
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ duration
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 200
+
+
+
+
+
+
+
+ containerStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ title
+ { String Element }
+
+ #
+
+
+
+
+
+ 默认值: ''
+
+
+
+
+
+
+
+ titleStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ titleGap
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 50
+
+
+
+
+
+
+
+ leftBtn
+ { String Element }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ onPressLeftBtn
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ leftBtnStyle
+ { Object }
+
+ #
+
+
+
+
左侧按钮文本样式(leftBtn 为字符串时才生效)
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ rightBtn
+ { String Element }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ onPressRightBtn
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ rightBtnStyle
+ { Object }
+
+ #
+
+
+
+
右侧按钮文本样式(leftBtn 为字符串时才生效)
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ activeOpacity
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: ACTIVE_OPACITY
+
+
+
+
+
+
+
+ children
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-ImgHolder.html b/docs/component-ImgHolder.html
new file mode 100644
index 0000000..12a35f3
--- /dev/null
+++ b/docs/component-ImgHolder.html
@@ -0,0 +1,585 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ImgHolder
+
+ 0.17.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ imgStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ holder
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ source
+ { Object Number }
+
+ #
+
+
+
+
+
+ 默认值: {
+uri: ''
+},
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-ImgPicker.html b/docs/component-ImgPicker.html
new file mode 100644
index 0000000..64c221e
--- /dev/null
+++ b/docs/component-ImgPicker.html
@@ -0,0 +1,711 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ImgPicker
+
+ 0.11.7
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Example
+
import ImgPicker from 'rnx-ui/ImgPicker';
+
+function Example(props) {
+ return (
+ <ImgPicker
+ images={this.state.images}
+ adder={
+ <Icon name="add" style={styles.imgPickerAdder} />
+ }
+ adderVisible={this.state.images.length < MAX_PHOTOS_NUMBER}
+ imgDisplayerProps={{
+ onImgPress: this.showPhoto,
+ deleter: (
+ <Icon name="close" style={styles.imgPickerDeleterIcon} />
+ ),
+ onDeleterPress: this.removePhoto,
+ }}
+ onAdderPress={this.openCameraActionSheet}
+ />
+ );
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ images
+ { Array }
+
+ #
+
+
+
+
+
+ 默认值: []
+
+
+
+
+
+
+
+ ImgDisplayerProps
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: ImgDisplayer.defaultProps
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ itemStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ adderBtnStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ onAdderPress
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ adder
+ { Element }
+
+ #
+
+
+
+
+
+ 默认值: +
+
+
+
+
+
+
+
+ adderVisible
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: true
+
+
+
+
+
+
+
+ deleterUnderlayColor
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-ImgRollView.html b/docs/component-ImgRollView.html
new file mode 100644
index 0000000..08d2538
--- /dev/null
+++ b/docs/component-ImgRollView.html
@@ -0,0 +1,802 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ImgRollView
+
+ 0.13.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Example
+
import ImgRollView from 'rnx-ui/ImgPicker';
+
+function Example(props) {
+ return (
+ <ImgRollView
+ onSelect={this.onSelect}
+ style={style.imgRollViewStyle}
+ maxSelected={5}
+ iconSelected={<Icon name="fa-check" style={style.iconStyle} />}
+ iconUnSelected={<Icon name="fa-check" style={style.iconStyle} />}
+ />
+ );
+}
+
+
⚠️ 注意
+
CameraRoll 提供了访问本地相册的功能。在iOS上使用这个模块之前,你需要先链接 RCTCameraRoll 库,具体做法请参考链接原生库文档。另外,从 iOS10 开始,访问相册需要用户授权。你需要在 Info.plist
中添加一条名为 NSCameraUsageDescription
的键,然后在其值中填写向用户请求权限的具体描述。编辑完成后这个键在 Xcode 中实际会显示为 Privacy - Camera Usage Description
。
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ maxSelected
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 10
+
+
+
+
+
+
+
+ gap
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 8
+
+
+
+
+
+
+
+ imagesPerRow
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 4
+
+
+
+
+
+
+
+ assetType
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: 'Photos'
+
+
+
+
+ 方法参数:
+
+
+
+
+
+
+
+
+
+
+
+ 参数名 |
+ 类型 |
+ 描述 |
+
+ 版本 |
+
+
+
+
+ 'Photos' |
+ String |
+ 图片资源 |
+
+ |
+
+
+
+ 'Videos' |
+ String |
+ 视频资源 |
+
+ |
+
+
+
+ 'All' |
+ String |
+ |
+
+ |
+
+
+
+
+
+
+
+
+
+ onSelect
+ { Function }
+
+ #
+
+
+
+
用户选择图片时触发的回调,返回参数为 node/uri/selected/uriSelected
+
+
+
+
+
+ 默认值: () => {}
+
+
+
+
+
+
+
+ iconSelected
+ { Element }
+
+ #
+
+
+
+
+
+ 默认值: v
+
+
+
+
+
+
+
+ iconUnSelected
+ { Element }
+
+ #
+
+
+
+
+
+ 默认值: x
+
+
+
+
+
+
+
+ uriList
+ { Array }
+
+ #
+
+
+
+
+
+ 默认值: []
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ iconSelectedStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ iconUnSelectedStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-KeyboardAdaptiveView.html b/docs/component-KeyboardAdaptiveView.html
new file mode 100644
index 0000000..9d2fe19
--- /dev/null
+++ b/docs/component-KeyboardAdaptiveView.html
@@ -0,0 +1,682 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KeyboardAdaptiveView
+
+ 0.13.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
基本用法
+
+当你找到这个组件时,你应该是遇到输入框被键盘遮挡的问题了。请你再三跟产品/设计/开发确认,是否真的有必要将输入框放在页面的偏下位置,这是 APP 开发历史悠久的坑,任何经验丰富的从业者/主流的 APP 都会极力避免这种场景,考虑下从根本解决这个问题,比如上移输入框的位置或者干脆新开一个页面?
+当然不是说 KeyboardAdaptiveView
这个组件不好,相反,KeyboardAdaptiveView
非常有效,完全碾压 react-native 官方组件 KeyboardAvoidingView
(既然来找 KeyboardAdaptiveView
相信你一定是被官方的那个组件坑了😄)。
+
+
在 iOS 设备中,处于滚动视图(ScrollView
或 ListView
)中的输入控件(TextInput
)如果处于页面偏下位置,常常容易被弹起的键盘遮住。于是,可以使用 KeyboardAdaptiveView
解决这个问题。
+
⚠️ 注意
+
+KeyboardAdaptiveView
会针对不同位置的 TextInput
进行不同位移,所以必须在每一个 TextInput
的 onFocus
时触发 KeyboardAdaptiveView
的 inputFocusHandle
方法,并将事件对象作为参数传入。
+
+为了提升用户体验,强烈建议 iOS 在外层滚动视图(ScrollView
或 ListView
)上添加 keyboardDismissMode="on-drag"
属性,在视图滚动时自动关闭键盘。对此 KeyboardAdaptiveView
也为你准备好适合的 keyboardDismissMode
值了,直接引用即可。
+
+KeyboardAdaptiveView
也提供了对安卓设备的支持,但是默认不会处理,当你确认要开启时,请确保禁用系统的处理。
+
+
+
具体操作请参考 Example。
+
Demo
+

+
Example
+
import KeyboardAdaptiveView, {
+ keyboardDismissMode,
+} from 'rnx-ui/Drop';
+
+class Example extends Component {
+ constructor(props) {
+ super(props);
+ this.getKeyboardAdaptiveView = this.getKeyboardAdaptiveView.bind(this);
+ this.onFocus = this.onFocus.bind(this);
+ }
+
+ onFocus(e) {
+ if (this.keyboardAdaptiveView) {
+ this.keyboardAdaptiveView.inputFocusHandle(e);
+ }
+ }
+ getKeyboardAdaptiveView(el) {
+ this.keyboardAdaptiveView = el;
+ }
+
+ render() {
+ return (
+ <ScrollView
+ keyboardDismissMode={keyboardDismissMode}
+ >
+ <KeyboardAdaptiveView
+ getEl={this.getKeyboardAdaptiveView}
+ >
+ <View style={styles.inputWrapper}>
+ <TextInput
+ style={styles.input}
+ onFocus={this.onFocus}
+ />
+ </View>
+ </KeyboardAdaptiveView>
+ </ScrollView>
+ );
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ getEl
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ style
+ { Objectt }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ children
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ moreDistance
+ { Number }
+
+ #
+
+
+
+
更多距离。iOS 系统键盘可能会出现 suggest 行,导致键盘高度获取不准确。
+
+
+
+
+
+ 默认值: 40
+
+
+
+
+
+
+
+ minkbdHeight
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 250
+
+
+
+
+
+
+
+ handlerAndroid
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Loading.html b/docs/component-Loading.html
new file mode 100644
index 0000000..4ee9e78
--- /dev/null
+++ b/docs/component-Loading.html
@@ -0,0 +1,629 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Loading
+
+ 0.17.1
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Other Points
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ visible
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: false
+
+
+
+
+
+
+
+ overlayStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: Null
+
+
+
+
+
+
+
+ loaderStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: Null
+
+
+
+
+
+
+
+ color
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '#fff'
+
+
+
+
+
+
+
+ size
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: 'small'
+
+
+
+
+
+
+
+ useOverlayAnimation
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: 'small'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Navbar.html b/docs/component-Navbar.html
new file mode 100644
index 0000000..c9c0ab7
--- /dev/null
+++ b/docs/component-Navbar.html
@@ -0,0 +1,821 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ NavBar
+
+ 0.11.6
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Other Points
+
+NavBar 的高度由 statusBarHeight
和 headerHeight
两部分组成。statusBarHeight
默认 iOS 为 20,Android 为 0;headerHeight
默认 iOS 为 44,Android 为 56。
+
+titleGap
用来控制 title
到左右两边的距离。在 title
为字符串且宽度超过这个距离时,标题会显示为自动剪切,并以 ‘...’ 结束。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: Null
+
+
+
+
+
+
+
+ statusBarHeight
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: STATUS_BAR_HEIGHT
+
+
+
+
+
+
+
+
+
+
+
+ 默认值: HEADER_HEIGHT
+
+
+
+
+
+
+
+ title
+ { String Element }
+
+ #
+
+
+
+
+
+ 默认值: ''
+
+
+
+
+
+
+
+ titleStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ titleGap
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 50
+
+
+
+
+
+
+
+ leftBtn
+ { String Element }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ leftEvent
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ leftBtnStyle
+ { Object }
+
+ #
+
+
+
+
左侧按钮文本样式(leftBtn 为字符串时才生效)
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ leftBtnDisabled
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: false
+
+
+
+
+
+
+
+ rightBtn
+ { String Element }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ rightEvent
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ rightBtnStyle
+ { Object }
+
+ #
+
+
+
+
右侧按钮文本样式(rightBtn 为字符串时才生效)
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ rightBtnDisabled
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: false
+
+
+
+
+
+
+
+ activeOpacity
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: ACTIVE_OPACITY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-NumericKeyBoard.html b/docs/component-NumericKeyBoard.html
new file mode 100644
index 0000000..d7ebbb9
--- /dev/null
+++ b/docs/component-NumericKeyBoard.html
@@ -0,0 +1,574 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ NumericKeyboardar
+
+ 0.17.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
很多情况下系统的数字键盘不能满足我们的要求,比如不同平台数字键盘表现不一致,比如有的数字键盘存在小数点,比如需要配合虚拟输入框而系统的键盘又不易控制...
+
Demo
+

+
Example
+
import NumericKeyboard from 'rnx-ui/NumericKeyboard';
+
+function Example(props) {
+ return (
+ <NumericKeyboard
+ onPress={this.onInput}
+ />
+ );
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: Null
+
+
+
+
+
+
+
+ onPress
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ deleteKeyContent
+ { String Element Array }
+
+ #
+
+
+
+
+
+ 默认值:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Overlay.html b/docs/component-Overlay.html
new file mode 100644
index 0000000..69f8667
--- /dev/null
+++ b/docs/component-Overlay.html
@@ -0,0 +1,656 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Overlay
+ 遮罩层
+ 0.16.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
⚠️ 注意
+
+点击 Overlay 内部元素时也会触发 Overlay 的 onPress
回调。如果需要避免该情况,请在内部元素外包裹 Touchable*
元素,用来捕获点击事件并阻止其冒泡。
+
+Overlay 默认撑满父容器,且父容器需要设置样式属性 position
为 'absolute'
或 'relative'
。
+
+Overlay 不会阻止安卓物理返回键。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ visible
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: false
+
+
+
+
+
+
+
+ onPress
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ children
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ pointerEvents
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: 'auto'
+
+
+
+
+
+
+
+ duration
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 200
+
+
+
+
+
+
+
+ useAnimation
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-PhoneNumInput.html b/docs/component-PhoneNumInput.html
new file mode 100644
index 0000000..3a6c812
--- /dev/null
+++ b/docs/component-PhoneNumInput.html
@@ -0,0 +1,692 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
基本说明
+
+rnx-ui 表单校验工具 Validator 现已支持该组件。
+
+
Demo
+

+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ placeholder
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '手机号'
+
+
+
+
+
+
+
+ placeholderTextColor
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: COLOR_PLACEHOLDER
+
+
+
+
+
+
+
+ collectValidate
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ defaultValue
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: ''
+
+
+
+
+
+
+
+ name
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: 'PHONE_NUM_INPUT'
+
+
+
+
+
+
+
+ readableName
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '手机号'
+
+
+
+
+
+
+
+ onChangeText
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Receiver.html b/docs/component-Receiver.html
new file mode 100644
index 0000000..8a6e3a9
--- /dev/null
+++ b/docs/component-Receiver.html
@@ -0,0 +1,675 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Receiver
+
+ 0.17.0
+
+
掉落元素接受组件
+
用来包裹掉落元素接受元素,如果该元素是绝对定位,定位的样式应该写在 Receiver
或父元素上,而不应该写在子元素上。Receiver
主要提供以下功能:
+
+- 提供元素中心坐标,以作为掉落动画的终点;
+- 提供掉落组件到达时的响应动画,需要在
Dropper
元素的 onEnd
回调中手动调用 Receiver
元素的 animate
方法。
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Example
+
import {
+ Receiver,
+} from 'rnx-ui/Drop';
+import Badge from 'rnx-ui/Drop';
+
+function CartReceiver(props) {
+ return (
+ <Receiver
+ ref={props.getEl}
+ getCenterPosition={props.getCenterPosition}
+ style={styles.all}
+ >
+ <Badge
+ text={props.count}
+ textContainerStyle={styles.textContainer}
+ >
+ <Cart
+ style={styles.cart}
+ iconStyle={styles.icon}
+ />
+ </Badge>
+ </Receiver>
+ );
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ getCenterPosition
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ getEl
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ scale
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 1.1
+
+
+
+
+
+
+
+ duration
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 1.1
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ children
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ onLayout
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-RefreshView.html b/docs/component-RefreshView.html
new file mode 100644
index 0000000..831a87e
--- /dev/null
+++ b/docs/component-RefreshView.html
@@ -0,0 +1,768 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RefreshView
+
+ 0.17.0
+
+
滚动框
+带惯性、下拉刷新功能。官版的 ScrollView 下拉刷新的功能几乎没有可定制空间,而 RefreshView 可以对 RefreshControl 进行完全的自定义,
+包括控件的本身,下拉状态的实时响应等,具有极大的可定制空间。
+
配套组件:RefreshControl
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Example
+
import PlaceholderText from 'rnx-ui/PlaceholderText';
+ function Example(props) {
+ return (
+ <PlaceholderText
+ placeholder={this.placeholder}
+ />
+ );
+ }
+
+
Todo
+
+- 初始状态即为 loading 状态
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ onEndReachedThreShold
+ { Number }
+
+ #
+
+
+
+
调用 onEndReached 之前的临界值,描述距底部的距离
+
+
+
+
+
+ 默认值: 0
+
+
+
+
+
+
+
+ onEndReached
+ { Function }
+
+ #
+
+
+
+
当滚动至距离底部 onEndReachedThreshold 的范围内,会持续触发的回调
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ overA
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 0.05
+
+
+
+
+
+
+
+ maxOverV
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 3
+
+
+
+
+
+
+
+ dragOverA
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 2.5
+
+
+
+
+
+
+
+ renderInterval
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 16
+
+
+
+
+
+
+
+ recoverTime
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 200
+
+
+
+
+
+
+
+ refreshControlRecoverTime
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 100
+
+
+
+
+
+
+
+ refreshDistance
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 60
+
+
+
+
+
+
+
+ refreshControl
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ children
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-Sheet.html b/docs/component-Sheet.html
new file mode 100644
index 0000000..f31360d
--- /dev/null
+++ b/docs/component-Sheet.html
@@ -0,0 +1,656 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sheet
+
+ 0.17.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Other Points
+
+- 子组件点击事件会穿透从而被遮罩层捕获,如需处理,请在子组件上加上点击事件进行拦截
+- 内部封装了 Overlay 组件,请参考 Overlay
+
+
Todo
+
+- bugfix:
visible
初始状态为 true 时只有遮罩
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ visible
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: false
+
+
+
+
+
+
+
+ overlayStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ onClose
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ onPressOverlay
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ children
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ duration
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 200
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-SmsCaptchaInput.html b/docs/component-SmsCaptchaInput.html
new file mode 100644
index 0000000..f3ac137
--- /dev/null
+++ b/docs/component-SmsCaptchaInput.html
@@ -0,0 +1,971 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
短信验证码输入框
+短信验证码输入框组件有三种状态:
+
0:初始状态
+
1:发送短信中状态
+
2:倒计时状态
+
3:倒计时结束状态
+
点击按钮会使组件由 0:初始状态
进入 1:发送短信中状态
,
+此时需要根据接口状况进行判断:
+1、如果发送短信成功:手动调起组件的 start
方法,进入 2:倒计时状态
,
+在倒计时结束时组件会自动进入 3:倒计时结束状态
;
+2、如果发送短信失败:手动调起组件的 stop
方法,进入 3:倒计时结束状态
;
+
+rnx-ui 表单校验工具Validator 现已支持该组件。
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ btnStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ btnTextInital
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '获取验证码'
+
+
+
+
+
+
+
+ btnTextSending
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '正在发送短信'
+
+
+
+
+
+
+
+ btnTextTiming
+ { String }
+
+ #
+
+
+
+
按钮文字:倒计时中,{time}
将会被替换为倒计时数字
+
+
+
+
+
+
+
+
+
+ btnTextTimed
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '重新获取'
+
+
+
+
+
+
+
+ btnTextStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ placeholder
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '短信验证码'
+
+
+
+
+
+
+
+ placeholderTextColor
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: COLOR_PLACEHOLDER
+
+
+
+
+
+
+
+ activeOpacity
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: ACTIVE_OPACITY
+
+
+
+
+
+
+
+ intervalTime
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 60
+
+
+
+
+
+
+
+ onPressBtn
+ { Function }
+
+ #
+
+
+
+
点击发送短信按钮回调,当返回 false 时,可以阻止倒计时开始;
+该回调接受两个参数:开始倒计时方法:start
和结束倒计时方法 stop
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ onStop
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ captchaLength
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 6
+
+
+
+
+
+
+
+ collectValidate
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ name
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: 'SMS_CODE_INPUT'
+
+
+
+
+
+
+
+ readablename
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: '短信验证码'
+
+
+
+
+
+
+
+ onChangeText
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ autoFocus
+ { Boolean }
+
+ #
+
+
+
+
是否开启自动获取焦点(在 start 被调用时)
+
+
+
+
+
+ 默认值: true
+
+
+
+
+
+
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+ hitSlop
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-TabBar.html b/docs/component-TabBar.html
new file mode 100644
index 0000000..83c541b
--- /dev/null
+++ b/docs/component-TabBar.html
@@ -0,0 +1,609 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TabBar
+
+ 0.17.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Other Points
+
+- TabBar 默认不设高度
+- 为防止
defaultComponent
和 activedComponent
不被刷新,强烈建议加上 key
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ activeId
+ { String }
+
+ #
+
+
+
+
激活项的 Id,必须是 items 项的 id 属性
+
+
+
+
+
+ 默认值: ''
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ items
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: [{}]
+
+
+
+
+
+
+
+ activeOpacity
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 1
+
+
+
+
+
+
+
+ onPress
+ { Function }
+
+ #
+
+
+
+
改变激活项时的回调,点击项的 id 会作为参数传入。
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-ToolTip.html b/docs/component-ToolTip.html
new file mode 100644
index 0000000..929ec4a
--- /dev/null
+++ b/docs/component-ToolTip.html
@@ -0,0 +1,650 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Other Points
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ visible
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: false
+
+
+
+
+
+
+
+ text
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: ''
+
+
+
+
+
+
+
+ overlayStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ textWrapperStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ textStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ pointerEvents
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: 'none'
+
+
+
+
+
+
+
+ useOverlayAnimation
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component-VirtualPasswordInput.html b/docs/component-VirtualPasswordInput.html
new file mode 100644
index 0000000..2f6c336
--- /dev/null
+++ b/docs/component-VirtualPasswordInput.html
@@ -0,0 +1,700 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Demo
+

+
Example
+
import VirtualPasswordInput from 'rnx-ui/VirtualPasswordInput';
+
+function Example(props) {
+ return (
+ <VirtualPasswordInput
+ onPress={this.onPressPswdInput}
+ value={this.state.pswd}
+ />
+ );
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ value
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: ''
+
+
+
+
+
+
+
+ secureTextEntry
+ { Boolean }
+
+ #
+
+
+
+
+
+ 默认值: true
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ containerStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ cellStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ secureStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ textStyle
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ maxLength
+ { Number }
+
+ #
+
+
+
+
+
+ 默认值: 6
+
+
+
+
+
+
+
+ onPress
+ { Function }
+
+ #
+
+
+
+
+
+ 默认值: NOOP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/component.html b/docs/component.html
new file mode 100644
index 0000000..3b32fa7
--- /dev/null
+++ b/docs/component.html
@@ -0,0 +1,590 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Example
+
import All from 'rnx-ui/All';
+
+function Example(props) {
+ return (
+ <All />
+ );
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
属性
+
+
+
+ children
+ { Element Array }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ style
+ { Object }
+
+ #
+
+
+
+
+
+ 默认值: null
+
+
+
+
+
+
+
+ statusBarBgColor
+ { String }
+
+ #
+
+
+
+
+
+ 默认值: 'transparent'
+
+
+
+
+
+
+
+ statusBarBgStyle
+ { Stirng }
+
+ #
+
+
+
+
+
+ 默认值: 'light-content'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 0000000..a8d3a33
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,350 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation RNX-UI
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
RNX-UI
+
RNX-UI
当前版本:v0.17.0
+
+
+
+
+
+
+
+
+
+
+ rnx-ui #
+
+
+
+A UI Lib for React Native
+Start #
1. Install #
npm install rnx-ui --save
+
2. Use #
import React, {
+ Component,
+} from 'react';
+import Btn from 'rnx-ui/Btn';
+
+function Demo(props) {
+ return <Btn />;
+}
+
+Overview #
🖌
designing(7) 🛠
developing(1) ✅
done(30)
+Component #
+Util #
+
+
+Name |
+Description |
+State |
+
+
+
+
+transPxToDp |
+像素(px)转虚拟像素(dp)方法 |
+✅ |
+
+
+Validator |
+表单校验工具 |
+✅ |
+
+
+
+Example #
将项目克隆至本地后:
+1. Install #
npm install
+
2. Run #
react-native run-ios
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/source/ZeroClipboard.swf b/docs/source/ZeroClipboard.swf
new file mode 100644
index 0000000..9c2171a
Binary files /dev/null and b/docs/source/ZeroClipboard.swf differ
diff --git a/docs/source/app.js b/docs/source/app.js
new file mode 100644
index 0000000..a44babd
--- /dev/null
+++ b/docs/source/app.js
@@ -0,0 +1,254 @@
+var EXAMPLE_MAX_HEIGHT = 98,
+ DEFAULT_SHOW_PARAMS = 5;
+
+$(document).ready(function() {
+ // 移动端导航
+ var $openPanel = $('.open-panel');
+ var $contentLeft = $('.content-left');
+ var $contentLeftWidth = $contentLeft.width() - 1;
+ var $ydoc = $('.ydoc');
+ var $mask = $('.mask');
+ var isPanelHide = true;
+ var winWidth = $(window).width();
+ var h2 = $('.content-right').find('h2');
+ var h3 = $('.content-right').find('h3');
+ var a = $('.content-left').find('a');
+ var lis = $contentLeft.find('li');
+ var titles = [];
+ var menus = [];
+ $ydoc.addClass('hidden');
+ if(isWechat()&&$contentLeft[0]){
+ $ydoc.addClass('off-webkit-scroll');
+ }
+ for(var i=0; i scrollTop){
+ // 遍历侧栏,找到对应的标题
+ for(var j in menus){
+ if(menus[j].name == titles[i].name){
+ lis.removeClass('active');
+ menus[j].parent.addClass('active');
+ $('.docs-sidenav').scrollTop(menus[j].offsetTop);
+ return;
+ }
+ }
+ return;
+ }
+ }
+ });
+
+ $ydoc.removeClass('hidden');
+ $ydoc.on('scroll', function(){
+ sessionStorage.setItem('offsetTop',$ydoc.scrollTop());
+ })
+ // 待元素获获取offsetTop值之后再设置ydoc的offsetTop
+ if(sessionStorage.offsetTop){
+ $ydoc.scrollTop(sessionStorage.offsetTop);
+ }
+ // $openPanel.trigger('click');
+ $mask.on('click',function(){
+ if(!isPanelHide){
+ $openPanel.click();
+ }
+ });
+
+ // PC端导航
+ $('.navbar-toggle').click(function(){
+ $(this).next(".ydoc-nav").toggle();
+ });
+
+ $('.docs-sidenav li').click(function(e){
+ $('.docs-sidenav li').removeClass('active');
+ $(this).addClass('active');
+ if(!isPanelHide){
+ $openPanel.trigger('click');
+ }
+ });
+
+ $('.markdown-body pre').map(function(i,item){
+ $(item).addClass('ydoc-example');
+ });
+
+ // $('code').each(function(i, block) {
+ // if (block.innerHTML.indexOf('\n') != -1) {
+ // var pn = block.parentNode;
+ // if (pn.tagName.toUpperCase() == 'PRE') {
+ // try {
+ // hljs.highlightBlock(block);
+ // } catch(e) {}
+ // } else {
+ // pn.innerHTML = '' + block.innerHTML + '
';
+ // try {
+ // hljs.highlightBlock(pn.childNodes[0].childNodes[0]);
+ // } catch(e) {}
+ // }
+ // }
+ // });
+
+
+ var winHeight = $(window).height() - 44,
+ sidebar = $('.docs-sidebar');
+ var docSideNav = $('.docs-sidenav');
+ var ydocContainerCon= $('.ydoc-container-content');
+ if(winWidth>767){
+ docSideNav.width($contentLeftWidth);
+ }
+ if (sidebar.height() > winHeight) {
+ sidebar.css('max-height', winHeight + 'px');
+ $('.docs-sidenav').css('max-height', winHeight + 'px');
+ if(winWidth<768){
+ $('.docs-sidenav').css({'overflow-x':'hidden'});
+ }
+ var activeMenu,
+ barScroll = false;
+
+ sidebar.on('mouseover', function() {
+ barScroll = true;
+ });
+ sidebar.on('mouseout', function() {
+ barScroll = false;
+ });
+ };
+
+ $(window).on('scroll', function(e) {
+ if( $(this).scrollTop() > ($('.footer').offset().top - $(window).height()) ){
+ winHeight = $(window).height() - $('.footer').outerHeight()-44;
+ sidebar.css('max-height', winHeight + 'px');
+ $('.docs-sidenav').css('max-height', winHeight + 'px');
+ }else{
+ winHeight = $(window).height() - 44;
+ sidebar.css('max-height', winHeight + 'px');
+ $('.docs-sidenav').css('max-height', winHeight + 'px');
+ }
+
+ if (!barScroll) {
+ var activeItem = $('.docs-sidebar li.active a');
+ if (activeItem.length) {
+ if (!activeMenu || (activeMenu.attr('href') != activeItem.attr('href'))) {
+ activeMenu = activeItem;
+ var top = activeMenu.offset().top - sidebar.offset().top;
+ if (top < 0) {
+ //sidebar.scrollTop(sidebar.scrollTop() + top);
+ $('.docs-sidenav').scrollTop($('.docs-sidenav').scrollTop() + top);
+ } else if (top > winHeight - 88) {
+ //sidebar.scrollTop(sidebar.scrollTop() + top - winHeight + 44);
+ $('.docs-sidenav').scrollTop($('.docs-sidenav').scrollTop() + top - winHeight + 88);
+ }
+ }
+ }
+ }
+ });
+
+ // 退出全屏浏览器窗口大小改变,不触发resize
+ $(window).on('resize', function(e){
+ resizeSidebar();
+ $contentLeftWidth = $contentLeft.width() - 1;
+ });
+ function resizeSidebar(){
+ var winHeight = $(window).height() - 44,
+ sidebar = $('.docs-sidebar');
+ var docSideNav = $('.docs-sidenav');
+ var ydocContainerCon= $('.ydoc-container-content');
+ if(winWidth>767){
+ docSideNav.width($contentLeftWidth);
+ }
+ if (sidebar.height() > winHeight) {
+ sidebar.css('max-height', winHeight + 'px');
+ $('.docs-sidenav').css('max-height', winHeight + 'px');
+ $('.docs-sidenav').css({'overflow-y':'scroll','overflow-x':'hidden'});
+ var barScroll = false;
+
+ sidebar.on('mouseover', function() {
+ barScroll = true;
+ });
+
+ sidebar.on('mouseout', function() {
+ barScroll = false;
+ });
+ // scroll
+ if( $(window).scrollTop() > ($('.footer').offset().top - $(window).height()) ){
+ winHeight = $(window).height() - $('.footer').outerHeight()-44;
+ sidebar.css('max-height', winHeight + 'px');
+ $('.docs-sidenav').css('max-height', winHeight + 'px');
+ }else{
+ winHeight = $(window).height() - 44;
+ sidebar.css('max-height', winHeight + 'px');
+ $('.docs-sidenav').css('max-height', winHeight + 'px');
+ }
+ }
+ }
+
+ function sortAsOffset(propertyName){
+ return function(obj1, obj2){
+ var val1 = obj1[propertyName];
+ var val2 = obj2[propertyName];
+ if(val1 < val2){
+ return -1;
+ }else if (val1 > val2) {
+ return 1;
+ }else {
+ return 0;
+ }
+ }
+ }
+ function isWechat(){
+ var ua = navigator.userAgent.toLowerCase();
+ if(ua.match(/MicroMessenger/i)=="micromessenger") {
+ return true;
+ } else {
+ return false;
+ }
+ }
+});
diff --git a/docs/source/code.css b/docs/source/code.css
new file mode 100644
index 0000000..7009f49
--- /dev/null
+++ b/docs/source/code.css
@@ -0,0 +1 @@
+@charset "UTF-8";.syntaxhighlighter .toolbar a,.syntaxhighlighter.printing a{text-decoration:none!important}.ydoc .task-list,menu,ol,ul{list-style:none}.syntaxhighlighter a,.syntaxhighlighter code,.syntaxhighlighter div,.syntaxhighlighter table,.syntaxhighlighter table caption,.syntaxhighlighter table tbody,.syntaxhighlighter table td,.syntaxhighlighter table thead,.syntaxhighlighter table tr,.syntaxhighlighter textarea{-moz-border-radius:0!important;-webkit-border-radius:0!important;background:0 0!important;border:0!important;bottom:auto!important;float:none!important;height:auto!important;left:auto!important;line-height:1.1em!important;margin:0!important;outline:0!important;overflow:visible!important;padding:0!important;position:static!important;right:auto!important;text-align:left!important;top:auto!important;vertical-align:baseline!important;width:auto!important;box-sizing:content-box!important;font-family:Consolas,"Bitstream Vera Sans Mono","Courier New",Courier,monospace!important;font-weight:400!important;font-style:normal!important;font-size:1em!important;min-height:inherit!important;min-height:auto!important}.ydoc .navbar-brand>li,.ydoc-nav li{float:left}.markdown-body .anchor:focus,a,button,input,select,textarea{outline:0}.syntaxhighlighter,.syntaxhighlighter table td.code .container{position:relative!important}.syntaxhighlighter,.syntaxhighlighter table,.syntaxhighlighter table td.code{width:100%!important}.syntaxhighlighter .bold,.syntaxhighlighter .keyword,.syntaxhighlighter .script,.syntaxhighlighter.printing .script{font-weight:700!important}.syntaxhighlighter{margin:1em 0!important;overflow:auto!important;font-size:1em!important}.syntaxhighlighter.source{overflow:hidden!important}.syntaxhighlighter .italic{font-style:italic!important}.syntaxhighlighter .line{white-space:pre!important}.syntaxhighlighter table caption{text-align:left!important;padding:.5em 0 .5em 1em!important}.syntaxhighlighter table td.code .container textarea{box-sizing:border-box!important;position:absolute!important;left:0!important;top:0!important;width:100%!important;height:100%!important;border:none!important;background:#fff!important;padding-left:1em!important;overflow:hidden!important;white-space:pre!important}.syntaxhighlighter table td.gutter .line{text-align:right!important;padding:0 .5em 0 1em!important}.syntaxhighlighter table td.code .line{padding:0 1em!important}.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0!important}.syntaxhighlighter.show{display:block!important}.syntaxhighlighter.collapsed table{display:none!important}.syntaxhighlighter.collapsed .toolbar{padding:.1em .8em 0!important;font-size:1em!important;position:static!important;width:auto!important;height:auto!important}.syntaxhighlighter.collapsed .toolbar span{display:inline!important;margin-right:1em!important}.syntaxhighlighter.collapsed .toolbar span a{padding:0!important;display:none!important}.syntaxhighlighter .toolbar span.title,.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline!important}.syntaxhighlighter .toolbar{position:absolute!important;right:1px!important;top:1px!important;width:11px!important;height:11px!important;font-size:10px!important;z-index:10!important}.syntaxhighlighter .toolbar a{display:block!important;text-align:center!important;padding-top:1px!important}.syntaxhighlighter .toolbar a.expandSource,.syntaxhighlighter.printing .toolbar{display:none!important}.syntaxhighlighter.ie{font-size:.9em!important;padding:1px 0!important}.syntaxhighlighter.ie .toolbar{line-height:8px!important}.syntaxhighlighter.ie .toolbar a{padding-top:0!important}.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:0 0!important}.syntaxhighlighter.printing .line .number{color:#bbb!important}.syntaxhighlighter.printing .line .content,.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:#000!important}.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200!important}.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:#00f!important}.syntaxhighlighter.printing .keyword{color:#069!important;font-weight:700!important}.syntaxhighlighter.printing .preprocessor{color:gray!important}.syntaxhighlighter.printing .variable{color:#a70!important}.syntaxhighlighter.printing .value{color:#090!important}.syntaxhighlighter.printing .functions{color:#ff1493!important}.syntaxhighlighter.printing .constants{color:#06c!important}.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray!important}.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493!important}.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red!important}.syntaxhighlighter .line.highlighted.number,.syntaxhighlighter table caption,.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:#000!important}.syntaxhighlighter,.syntaxhighlighter .line.alt1,.syntaxhighlighter .line.alt2{background-color:#fff!important}.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#e0e0e0!important}.syntaxhighlighter .gutter{color:#afafaf!important}.syntaxhighlighter .gutter .line{border-right:3px solid #6ce26c!important}.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c!important;color:#fff!important}.syntaxhighlighter.printing .line .content{border:none!important}.syntaxhighlighter.collapsed{overflow:visible!important}.syntaxhighlighter.collapsed .toolbar{color:#00f!important;background:#fff!important;border:1px solid #6ce26c!important}.syntaxhighlighter.collapsed .toolbar a{color:#00f!important}.syntaxhighlighter.collapsed .toolbar a:hover{color:red!important}.syntaxhighlighter .toolbar{color:#fff!important;background:#6ce26c!important;border:none!important}.syntaxhighlighter .toolbar a{color:#fff!important}.syntaxhighlighter .plain,.syntaxhighlighter .plain a,.syntaxhighlighter .toolbar a:hover{color:#000!important}.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200!important}.syntaxhighlighter .string,.syntaxhighlighter .string a{color:#00f!important}.syntaxhighlighter .keyword{color:#069!important}.syntaxhighlighter .preprocessor{color:gray!important}.syntaxhighlighter .variable{color:#a70!important}.syntaxhighlighter .value{color:#090!important}.syntaxhighlighter .functions{color:#ff1493!important}.syntaxhighlighter .constants{color:#06c!important}.syntaxhighlighter .script{color:#069!important;background-color:none!important}.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray!important}.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493!important}.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red!important}html{font-size:100px;height:100%}blockquote,body,button,dd,dl,fieldset,figure,form,h1,h2,h3,h4,h5,h6,input,legend,ol,p,pre,td,textarea,th,ul,xmp{margin:0;padding:0}body,button,code,input,kbd,pre,samp,select,textarea,tt,xmp{height:100%;line-height:1.5;font-family:tahoma,arial,"Hiragino Sans GB",simsun,sans-serif}.clr,.clrfix:after{height:0;clear:both}big,button,h1,h2,h3,h4,h5,h6,input,select,small,textarea{font-size:100%}h1,h2,h3,h4,h5,h6{font-family:tahoma,arial,"Hiragino Sans GB","微软雅黑",simsun,sans-serif;font-weight:400}.ydoc .task-list,.ydoc .ydocIcon{font-family:ydocfont}address,cite,dfn,em,i,optgroup,var{font-style:normal}table{border-collapse:collapse;border-spacing:0;text-align:left}caption,th{text-align:inherit}fieldset,img{border:0}button,img,input,object,select,textarea{vertical-align:middle}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}audio,canvas,video{display:inline-block}blockquote:after,blockquote:before,q:after,q:before{content:"\0020"}textarea{overflow:auto;resize:vertical}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}.mark,mark{background-color:#fcf8e3;padding:.2em}a,del,ins,s,u{text-decoration:none}sub,sup{vertical-align:baseline}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.ydoc,.ydoc-header,.ydoc-nav{font-size:.14rem}*,::after,::before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:transparent}.clr{overflow:hidden}.clrfix{zoom:1}.clrfix:after{display:block;visibility:hidden;content:"."}@font-face{font-family:ydocfont;font-style:normal;font-weight:400;src:url(fonts/ydoc.eot?v=1.0.0);src:url(fonts/ydoc.eot?#iefixiefix&v=1.0.0) format("embedded-opentype"),url(fonts/ydoc.woff?v=1.0.0) format("woff"),url(fonts/ydoc.ttf?v=1.0.0) format("truetype"),url(source/fonts/ydoc.svg?v=1.0.0#icomoonregular) format("svg")}.ydoc{background:#fafafa;overflow:hidden;height:auto;min-height:100%;position:relative}.ydoc-header{line-height:.48rem;color:#3b3b3b;text-align:right;padding:0 .2rem;overflow:hidden;background-color:#252a31;background-image:-moz-linear-gradient(top,#333,#222);background-image:-ms-linear-gradient(top,#333,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#333),to(#222));background-image:-webkit-linear-gradient(top,#333,#222);background-image:-o-linear-gradient(top,#333,#222);background-image:linear-gradient(top,#333,#222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-box-shadow:0 1px 3px rgba(0,0,0,.25),inset 0 -1px 0 rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.25),inset 0 -1px 0 rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.25),inset 0 -1px 0 rgba(0,0,0,.1)}.ydoc-header a,.ydoc-nav{color:#fff}.ydoc-header-area{margin:0 auto}.ydoc .navbar-brand{width:auto;float:left;margin-right:20px;font-weight:700}.ydoc-nav .active,.ydoc-nav .active a,.ydoc-nav li a:hover{color:#ff503f}.ydoc-nav li a{padding:0 15px}.ydoc-nav .navbar-right{float:right}.ydoc-nav .navbar-left{float:left}.ydoc-second-header{background:#252a31}.ydoc-second-header a{color:#fff}.ydoc-second-header .ydoc-nav{float:right}.ydoc .task-list .checkbox{vertical-align:baseline;user-select:none}.ydoc .navbar-toggle{float:right;font-size:.22rem;display:none;background:0 0;border:none;cursor:pointer;color:#fff;line-height:.48rem}.ydoc .ydoc-banner-bg{background:url(images/grid-18px-masked.png) 0 top repeat-x;padding-bottom:121px}.ydoc .ydoc-banner-bg .desc{font-family:"微软雅黑"}.ydoc-banner{color:#fff;font-size:.18rem;padding:20px 30px}.ydoc-banner-area{margin:0 auto}.ydoc-banner-area h1{font-size:.28rem;margin-bottom:.1rem;color:#333}.ydoc-banner-area p{line-height:1.7;margin:0 0 10px;color:#333}.ydoc .footer{text-align:center;position:absolute;left:0;bottom:0;overflow:hidden;margin:0 auto;padding:40px 0 60px;width:100%;color:#fff;background:#252a31;font-size:14px}.ydoc .footer .copyright{font-size:14px;text-align:center;color:#a1a1a1}.ydoc .footer .copyright a{color:#a1a1a1;text-decoration:underline}.ydoc-container{clear:both;overflow:hidden}.ydoc-container-content{overflow:hidden;background-color:#fff;margin:20px auto;padding:24px 0 0;box-shadow:0 0 3px #e5e5e5;position:relative}.ydoc-container-content .static-code-content{width:100%;background:#fff;padding:.15rem}.ydoc-container-content .content-left,.ydoc-container-content .content-right{float:left;position:relative;min-height:1px}.ydoc-container-content .content-right{box-sizing:border-box;width:75%;background:#fff;padding:15px;float:right;min-height:500px}.ydoc-container-content .hashlink{display:none}.ydoc-container-content .subject:hover .hashlink{display:inline}.ydoc-container-content .right{float:right}.ydoc-container-content .content-left{width:25%}.ydoc-container-content .docs-table del{text-decoration:line-through;color:#999}.ydoc-container-content .ydoc-example{position:relative;overflow:hidden;height:auto}.ydoc-container-content .ydoc-example code{overflow-y:hidden;display:block;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace}.ydoc-container-content .ydoc-example .extend,.ydoc-container-content .ydoc-example .fold{color:#337ab7;position:absolute;left:15px;bottom:10px;cursor:pointer}.ydoc-container-content .ydoc-example .extend:hover,.ydoc-container-content .ydoc-example .fold:hover{text-decoration:underline}.ydoc-container-content .docs-sidebar{background:#fff;z-index:9999;overflow:hidden}.ydoc-container-content .docs-sidebar .docs-sidenav{padding-left:0;overflow-x:hidden}.ydoc-container-content .docs-sidebar .docs-sidenav li{line-height:.42rem;height:.42rem;font-size:14px;overflow:hidden}.ydoc-container-content .docs-sidebar .docs-sidenav li a{padding:0 .16rem 0 .28rem;border-left:2px solid #fff;text-overflow:ellipsis;color:#666;line-height:.42rem;height:.42rem;display:inline-block;width:100%;position:relative;overflow:hidden;white-space:nowrap}.ydoc-container-content .docs-sidebar .docs-sidenav li a:hover{background-color:#fff8ef;border-left-color:#fff8ef}.ydoc-container-content .docs-sidebar .docs-sidenav li.active a,.ydoc-container-content .docs-sidebar .docs-sidenav li.active a:hover{border-left:2px solid #ff503f;color:#ff503f}.ydoc-container-content .docs-sidebar .docs-sidenav ul{width:100%}.ydoc-container-content .docs-sidebar .docs-sidenav ul li,.ydoc-container-content .docs-sidebar .docs-sidenav ul li.active{font-size:.12rem}.ydoc-container-content .docs-sidebar .docs-sidenav ul li a,.ydoc-container-content .docs-sidebar .docs-sidenav ul li a:hover,.ydoc-container-content .docs-sidebar .docs-sidenav ul li.active a,.ydoc-container-content .docs-sidebar .docs-sidenav ul li.active a:hover{padding-left:48px}.ydoc-container-content .docs-sidebar.affix{position:fixed;top:20px}.ydoc-container-content .docs-sidebar.affix-bottom{position:absolute}.ydoc-container-content .docs-section{margin:10px}.ydoc-container .docs-sidebar:before{height:100%;background-color:#eee;width:1px;position:absolute;right:0;display:block;min-height:500px;z-index:99;content:" ";box-sizing:border-box}.open-panel{display:none;overflow:hidden;position:fixed;right:5%;bottom:50px;opacity:.5;width:40px;height:40px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2lpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpEMzJFMTVDOUNCMTQxMUU2OERGOEZGOEM1MkU1MUJENCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEQThGQTIzRENEQTUxMUU2QTczMUM3QjRDM0UxNjQxMiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEQThGQTIzQ0NEQTUxMUU2QTczMUM3QjRDM0UxNjQxMiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6ODZjMjliOTEtNjI0Zi1iZDQ3LWEzZWQtMDIwYzQwNDQxMjlkIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQzMkUxNUM5Q0IxNDExRTY4REY4RkY4QzUyRTUxQkQ0Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+g3TxwAAAANRJREFUeNrsmT0KwkAQhWfXNGLhQewUW08i2FlZ7LZeQMRiC0EQwcvYixcRrbRc35DYaJNGdpD34EsRUnzs/AQSF0IQpAN2YAq6wEmZZPAABxD1RtVwAQMpHz2YHtBTm4Cxx2VrRO4zQ7BSwZnYzdw3PWc1fS+246wLCgX/XrBq81BK6SdvlhhjZolNlLhNKTjFFOQe5B7kHuQUU5B7kHuQe5BTTEEKUvArWQWfhgVvKng0LLhXwQU4G5Q7geW7B0dgA+5S/woo1nPgCtZSf+WXlwADAGEgKNreXHUxAAAAAElFTkSuQmCC) no-repeat}@media screen and (min-width:1200px){.ydoc-banner-area,.ydoc-container-content,.ydoc-header-area{width:1200px}}@media screen and (min-width:992px) and (max-width:1199px){.ydoc-banner-area,.ydoc-container-content,.ydoc-header-area{width:992px}}@media screen and (min-width:768px) and (max-width:991px){.ydoc-banner-area,.ydoc-container-content,.ydoc-header-area{width:768px}}@media screen and (max-width:767px){.mask,.ydoc-container-content .content-left{position:fixed;top:0;transition:all .4s;height:100%}.mask,.ydoc{height:100%}.mask{display:none;left:0;z-index:0;width:100%;background-color:transparent}.show{background-color:rgba(0,0,0,.35)}.ydoc-container-content .content-right{width:100%!important}.ydoc-container-content .content-left{display:block;right:-75%;width:75%!important;background-color:#222;z-index:1;-webkit-transition:all .4s}.ydoc .footer,.ydoc-container-content .docs-sidebar.affix{position:static}.ydoc-container-content .content-left:before{content:'目录:';display:block;padding:.28rem;color:#999;background-color:#2c2c2c;font-weight:700}.ydoc-container-content .docs-sidebar,.ydoc-container-content .docs-sidebar .docs-sidenav li a:hover{background-color:#222}.ydoc-container-content .docs-sidebar .docs-sidenav li a{color:#999;border-color:#222}.ydoc-container-content .instructions-con-runner{display:none}.open-panel{display:block;cursor:default;transition:all .4s;-webkit-transition:all .4s}.ydoc-banner-area,.ydoc-container-content,.ydoc-header-area{width:100%}.ydoc{overflow:scroll;-webkit-overflow-scrolling:touch}.ydoc .navbar-toggle{display:inline-block}.ydoc .ydoc-nav{display:none;clear:both;width:100%}.ydoc .ydoc-nav .navbar-left,.ydoc .ydoc-nav .navbar-right{width:100%}.ydoc .ydoc-nav .navbar-left li,.ydoc .ydoc-nav .navbar-right li{width:100%;text-align:left;display:inline-block}.ydoc .ydoc-nav .navbar-left li a,.ydoc .ydoc-nav .navbar-right li a{padding:0;width:100%;display:inline-block}.ydoc .ydoc-nav .navbar-left li a:hover,.ydoc .ydoc-nav .navbar-right li a:hover{color:#ff503f}.ydoc .ydoc-banner-bg{padding-bottom:0}.off-webkit-scroll{-webkit-overflow-scrolling:auto}.hidden{overflow:hidden}.ydoc-second-header,.ydoc-second-header .ydoc-nav{display:block}.ydoc-second-header .ydoc-nav li{float:left}}.anchorjs-link{display:none}@media screen and (min-width:768px){.ydoc-container-content .staticsidenav .docs-sidebar.affix{position:static}.ydoc-container-content .staticsidenav .docs-sidebar .docs-sidenav{overflow:inherit}.staticsidenav .docs-sidebar{overflow:initial}}.markdown-body code{color:#c7254e;background-color:#f9f2f4;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.markdown-body pre{display:block;margin:0 0 10px;word-break:break-all;color:#333;background-color:#fafafa;border:1px solid #ccc}.markdown-body::after,.markdown-body::before{display:table;content:""}.markdown-body pre code{font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.markdown-body em{font-style:italic}.markdown-body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:14px;line-height:1.5;word-wrap:break-word}.markdown-body a{color:#337ab7}.markdown-body::after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#c00}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:#e7e7e7;border:0}.markdown-body blockquote{padding:0 1em;color:#777;border-left:.25em solid #ddd}.markdown-body h1,.markdown-body h2{padding-bottom:.3em;border-bottom:1px solid #eee}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body .loweralpha{list-style-type:lower-alpha}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit}.markdown-body h1{font-size:2em}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1.15em}.markdown-body h5{font-size:.875em}.markdown-body h6{font-size:.85em;color:#777}.markdown-body ol,.markdown-body ul{padding-left:2em;list-style-type:disc}.markdown-body ol.no-list,.markdown-body ul.no-list{padding:0;list-style-type:none}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}.markdown-body table th{font-weight:700}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #ddd}.markdown-body table tr{background-color:#fff;border-top:1px solid #ccc}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:.2em 0;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown-body code:after,.markdown-body code:before,.markdown-body tt:after,.markdown-body tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;border-radius:3px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body pre{word-wrap:normal}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.glyphicon,.markdown-body kbd,.yo-badge{display:inline-block}.markdown-body pre code:after,.markdown-body pre code:before,.markdown-body pre tt:after,.markdown-body pre tt:before{content:normal}.markdown-body kbd{padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:1px solid #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}#readme.contributing>div{max-height:250px;overflow:auto}#readme .markdown-body,#readme .plain{background-color:#fff;border:1px solid #ddd;border-bottom-left-radius:3px;border-bottom-right-radius:3px;padding:30px;word-wrap:break-word}#readme .plain pre{font-size:15px;white-space:pre-wrap}#readme .markdown-body{border:0;padding:30px;border-radius:0}#readme table[data-table-type=yaml-metadata]{line-height:1;font-size:12px}#readme table[data-table-type=yaml-metadata] table{margin:0}.yo-badge{padding:1px .1rem;color:#fff;font-size:.12rem;margin-left:10px;border-radius:12px;font-weight:400}.yo-badge-primary{color:#337ab7;border:1px solid #337ab7}.yo-badge-success{color:#5cb85c;border:1px solid #5cb85c}.yo-badge-info{color:#5bc0de;border:1px solid #5bc0de}.yo-badge-warning{color:#f0ad4e;border:1px solid #f0ad4e}.yo-badge-danger{color:#d9534f;border:1px solid #d9534f}.glyphicon{position:relative;top:1px;font-family:ydocfont;font-style:normal;font-weight:700;font-size:.2rem;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-ok:before{content:"\f078"}.text-success{color:#3c763d}.release-date{font-size:1em;color:grey}.change-type{font-size:1em;color:#ff503f}.markdown-body blockquote.api{border-left:none;padding:0;color:#ff503f}.markdown-body .docs-section h1,.markdown-body .docs-section h2{border-bottom:none}.markdown-body .docs-section li .ydoc-example{left:-2em}.markdown-body .docs-section .blockquote.api{padding:0 0 .15rem}.markdown-body .docs-section h3{color:#ff503f;border-left-color:#ff503f;font-weight:400}.markdown-body .docs-section h3 a{color:#ff503f}.markdown-body .docs-section .con-list-item .con-head{font-size:22px;font-weight:700;border-bottom:1px solid #ddd;margin:0 0 .2rem;padding:.1rem 0;width:100%}.markdown-body .docs-section .con-list-item .prop-type{font-size:14px}.markdown-body .docs-section .con-list-item:last-child{border:none}.markdown-body .docs-section .hide-params{display:none}.markdown-body .docs-section .show-params{display:table-row}.markdown-body .docs-section .extend-params,.markdown-body .docs-section .fold-params{color:#337ab7;margin:-.1rem 0 .15rem;display:block;cursor:pointer}.instructions{margin-bottom:.2rem;overflow:hidden}.instructions-con{display:flex;flex-direction:row}.instructions-con-info{flex:1;overflow:hidden;padding-right:10px}.instructions-con-runner{width:3.2rem;height:6.5rem;padding:0 .16rem;background:url(images/feed.png) no-repeat;background-size:100%;position:relative}.instructions-con-runner .instructions-iframe{background:#fff;width:2.9rem;height:5.1rem;position:absolute;top:.66rem;left:.18rem;border:0}
\ No newline at end of file
diff --git a/docs/source/fonts/ydoc.eot b/docs/source/fonts/ydoc.eot
new file mode 100644
index 0000000..01a8d18
Binary files /dev/null and b/docs/source/fonts/ydoc.eot differ
diff --git a/docs/source/fonts/ydoc.svg b/docs/source/fonts/ydoc.svg
new file mode 100644
index 0000000..b30f92d
--- /dev/null
+++ b/docs/source/fonts/ydoc.svg
@@ -0,0 +1,27 @@
+
+
+
\ No newline at end of file
diff --git a/docs/source/fonts/ydoc.ttf b/docs/source/fonts/ydoc.ttf
new file mode 100644
index 0000000..1fb1969
Binary files /dev/null and b/docs/source/fonts/ydoc.ttf differ
diff --git a/docs/source/fonts/ydoc.woff b/docs/source/fonts/ydoc.woff
new file mode 100644
index 0000000..fc7ccd9
Binary files /dev/null and b/docs/source/fonts/ydoc.woff differ
diff --git a/docs/source/images/feed.png b/docs/source/images/feed.png
new file mode 100644
index 0000000..e110090
Binary files /dev/null and b/docs/source/images/feed.png differ
diff --git a/docs/source/images/grid-18px-masked.png b/docs/source/images/grid-18px-masked.png
new file mode 100644
index 0000000..1bc82b0
Binary files /dev/null and b/docs/source/images/grid-18px-masked.png differ
diff --git a/docs/source/main.css b/docs/source/main.css
new file mode 100644
index 0000000..79f1fcb
--- /dev/null
+++ b/docs/source/main.css
@@ -0,0 +1 @@
+@charset "UTF-8";.ydoc .navbar-brand>li,.ydoc-nav li{float:left}.ydoc .task-list,menu,ol,ul{list-style:none}.markdown-body .anchor:focus,a,button,input,select,textarea{outline:0}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#a67f59;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#DD4A68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}html{font-size:100px;height:100%}blockquote,body,button,dd,dl,fieldset,figure,form,h1,h2,h3,h4,h5,h6,input,legend,ol,p,pre,td,textarea,th,ul,xmp{margin:0;padding:0}body,button,code,input,kbd,pre,samp,select,textarea,tt,xmp{height:100%;line-height:1.5;font-family:tahoma,arial,"Hiragino Sans GB",simsun,sans-serif}.clr,.clrfix:after{height:0;clear:both}big,button,h1,h2,h3,h4,h5,h6,input,select,small,textarea{font-size:100%}h1,h2,h3,h4,h5,h6{font-family:tahoma,arial,"Hiragino Sans GB","微软雅黑",simsun,sans-serif;font-weight:400}.ydoc .task-list,.ydoc .ydocIcon{font-family:ydocfont}address,cite,dfn,em,i,optgroup,var{font-style:normal}table{border-collapse:collapse;border-spacing:0;text-align:left}caption,th{text-align:inherit}fieldset,img{border:0}button,img,input,object,select,textarea{vertical-align:middle}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}audio,canvas,video{display:inline-block}blockquote:after,blockquote:before,q:after,q:before{content:"\0020"}textarea{overflow:auto;resize:vertical}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}.mark,mark{background-color:#fcf8e3;padding:.2em}a,del,ins,s,u{text-decoration:none}sub,sup{vertical-align:baseline}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.ydoc,.ydoc-header,.ydoc-nav{font-size:.14rem}*,::after,::before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:transparent}.clr{overflow:hidden}.clrfix{zoom:1}.clrfix:after{display:block;visibility:hidden;content:"."}@font-face{font-family:ydocfont;font-style:normal;font-weight:400;src:url(fonts/ydoc.eot?v=1.0.0);src:url(fonts/ydoc.eot?#iefixiefix&v=1.0.0) format("embedded-opentype"),url(fonts/ydoc.woff?v=1.0.0) format("woff"),url(fonts/ydoc.ttf?v=1.0.0) format("truetype"),url(source/fonts/ydoc.svg?v=1.0.0#icomoonregular) format("svg")}.ydoc{background:#fafafa;overflow:hidden;height:auto;min-height:100%;position:relative}.ydoc-header{line-height:.48rem;color:#3b3b3b;text-align:right;padding:0 .2rem;overflow:hidden;background-color:#252a31;background-image:-moz-linear-gradient(top,#333,#222);background-image:-ms-linear-gradient(top,#333,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#333),to(#222));background-image:-webkit-linear-gradient(top,#333,#222);background-image:-o-linear-gradient(top,#333,#222);background-image:linear-gradient(top,#333,#222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-box-shadow:0 1px 3px rgba(0,0,0,.25),inset 0 -1px 0 rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.25),inset 0 -1px 0 rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.25),inset 0 -1px 0 rgba(0,0,0,.1)}.ydoc-header a,.ydoc-nav{color:#fff}.ydoc-header-area{margin:0 auto}.ydoc .navbar-brand{width:auto;float:left;margin-right:20px;font-weight:700}.ydoc-nav .active,.ydoc-nav .active a,.ydoc-nav li a:hover{color:#ff503f}.ydoc-nav li a{padding:0 15px}.ydoc-nav .navbar-right{float:right}.ydoc-nav .navbar-left{float:left}.ydoc-second-header{background:#252a31}.ydoc-second-header a{color:#fff}.ydoc-second-header .ydoc-nav{float:right}.ydoc .task-list .checkbox{vertical-align:baseline;user-select:none}.ydoc .navbar-toggle{float:right;font-size:.22rem;display:none;background:0 0;border:none;cursor:pointer;color:#fff;line-height:.48rem}.ydoc .ydoc-banner-bg{background:url(images/grid-18px-masked.png) 0 top repeat-x;padding-bottom:121px}.ydoc .ydoc-banner-bg .desc{font-family:"微软雅黑"}.ydoc-banner{color:#fff;font-size:.18rem;padding:20px 30px}.ydoc-banner-area{margin:0 auto}.ydoc-banner-area h1{font-size:.28rem;margin-bottom:.1rem;color:#333}.ydoc-banner-area p{line-height:1.7;margin:0 0 10px;color:#333}.ydoc .footer{text-align:center;position:absolute;left:0;bottom:0;overflow:hidden;margin:0 auto;padding:40px 0 60px;width:100%;color:#fff;background:#252a31;font-size:14px}.ydoc .footer .copyright{font-size:14px;text-align:center;color:#a1a1a1}.ydoc .footer .copyright a{color:#a1a1a1;text-decoration:underline}.ydoc-container{clear:both;overflow:hidden}.ydoc-container-content{overflow:hidden;background-color:#fff;margin:20px auto;padding:24px 0 0;box-shadow:0 0 3px #e5e5e5;position:relative}.ydoc-container-content .static-code-content{width:100%;background:#fff;padding:.15rem}.ydoc-container-content .content-left,.ydoc-container-content .content-right{float:left;position:relative;min-height:1px}.ydoc-container-content .content-right{box-sizing:border-box;width:75%;background:#fff;padding:15px;float:right;min-height:500px}.ydoc-container-content .hashlink{display:none}.ydoc-container-content .subject:hover .hashlink{display:inline}.ydoc-container-content .right{float:right}.ydoc-container-content .content-left{width:25%}.ydoc-container-content .docs-table del{text-decoration:line-through;color:#999}.ydoc-container-content .ydoc-example{position:relative;overflow:hidden;height:auto}.ydoc-container-content .ydoc-example code{overflow-y:hidden;display:block;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace}.ydoc-container-content .ydoc-example .extend,.ydoc-container-content .ydoc-example .fold{color:#337ab7;position:absolute;left:15px;bottom:10px;cursor:pointer}.ydoc-container-content .ydoc-example .extend:hover,.ydoc-container-content .ydoc-example .fold:hover{text-decoration:underline}.ydoc-container-content .docs-sidebar{background:#fff;z-index:9999;overflow:hidden}.ydoc-container-content .docs-sidebar .docs-sidenav{padding-left:0;overflow-x:hidden}.ydoc-container-content .docs-sidebar .docs-sidenav li{line-height:.42rem;height:.42rem;font-size:14px;overflow:hidden}.ydoc-container-content .docs-sidebar .docs-sidenav li a{padding:0 .16rem 0 .28rem;border-left:2px solid #fff;text-overflow:ellipsis;color:#666;line-height:.42rem;height:.42rem;display:inline-block;width:100%;position:relative;overflow:hidden;white-space:nowrap}.ydoc-container-content .docs-sidebar .docs-sidenav li a:hover{background-color:#fff8ef;border-left-color:#fff8ef}.ydoc-container-content .docs-sidebar .docs-sidenav li.active a,.ydoc-container-content .docs-sidebar .docs-sidenav li.active a:hover{border-left:2px solid #ff503f;color:#ff503f}.ydoc-container-content .docs-sidebar .docs-sidenav ul{width:100%}.ydoc-container-content .docs-sidebar .docs-sidenav ul li,.ydoc-container-content .docs-sidebar .docs-sidenav ul li.active{font-size:.12rem}.ydoc-container-content .docs-sidebar .docs-sidenav ul li a,.ydoc-container-content .docs-sidebar .docs-sidenav ul li a:hover,.ydoc-container-content .docs-sidebar .docs-sidenav ul li.active a,.ydoc-container-content .docs-sidebar .docs-sidenav ul li.active a:hover{padding-left:48px}.ydoc-container-content .docs-sidebar.affix{position:fixed;top:20px}.ydoc-container-content .docs-sidebar.affix-bottom{position:absolute}.ydoc-container-content .docs-section{margin:10px}.ydoc-container .docs-sidebar:before{height:100%;background-color:#eee;width:1px;position:absolute;right:0;display:block;min-height:500px;z-index:99;content:" ";box-sizing:border-box}.open-panel{display:none;overflow:hidden;position:fixed;right:5%;bottom:50px;opacity:.5;width:40px;height:40px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2lpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpEMzJFMTVDOUNCMTQxMUU2OERGOEZGOEM1MkU1MUJENCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEQThGQTIzRENEQTUxMUU2QTczMUM3QjRDM0UxNjQxMiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEQThGQTIzQ0NEQTUxMUU2QTczMUM3QjRDM0UxNjQxMiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6ODZjMjliOTEtNjI0Zi1iZDQ3LWEzZWQtMDIwYzQwNDQxMjlkIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQzMkUxNUM5Q0IxNDExRTY4REY4RkY4QzUyRTUxQkQ0Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+g3TxwAAAANRJREFUeNrsmT0KwkAQhWfXNGLhQewUW08i2FlZ7LZeQMRiC0EQwcvYixcRrbRc35DYaJNGdpD34EsRUnzs/AQSF0IQpAN2YAq6wEmZZPAABxD1RtVwAQMpHz2YHtBTm4Cxx2VrRO4zQ7BSwZnYzdw3PWc1fS+246wLCgX/XrBq81BK6SdvlhhjZolNlLhNKTjFFOQe5B7kHuQUU5B7kHuQe5BTTEEKUvArWQWfhgVvKng0LLhXwQU4G5Q7geW7B0dgA+5S/woo1nPgCtZSf+WXlwADAGEgKNreXHUxAAAAAElFTkSuQmCC) no-repeat}@media screen and (min-width:1200px){.ydoc-banner-area,.ydoc-container-content,.ydoc-header-area{width:1200px}}@media screen and (min-width:992px) and (max-width:1199px){.ydoc-banner-area,.ydoc-container-content,.ydoc-header-area{width:992px}}@media screen and (min-width:768px) and (max-width:991px){.ydoc-banner-area,.ydoc-container-content,.ydoc-header-area{width:768px}}@media screen and (max-width:767px){.mask,.ydoc-container-content .content-left{position:fixed;top:0;transition:all .4s;height:100%}.mask,.ydoc{height:100%}.mask{display:none;left:0;z-index:0;width:100%;background-color:transparent}.show{background-color:rgba(0,0,0,.35)}.ydoc-container-content .content-right{width:100%!important}.ydoc-container-content .content-left{display:block;right:-75%;width:75%!important;background-color:#222;z-index:1;-webkit-transition:all .4s}.ydoc .footer,.ydoc-container-content .docs-sidebar.affix{position:static}.ydoc-container-content .content-left:before{content:'目录:';display:block;padding:.28rem;color:#999;background-color:#2c2c2c;font-weight:700}.ydoc-container-content .docs-sidebar,.ydoc-container-content .docs-sidebar .docs-sidenav li a:hover{background-color:#222}.ydoc-container-content .docs-sidebar .docs-sidenav li a{color:#999;border-color:#222}.ydoc-container-content .instructions-con-runner{display:none}.open-panel{display:block;cursor:default;transition:all .4s;-webkit-transition:all .4s}.ydoc-banner-area,.ydoc-container-content,.ydoc-header-area{width:100%}.ydoc{overflow:scroll;-webkit-overflow-scrolling:touch}.ydoc .navbar-toggle{display:inline-block}.ydoc .ydoc-nav{display:none;clear:both;width:100%}.ydoc .ydoc-nav .navbar-left,.ydoc .ydoc-nav .navbar-right{width:100%}.ydoc .ydoc-nav .navbar-left li,.ydoc .ydoc-nav .navbar-right li{width:100%;text-align:left;display:inline-block}.ydoc .ydoc-nav .navbar-left li a,.ydoc .ydoc-nav .navbar-right li a{padding:0;width:100%;display:inline-block}.ydoc .ydoc-nav .navbar-left li a:hover,.ydoc .ydoc-nav .navbar-right li a:hover{color:#ff503f}.ydoc .ydoc-banner-bg{padding-bottom:0}.off-webkit-scroll{-webkit-overflow-scrolling:auto}.hidden{overflow:hidden}.ydoc-second-header,.ydoc-second-header .ydoc-nav{display:block}.ydoc-second-header .ydoc-nav li{float:left}}.anchorjs-link{display:none}@media screen and (min-width:768px){.ydoc-container-content .staticsidenav .docs-sidebar.affix{position:static}.ydoc-container-content .staticsidenav .docs-sidebar .docs-sidenav{overflow:inherit}.staticsidenav .docs-sidebar{overflow:initial}}.markdown-body code{color:#c7254e;background-color:#f9f2f4;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.markdown-body pre{display:block;margin:0 0 10px;word-break:break-all;color:#333;background-color:#fafafa;border:1px solid #ccc}.markdown-body::after,.markdown-body::before{display:table;content:""}.markdown-body pre code{font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.markdown-body em{font-style:italic}.markdown-body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:14px;line-height:1.5;word-wrap:break-word}.markdown-body a{color:#337ab7}.markdown-body::after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#c00}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:#e7e7e7;border:0}.markdown-body blockquote{padding:0 1em;color:#777;border-left:.25em solid #ddd}.markdown-body h1,.markdown-body h2{padding-bottom:.3em;border-bottom:1px solid #eee}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body .loweralpha{list-style-type:lower-alpha}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit}.markdown-body h1{font-size:2em}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1.15em}.markdown-body h5{font-size:.875em}.markdown-body h6{font-size:.85em;color:#777}.markdown-body ol,.markdown-body ul{padding-left:2em;list-style-type:disc}.markdown-body ol.no-list,.markdown-body ul.no-list{padding:0;list-style-type:none}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}.markdown-body table th{font-weight:700}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #ddd}.markdown-body table tr{background-color:#fff;border-top:1px solid #ccc}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:.2em 0;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown-body code:after,.markdown-body code:before,.markdown-body tt:after,.markdown-body tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;border-radius:3px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body pre{word-wrap:normal}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.glyphicon,.markdown-body kbd,.yo-badge{display:inline-block}.markdown-body pre code:after,.markdown-body pre code:before,.markdown-body pre tt:after,.markdown-body pre tt:before{content:normal}.markdown-body kbd{padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:1px solid #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}#readme.contributing>div{max-height:250px;overflow:auto}#readme .markdown-body,#readme .plain{background-color:#fff;border:1px solid #ddd;border-bottom-left-radius:3px;border-bottom-right-radius:3px;padding:30px;word-wrap:break-word}#readme .plain pre{font-size:15px;white-space:pre-wrap}#readme .markdown-body{border:0;padding:30px;border-radius:0}#readme table[data-table-type=yaml-metadata]{line-height:1;font-size:12px}#readme table[data-table-type=yaml-metadata] table{margin:0}.yo-badge{padding:1px .1rem;color:#fff;font-size:.12rem;margin-left:10px;border-radius:12px;font-weight:400}.yo-badge-primary{color:#337ab7;border:1px solid #337ab7}.yo-badge-success{color:#5cb85c;border:1px solid #5cb85c}.yo-badge-info{color:#5bc0de;border:1px solid #5bc0de}.yo-badge-warning{color:#f0ad4e;border:1px solid #f0ad4e}.yo-badge-danger{color:#d9534f;border:1px solid #d9534f}.glyphicon{position:relative;top:1px;font-family:ydocfont;font-style:normal;font-weight:700;font-size:.2rem;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-ok:before{content:"\f078"}.text-success{color:#3c763d}.release-date{font-size:1em;color:grey}.change-type{font-size:1em;color:#ff503f}.markdown-body blockquote.api{border-left:none;padding:0;color:#ff503f}.markdown-body .docs-section h1,.markdown-body .docs-section h2{border-bottom:none}.markdown-body .docs-section li .ydoc-example{left:-2em}.markdown-body .docs-section .blockquote.api{padding:0 0 .15rem}.markdown-body .docs-section h3{color:#ff503f;border-left-color:#ff503f;font-weight:400}.markdown-body .docs-section h3 a{color:#ff503f}.markdown-body .docs-section .con-list-item .con-head{font-size:22px;font-weight:700;border-bottom:1px solid #ddd;margin:0 0 .2rem;padding:.1rem 0;width:100%}.markdown-body .docs-section .con-list-item .prop-type{font-size:14px}.markdown-body .docs-section .con-list-item:last-child{border:none}.markdown-body .docs-section .hide-params{display:none}.markdown-body .docs-section .show-params{display:table-row}.markdown-body .docs-section .extend-params,.markdown-body .docs-section .fold-params{color:#337ab7;margin:-.1rem 0 .15rem;display:block;cursor:pointer}.instructions{margin-bottom:.2rem;overflow:hidden}.instructions-con{display:flex;flex-direction:row}.instructions-con-info{flex:1;overflow:hidden;padding-right:10px}.instructions-con-runner{width:3.2rem;height:6.5rem;padding:0 .16rem;background:url(images/feed.png) no-repeat;background-size:100%;position:relative}.instructions-con-runner .instructions-iframe{background:#fff;width:2.9rem;height:5.1rem;position:absolute;top:.66rem;left:.18rem;border:0}
\ No newline at end of file
diff --git a/docs/source/main.js b/docs/source/main.js
new file mode 100644
index 0000000..6c4dbac
--- /dev/null
+++ b/docs/source/main.js
@@ -0,0 +1,6 @@
+function AnchorJS(e){"use strict";this.options=e||{},this._applyRemainingDefaultOptions=function(e){this.options.icon=this.options.hasOwnProperty("icon")?e.icon:"",this.options.visible=this.options.hasOwnProperty("visible")?e.visible:"hover",this.options.placement=this.options.hasOwnProperty("placement")?e.placement:"right",this.options.class=this.options.hasOwnProperty("class")?e.class:""},this._applyRemainingDefaultOptions(e),this.add=function(e){var t,n,i,o,r,s,a,l,c,u,d,f,p,h;if(this._applyRemainingDefaultOptions(this.options),e){if("string"!=typeof e)throw new Error("The selector provided to AnchorJS was invalid.")}else e="h1, h2, h3, h4, h5, h6";if(t=document.querySelectorAll(e),0===t.length)return!1;for(this._addBaselineStyles(),n=document.querySelectorAll("[id]"),i=[].map.call(n,function(e){return e.id}),r=0;r',p=document.createElement("div"),p.innerHTML=f,h=p.childNodes,"always"===this.options.visible&&(h[0].style.opacity="1"),""===this.options.icon&&(h[0].style.fontFamily="anchorjs-icons",h[0].style.fontStyle="normal",h[0].style.fontVariant="normal",h[0].style.fontWeight="normal"),"left"===this.options.placement?(h[0].style.position="absolute",h[0].style.marginLeft="-1em",h[0].style.paddingRight="0.5em",t[r].insertBefore(h[0],t[r].firstChild)):(h[0].style.paddingLeft="0.375em",t[r].appendChild(h[0]))}return this},this.remove=function(e){for(var t,n=document.querySelectorAll(e),i=0;i .anchorjs-link, .anchorjs-link:focus { opacity: 1; }",o=' @font-face { font-family: "anchorjs-icons"; font-style: normal; font-weight: normal; src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBTUAAAC8AAAAYGNtYXAWi9QdAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zgq29TcAAAF4AAABNGhlYWQEZM3pAAACrAAAADZoaGVhBhUDxgAAAuQAAAAkaG10eASAADEAAAMIAAAAFGxvY2EAKACuAAADHAAAAAxtYXhwAAgAVwAAAygAAAAgbmFtZQ5yJ3cAAANIAAAB2nBvc3QAAwAAAAAFJAAAACAAAwJAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpywPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6cv//f//AAAAAAAg6cv//f//AAH/4xY5AAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACADEARAJTAsAAKwBUAAABIiYnJjQ/AT4BMzIWFxYUDwEGIicmND8BNjQnLgEjIgYPAQYUFxYUBw4BIwciJicmND8BNjIXFhQPAQYUFx4BMzI2PwE2NCcmNDc2MhcWFA8BDgEjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAEAAAABAACiToc1Xw889QALBAAAAAAA0XnFFgAAAADRecUWAAAAAAJTAsAAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAAlMAAQAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAACAAAAAoAAMQAAAAAACgAUAB4AmgABAAAABQBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIABwCfAAEAAAAAAAMADgBLAAEAAAAAAAQADgC0AAEAAAAAAAUACwAqAAEAAAAAAAYADgB1AAEAAAAAAAoAGgDeAAMAAQQJAAEAHAAOAAMAAQQJAAIADgCmAAMAAQQJAAMAHABZAAMAAQQJAAQAHADCAAMAAQQJAAUAFgA1AAMAAQQJAAYAHACDAAMAAQQJAAoANAD4YW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format("truetype"); }',r=" [data-anchorjs-icon]::after { content: attr(data-anchorjs-icon); }";t.className="anchorjs",t.appendChild(document.createTextNode("")),e=document.head.querySelector('[rel="stylesheet"], style'),void 0===e?document.head.appendChild(t):document.head.insertBefore(t,e),t.sheet.insertRule(n,t.sheet.cssRules.length),t.sheet.insertRule(i,t.sheet.cssRules.length),t.sheet.insertRule(r,t.sheet.cssRules.length),t.sheet.insertRule(o,t.sheet.cssRules.length)}}}if(!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t="length"in e&&e.length,n=oe.type(e);return"function"!==n&&!oe.isWindow(e)&&(!(1!==e.nodeType||!t)||("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e))}function i(e,t,n){if(oe.isFunction(t))return oe.grep(e,function(e,i){return!!t.call(e,i,e)!==n});if(t.nodeType)return oe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(fe.test(t))return oe.filter(t,e,n);t=oe.filter(t,e)}return oe.grep(e,function(e){return oe.inArray(e,t)>=0!==n})}function o(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function r(e){var t=Ae[e]={};return oe.each(e.match(be)||[],function(e,n){t[n]=!0}),t}function s(){he.addEventListener?(he.removeEventListener("DOMContentLoaded",a,!1),e.removeEventListener("load",a,!1)):(he.detachEvent("onreadystatechange",a),e.detachEvent("onload",a))}function a(){(he.addEventListener||"load"===event.type||"complete"===he.readyState)&&(s(),oe.ready())}function l(e,t,n){if(void 0===n&&1===e.nodeType){var i="data-"+t.replace(Ee,"-$1").toLowerCase();if(n=e.getAttribute(i),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:Te.test(n)?oe.parseJSON(n):n)}catch(e){}oe.data(e,t,n)}else n=void 0}return n}function c(e){var t;for(t in e)if(("data"!==t||!oe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(e,t,n,i){if(oe.acceptData(e)){var o,r,s=oe.expando,a=e.nodeType,l=a?oe.cache:e,c=a?e[s]:e[s]&&s;if(c&&l[c]&&(i||l[c].data)||void 0!==n||"string"!=typeof t)return c||(c=a?e[s]=X.pop()||oe.guid++:s),l[c]||(l[c]=a?{}:{toJSON:oe.noop}),("object"==typeof t||"function"==typeof t)&&(i?l[c]=oe.extend(l[c],t):l[c].data=oe.extend(l[c].data,t)),r=l[c],i||(r.data||(r.data={}),r=r.data),void 0!==n&&(r[oe.camelCase(t)]=n),"string"==typeof t?(o=r[t],null==o&&(o=r[oe.camelCase(t)])):o=r,o}}function d(e,t,n){if(oe.acceptData(e)){var i,o,r=e.nodeType,s=r?oe.cache:e,a=r?e[oe.expando]:oe.expando;if(s[a]){if(t&&(i=n?s[a]:s[a].data)){oe.isArray(t)?t=t.concat(oe.map(t,oe.camelCase)):t in i?t=[t]:(t=oe.camelCase(t),t=t in i?[t]:t.split(" ")),o=t.length;for(;o--;)delete i[t[o]];if(n?!c(i):!oe.isEmptyObject(i))return}(n||(delete s[a].data,c(s[a])))&&(r?oe.cleanData([e],!0):ne.deleteExpando||s!=s.window?delete s[a]:s[a]=null)}}}function f(){return!0}function p(){return!1}function h(){try{return he.activeElement}catch(e){}}function g(e){var t=Re.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function m(e,t){var n,i,o=0,r=typeof e.getElementsByTagName!==Ce?e.getElementsByTagName(t||"*"):typeof e.querySelectorAll!==Ce?e.querySelectorAll(t||"*"):void 0;if(!r)for(r=[],n=e.childNodes||e;null!=(i=n[o]);o++)!t||oe.nodeName(i,t)?r.push(i):oe.merge(r,m(i,t));return void 0===t||t&&oe.nodeName(e,t)?oe.merge([e],r):r}function v(e){$e.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t){return oe.nodeName(e,"table")&&oe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function b(e){return e.type=(null!==oe.find.attr(e,"type"))+"/"+e.type,e}function A(e){var t=Ge.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function x(e,t){for(var n,i=0;null!=(n=e[i]);i++)oe._data(n,"globalEval",!t||oe._data(t[i],"globalEval"))}function w(e,t){if(1===t.nodeType&&oe.hasData(e)){var n,i,o,r=oe._data(e),s=oe._data(t,r),a=r.events;if(a){delete s.handle,s.events={};for(n in a)for(i=0,o=a[n].length;o>i;i++)oe.event.add(t,n,a[n][i])}s.data&&(s.data=oe.extend({},s.data))}}function C(e,t){var n,i,o;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!ne.noCloneEvent&&t[oe.expando]){o=oe._data(t);for(i in o.events)oe.removeEvent(t,i,o.handle);t.removeAttribute(oe.expando)}"script"===n&&t.text!==e.text?(b(t).text=e.text,A(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),ne.html5Clone&&e.innerHTML&&!oe.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&$e.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function T(t,n){var i,o=oe(n.createElement(t)).appendTo(n.body),r=e.getDefaultComputedStyle&&(i=e.getDefaultComputedStyle(o[0]))?i.display:oe.css(o[0],"display");return o.detach(),r}function E(e){var t=he,n=Ke[e];return n||(n=T(e,t),"none"!==n&&n||(Je=(Je||oe("")).appendTo(t.documentElement),t=(Je[0].contentWindow||Je[0].contentDocument).document,t.write(),t.close(),n=T(e,t),Je.detach()),Ke[e]=n),n}function S(e,t){return{get:function(){var n=e();if(null!=n)return n?void delete this.get:(this.get=t).apply(this,arguments)}}}function k(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),i=t,o=ft.length;o--;)if(t=ft[o]+n,t in e)return t;return i}function N(e,t){for(var n,i,o,r=[],s=0,a=e.length;a>s;s++)i=e[s],i.style&&(r[s]=oe._data(i,"olddisplay"),n=i.style.display,t?(r[s]||"none"!==n||(i.style.display=""),""===i.style.display&&Ne(i)&&(r[s]=oe._data(i,"olddisplay",E(i.nodeName)))):(o=Ne(i),(n&&"none"!==n||!o)&&oe._data(i,"olddisplay",o?n:oe.css(i,"display"))));for(s=0;a>s;s++)i=e[s],i.style&&(t&&"none"!==i.style.display&&""!==i.style.display||(i.style.display=t?r[s]||"":"none"));return e}function D(e,t,n){var i=lt.exec(t);return i?Math.max(0,i[1]-(n||0))+(i[2]||"px"):t}function $(e,t,n,i,o){for(var r=n===(i?"border":"content")?4:"width"===t?1:0,s=0;4>r;r+=2)"margin"===n&&(s+=oe.css(e,n+ke[r],!0,o)),i?("content"===n&&(s-=oe.css(e,"padding"+ke[r],!0,o)),"margin"!==n&&(s-=oe.css(e,"border"+ke[r]+"Width",!0,o))):(s+=oe.css(e,"padding"+ke[r],!0,o),"padding"!==n&&(s+=oe.css(e,"border"+ke[r]+"Width",!0,o)));return s}function j(e,t,n){var i=!0,o="width"===t?e.offsetWidth:e.offsetHeight,r=et(e),s=ne.boxSizing&&"border-box"===oe.css(e,"boxSizing",!1,r);if(0>=o||null==o){if(o=tt(e,t,r),(0>o||null==o)&&(o=e.style[t]),it.test(o))return o;i=s&&(ne.boxSizingReliable()||o===e.style[t]),o=parseFloat(o)||0}return o+$(e,t,n||(s?"border":"content"),i,r)+"px"}function L(e,t,n,i,o){return new L.prototype.init(e,t,n,i,o)}function O(){return setTimeout(function(){pt=void 0}),pt=oe.now()}function I(e,t){var n,i={height:e},o=0;for(t=t?1:0;4>o;o+=2-t)n=ke[o],i["margin"+n]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function B(e,t,n){for(var i,o=(bt[t]||[]).concat(bt["*"]),r=0,s=o.length;s>r;r++)if(i=o[r].call(n,t,e))return i}function R(e,t,n){var i,o,r,s,a,l,c,u,d=this,f={},p=e.style,h=e.nodeType&&Ne(e),g=oe._data(e,"fxshow");n.queue||(a=oe._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,l=a.empty.fire,a.empty.fire=function(){a.unqueued||l()}),a.unqueued++,d.always(function(){d.always(function(){a.unqueued--,oe.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],c=oe.css(e,"display"),u="none"===c?oe._data(e,"olddisplay")||E(e.nodeName):c,"inline"===u&&"none"===oe.css(e,"float")&&(ne.inlineBlockNeedsLayout&&"inline"!==E(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",ne.shrinkWrapBlocks()||d.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(i in t)if(o=t[i],gt.exec(o)){if(delete t[i],r=r||"toggle"===o,o===(h?"hide":"show")){if("show"!==o||!g||void 0===g[i])continue;h=!0}f[i]=g&&g[i]||oe.style(e,i)}else c=void 0;if(oe.isEmptyObject(f))"inline"===("none"===c?E(e.nodeName):c)&&(p.display=c);else{g?"hidden"in g&&(h=g.hidden):g=oe._data(e,"fxshow",{}),r&&(g.hidden=!h),h?oe(e).show():d.done(function(){oe(e).hide()}),d.done(function(){var t;oe._removeData(e,"fxshow");for(t in f)oe.style(e,t,f[t])});for(i in f)s=B(h?g[i]:0,i,d),i in g||(g[i]=s.start,h&&(s.end=s.start,s.start="width"===i||"height"===i?1:0))}}function H(e,t){var n,i,o,r,s;for(n in e)if(i=oe.camelCase(n),o=t[i],r=e[n],oe.isArray(r)&&(o=r[1],r=e[n]=r[0]),n!==i&&(e[i]=r,delete e[n]),s=oe.cssHooks[i],s&&"expand"in s){r=s.expand(r),delete e[i];for(n in r)n in e||(e[n]=r[n],t[n]=o)}else t[i]=o}function M(e,t,n){var i,o,r=0,s=yt.length,a=oe.Deferred().always(function(){delete l.elem}),l=function(){if(o)return!1;for(var t=pt||O(),n=Math.max(0,c.startTime+c.duration-t),i=n/c.duration||0,r=1-i,s=0,l=c.tweens.length;l>s;s++)c.tweens[s].run(r);return a.notifyWith(e,[c,r,n]),1>r&&l?n:(a.resolveWith(e,[c]),!1)},c=a.promise({elem:e,props:oe.extend({},t),opts:oe.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:pt||O(),duration:n.duration,tweens:[],createTween:function(t,n){var i=oe.Tween(e,c.opts,t,n,c.opts.specialEasing[t]||c.opts.easing);return c.tweens.push(i),i},stop:function(t){var n=0,i=t?c.tweens.length:0;if(o)return this;for(o=!0;i>n;n++)c.tweens[n].run(1);return t?a.resolveWith(e,[c,t]):a.rejectWith(e,[c,t]),this}}),u=c.props;for(H(u,c.opts.specialEasing);s>r;r++)if(i=yt[r].call(c,e,u,c.opts))return i;return oe.map(u,B,c),oe.isFunction(c.opts.start)&&c.opts.start.call(e,c),oe.fx.timer(oe.extend(l,{elem:e,anim:c,queue:c.opts.queue})),c.progress(c.opts.progress).done(c.opts.done,c.opts.complete).fail(c.opts.fail).always(c.opts.always)}function F(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var i,o=0,r=t.toLowerCase().match(be)||[];if(oe.isFunction(n))for(;i=r[o++];)"+"===i.charAt(0)?(i=i.slice(1)||"*",(e[i]=e[i]||[]).unshift(n)):(e[i]=e[i]||[]).push(n)}}function P(e,t,n,i){function o(a){var l;return r[a]=!0,oe.each(e[a]||[],function(e,a){var c=a(t,n,i);return"string"!=typeof c||s||r[c]?s?!(l=c):void 0:(t.dataTypes.unshift(c),o(c),!1)}),l}var r={},s=e===_t;return o(t.dataTypes[0])||!r["*"]&&o("*")}function z(e,t){var n,i,o=oe.ajaxSettings.flatOptions||{};for(i in t)void 0!==t[i]&&((o[i]?e:n||(n={}))[i]=t[i]);return n&&oe.extend(!0,e,n),e}function q(e,t,n){for(var i,o,r,s,a=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===o&&(o=e.mimeType||t.getResponseHeader("Content-Type"));if(o)for(s in a)if(a[s]&&a[s].test(o)){l.unshift(s);break}if(l[0]in n)r=l[0];else{for(s in n){if(!l[0]||e.converters[s+" "+l[0]]){r=s;break}i||(i=s)}r=r||i}return r?(r!==l[0]&&l.unshift(r),n[r]):void 0}function _(e,t,n,i){var o,r,s,a,l,c={},u=e.dataTypes.slice();if(u[1])for(s in e.converters)c[s.toLowerCase()]=e.converters[s];for(r=u.shift();r;)if(e.responseFields[r]&&(n[e.responseFields[r]]=t),!l&&i&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=r,r=u.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(s=c[l+" "+r]||c["* "+r],!s)for(o in c)if(a=o.split(" "),a[1]===r&&(s=c[l+" "+a[0]]||c["* "+a[0]])){s===!0?s=c[o]:c[o]!==!0&&(r=a[0],u.unshift(a[1]));break}if(s!==!0)if(s&&e.throws)t=s(t);else try{t=s(t)}catch(e){return{state:"parsererror",error:s?e:"No conversion from "+l+" to "+r}}}return{state:"success",data:t}}function W(e,t,n,i){var o;if(oe.isArray(t))oe.each(t,function(t,o){n||Qt.test(e)?i(e,o):W(e+"["+("object"==typeof o?t:"")+"]",o,n,i)});else if(n||"object"!==oe.type(t))i(e,t);else for(o in t)W(e+"["+o+"]",t[o],n,i)}function U(){try{return new e.XMLHttpRequest}catch(e){}}function Q(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}function G(e){return oe.isWindow(e)?e:9===e.nodeType&&(e.defaultView||e.parentWindow)}var X=[],V=X.slice,Y=X.concat,Z=X.push,J=X.indexOf,K={},ee=K.toString,te=K.hasOwnProperty,ne={},ie="1.11.3",oe=function(e,t){return new oe.fn.init(e,t)},re=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,se=/^-ms-/,ae=/-([\da-z])/gi,le=function(e,t){return t.toUpperCase()};oe.fn=oe.prototype={jquery:ie,constructor:oe,selector:"",length:0,toArray:function(){return V.call(this)},get:function(e){return null!=e?0>e?this[e+this.length]:this[e]:V.call(this)},pushStack:function(e){var t=oe.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return oe.each(this,e,t)},map:function(e){return this.pushStack(oe.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(V.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:Z,sort:X.sort,splice:X.splice},oe.extend=oe.fn.extend=function(){var e,t,n,i,o,r,s=arguments[0]||{},a=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[a]||{},a++),"object"==typeof s||oe.isFunction(s)||(s={}),a===l&&(s=this,a--);l>a;a++)if(null!=(o=arguments[a]))for(i in o)e=s[i],n=o[i],s!==n&&(c&&n&&(oe.isPlainObject(n)||(t=oe.isArray(n)))?(t?(t=!1,r=e&&oe.isArray(e)?e:[]):r=e&&oe.isPlainObject(e)?e:{},s[i]=oe.extend(c,r,n)):void 0!==n&&(s[i]=n));return s},oe.extend({expando:"jQuery"+(ie+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===oe.type(e)},isArray:Array.isArray||function(e){return"array"===oe.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!oe.isArray(e)&&e-parseFloat(e)+1>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==oe.type(e)||e.nodeType||oe.isWindow(e))return!1;try{if(e.constructor&&!te.call(e,"constructor")&&!te.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(e){return!1}if(ne.ownLast)for(t in e)return te.call(e,t);for(t in e);return void 0===t||te.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?K[ee.call(e)]||"object":typeof e},globalEval:function(t){t&&oe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(se,"ms-").replace(ae,le)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,i){var o,r=0,s=e.length,a=n(e);if(i){if(a)for(;s>r&&(o=t.apply(e[r],i),o!==!1);r++);else for(r in e)if(o=t.apply(e[r],i),o===!1)break}else if(a)for(;s>r&&(o=t.call(e[r],r,e[r]),o!==!1);r++);else for(r in e)if(o=t.call(e[r],r,e[r]),o===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(re,"")},makeArray:function(e,t){var i=t||[];return null!=e&&(n(Object(e))?oe.merge(i,"string"==typeof e?[e]:e):Z.call(i,e)),i},inArray:function(e,t,n){var i;if(t){if(J)return J.call(t,e,n);for(i=t.length,n=n?0>n?Math.max(0,i+n):n:0;i>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,i=0,o=e.length;n>i;)e[o++]=t[i++];if(n!==n)for(;void 0!==t[i];)e[o++]=t[i++];return e.length=o,e},grep:function(e,t,n){for(var i,o=[],r=0,s=e.length,a=!n;s>r;r++)i=!t(e[r],r),i!==a&&o.push(e[r]);return o},map:function(e,t,i){var o,r=0,s=e.length,a=n(e),l=[];if(a)for(;s>r;r++)o=t(e[r],r,i),null!=o&&l.push(o);else for(r in e)o=t(e[r],r,i),null!=o&&l.push(o);return Y.apply([],l)},guid:1,proxy:function(e,t){var n,i,o;return"string"==typeof t&&(o=e[t],t=e,e=o),oe.isFunction(e)?(n=V.call(arguments,2),i=function(){return e.apply(t||this,n.concat(V.call(arguments)))},i.guid=e.guid=e.guid||oe.guid++,i):void 0},now:function(){return+new Date},support:ne}),oe.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){K["[object "+t+"]"]=t.toLowerCase()});var ce=function(e){function t(e,t,n,i){var o,r,s,a,l,c,d,p,h,g;if((t?t.ownerDocument||t:P)!==L&&j(t),t=t||L,n=n||[],a=t.nodeType,"string"!=typeof e||!e||1!==a&&9!==a&&11!==a)return n;if(!i&&I){if(11!==a&&(o=ye.exec(e)))if(s=o[1]){if(9===a){if(r=t.getElementById(s),!r||!r.parentNode)return n;if(r.id===s)return n.push(r),n}else if(t.ownerDocument&&(r=t.ownerDocument.getElementById(s))&&M(t,r)&&r.id===s)return n.push(r),n}else{if(o[2])return J.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&x.getElementsByClassName)return J.apply(n,t.getElementsByClassName(s)),n}if(x.qsa&&(!B||!B.test(e))){if(p=d=F,h=t,g=1!==a&&e,1===a&&"object"!==t.nodeName.toLowerCase()){for(c=E(e),(d=t.getAttribute("id"))?p=d.replace(Ae,"\\$&"):t.setAttribute("id",p),p="[id='"+p+"'] ",l=c.length;l--;)c[l]=p+f(c[l]);h=be.test(e)&&u(t.parentNode)||t,g=c.join(",")}if(g)try{return J.apply(n,h.querySelectorAll(g)),n}catch(e){}finally{d||t.removeAttribute("id")}}}return k(e.replace(le,"$1"),t,n,i)}function n(){function e(n,i){return t.push(n+" ")>w.cacheLength&&delete e[t.shift()],e[n+" "]=i}var t=[];return e}function i(e){return e[F]=!0,e}function o(e){var t=L.createElement("div");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function r(e,t){for(var n=e.split("|"),i=e.length;i--;)w.attrHandle[n[i]]=t}function s(e,t){var n=t&&e,i=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||G)-(~e.sourceIndex||G);if(i)return i;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function l(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return i(function(t){return t=+t,i(function(n,i){for(var o,r=e([],n.length,t),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))})})}function u(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function d(){}function f(e){for(var t=0,n=e.length,i="";n>t;t++)i+=e[t].value;return i}function p(e,t,n){var i=t.dir,o=n&&"parentNode"===i,r=q++;return t.first?function(t,n,r){for(;t=t[i];)if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var a,l,c=[z,r];if(s){for(;t=t[i];)if((1===t.nodeType||o)&&e(t,n,s))return!0}else for(;t=t[i];)if(1===t.nodeType||o){if(l=t[F]||(t[F]={}),(a=l[i])&&a[0]===z&&a[1]===r)return c[2]=a[2];if(l[i]=c,c[2]=e(t,n,s))return!0}}}function h(e){return e.length>1?function(t,n,i){for(var o=e.length;o--;)if(!e[o](t,n,i))return!1;return!0}:e[0]}function g(e,n,i){for(var o=0,r=n.length;r>o;o++)t(e,n[o],i);return i}function m(e,t,n,i,o){for(var r,s=[],a=0,l=e.length,c=null!=t;l>a;a++)(r=e[a])&&(!n||n(r,i,o))&&(s.push(r),c&&t.push(a));return s}function v(e,t,n,o,r,s){return o&&!o[F]&&(o=v(o)),r&&!r[F]&&(r=v(r,s)),i(function(i,s,a,l){var c,u,d,f=[],p=[],h=s.length,v=i||g(t||"*",a.nodeType?[a]:a,[]),y=!e||!i&&t?v:m(v,f,e,a,l),b=n?r||(i?e:h||o)?[]:s:y;if(n&&n(y,b,a,l),o)for(c=m(b,p),o(c,[],a,l),u=c.length;u--;)(d=c[u])&&(b[p[u]]=!(y[p[u]]=d));if(i){if(r||e){if(r){for(c=[],u=b.length;u--;)(d=b[u])&&c.push(y[u]=d);r(null,b=[],c,l)}for(u=b.length;u--;)(d=b[u])&&(c=r?ee(i,d):f[u])>-1&&(i[c]=!(s[c]=d))}}else b=m(b===s?b.splice(h,b.length):b),r?r(null,s,b,l):J.apply(s,b)})}function y(e){for(var t,n,i,o=e.length,r=w.relative[e[0].type],s=r||w.relative[" "],a=r?1:0,l=p(function(e){return e===t},s,!0),c=p(function(e){return ee(t,e)>-1},s,!0),u=[function(e,n,i){var o=!r&&(i||n!==N)||((t=n).nodeType?l(e,n,i):c(e,n,i));return t=null,o}];o>a;a++)if(n=w.relative[e[a].type])u=[p(h(u),n)];else{if(n=w.filter[e[a].type].apply(null,e[a].matches),n[F]){for(i=++a;o>i&&!w.relative[e[i].type];i++);return v(a>1&&h(u),a>1&&f(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(le,"$1"),n,i>a&&y(e.slice(a,i)),o>i&&y(e=e.slice(i)),o>i&&f(e))}u.push(n)}return h(u)}function b(e,n){var o=n.length>0,r=e.length>0,s=function(i,s,a,l,c){var u,d,f,p=0,h="0",g=i&&[],v=[],y=N,b=i||r&&w.find.TAG("*",c),A=z+=null==y?1:Math.random()||.1,x=b.length;for(c&&(N=s!==L&&s);h!==x&&null!=(u=b[h]);h++){if(r&&u){for(d=0;f=e[d++];)if(f(u,s,a)){l.push(u);break}c&&(z=A)}o&&((u=!f&&u)&&p--,i&&g.push(u))}if(p+=h,o&&h!==p){for(d=0;f=n[d++];)f(g,v,s,a);if(i){if(p>0)for(;h--;)g[h]||v[h]||(v[h]=Y.call(l));v=m(v)}J.apply(l,v),c&&!i&&v.length>0&&p+n.length>1&&t.uniqueSort(l)}return c&&(z=A,N=y),g};return o?i(s):s}var A,x,w,C,T,E,S,k,N,D,$,j,L,O,I,B,R,H,M,F="sizzle"+1*new Date,P=e.document,z=0,q=0,_=n(),W=n(),U=n(),Q=function(e,t){return e===t&&($=!0),0},G=1<<31,X={}.hasOwnProperty,V=[],Y=V.pop,Z=V.push,J=V.push,K=V.slice,ee=function(e,t){for(var n=0,i=e.length;i>n;n++)if(e[n]===t)return n;return-1},te="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",ne="[\\x20\\t\\r\\n\\f]",ie="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",oe=ie.replace("w","w#"),re="\\["+ne+"*("+ie+")(?:"+ne+"*([*^$|!~]?=)"+ne+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+oe+"))|)"+ne+"*\\]",se=":("+ie+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+re+")*)|.*)\\)|)",ae=new RegExp(ne+"+","g"),le=new RegExp("^"+ne+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ne+"+$","g"),ce=new RegExp("^"+ne+"*,"+ne+"*"),ue=new RegExp("^"+ne+"*([>+~]|"+ne+")"+ne+"*"),de=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(se),pe=new RegExp("^"+oe+"$"),he={ID:new RegExp("^#("+ie+")"),CLASS:new RegExp("^\\.("+ie+")"),TAG:new RegExp("^("+ie.replace("w","w*")+")"),ATTR:new RegExp("^"+re),PSEUDO:new RegExp("^"+se),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},ge=/^(?:input|select|textarea|button)$/i,me=/^h\d$/i,ve=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,be=/[+~]/,Ae=/'|\\/g,xe=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var i="0x"+t-65536;return i!==i||n?t:0>i?String.fromCharCode(i+65536):String.fromCharCode(i>>10|55296,1023&i|56320)},Ce=function(){j()};try{J.apply(V=K.call(P.childNodes),P.childNodes),V[P.childNodes.length].nodeType}catch(e){J={apply:V.length?function(e,t){Z.apply(e,K.call(t))}:function(e,t){for(var n=e.length,i=0;e[n++]=t[i++];);e.length=n-1}}}x=t.support={},T=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},j=t.setDocument=function(e){var t,n,i=e?e.ownerDocument||e:P;return i!==L&&9===i.nodeType&&i.documentElement?(L=i,O=i.documentElement,n=i.defaultView,n&&n!==n.top&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),I=!T(i),x.attributes=o(function(e){return e.className="i",!e.getAttribute("className")}),x.getElementsByTagName=o(function(e){return e.appendChild(i.createComment("")),!e.getElementsByTagName("*").length}),x.getElementsByClassName=ve.test(i.getElementsByClassName),x.getById=o(function(e){return O.appendChild(e).id=F,!i.getElementsByName||!i.getElementsByName(F).length}),x.getById?(w.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&I){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},w.filter.ID=function(e){var t=e.replace(xe,we);return function(e){return e.getAttribute("id")===t}}):(delete w.find.ID,w.filter.ID=function(e){var t=e.replace(xe,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),w.find.TAG=x.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):x.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,i=[],o=0,r=t.getElementsByTagName(e);if("*"===e){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},w.find.CLASS=x.getElementsByClassName&&function(e,t){return I?t.getElementsByClassName(e):void 0},R=[],B=[],(x.qsa=ve.test(i.querySelectorAll))&&(o(function(e){O.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&B.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||B.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+F+"-]").length||B.push("~="),e.querySelectorAll(":checked").length||B.push(":checked"),e.querySelectorAll("a#"+F+"+*").length||B.push(".#.+[+~]")}),o(function(e){var t=i.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&B.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||B.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),B.push(",.*:")})),(x.matchesSelector=ve.test(H=O.matches||O.webkitMatchesSelector||O.mozMatchesSelector||O.oMatchesSelector||O.msMatchesSelector))&&o(function(e){x.disconnectedMatch=H.call(e,"div"),H.call(e,"[s!='']:x"),R.push("!=",se)}),B=B.length&&new RegExp(B.join("|")),R=R.length&&new RegExp(R.join("|")),t=ve.test(O.compareDocumentPosition),M=t||ve.test(O.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,i=t&&t.parentNode;return e===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):e.compareDocumentPosition&&16&e.compareDocumentPosition(i)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},Q=t?function(e,t){if(e===t)return $=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!x.sortDetached&&t.compareDocumentPosition(e)===n?e===i||e.ownerDocument===P&&M(P,e)?-1:t===i||t.ownerDocument===P&&M(P,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return $=!0,0;var n,o=0,r=e.parentNode,a=t.parentNode,l=[e],c=[t];if(!r||!a)return e===i?-1:t===i?1:r?-1:a?1:D?ee(D,e)-ee(D,t):0;if(r===a)return s(e,t);for(n=e;n=n.parentNode;)l.unshift(n);for(n=t;n=n.parentNode;)c.unshift(n);for(;l[o]===c[o];)o++;return o?s(l[o],c[o]):l[o]===P?-1:c[o]===P?1:0},i):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&j(e),n=n.replace(de,"='$1']"),!(!x.matchesSelector||!I||R&&R.test(n)||B&&B.test(n)))try{var i=H.call(e,n);if(i||x.disconnectedMatch||e.document&&11!==e.document.nodeType)return i}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&j(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&j(e);var n=w.attrHandle[t.toLowerCase()],i=n&&X.call(w.attrHandle,t.toLowerCase())?n(e,t,!I):void 0;return void 0!==i?i:x.attributes||!I?e.getAttribute(t):(i=e.getAttributeNode(t))&&i.specified?i.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],i=0,o=0;if($=!x.detectDuplicates,D=!x.sortStable&&e.slice(0),e.sort(Q),$){for(;t=e[o++];)t===e[o]&&(i=n.push(o));for(;i--;)e.splice(n[i],1)}return D=null,e},C=t.getText=function(e){var t,n="",i=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[i++];)n+=C(t);return n},w=t.selectors={cacheLength:50,createPseudo:i,match:he,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xe,we),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),
+e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(xe,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=_[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&_(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,i){return function(o){var r=t.attr(o,e);return null==r?"!="===n:!n||(r+="","="===n?r===i:"!="===n?r!==i:"^="===n?i&&0===r.indexOf(i):"*="===n?i&&r.indexOf(i)>-1:"$="===n?i&&r.slice(-i.length)===i:"~="===n?(" "+r.replace(ae," ")+" ").indexOf(i)>-1:"|="===n&&(r===i||r.slice(0,i.length+1)===i+"-"))}},CHILD:function(e,t,n,i,o){var r="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===i&&0===o?function(e){return!!e.parentNode}:function(t,n,l){var c,u,d,f,p,h,g=r!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!l&&!a;if(m){if(r){for(;g;){for(d=t;d=d[g];)if(a?d.nodeName.toLowerCase()===v:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[s?m.firstChild:m.lastChild],s&&y){for(u=m[F]||(m[F]={}),c=u[e]||[],p=c[0]===z&&c[1],f=c[0]===z&&c[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(f=p=0)||h.pop();)if(1===d.nodeType&&++f&&d===t){u[e]=[z,p,f];break}}else if(y&&(c=(t[F]||(t[F]={}))[e])&&c[0]===z)f=c[1];else for(;(d=++p&&d&&d[g]||(f=p=0)||h.pop())&&((a?d.nodeName.toLowerCase()!==v:1!==d.nodeType)||!++f||(y&&((d[F]||(d[F]={}))[e]=[z,f]),d!==t)););return f-=o,f===i||f%i===0&&f/i>=0}}},PSEUDO:function(e,n){var o,r=w.pseudos[e]||w.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return r[F]?r(n):r.length>1?(o=[e,e,"",n],w.setFilters.hasOwnProperty(e.toLowerCase())?i(function(e,t){for(var i,o=r(e,n),s=o.length;s--;)i=ee(e,o[s]),e[i]=!(t[i]=o[s])}):function(e){return r(e,0,o)}):r}},pseudos:{not:i(function(e){var t=[],n=[],o=S(e.replace(le,"$1"));return o[F]?i(function(e,t,n,i){for(var r,s=o(e,null,i,[]),a=e.length;a--;)(r=s[a])&&(e[a]=!(t[a]=r))}):function(e,i,r){return t[0]=e,o(t,null,r,n),t[0]=null,!n.pop()}}),has:i(function(e){return function(n){return t(e,n).length>0}}),contains:i(function(e){return e=e.replace(xe,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:i(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(xe,we).toLowerCase(),function(t){var n;do if(n=I?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===O},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!w.pseudos.empty(e)},header:function(e){return me.test(e.nodeName)},input:function(e){return ge.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:c(function(){return[0]}),last:c(function(e,t){return[t-1]}),eq:c(function(e,t,n){return[0>n?n+t:n]}),even:c(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:c(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:c(function(e,t,n){for(var i=0>n?n+t:n;--i>=0;)e.push(i);return e}),gt:c(function(e,t,n){for(var i=0>n?n+t:n;++i2&&"ID"===(s=r[0]).type&&x.getById&&9===t.nodeType&&I&&w.relative[r[1].type]){if(t=(w.find.ID(s.matches[0].replace(xe,we),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(r.shift().value.length)}for(o=he.needsContext.test(e)?0:r.length;o--&&(s=r[o],!w.relative[a=s.type]);)if((l=w.find[a])&&(i=l(s.matches[0].replace(xe,we),be.test(r[0].type)&&u(t.parentNode)||t))){if(r.splice(o,1),e=i.length&&f(r),!e)return J.apply(n,i),n;break}}return(c||S(e,d))(i,t,!I,n,be.test(e)&&u(t.parentNode)||t),n},x.sortStable=F.split("").sort(Q).join("")===F,x.detectDuplicates=!!$,j(),x.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement("div"))}),o(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||r("type|href|height|width",function(e,t,n){return n?void 0:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),x.attributes&&o(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||r("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?void 0:e.defaultValue}),o(function(e){return null==e.getAttribute("disabled")})||r(te,function(e,t,n){var i;return n?void 0:e[t]===!0?t.toLowerCase():(i=e.getAttributeNode(t))&&i.specified?i.value:null}),t}(e);oe.find=ce,oe.expr=ce.selectors,oe.expr[":"]=oe.expr.pseudos,oe.unique=ce.uniqueSort,oe.text=ce.getText,oe.isXMLDoc=ce.isXML,oe.contains=ce.contains;var ue=oe.expr.match.needsContext,de=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,fe=/^.[^:#\[\.,]*$/;oe.filter=function(e,t,n){var i=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===i.nodeType?oe.find.matchesSelector(i,e)?[i]:[]:oe.find.matches(e,oe.grep(t,function(e){return 1===e.nodeType}))},oe.fn.extend({find:function(e){var t,n=[],i=this,o=i.length;if("string"!=typeof e)return this.pushStack(oe(e).filter(function(){for(t=0;o>t;t++)if(oe.contains(i[t],this))return!0}));for(t=0;o>t;t++)oe.find(e,i[t],n);return n=this.pushStack(o>1?oe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(i(this,e||[],!1))},not:function(e){return this.pushStack(i(this,e||[],!0))},is:function(e){return!!i(this,"string"==typeof e&&ue.test(e)?oe(e):e||[],!1).length}});var pe,he=e.document,ge=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,me=oe.fn.init=function(e,t){var n,i;if(!e)return this;if("string"==typeof e){if(n="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:ge.exec(e),!n||!n[1]&&t)return!t||t.jquery?(t||pe).find(e):this.constructor(t).find(e);if(n[1]){if(t=t instanceof oe?t[0]:t,oe.merge(this,oe.parseHTML(n[1],t&&t.nodeType?t.ownerDocument||t:he,!0)),de.test(n[1])&&oe.isPlainObject(t))for(n in t)oe.isFunction(this[n])?this[n](t[n]):this.attr(n,t[n]);return this}if(i=he.getElementById(n[2]),i&&i.parentNode){if(i.id!==n[2])return pe.find(e);this.length=1,this[0]=i}return this.context=he,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):oe.isFunction(e)?"undefined"!=typeof pe.ready?pe.ready(e):e(oe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),oe.makeArray(e,this))};me.prototype=oe.fn,pe=oe(he);var ve=/^(?:parents|prev(?:Until|All))/,ye={children:!0,contents:!0,next:!0,prev:!0};oe.extend({dir:function(e,t,n){for(var i=[],o=e[t];o&&9!==o.nodeType&&(void 0===n||1!==o.nodeType||!oe(o).is(n));)1===o.nodeType&&i.push(o),o=o[t];return i},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}}),oe.fn.extend({has:function(e){var t,n=oe(e,this),i=n.length;return this.filter(function(){for(t=0;i>t;t++)if(oe.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,i=0,o=this.length,r=[],s=ue.test(e)||"string"!=typeof e?oe(e,t||this.context):0;o>i;i++)for(n=this[i];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(s?s.index(n)>-1:1===n.nodeType&&oe.find.matchesSelector(n,e))){r.push(n);break}return this.pushStack(r.length>1?oe.unique(r):r)},index:function(e){return e?"string"==typeof e?oe.inArray(this[0],oe(e)):oe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(oe.unique(oe.merge(this.get(),oe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),oe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return oe.dir(e,"parentNode")},parentsUntil:function(e,t,n){return oe.dir(e,"parentNode",n)},next:function(e){return o(e,"nextSibling")},prev:function(e){return o(e,"previousSibling")},nextAll:function(e){return oe.dir(e,"nextSibling")},prevAll:function(e){return oe.dir(e,"previousSibling")},nextUntil:function(e,t,n){return oe.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return oe.dir(e,"previousSibling",n)},siblings:function(e){return oe.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return oe.sibling(e.firstChild)},contents:function(e){return oe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:oe.merge([],e.childNodes)}},function(e,t){oe.fn[e]=function(n,i){var o=oe.map(this,t,n);return"Until"!==e.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=oe.filter(i,o)),this.length>1&&(ye[e]||(o=oe.unique(o)),ve.test(e)&&(o=o.reverse())),this.pushStack(o)}});var be=/\S+/g,Ae={};oe.Callbacks=function(e){e="string"==typeof e?Ae[e]||r(e):oe.extend({},e);var t,n,i,o,s,a,l=[],c=!e.once&&[],u=function(r){for(n=e.memory&&r,i=!0,s=a||0,a=0,o=l.length,t=!0;l&&o>s;s++)if(l[s].apply(r[0],r[1])===!1&&e.stopOnFalse){n=!1;break}t=!1,l&&(c?c.length&&u(c.shift()):n?l=[]:d.disable())},d={add:function(){if(l){var i=l.length;!function t(n){oe.each(n,function(n,i){var o=oe.type(i);"function"===o?e.unique&&d.has(i)||l.push(i):i&&i.length&&"string"!==o&&t(i)})}(arguments),t?o=l.length:n&&(a=i,u(n))}return this},remove:function(){return l&&oe.each(arguments,function(e,n){for(var i;(i=oe.inArray(n,l,i))>-1;)l.splice(i,1),t&&(o>=i&&o--,s>=i&&s--)}),this},has:function(e){return e?oe.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=c=n=void 0,this},disabled:function(){return!l},lock:function(){return c=void 0,n||d.disable(),this},locked:function(){return!c},fireWith:function(e,n){return!l||i&&!c||(n=n||[],n=[e,n.slice?n.slice():n],t?c.push(n):u(n)),this},fire:function(){return d.fireWith(this,arguments),this},fired:function(){return!!i}};return d},oe.extend({Deferred:function(e){var t=[["resolve","done",oe.Callbacks("once memory"),"resolved"],["reject","fail",oe.Callbacks("once memory"),"rejected"],["notify","progress",oe.Callbacks("memory")]],n="pending",i={state:function(){return n},always:function(){return o.done(arguments).fail(arguments),this},then:function(){var e=arguments;return oe.Deferred(function(n){oe.each(t,function(t,r){var s=oe.isFunction(e[t])&&e[t];o[r[1]](function(){var e=s&&s.apply(this,arguments);e&&oe.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[r[0]+"With"](this===i?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?oe.extend(e,i):i}},o={};return i.pipe=i.then,oe.each(t,function(e,r){var s=r[2],a=r[3];i[r[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),o[r[0]]=function(){return o[r[0]+"With"](this===o?i:this,arguments),this},o[r[0]+"With"]=s.fireWith}),i.promise(o),e&&e.call(o,o),o},when:function(e){var t,n,i,o=0,r=V.call(arguments),s=r.length,a=1!==s||e&&oe.isFunction(e.promise)?s:0,l=1===a?e:oe.Deferred(),c=function(e,n,i){return function(o){n[e]=this,i[e]=arguments.length>1?V.call(arguments):o,i===t?l.notifyWith(n,i):--a||l.resolveWith(n,i)}};if(s>1)for(t=new Array(s),n=new Array(s),i=new Array(s);s>o;o++)r[o]&&oe.isFunction(r[o].promise)?r[o].promise().done(c(o,i,r)).fail(l.reject).progress(c(o,n,t)):--a;return a||l.resolveWith(i,r),l.promise()}});var xe;oe.fn.ready=function(e){return oe.ready.promise().done(e),this},oe.extend({isReady:!1,readyWait:1,holdReady:function(e){e?oe.readyWait++:oe.ready(!0)},ready:function(e){if(e===!0?!--oe.readyWait:!oe.isReady){if(!he.body)return setTimeout(oe.ready);oe.isReady=!0,e!==!0&&--oe.readyWait>0||(xe.resolveWith(he,[oe]),oe.fn.triggerHandler&&(oe(he).triggerHandler("ready"),oe(he).off("ready")))}}}),oe.ready.promise=function(t){if(!xe)if(xe=oe.Deferred(),"complete"===he.readyState)setTimeout(oe.ready);else if(he.addEventListener)he.addEventListener("DOMContentLoaded",a,!1),e.addEventListener("load",a,!1);else{he.attachEvent("onreadystatechange",a),e.attachEvent("onload",a);var n=!1;try{n=null==e.frameElement&&he.documentElement}catch(e){}n&&n.doScroll&&!function e(){if(!oe.isReady){try{n.doScroll("left")}catch(t){return setTimeout(e,50)}s(),oe.ready()}}()}return xe.promise(t)};var we,Ce="undefined";for(we in oe(ne))break;ne.ownLast="0"!==we,ne.inlineBlockNeedsLayout=!1,oe(function(){var e,t,n,i;n=he.getElementsByTagName("body")[0],n&&n.style&&(t=he.createElement("div"),i=he.createElement("div"),i.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(i).appendChild(t),typeof t.style.zoom!==Ce&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",ne.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(i))}),function(){var e=he.createElement("div");if(null==ne.deleteExpando){ne.deleteExpando=!0;try{delete e.test}catch(e){ne.deleteExpando=!1}}e=null}(),oe.acceptData=function(e){var t=oe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)};var Te=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Ee=/([A-Z])/g;oe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?oe.cache[e[oe.expando]]:e[oe.expando],!!e&&!c(e)},data:function(e,t,n){return u(e,t,n)},removeData:function(e,t){return d(e,t)},_data:function(e,t,n){return u(e,t,n,!0)},_removeData:function(e,t){return d(e,t,!0)}}),oe.fn.extend({data:function(e,t){var n,i,o,r=this[0],s=r&&r.attributes;if(void 0===e){if(this.length&&(o=oe.data(r),1===r.nodeType&&!oe._data(r,"parsedAttrs"))){for(n=s.length;n--;)s[n]&&(i=s[n].name,0===i.indexOf("data-")&&(i=oe.camelCase(i.slice(5)),l(r,i,o[i])));oe._data(r,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){oe.data(this,e)}):arguments.length>1?this.each(function(){oe.data(this,e,t)}):r?l(r,e,oe.data(r,e)):void 0},removeData:function(e){return this.each(function(){oe.removeData(this,e)})}}),oe.extend({queue:function(e,t,n){var i;return e?(t=(t||"fx")+"queue",i=oe._data(e,t),n&&(!i||oe.isArray(n)?i=oe._data(e,t,oe.makeArray(n)):i.push(n)),i||[]):void 0},dequeue:function(e,t){t=t||"fx";var n=oe.queue(e,t),i=n.length,o=n.shift(),r=oe._queueHooks(e,t),s=function(){oe.dequeue(e,t)};"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===t&&n.unshift("inprogress"),delete r.stop,o.call(e,s,r)),!i&&r&&r.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return oe._data(e,n)||oe._data(e,n,{empty:oe.Callbacks("once memory").add(function(){oe._removeData(e,t+"queue"),oe._removeData(e,n)})})}}),oe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.lengtha;a++)t(e[a],n,s?i:i.call(e[a],a,t(e[a],n)));return o?e:c?t.call(e):l?t(e[0],n):r},$e=/^(?:checkbox|radio)$/i;!function(){var e=he.createElement("input"),t=he.createElement("div"),n=he.createDocumentFragment();if(t.innerHTML=" a",ne.leadingWhitespace=3===t.firstChild.nodeType,ne.tbody=!t.getElementsByTagName("tbody").length,ne.htmlSerialize=!!t.getElementsByTagName("link").length,ne.html5Clone="<:nav>"!==he.createElement("nav").cloneNode(!0).outerHTML,e.type="checkbox",e.checked=!0,n.appendChild(e),ne.appendChecked=e.checked,t.innerHTML="",ne.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue,n.appendChild(t),t.innerHTML="",ne.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,ne.noCloneEvent=!0,t.attachEvent&&(t.attachEvent("onclick",function(){ne.noCloneEvent=!1}),t.cloneNode(!0).click()),null==ne.deleteExpando){ne.deleteExpando=!0;try{delete t.test}catch(e){ne.deleteExpando=!1}}}(),function(){var t,n,i=he.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(ne[t+"Bubbles"]=n in e)||(i.setAttribute(n,"t"),ne[t+"Bubbles"]=i.attributes[n].expando===!1);i=null}();var je=/^(?:input|select|textarea)$/i,Le=/^key/,Oe=/^(?:mouse|pointer|contextmenu)|click/,Ie=/^(?:focusinfocus|focusoutblur)$/,Be=/^([^.]*)(?:\.(.+)|)$/;oe.event={global:{},add:function(e,t,n,i,o){var r,s,a,l,c,u,d,f,p,h,g,m=oe._data(e);if(m){for(n.handler&&(l=n,n=l.handler,o=l.selector),n.guid||(n.guid=oe.guid++),(s=m.events)||(s=m.events={}),(u=m.handle)||(u=m.handle=function(e){return typeof oe===Ce||e&&oe.event.triggered===e.type?void 0:oe.event.dispatch.apply(u.elem,arguments)},u.elem=e),t=(t||"").match(be)||[""],a=t.length;a--;)r=Be.exec(t[a])||[],p=g=r[1],h=(r[2]||"").split(".").sort(),p&&(c=oe.event.special[p]||{},p=(o?c.delegateType:c.bindType)||p,c=oe.event.special[p]||{},d=oe.extend({type:p,origType:g,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&oe.expr.match.needsContext.test(o),namespace:h.join(".")},l),(f=s[p])||(f=s[p]=[],f.delegateCount=0,c.setup&&c.setup.call(e,i,h,u)!==!1||(e.addEventListener?e.addEventListener(p,u,!1):e.attachEvent&&e.attachEvent("on"+p,u))),c.add&&(c.add.call(e,d),d.handler.guid||(d.handler.guid=n.guid)),o?f.splice(f.delegateCount++,0,d):f.push(d),oe.event.global[p]=!0);e=null}},remove:function(e,t,n,i,o){var r,s,a,l,c,u,d,f,p,h,g,m=oe.hasData(e)&&oe._data(e);if(m&&(u=m.events)){for(t=(t||"").match(be)||[""],c=t.length;c--;)if(a=Be.exec(t[c])||[],p=g=a[1],h=(a[2]||"").split(".").sort(),p){for(d=oe.event.special[p]||{},p=(i?d.delegateType:d.bindType)||p,f=u[p]||[],a=a[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=r=f.length;r--;)s=f[r],!o&&g!==s.origType||n&&n.guid!==s.guid||a&&!a.test(s.namespace)||i&&i!==s.selector&&("**"!==i||!s.selector)||(f.splice(r,1),s.selector&&f.delegateCount--,d.remove&&d.remove.call(e,s));l&&!f.length&&(d.teardown&&d.teardown.call(e,h,m.handle)!==!1||oe.removeEvent(e,p,m.handle),delete u[p])}else for(p in u)oe.event.remove(e,p+t[c],n,i,!0);oe.isEmptyObject(u)&&(delete m.handle,oe._removeData(e,"events"))}},trigger:function(t,n,i,o){var r,s,a,l,c,u,d,f=[i||he],p=te.call(t,"type")?t.type:t,h=te.call(t,"namespace")?t.namespace.split("."):[];if(a=u=i=i||he,3!==i.nodeType&&8!==i.nodeType&&!Ie.test(p+oe.event.triggered)&&(p.indexOf(".")>=0&&(h=p.split("."),p=h.shift(),h.sort()),s=p.indexOf(":")<0&&"on"+p,t=t[oe.expando]?t:new oe.Event(p,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=h.join("."),t.namespace_re=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:oe.makeArray(n,[t]),c=oe.event.special[p]||{},o||!c.trigger||c.trigger.apply(i,n)!==!1)){if(!o&&!c.noBubble&&!oe.isWindow(i)){for(l=c.delegateType||p,Ie.test(l+p)||(a=a.parentNode);a;a=a.parentNode)f.push(a),u=a;u===(i.ownerDocument||he)&&f.push(u.defaultView||u.parentWindow||e)}for(d=0;(a=f[d++])&&!t.isPropagationStopped();)t.type=d>1?l:c.bindType||p,r=(oe._data(a,"events")||{})[t.type]&&oe._data(a,"handle"),r&&r.apply(a,n),r=s&&a[s],r&&r.apply&&oe.acceptData(a)&&(t.result=r.apply(a,n),t.result===!1&&t.preventDefault());if(t.type=p,!o&&!t.isDefaultPrevented()&&(!c._default||c._default.apply(f.pop(),n)===!1)&&oe.acceptData(i)&&s&&i[p]&&!oe.isWindow(i)){u=i[s],u&&(i[s]=null),oe.event.triggered=p;try{i[p]()}catch(e){}oe.event.triggered=void 0,u&&(i[s]=u)}return t.result}},dispatch:function(e){e=oe.event.fix(e);var t,n,i,o,r,s=[],a=V.call(arguments),l=(oe._data(this,"events")||{})[e.type]||[],c=oe.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){for(s=oe.event.handlers.call(this,e,l),t=0;(o=s[t++])&&!e.isPropagationStopped();)for(e.currentTarget=o.elem,r=0;(i=o.handlers[r++])&&!e.isImmediatePropagationStopped();)(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,n=((oe.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,a),void 0!==n&&(e.result=n)===!1&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,i,o,r,s=[],a=t.delegateCount,l=e.target;if(a&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],r=0;a>r;r++)i=t[r],n=i.selector+" ",void 0===o[n]&&(o[n]=i.needsContext?oe(n,this).index(l)>=0:oe.find(n,this,null,[l]).length),o[n]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return a]","i"),Fe=/^\s+/,Pe=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ze=/<([\w:]+)/,qe=/\s*$/g,Ve={option:[1,""],legend:[1,""],area:[1,""],param:[1,""],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:ne.htmlSerialize?[0,"",""]:[1,"X","
"]},Ye=g(he),Ze=Ye.appendChild(he.createElement("div"));Ve.optgroup=Ve.option,Ve.tbody=Ve.tfoot=Ve.colgroup=Ve.caption=Ve.thead,Ve.th=Ve.td,oe.extend({clone:function(e,t,n){var i,o,r,s,a,l=oe.contains(e.ownerDocument,e);if(ne.html5Clone||oe.isXMLDoc(e)||!Me.test("<"+e.nodeName+">")?r=e.cloneNode(!0):(Ze.innerHTML=e.outerHTML,Ze.removeChild(r=Ze.firstChild)),!(ne.noCloneEvent&&ne.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||oe.isXMLDoc(e)))for(i=m(r),a=m(e),s=0;null!=(o=a[s]);++s)i[s]&&C(o,i[s]);if(t)if(n)for(a=a||m(e),i=i||m(r),s=0;null!=(o=a[s]);s++)w(o,i[s]);else w(e,r);return i=m(r,"script"),i.length>0&&x(i,!l&&m(e,"script")),i=a=o=null,r},buildFragment:function(e,t,n,i){for(var o,r,s,a,l,c,u,d=e.length,f=g(t),p=[],h=0;d>h;h++)if(r=e[h],r||0===r)if("object"===oe.type(r))oe.merge(p,r.nodeType?[r]:r);else if(_e.test(r)){for(a=a||f.appendChild(t.createElement("div")),l=(ze.exec(r)||["",""])[1].toLowerCase(),u=Ve[l]||Ve._default,a.innerHTML=u[1]+r.replace(Pe,"<$1>$2>")+u[2],o=u[0];o--;)a=a.lastChild;if(!ne.leadingWhitespace&&Fe.test(r)&&p.push(t.createTextNode(Fe.exec(r)[0])),!ne.tbody)for(r="table"!==l||qe.test(r)?""!==u[1]||qe.test(r)?0:a:a.firstChild,o=r&&r.childNodes.length;o--;)oe.nodeName(c=r.childNodes[o],"tbody")&&!c.childNodes.length&&r.removeChild(c);for(oe.merge(p,a.childNodes),a.textContent="";a.firstChild;)a.removeChild(a.firstChild);a=f.lastChild}else p.push(t.createTextNode(r));for(a&&f.removeChild(a),
+ne.appendChecked||oe.grep(m(p,"input"),v),h=0;r=p[h++];)if((!i||-1===oe.inArray(r,i))&&(s=oe.contains(r.ownerDocument,r),a=m(f.appendChild(r),"script"),s&&x(a),n))for(o=0;r=a[o++];)Qe.test(r.type||"")&&n.push(r);return a=null,f},cleanData:function(e,t){for(var n,i,o,r,s=0,a=oe.expando,l=oe.cache,c=ne.deleteExpando,u=oe.event.special;null!=(n=e[s]);s++)if((t||oe.acceptData(n))&&(o=n[a],r=o&&l[o])){if(r.events)for(i in r.events)u[i]?oe.event.remove(n,i):oe.removeEvent(n,i,r.handle);l[o]&&(delete l[o],c?delete n[a]:typeof n.removeAttribute!==Ce?n.removeAttribute(a):n[a]=null,X.push(o))}}}),oe.fn.extend({text:function(e){return De(this,function(e){return void 0===e?oe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||he).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=y(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=y(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){for(var n,i=e?oe.filter(e,this):this,o=0;null!=(n=i[o]);o++)t||1!==n.nodeType||oe.cleanData(m(n)),n.parentNode&&(t&&oe.contains(n.ownerDocument,n)&&x(m(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&oe.cleanData(m(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&oe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return oe.clone(this,e,t)})},html:function(e){return De(this,function(e){var t=this[0]||{},n=0,i=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(He,""):void 0;if(!("string"!=typeof e||We.test(e)||!ne.htmlSerialize&&Me.test(e)||!ne.leadingWhitespace&&Fe.test(e)||Ve[(ze.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(Pe,"<$1>$2>");try{for(;i>n;n++)t=this[n]||{},1===t.nodeType&&(oe.cleanData(m(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=arguments[0];return this.domManip(arguments,function(t){e=this.parentNode,oe.cleanData(m(this)),e&&e.replaceChild(t,this)}),e&&(e.length||e.nodeType)?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t){e=Y.apply([],e);var n,i,o,r,s,a,l=0,c=this.length,u=this,d=c-1,f=e[0],p=oe.isFunction(f);if(p||c>1&&"string"==typeof f&&!ne.checkClone&&Ue.test(f))return this.each(function(n){var i=u.eq(n);p&&(e[0]=f.call(this,n,i.html())),i.domManip(e,t)});if(c&&(a=oe.buildFragment(e,this[0].ownerDocument,!1,this),n=a.firstChild,1===a.childNodes.length&&(a=n),n)){for(r=oe.map(m(a,"script"),b),o=r.length;c>l;l++)i=a,l!==d&&(i=oe.clone(i,!0,!0),o&&oe.merge(r,m(i,"script"))),t.call(this[l],i,l);if(o)for(s=r[r.length-1].ownerDocument,oe.map(r,A),l=0;o>l;l++)i=r[l],Qe.test(i.type||"")&&!oe._data(i,"globalEval")&&oe.contains(s,i)&&(i.src?oe._evalUrl&&oe._evalUrl(i.src):oe.globalEval((i.text||i.textContent||i.innerHTML||"").replace(Xe,"")));a=n=null}return this}}),oe.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){oe.fn[e]=function(e){for(var n,i=0,o=[],r=oe(e),s=r.length-1;s>=i;i++)n=i===s?this:this.clone(!0),oe(r[i])[t](n),Z.apply(o,n.get());return this.pushStack(o)}});var Je,Ke={};!function(){var e;ne.shrinkWrapBlocks=function(){if(null!=e)return e;e=!1;var t,n,i;return n=he.getElementsByTagName("body")[0],n&&n.style?(t=he.createElement("div"),i=he.createElement("div"),i.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(i).appendChild(t),typeof t.style.zoom!==Ce&&(t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",t.appendChild(he.createElement("div")).style.width="5px",e=3!==t.offsetWidth),n.removeChild(i),e):void 0}}();var et,tt,nt=/^margin/,it=new RegExp("^("+Se+")(?!px)[a-z%]+$","i"),ot=/^(top|right|bottom|left)$/;e.getComputedStyle?(et=function(t){return t.ownerDocument.defaultView.opener?t.ownerDocument.defaultView.getComputedStyle(t,null):e.getComputedStyle(t,null)},tt=function(e,t,n){var i,o,r,s,a=e.style;return n=n||et(e),s=n?n.getPropertyValue(t)||n[t]:void 0,n&&(""!==s||oe.contains(e.ownerDocument,e)||(s=oe.style(e,t)),it.test(s)&&nt.test(t)&&(i=a.width,o=a.minWidth,r=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=i,a.minWidth=o,a.maxWidth=r)),void 0===s?s:s+""}):he.documentElement.currentStyle&&(et=function(e){return e.currentStyle},tt=function(e,t,n){var i,o,r,s,a=e.style;return n=n||et(e),s=n?n[t]:void 0,null==s&&a&&a[t]&&(s=a[t]),it.test(s)&&!ot.test(t)&&(i=a.left,o=e.runtimeStyle,r=o&&o.left,r&&(o.left=e.currentStyle.left),a.left="fontSize"===t?"1em":s,s=a.pixelLeft+"px",a.left=i,r&&(o.left=r)),void 0===s?s:s+""||"auto"}),!function(){function t(){var t,n,i,o;n=he.getElementsByTagName("body")[0],n&&n.style&&(t=he.createElement("div"),i=he.createElement("div"),i.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(i).appendChild(t),t.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",r=s=!1,l=!0,e.getComputedStyle&&(r="1%"!==(e.getComputedStyle(t,null)||{}).top,s="4px"===(e.getComputedStyle(t,null)||{width:"4px"}).width,o=t.appendChild(he.createElement("div")),o.style.cssText=t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",o.style.marginRight=o.style.width="0",t.style.width="1px",l=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight),t.removeChild(o)),t.innerHTML="",o=t.getElementsByTagName("td"),o[0].style.cssText="margin:0;border:0;padding:0;display:none",a=0===o[0].offsetHeight,a&&(o[0].style.display="",o[1].style.display="none",a=0===o[0].offsetHeight),n.removeChild(i))}var n,i,o,r,s,a,l;n=he.createElement("div"),n.innerHTML=" a",o=n.getElementsByTagName("a")[0],(i=o&&o.style)&&(i.cssText="float:left;opacity:.5",ne.opacity="0.5"===i.opacity,ne.cssFloat=!!i.cssFloat,n.style.backgroundClip="content-box",n.cloneNode(!0).style.backgroundClip="",ne.clearCloneStyle="content-box"===n.style.backgroundClip,ne.boxSizing=""===i.boxSizing||""===i.MozBoxSizing||""===i.WebkitBoxSizing,oe.extend(ne,{reliableHiddenOffsets:function(){return null==a&&t(),a},boxSizingReliable:function(){return null==s&&t(),s},pixelPosition:function(){return null==r&&t(),r},reliableMarginRight:function(){return null==l&&t(),l}}))}(),oe.swap=function(e,t,n,i){var o,r,s={};for(r in t)s[r]=e.style[r],e.style[r]=t[r];o=n.apply(e,i||[]);for(r in t)e.style[r]=s[r];return o};var rt=/alpha\([^)]*\)/i,st=/opacity\s*=\s*([^)]*)/,at=/^(none|table(?!-c[ea]).+)/,lt=new RegExp("^("+Se+")(.*)$","i"),ct=new RegExp("^([+-])=("+Se+")","i"),ut={position:"absolute",visibility:"hidden",display:"block"},dt={letterSpacing:"0",fontWeight:"400"},ft=["Webkit","O","Moz","ms"];oe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=tt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:ne.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,r,s,a=oe.camelCase(t),l=e.style;if(t=oe.cssProps[a]||(oe.cssProps[a]=k(l,a)),s=oe.cssHooks[t]||oe.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(e,!1,i))?o:l[t];if(r=typeof n,"string"===r&&(o=ct.exec(n))&&(n=(o[1]+1)*o[2]+parseFloat(oe.css(e,t)),r="number"),null!=n&&n===n&&("number"!==r||oe.cssNumber[a]||(n+="px"),ne.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),!(s&&"set"in s&&void 0===(n=s.set(e,n,i)))))try{l[t]=n}catch(e){}}},css:function(e,t,n,i){var o,r,s,a=oe.camelCase(t);return t=oe.cssProps[a]||(oe.cssProps[a]=k(e.style,a)),s=oe.cssHooks[t]||oe.cssHooks[a],s&&"get"in s&&(r=s.get(e,!0,n)),void 0===r&&(r=tt(e,t,i)),"normal"===r&&t in dt&&(r=dt[t]),""===n||n?(o=parseFloat(r),n===!0||oe.isNumeric(o)?o||0:r):r}}),oe.each(["height","width"],function(e,t){oe.cssHooks[t]={get:function(e,n,i){return n?at.test(oe.css(e,"display"))&&0===e.offsetWidth?oe.swap(e,ut,function(){return j(e,t,i)}):j(e,t,i):void 0},set:function(e,n,i){var o=i&&et(e);return D(e,n,i?$(e,t,i,ne.boxSizing&&"border-box"===oe.css(e,"boxSizing",!1,o),o):0)}}}),ne.opacity||(oe.cssHooks.opacity={get:function(e,t){return st.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,i=e.currentStyle,o=oe.isNumeric(t)?"alpha(opacity="+100*t+")":"",r=i&&i.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===oe.trim(r.replace(rt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||i&&!i.filter)||(n.filter=rt.test(r)?r.replace(rt,o):r+" "+o)}}),oe.cssHooks.marginRight=S(ne.reliableMarginRight,function(e,t){return t?oe.swap(e,{display:"inline-block"},tt,[e,"marginRight"]):void 0}),oe.each({margin:"",padding:"",border:"Width"},function(e,t){oe.cssHooks[e+t]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];4>i;i++)o[e+ke[i]+t]=r[i]||r[i-2]||r[0];return o}},nt.test(e)||(oe.cssHooks[e+t].set=D)}),oe.fn.extend({css:function(e,t){return De(this,function(e,t,n){var i,o,r={},s=0;if(oe.isArray(t)){for(i=et(e),o=t.length;o>s;s++)r[t[s]]=oe.css(e,t[s],!1,i);return r}return void 0!==n?oe.style(e,t,n):oe.css(e,t)},e,t,arguments.length>1)},show:function(){return N(this,!0)},hide:function(){return N(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Ne(this)?oe(this).show():oe(this).hide()})}}),oe.Tween=L,L.prototype={constructor:L,init:function(e,t,n,i,o,r){this.elem=e,this.prop=n,this.easing=o||"swing",this.options=t,this.start=this.now=this.cur(),this.end=i,this.unit=r||(oe.cssNumber[n]?"":"px")},cur:function(){var e=L.propHooks[this.prop];return e&&e.get?e.get(this):L.propHooks._default.get(this)},run:function(e){var t,n=L.propHooks[this.prop];return this.options.duration?this.pos=t=oe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):L.propHooks._default.set(this),this}},L.prototype.init.prototype=L.prototype,L.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=oe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){oe.fx.step[e.prop]?oe.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[oe.cssProps[e.prop]]||oe.cssHooks[e.prop])?oe.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},L.propHooks.scrollTop=L.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},oe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},oe.fx=L.prototype.init,oe.fx.step={};var pt,ht,gt=/^(?:toggle|show|hide)$/,mt=new RegExp("^(?:([+-])=|)("+Se+")([a-z%]*)$","i"),vt=/queueHooks$/,yt=[R],bt={"*":[function(e,t){var n=this.createTween(e,t),i=n.cur(),o=mt.exec(t),r=o&&o[3]||(oe.cssNumber[e]?"":"px"),s=(oe.cssNumber[e]||"px"!==r&&+i)&&mt.exec(oe.css(n.elem,e)),a=1,l=20;if(s&&s[3]!==r){r=r||s[3],o=o||[],s=+i||1;do a=a||".5",s/=a,oe.style(n.elem,e,s+r);while(a!==(a=n.cur()/i)&&1!==a&&--l)}return o&&(s=n.start=+s||+i||0,n.unit=r,n.end=o[1]?s+(o[1]+1)*o[2]:+o[2]),n}]};oe.Animation=oe.extend(M,{tweener:function(e,t){oe.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,i=0,o=e.length;o>i;i++)n=e[i],bt[n]=bt[n]||[],bt[n].unshift(t)},prefilter:function(e,t){t?yt.unshift(e):yt.push(e)}}),oe.speed=function(e,t,n){var i=e&&"object"==typeof e?oe.extend({},e):{complete:n||!n&&t||oe.isFunction(e)&&e,duration:e,easing:n&&t||t&&!oe.isFunction(t)&&t};return i.duration=oe.fx.off?0:"number"==typeof i.duration?i.duration:i.duration in oe.fx.speeds?oe.fx.speeds[i.duration]:oe.fx.speeds._default,(null==i.queue||i.queue===!0)&&(i.queue="fx"),i.old=i.complete,i.complete=function(){oe.isFunction(i.old)&&i.old.call(this),i.queue&&oe.dequeue(this,i.queue)},i},oe.fn.extend({fadeTo:function(e,t,n,i){return this.filter(Ne).css("opacity",0).show().end().animate({opacity:t},e,n,i)},animate:function(e,t,n,i){var o=oe.isEmptyObject(e),r=oe.speed(t,n,i),s=function(){var t=M(this,oe.extend({},e),r);(o||oe._data(this,"finish"))&&t.stop(!0)};return s.finish=s,o||r.queue===!1?this.each(s):this.queue(r.queue,s)},stop:function(e,t,n){var i=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,o=null!=e&&e+"queueHooks",r=oe.timers,s=oe._data(this);if(o)s[o]&&s[o].stop&&i(s[o]);else for(o in s)s[o]&&s[o].stop&&vt.test(o)&&i(s[o]);for(o=r.length;o--;)r[o].elem!==this||null!=e&&r[o].queue!==e||(r[o].anim.stop(n),t=!1,r.splice(o,1));(t||!n)&&oe.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=oe._data(this),i=n[e+"queue"],o=n[e+"queueHooks"],r=oe.timers,s=i?i.length:0;for(n.finish=!0,oe.queue(this,e,[]),o&&o.stop&&o.stop.call(this,!0),t=r.length;t--;)r[t].elem===this&&r[t].queue===e&&(r[t].anim.stop(!0),r.splice(t,1));for(t=0;s>t;t++)i[t]&&i[t].finish&&i[t].finish.call(this);delete n.finish})}}),oe.each(["toggle","show","hide"],function(e,t){var n=oe.fn[t];oe.fn[t]=function(e,i,o){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(I(t,!0),e,i,o)}}),oe.each({slideDown:I("show"),slideUp:I("hide"),slideToggle:I("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){oe.fn[e]=function(e,n,i){return this.animate(t,e,n,i)}}),oe.timers=[],oe.fx.tick=function(){var e,t=oe.timers,n=0;for(pt=oe.now();na",i=t.getElementsByTagName("a")[0],n=he.createElement("select"),o=n.appendChild(he.createElement("option")),e=t.getElementsByTagName("input")[0],i.style.cssText="top:1px",ne.getSetAttribute="t"!==t.className,ne.style=/top/.test(i.getAttribute("style")),ne.hrefNormalized="/a"===i.getAttribute("href"),ne.checkOn=!!e.value,ne.optSelected=o.selected,ne.enctype=!!he.createElement("form").enctype,n.disabled=!0,ne.optDisabled=!o.disabled,e=he.createElement("input"),e.setAttribute("value",""),ne.input=""===e.getAttribute("value"),e.value="t",e.setAttribute("type","radio"),ne.radioValue="t"===e.value}();var At=/\r/g;oe.fn.extend({val:function(e){var t,n,i,o=this[0];return arguments.length?(i=oe.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,oe(this).val()):e,null==o?o="":"number"==typeof o?o+="":oe.isArray(o)&&(o=oe.map(o,function(e){return null==e?"":e+""})),t=oe.valHooks[this.type]||oe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))})):o?(t=oe.valHooks[o.type]||oe.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(At,""):null==n?"":n)):void 0}}),oe.extend({valHooks:{option:{get:function(e){var t=oe.find.attr(e,"value");return null!=t?t:oe.trim(oe.text(e))}},select:{get:function(e){for(var t,n,i=e.options,o=e.selectedIndex,r="select-one"===e.type||0>o,s=r?null:[],a=r?o+1:i.length,l=0>o?a:r?o:0;a>l;l++)if(n=i[l],!(!n.selected&&l!==o||(ne.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&oe.nodeName(n.parentNode,"optgroup"))){if(t=oe(n).val(),r)return t;s.push(t)}return s},set:function(e,t){for(var n,i,o=e.options,r=oe.makeArray(t),s=o.length;s--;)if(i=o[s],oe.inArray(oe.valHooks.option.get(i),r)>=0)try{i.selected=n=!0}catch(e){i.scrollHeight}else i.selected=!1;return n||(e.selectedIndex=-1),o}}}}),oe.each(["radio","checkbox"],function(){oe.valHooks[this]={set:function(e,t){return oe.isArray(t)?e.checked=oe.inArray(oe(e).val(),t)>=0:void 0}},ne.checkOn||(oe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var xt,wt,Ct=oe.expr.attrHandle,Tt=/^(?:checked|selected)$/i,Et=ne.getSetAttribute,St=ne.input;oe.fn.extend({attr:function(e,t){return De(this,oe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){oe.removeAttr(this,e)})}}),oe.extend({attr:function(e,t,n){var i,o,r=e.nodeType;if(e&&3!==r&&8!==r&&2!==r)return typeof e.getAttribute===Ce?oe.prop(e,t,n):(1===r&&oe.isXMLDoc(e)||(t=t.toLowerCase(),i=oe.attrHooks[t]||(oe.expr.match.bool.test(t)?wt:xt)),void 0===n?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=oe.find.attr(e,t),null==o?void 0:o):null!==n?i&&"set"in i&&void 0!==(o=i.set(e,n,t))?o:(e.setAttribute(t,n+""),n):void oe.removeAttr(e,t))},removeAttr:function(e,t){var n,i,o=0,r=t&&t.match(be);if(r&&1===e.nodeType)for(;n=r[o++];)i=oe.propFix[n]||n,oe.expr.match.bool.test(n)?St&&Et||!Tt.test(n)?e[i]=!1:e[oe.camelCase("default-"+n)]=e[i]=!1:oe.attr(e,n,""),e.removeAttribute(Et?n:i)},attrHooks:{type:{set:function(e,t){if(!ne.radioValue&&"radio"===t&&oe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}}}),wt={set:function(e,t,n){return t===!1?oe.removeAttr(e,n):St&&Et||!Tt.test(n)?e.setAttribute(!Et&&oe.propFix[n]||n,n):e[oe.camelCase("default-"+n)]=e[n]=!0,n}},oe.each(oe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=Ct[t]||oe.find.attr;Ct[t]=St&&Et||!Tt.test(t)?function(e,t,i){var o,r;return i||(r=Ct[t],Ct[t]=o,o=null!=n(e,t,i)?t.toLowerCase():null,Ct[t]=r),o}:function(e,t,n){return n?void 0:e[oe.camelCase("default-"+t)]?t.toLowerCase():null}}),St&&Et||(oe.attrHooks.value={set:function(e,t,n){return oe.nodeName(e,"input")?void(e.defaultValue=t):xt&&xt.set(e,t,n)}}),Et||(xt={set:function(e,t,n){var i=e.getAttributeNode(n);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(n)),i.value=t+="","value"===n||t===e.getAttribute(n)?t:void 0}},Ct.id=Ct.name=Ct.coords=function(e,t,n){var i;return n?void 0:(i=e.getAttributeNode(t))&&""!==i.value?i.value:null},oe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:void 0},set:xt.set},oe.attrHooks.contenteditable={set:function(e,t,n){xt.set(e,""!==t&&t,n)}},oe.each(["width","height"],function(e,t){oe.attrHooks[t]={set:function(e,n){return""===n?(e.setAttribute(t,"auto"),n):void 0}}})),ne.style||(oe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var kt=/^(?:input|select|textarea|button|object)$/i,Nt=/^(?:a|area)$/i;oe.fn.extend({prop:function(e,t){return De(this,oe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=oe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(e){}})}}),oe.extend({propFix:{for:"htmlFor",class:"className"},prop:function(e,t,n){var i,o,r,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return r=1!==s||!oe.isXMLDoc(e),r&&(t=oe.propFix[t]||t,o=oe.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(e,n,t))?i:e[t]=n:o&&"get"in o&&null!==(i=o.get(e,t))?i:e[t]},propHooks:{tabIndex:{get:function(e){var t=oe.find.attr(e,"tabindex");return t?parseInt(t,10):kt.test(e.nodeName)||Nt.test(e.nodeName)&&e.href?0:-1}}}}),ne.hrefNormalized||oe.each(["href","src"],function(e,t){oe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),ne.optSelected||(oe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),oe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){oe.propFix[this.toLowerCase()]=this}),ne.enctype||(oe.propFix.enctype="encoding");var Dt=/[\t\r\n\f]/g;oe.fn.extend({addClass:function(e){var t,n,i,o,r,s,a=0,l=this.length,c="string"==typeof e&&e;if(oe.isFunction(e))return this.each(function(t){oe(this).addClass(e.call(this,t,this.className))});if(c)for(t=(e||"").match(be)||[];l>a;a++)if(n=this[a],i=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(Dt," "):" ")){for(r=0;o=t[r++];)i.indexOf(" "+o+" ")<0&&(i+=o+" ");s=oe.trim(i),n.className!==s&&(n.className=s)}return this},removeClass:function(e){var t,n,i,o,r,s,a=0,l=this.length,c=0===arguments.length||"string"==typeof e&&e;if(oe.isFunction(e))return this.each(function(t){oe(this).removeClass(e.call(this,t,this.className))});if(c)for(t=(e||"").match(be)||[];l>a;a++)if(n=this[a],i=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(Dt," "):"")){for(r=0;o=t[r++];)for(;i.indexOf(" "+o+" ")>=0;)i=i.replace(" "+o+" "," ");s=e?oe.trim(i):"",n.className!==s&&(n.className=s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):this.each(oe.isFunction(e)?function(n){oe(this).toggleClass(e.call(this,n,this.className,t),t)}:function(){if("string"===n)for(var t,i=0,o=oe(this),r=e.match(be)||[];t=r[i++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else(n===Ce||"boolean"===n)&&(this.className&&oe._data(this,"__className__",this.className),this.className=this.className||e===!1?"":oe._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,i=this.length;i>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(Dt," ").indexOf(t)>=0)return!0;return!1}}),oe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){oe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),oe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,i){return this.on(t,e,n,i)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var $t=oe.now(),jt=/\?/,Lt=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;oe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,i=null,o=oe.trim(t+"");return o&&!oe.trim(o.replace(Lt,function(e,t,o,r){return n&&t&&(i=0),0===i?e:(n=o||t,i+=!r-!o,"")}))?Function("return "+o)():oe.error("Invalid JSON: "+t)},oe.parseXML=function(t){var n,i;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(i=new DOMParser,n=i.parseFromString(t,"text/xml")):(n=new ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(e){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||oe.error("Invalid XML: "+t),n};var Ot,It,Bt=/#.*$/,Rt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Mt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Pt=/^\/\//,zt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,qt={},_t={},Wt="*/".concat("*");try{It=location.href}catch(e){It=he.createElement("a"),It.href="",It=It.href}Ot=zt.exec(It.toLowerCase())||[],oe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:It,type:"GET",isLocal:Mt.test(Ot[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Wt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":oe.parseJSON,"text xml":oe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?z(z(e,oe.ajaxSettings),t):z(oe.ajaxSettings,e)},ajaxPrefilter:F(qt),ajaxTransport:F(_t),ajax:function(e,t){function n(e,t,n,i){var o,u,v,y,A,w=t;2!==b&&(b=2,a&&clearTimeout(a),c=void 0,s=i||"",x.readyState=e>0?4:0,o=e>=200&&300>e||304===e,n&&(y=q(d,x,n)),y=_(d,y,x,o),o?(d.ifModified&&(A=x.getResponseHeader("Last-Modified"),A&&(oe.lastModified[r]=A),A=x.getResponseHeader("etag"),A&&(oe.etag[r]=A)),204===e||"HEAD"===d.type?w="nocontent":304===e?w="notmodified":(w=y.state,u=y.data,v=y.error,o=!v)):(v=w,(e||!w)&&(w="error",0>e&&(e=0))),x.status=e,x.statusText=(t||w)+"",o?h.resolveWith(f,[u,w,x]):h.rejectWith(f,[x,w,v]),x.statusCode(m),m=void 0,l&&p.trigger(o?"ajaxSuccess":"ajaxError",[x,d,o?u:v]),g.fireWith(f,[x,w]),l&&(p.trigger("ajaxComplete",[x,d]),--oe.active||oe.event.trigger("ajaxStop")))}"object"==typeof e&&(t=e,e=void 0),t=t||{};var i,o,r,s,a,l,c,u,d=oe.ajaxSetup({},t),f=d.context||d,p=d.context&&(f.nodeType||f.jquery)?oe(f):oe.event,h=oe.Deferred(),g=oe.Callbacks("once memory"),m=d.statusCode||{},v={},y={},b=0,A="canceled",x={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!u)for(u={};t=Ht.exec(s);)u[t[1].toLowerCase()]=t[2];t=u[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=y[n]=y[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else x.always(e[x.status]);return this},abort:function(e){var t=e||A;return c&&c.abort(t),n(0,t),this}};if(h.promise(x).complete=g.add,x.success=x.done,x.error=x.fail,d.url=((e||d.url||It)+"").replace(Bt,"").replace(Pt,Ot[1]+"//"),d.type=t.method||t.type||d.method||d.type,d.dataTypes=oe.trim(d.dataType||"*").toLowerCase().match(be)||[""],null==d.crossDomain&&(i=zt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===Ot[1]&&i[2]===Ot[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(Ot[3]||("http:"===Ot[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=oe.param(d.data,d.traditional)),P(qt,d,t,x),2===b)return x;l=oe.event&&d.global,l&&0===oe.active++&&oe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),r=d.url,d.hasContent||(d.data&&(r=d.url+=(jt.test(r)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Rt.test(r)?r.replace(Rt,"$1_="+$t++):r+(jt.test(r)?"&":"?")+"_="+$t++)),d.ifModified&&(oe.lastModified[r]&&x.setRequestHeader("If-Modified-Since",oe.lastModified[r]),oe.etag[r]&&x.setRequestHeader("If-None-Match",oe.etag[r])),(d.data&&d.hasContent&&d.contentType!==!1||t.contentType)&&x.setRequestHeader("Content-Type",d.contentType),x.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Wt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)x.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(f,x,d)===!1||2===b))return x.abort();A="abort";for(o in{success:1,error:1,complete:1})x[o](d[o]);if(c=P(_t,d,t,x)){x.readyState=1,l&&p.trigger("ajaxSend",[x,d]),d.async&&d.timeout>0&&(a=setTimeout(function(){x.abort("timeout")},d.timeout));try{b=1,c.send(v,n)}catch(e){if(!(2>b))throw e;n(-1,e)}}else n(-1,"No Transport");return x},getJSON:function(e,t,n){return oe.get(e,t,n,"json")},getScript:function(e,t){return oe.get(e,void 0,t,"script")}}),oe.each(["get","post"],function(e,t){oe[t]=function(e,n,i,o){return oe.isFunction(n)&&(o=o||i,i=n,n=void 0),oe.ajax({url:e,type:t,dataType:o,data:n,success:i})}}),oe._evalUrl=function(e){return oe.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,throws:!0})},oe.fn.extend({wrapAll:function(e){if(oe.isFunction(e))return this.each(function(t){oe(this).wrapAll(e.call(this,t))});if(this[0]){var t=oe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return this.each(oe.isFunction(e)?function(t){oe(this).wrapInner(e.call(this,t))}:function(){var t=oe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=oe.isFunction(e);return this.each(function(n){oe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){oe.nodeName(this,"body")||oe(this).replaceWith(this.childNodes)}).end()}}),oe.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||!ne.reliableHiddenOffsets()&&"none"===(e.style&&e.style.display||oe.css(e,"display"))},oe.expr.filters.visible=function(e){return!oe.expr.filters.hidden(e)};var Ut=/%20/g,Qt=/\[\]$/,Gt=/\r?\n/g,Xt=/^(?:submit|button|image|reset|file)$/i,Vt=/^(?:input|select|textarea|keygen)/i;oe.param=function(e,t){var n,i=[],o=function(e,t){t=oe.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=oe.ajaxSettings&&oe.ajaxSettings.traditional),oe.isArray(e)||e.jquery&&!oe.isPlainObject(e))oe.each(e,function(){o(this.name,this.value)});else for(n in e)W(n,e[n],t,o);return i.join("&").replace(Ut,"+")},oe.fn.extend({serialize:function(){return oe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=oe.prop(this,"elements");return e?oe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!oe(this).is(":disabled")&&Vt.test(this.nodeName)&&!Xt.test(e)&&(this.checked||!$e.test(e))}).map(function(e,t){var n=oe(this).val();return null==n?null:oe.isArray(n)?oe.map(n,function(e){return{name:t.name,value:e.replace(Gt,"\r\n")}}):{name:t.name,value:n.replace(Gt,"\r\n")}}).get()}}),oe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&U()||Q()}:U;var Yt=0,Zt={},Jt=oe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in Zt)Zt[e](void 0,!0)}),ne.cors=!!Jt&&"withCredentials"in Jt,Jt=ne.ajax=!!Jt,Jt&&oe.ajaxTransport(function(e){if(!e.crossDomain||ne.cors){var t;return{send:function(n,i){var o,r=e.xhr(),s=++Yt;if(r.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(o in e.xhrFields)r[o]=e.xhrFields[o];e.mimeType&&r.overrideMimeType&&r.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(o in n)void 0!==n[o]&&r.setRequestHeader(o,n[o]+"");r.send(e.hasContent&&e.data||null),t=function(n,o){var a,l,c;if(t&&(o||4===r.readyState))if(delete Zt[s],t=void 0,r.onreadystatechange=oe.noop,o)4!==r.readyState&&r.abort();else{c={},a=r.status,"string"==typeof r.responseText&&(c.text=r.responseText);try{l=r.statusText}catch(e){l=""}a||!e.isLocal||e.crossDomain?1223===a&&(a=204):a=c.text?200:404}c&&i(a,l,c,r.getAllResponseHeaders())},e.async?4===r.readyState?setTimeout(t):r.onreadystatechange=Zt[s]=t:t()},abort:function(){t&&t(void 0,!0)}}}}),oe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/
+},converters:{"text script":function(e){return oe.globalEval(e),e}}}),oe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),oe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=he.head||oe("head")[0]||he.documentElement;return{send:function(i,o){t=he.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||o(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var Kt=[],en=/(=)\?(?=&|$)|\?\?/;oe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||oe.expando+"_"+$t++;return this[e]=!0,e}}),oe.ajaxPrefilter("json jsonp",function(t,n,i){var o,r,s,a=t.jsonp!==!1&&(en.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&en.test(t.data)&&"data");return a||"jsonp"===t.dataTypes[0]?(o=t.jsonpCallback=oe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(en,"$1"+o):t.jsonp!==!1&&(t.url+=(jt.test(t.url)?"&":"?")+t.jsonp+"="+o),t.converters["script json"]=function(){return s||oe.error(o+" was not called"),s[0]},t.dataTypes[0]="json",r=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=r,t[o]&&(t.jsonpCallback=n.jsonpCallback,Kt.push(o)),s&&oe.isFunction(r)&&r(s[0]),s=r=void 0}),"script"):void 0}),oe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||he;var i=de.exec(e),o=!n&&[];return i?[t.createElement(i[1])]:(i=oe.buildFragment([e],t,o),o&&o.length&&oe(o).remove(),oe.merge([],i.childNodes))};var tn=oe.fn.load;oe.fn.load=function(e,t,n){if("string"!=typeof e&&tn)return tn.apply(this,arguments);var i,o,r,s=this,a=e.indexOf(" ");return a>=0&&(i=oe.trim(e.slice(a,e.length)),e=e.slice(0,a)),oe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(r="POST"),s.length>0&&oe.ajax({url:e,type:r,dataType:"html",data:t}).done(function(e){o=arguments,s.html(i?oe("").append(oe.parseHTML(e)).find(i):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},oe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){oe.fn[t]=function(e){return this.on(t,e)}}),oe.expr.filters.animated=function(e){return oe.grep(oe.timers,function(t){return e===t.elem}).length};var nn=e.document.documentElement;oe.offset={setOffset:function(e,t,n){var i,o,r,s,a,l,c,u=oe.css(e,"position"),d=oe(e),f={};"static"===u&&(e.style.position="relative"),a=d.offset(),r=oe.css(e,"top"),l=oe.css(e,"left"),c=("absolute"===u||"fixed"===u)&&oe.inArray("auto",[r,l])>-1,c?(i=d.position(),s=i.top,o=i.left):(s=parseFloat(r)||0,o=parseFloat(l)||0),oe.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+o),"using"in t?t.using.call(e,f):d.css(f)}},oe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){oe.offset.setOffset(this,e,t)});var t,n,i={top:0,left:0},o=this[0],r=o&&o.ownerDocument;return r?(t=r.documentElement,oe.contains(t,o)?(typeof o.getBoundingClientRect!==Ce&&(i=o.getBoundingClientRect()),n=G(r),{top:i.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:i.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):i):void 0},position:function(){if(this[0]){var e,t,n={top:0,left:0},i=this[0];return"fixed"===oe.css(i,"position")?t=i.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),oe.nodeName(e[0],"html")||(n=e.offset()),n.top+=oe.css(e[0],"borderTopWidth",!0),n.left+=oe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-oe.css(i,"marginTop",!0),left:t.left-n.left-oe.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||nn;e&&!oe.nodeName(e,"html")&&"static"===oe.css(e,"position");)e=e.offsetParent;return e||nn})}}),oe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);oe.fn[e]=function(i){return De(this,function(e,i,o){var r=G(e);return void 0===o?r?t in r?r[t]:r.document.documentElement[i]:e[i]:void(r?r.scrollTo(n?oe(r).scrollLeft():o,n?o:oe(r).scrollTop()):e[i]=o)},e,i,arguments.length,null)}}),oe.each(["top","left"],function(e,t){oe.cssHooks[t]=S(ne.pixelPosition,function(e,n){return n?(n=tt(e,t),it.test(n)?oe(e).position()[t]+"px":n):void 0})}),oe.each({Height:"height",Width:"width"},function(e,t){oe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,i){oe.fn[i]=function(i,o){var r=arguments.length&&(n||"boolean"!=typeof i),s=n||(i===!0||o===!0?"margin":"border");return De(this,function(t,n,i){var o;return oe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?oe.css(t,n,s):oe.style(t,n,i,s)},t,r?i:void 0,r,null)}})}),oe.fn.size=function(){return this.length},oe.fn.andSelf=oe.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return oe});var on=e.jQuery,rn=e.$;return oe.noConflict=function(t){return e.$===oe&&(e.$=rn),t&&e.jQuery===oe&&(e.jQuery=on),oe},typeof t===Ce&&(e.jQuery=e.$=oe),oe}),"undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(e){"use strict";var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1==t[0]&&9==t[1]&&t[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(e){"use strict";function t(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var n in t)if(void 0!==e.style[n])return{end:t[n]};return!1}e.fn.emulateTransitionEnd=function(t){var n=!1,i=this;e(this).one("bsTransitionEnd",function(){n=!0});var o=function(){n||e(i).trigger(e.support.transition.end)};return setTimeout(o,t),this},e(function(){e.support.transition=t(),e.support.transition&&(e.event.special.bsTransitionEnd={bindType:e.support.transition.end,delegateType:e.support.transition.end,handle:function(t){return e(t.target).is(this)?t.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(e){"use strict";function t(t){return this.each(function(){var n=e(this),o=n.data("bs.alert");o||n.data("bs.alert",o=new i(this)),"string"==typeof t&&o[t].call(n)})}var n='[data-dismiss="alert"]',i=function(t){e(t).on("click",n,this.close)};i.VERSION="3.3.5",i.TRANSITION_DURATION=150,i.prototype.close=function(t){function n(){s.detach().trigger("closed.bs.alert").remove()}var o=e(this),r=o.attr("data-target");r||(r=o.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));var s=e(r);t&&t.preventDefault(),s.length||(s=o.closest(".alert")),s.trigger(t=e.Event("close.bs.alert")),t.isDefaultPrevented()||(s.removeClass("in"),e.support.transition&&s.hasClass("fade")?s.one("bsTransitionEnd",n).emulateTransitionEnd(i.TRANSITION_DURATION):n())};var o=e.fn.alert;e.fn.alert=t,e.fn.alert.Constructor=i,e.fn.alert.noConflict=function(){return e.fn.alert=o,this},e(document).on("click.bs.alert.data-api",n,i.prototype.close)}(jQuery),+function(e){"use strict";function t(t){return this.each(function(){var i=e(this),o=i.data("bs.button"),r="object"==typeof t&&t;o||i.data("bs.button",o=new n(this,r)),"toggle"==t?o.toggle():t&&o.setState(t)})}var n=function(t,i){this.$element=e(t),this.options=e.extend({},n.DEFAULTS,i),this.isLoading=!1};n.VERSION="3.3.5",n.DEFAULTS={loadingText:"loading..."},n.prototype.setState=function(t){var n="disabled",i=this.$element,o=i.is("input")?"val":"html",r=i.data();t+="Text",null==r.resetText&&i.data("resetText",i[o]()),setTimeout(e.proxy(function(){i[o](null==r[t]?this.options[t]:r[t]),"loadingText"==t?(this.isLoading=!0,i.addClass(n).attr(n,n)):this.isLoading&&(this.isLoading=!1,i.removeClass(n).removeAttr(n))},this),0)},n.prototype.toggle=function(){var e=!0,t=this.$element.closest('[data-toggle="buttons"]');if(t.length){var n=this.$element.find("input");"radio"==n.prop("type")?(n.prop("checked")&&(e=!1),t.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==n.prop("type")&&(n.prop("checked")!==this.$element.hasClass("active")&&(e=!1),this.$element.toggleClass("active")),n.prop("checked",this.$element.hasClass("active")),e&&n.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var i=e.fn.button;e.fn.button=t,e.fn.button.Constructor=n,e.fn.button.noConflict=function(){return e.fn.button=i,this},e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(n){var i=e(n.target);i.hasClass("btn")||(i=i.closest(".btn")),t.call(i,"toggle"),e(n.target).is('input[type="radio"]')||e(n.target).is('input[type="checkbox"]')||n.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(t){e(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))})}(jQuery),+function(e){"use strict";function t(t){return this.each(function(){var i=e(this),o=i.data("bs.carousel"),r=e.extend({},n.DEFAULTS,i.data(),"object"==typeof t&&t),s="string"==typeof t?t:r.slide;o||i.data("bs.carousel",o=new n(this,r)),"number"==typeof t?o.to(t):s?o[s]():r.interval&&o.pause().cycle()})}var n=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",e.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",e.proxy(this.pause,this)).on("mouseleave.bs.carousel",e.proxy(this.cycle,this))};n.VERSION="3.3.5",n.TRANSITION_DURATION=600,n.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},n.prototype.keydown=function(e){if(!/input|textarea/i.test(e.target.tagName)){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()}},n.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},n.prototype.getItemIndex=function(e){return this.$items=e.parent().children(".item"),this.$items.index(e||this.$active)},n.prototype.getItemForDirection=function(e,t){var n=this.getItemIndex(t),i="prev"==e&&0===n||"next"==e&&n==this.$items.length-1;if(i&&!this.options.wrap)return t;var o="prev"==e?-1:1,r=(n+o)%this.$items.length;return this.$items.eq(r)},n.prototype.to=function(e){var t=this,n=this.getItemIndex(this.$active=this.$element.find(".item.active"));return e>this.$items.length-1||0>e?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){t.to(e)}):n==e?this.pause().cycle():this.slide(e>n?"next":"prev",this.$items.eq(e))},n.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},n.prototype.next=function(){return this.sliding?void 0:this.slide("next")},n.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},n.prototype.slide=function(t,i){var o=this.$element.find(".item.active"),r=i||this.getItemForDirection(t,o),s=this.interval,a="next"==t?"left":"right",l=this;if(r.hasClass("active"))return this.sliding=!1;var c=r[0],u=e.Event("slide.bs.carousel",{relatedTarget:c,direction:a});if(this.$element.trigger(u),!u.isDefaultPrevented()){if(this.sliding=!0,s&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var d=e(this.$indicators.children()[this.getItemIndex(r)]);d&&d.addClass("active")}var f=e.Event("slid.bs.carousel",{relatedTarget:c,direction:a});return e.support.transition&&this.$element.hasClass("slide")?(r.addClass(t),r[0].offsetWidth,o.addClass(a),r.addClass(a),o.one("bsTransitionEnd",function(){r.removeClass([t,a].join(" ")).addClass("active"),o.removeClass(["active",a].join(" ")),l.sliding=!1,setTimeout(function(){l.$element.trigger(f)},0)}).emulateTransitionEnd(n.TRANSITION_DURATION)):(o.removeClass("active"),r.addClass("active"),this.sliding=!1,this.$element.trigger(f)),s&&this.cycle(),this}};var i=e.fn.carousel;e.fn.carousel=t,e.fn.carousel.Constructor=n,e.fn.carousel.noConflict=function(){return e.fn.carousel=i,this};var o=function(n){var i,o=e(this),r=e(o.attr("data-target")||(i=o.attr("href"))&&i.replace(/.*(?=#[^\s]+$)/,""));if(r.hasClass("carousel")){var s=e.extend({},r.data(),o.data()),a=o.attr("data-slide-to");a&&(s.interval=!1),t.call(r,s),a&&r.data("bs.carousel").to(a),n.preventDefault()}};e(document).on("click.bs.carousel.data-api","[data-slide]",o).on("click.bs.carousel.data-api","[data-slide-to]",o),e(window).on("load",function(){e('[data-ride="carousel"]').each(function(){var n=e(this);t.call(n,n.data())})})}(jQuery),+function(e){"use strict";function t(t){var n,i=t.attr("data-target")||(n=t.attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,"");return e(i)}function n(t){return this.each(function(){var n=e(this),o=n.data("bs.collapse"),r=e.extend({},i.DEFAULTS,n.data(),"object"==typeof t&&t);!o&&r.toggle&&/show|hide/.test(t)&&(r.toggle=!1),o||n.data("bs.collapse",o=new i(this,r)),"string"==typeof t&&o[t]()})}var i=function(t,n){this.$element=e(t),this.options=e.extend({},i.DEFAULTS,n),this.$trigger=e('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};i.VERSION="3.3.5",i.TRANSITION_DURATION=350,i.DEFAULTS={toggle:!0},i.prototype.dimension=function(){var e=this.$element.hasClass("width");return e?"width":"height"},i.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var t,o=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(o&&o.length&&(t=o.data("bs.collapse"),t&&t.transitioning))){var r=e.Event("show.bs.collapse");if(this.$element.trigger(r),!r.isDefaultPrevented()){o&&o.length&&(n.call(o,"hide"),t||o.data("bs.collapse",null));var s=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[s](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var a=function(){this.$element.removeClass("collapsing").addClass("collapse in")[s](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!e.support.transition)return a.call(this);var l=e.camelCase(["scroll",s].join("-"));this.$element.one("bsTransitionEnd",e.proxy(a,this)).emulateTransitionEnd(i.TRANSITION_DURATION)[s](this.$element[0][l])}}}},i.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var t=e.Event("hide.bs.collapse");if(this.$element.trigger(t),!t.isDefaultPrevented()){var n=this.dimension();this.$element[n](this.$element[n]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var o=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return e.support.transition?void this.$element[n](0).one("bsTransitionEnd",e.proxy(o,this)).emulateTransitionEnd(i.TRANSITION_DURATION):o.call(this)}}},i.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},i.prototype.getParent=function(){return e(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(e.proxy(function(n,i){var o=e(i);this.addAriaAndCollapsedClass(t(o),o)},this)).end()},i.prototype.addAriaAndCollapsedClass=function(e,t){var n=e.hasClass("in");e.attr("aria-expanded",n),t.toggleClass("collapsed",!n).attr("aria-expanded",n)};var o=e.fn.collapse;e.fn.collapse=n,e.fn.collapse.Constructor=i,e.fn.collapse.noConflict=function(){return e.fn.collapse=o,this},e(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(i){var o=e(this);o.attr("data-target")||i.preventDefault();var r=t(o),s=r.data("bs.collapse"),a=s?"toggle":o.data();n.call(r,a)})}(jQuery),+function(e){"use strict";function t(t){var n=t.attr("data-target");n||(n=t.attr("href"),n=n&&/#[A-Za-z]/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,""));var i=n&&e(n);return i&&i.length?i:t.parent()}function n(n){n&&3===n.which||(e(o).remove(),e(r).each(function(){var i=e(this),o=t(i),r={relatedTarget:this};o.hasClass("open")&&(n&&"click"==n.type&&/input|textarea/i.test(n.target.tagName)&&e.contains(o[0],n.target)||(o.trigger(n=e.Event("hide.bs.dropdown",r)),n.isDefaultPrevented()||(i.attr("aria-expanded","false"),o.removeClass("open").trigger("hidden.bs.dropdown",r))))}))}function i(t){return this.each(function(){var n=e(this),i=n.data("bs.dropdown");i||n.data("bs.dropdown",i=new s(this)),"string"==typeof t&&i[t].call(n)})}var o=".dropdown-backdrop",r='[data-toggle="dropdown"]',s=function(t){e(t).on("click.bs.dropdown",this.toggle)};s.VERSION="3.3.5",s.prototype.toggle=function(i){var o=e(this);if(!o.is(".disabled, :disabled")){var r=t(o),s=r.hasClass("open");if(n(),!s){"ontouchstart"in document.documentElement&&!r.closest(".navbar-nav").length&&e(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(e(this)).on("click",n);var a={relatedTarget:this};if(r.trigger(i=e.Event("show.bs.dropdown",a)),i.isDefaultPrevented())return;o.trigger("focus").attr("aria-expanded","true"),r.toggleClass("open").trigger("shown.bs.dropdown",a)}return!1}},s.prototype.keydown=function(n){if(/(38|40|27|32)/.test(n.which)&&!/input|textarea/i.test(n.target.tagName)){var i=e(this);if(n.preventDefault(),n.stopPropagation(),!i.is(".disabled, :disabled")){var o=t(i),s=o.hasClass("open");if(!s&&27!=n.which||s&&27==n.which)return 27==n.which&&o.find(r).trigger("focus"),i.trigger("click");var a=" li:not(.disabled):visible a",l=o.find(".dropdown-menu"+a);if(l.length){var c=l.index(n.target);38==n.which&&c>0&&c--,40==n.which&&c
document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&e?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!e?this.scrollbarWidth:""})},n.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},n.prototype.checkScrollbar=function(){var e=window.innerWidth;if(!e){var t=document.documentElement.getBoundingClientRect();e=t.right-Math.abs(t.left)}this.bodyIsOverflowing=document.body.clientWidth ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},n.prototype.init=function(t,n,i){if(this.enabled=!0,this.type=t,this.$element=e(n),this.options=this.getOptions(i),this.$viewport=this.options.viewport&&e(e.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var o=this.options.trigger.split(" "),r=o.length;r--;){var s=o[r];if("click"==s)this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",l="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(l+"."+this.type,this.options.selector,e.proxy(this.leave,this))}}this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},n.prototype.getDefaults=function(){return n.DEFAULTS},n.prototype.getOptions=function(t){return t=e.extend({},this.getDefaults(),this.$element.data(),t),t.delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t},n.prototype.getDelegateOptions=function(){var t={},n=this.getDefaults();return this._options&&e.each(this._options,function(e,i){n[e]!=i&&(t[e]=i)}),t},n.prototype.enter=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);return n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusin"==t.type?"focus":"hover"]=!0),n.tip().hasClass("in")||"in"==n.hoverState?void(n.hoverState="in"):(clearTimeout(n.timeout),n.hoverState="in",n.options.delay&&n.options.delay.show?void(n.timeout=setTimeout(function(){"in"==n.hoverState&&n.show()},n.options.delay.show)):n.show())},n.prototype.isInStateTrue=function(){for(var e in this.inState)if(this.inState[e])return!0;return!1},n.prototype.leave=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);return n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusout"==t.type?"focus":"hover"]=!1),n.isInStateTrue()?void 0:(clearTimeout(n.timeout),n.hoverState="out",n.options.delay&&n.options.delay.hide?void(n.timeout=setTimeout(function(){"out"==n.hoverState&&n.hide()},n.options.delay.hide)):n.hide())},n.prototype.show=function(){var t=e.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var i=e.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!i)return;var o=this,r=this.tip(),s=this.getUID(this.type);this.setContent(),r.attr("id",s),this.$element.attr("aria-describedby",s),this.options.animation&&r.addClass("fade");var a="function"==typeof this.options.placement?this.options.placement.call(this,r[0],this.$element[0]):this.options.placement,l=/\s?auto?\s?/i,c=l.test(a);c&&(a=a.replace(l,"")||"top"),r.detach().css({top:0,left:0,display:"block"}).addClass(a).data("bs."+this.type,this),this.options.container?r.appendTo(this.options.container):r.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var u=this.getPosition(),d=r[0].offsetWidth,f=r[0].offsetHeight;if(c){var p=a,h=this.getPosition(this.$viewport);a="bottom"==a&&u.bottom+f>h.bottom?"top":"top"==a&&u.top-fh.width?"left":"left"==a&&u.left-ds.top+s.height&&(o.top=s.top+s.height-l)}else{var c=t.left-r,u=t.left+r+n;cs.right&&(o.left=s.left+s.width-u)}return o},n.prototype.getTitle=function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||("function"==typeof n.title?n.title.call(t[0]):n.title)},n.prototype.getUID=function(e){do e+=~~(1e6*Math.random());while(document.getElementById(e));return e},n.prototype.tip=function(){if(!this.$tip&&(this.$tip=e(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},n.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},n.prototype.enable=function(){this.enabled=!0},n.prototype.disable=function(){this.enabled=!1},n.prototype.toggleEnabled=function(){this.enabled=!this.enabled},n.prototype.toggle=function(t){var n=this;t&&(n=e(t.currentTarget).data("bs."+this.type),n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n))),t?(n.inState.click=!n.inState.click,n.isInStateTrue()?n.enter(n):n.leave(n)):n.tip().hasClass("in")?n.leave(n):n.enter(n)},n.prototype.destroy=function(){var e=this;clearTimeout(this.timeout),this.hide(function(){e.$element.off("."+e.type).removeData("bs."+e.type),e.$tip&&e.$tip.detach(),e.$tip=null,e.$arrow=null,e.$viewport=null})};var i=e.fn.tooltip;e.fn.tooltip=t,e.fn.tooltip.Constructor=n,e.fn.tooltip.noConflict=function(){return e.fn.tooltip=i,this}}(jQuery),+function(e){"use strict";function t(t){return this.each(function(){var i=e(this),o=i.data("bs.popover"),r="object"==typeof t&&t;(o||!/destroy|hide/.test(t))&&(o||i.data("bs.popover",o=new n(this,r)),"string"==typeof t&&o[t]())})}var n=function(e,t){this.init("popover",e,t)};if(!e.fn.tooltip)throw new Error("Popover requires tooltip.js");n.VERSION="3.3.5",n.DEFAULTS=e.extend({},e.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),n.prototype=e.extend({},e.fn.tooltip.Constructor.prototype),n.prototype.constructor=n,n.prototype.getDefaults=function(){return n.DEFAULTS},n.prototype.setContent=function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof n?"html":"append":"text"](n),e.removeClass("fade top bottom left right in"),e.find(".popover-title").html()||e.find(".popover-title").hide()},n.prototype.hasContent=function(){return this.getTitle()||this.getContent()},n.prototype.getContent=function(){var e=this.$element,t=this.options;return e.attr("data-content")||("function"==typeof t.content?t.content.call(e[0]):t.content)},n.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var i=e.fn.popover;e.fn.popover=t,e.fn.popover.Constructor=n,e.fn.popover.noConflict=function(){return e.fn.popover=i,this}}(jQuery),+function(e){"use strict";function t(n,i){this.$body=e(document.body),this.$scrollElement=e(e(n).is(document.body)?window:n),this.options=e.extend({},t.DEFAULTS,i),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e.proxy(this.process,this)),this.refresh(),this.process()}function n(n){return this.each(function(){var i=e(this),o=i.data("bs.scrollspy"),r="object"==typeof n&&n;o||i.data("bs.scrollspy",o=new t(this,r)),"string"==typeof n&&o[n]()})}t.VERSION="3.3.5",t.DEFAULTS={offset:10},t.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},t.prototype.refresh=function(){var t=this,n="offset",i=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),e.isWindow(this.$scrollElement[0])||(n="position",i=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=e(this),o=t.data("target")||t.attr("href"),r=/^#./.test(o)&&e(o);return r&&r.length&&r.is(":visible")&&[[r[n]().top+i,o]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},t.prototype.process=function(){var e,t=this.$scrollElement.scrollTop()+this.options.offset,n=this.getScrollHeight(),i=this.options.offset+n-this.$scrollElement.height(),o=this.offsets,r=this.targets,s=this.activeTarget;if(this.scrollHeight!=n&&this.refresh(),t>=i)return s!=(e=r[r.length-1])&&this.activate(e);if(s&&t=o[e]&&(void 0===o[e+1]||t .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),t.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),a?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu").length&&t.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),o&&o()}var s=i.find("> .active"),a=o&&e.support.transition&&(s.length&&s.hasClass("fade")||!!i.find("> .fade").length);s.length&&a?s.one("bsTransitionEnd",r).emulateTransitionEnd(n.TRANSITION_DURATION):r(),s.removeClass("in")};var i=e.fn.tab;e.fn.tab=t,e.fn.tab.Constructor=n,e.fn.tab.noConflict=function(){return e.fn.tab=i,this};var o=function(n){n.preventDefault(),t.call(e(this),"show")};e(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',o).on("click.bs.tab.data-api",'[data-toggle="pill"]',o)}(jQuery),+function(e){"use strict";function t(t){return this.each(function(){var i=e(this),o=i.data("bs.affix"),r="object"==typeof t&&t;o||i.data("bs.affix",o=new n(this,r)),"string"==typeof t&&o[t]()})}var n=function(t,i){this.options=e.extend({},n.DEFAULTS,i),this.$target=e(this.options.target).on("scroll.bs.affix.data-api",e.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",e.proxy(this.checkPositionWithEventLoop,this)),this.$element=e(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};n.VERSION="3.3.5",n.RESET="affix affix-top affix-bottom",n.DEFAULTS={offset:0,target:window},n.prototype.getState=function(e,t,n,i){var o=this.$target.scrollTop(),r=this.$element.offset(),s=this.$target.height();if(null!=n&&"top"==this.affixed)return n>o&&"top";if("bottom"==this.affixed)return null!=n?!(o+this.unpin<=r.top)&&"bottom":!(e-i>=o+s)&&"bottom";var a=null==this.affixed,l=a?o:r.top,c=a?s:t;return null!=n&&n>=o?"top":null!=i&&l+c>=e-i&&"bottom"},n.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(n.RESET).addClass("affix");var e=this.$target.scrollTop(),t=this.$element.offset();return this.pinnedOffset=t.top-e},n.prototype.checkPositionWithEventLoop=function(){setTimeout(e.proxy(this.checkPosition,this),1)},n.prototype.checkPosition=function(){if(this.$element.is(":visible")){var t=this.$element.height(),i=this.options.offset,o=i.top,r=i.bottom,s=Math.max(e(document).height(),e(document.body).height());"object"!=typeof i&&(r=o=i),"function"==typeof o&&(o=i.top(this.$element)),"function"==typeof r&&(r=i.bottom(this.$element));var a=this.getState(s,t,o,r);if(this.affixed!=a){null!=this.unpin&&this.$element.css("top","");var l="affix"+(a?"-"+a:""),c=e.Event(l+".bs.affix");if(this.$element.trigger(c),c.isDefaultPrevented())return;this.affixed=a,this.unpin="bottom"==a?this.getPinnedOffset():null,this.$element.removeClass(n.RESET).addClass(l).trigger(l.replace("affix","affixed")+".bs.affix")}"bottom"==a&&this.$element.offset({top:s-t-r})}};var i=e.fn.affix;e.fn.affix=t,e.fn.affix.Constructor=n,e.fn.affix.noConflict=function(){return e.fn.affix=i,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var n=e(this),i=n.data();i.offset=i.offset||{},null!=i.offsetBottom&&(i.offset.bottom=i.offsetBottom),null!=i.offsetTop&&(i.offset.top=i.offsetTop),t.call(n,i)})})}(jQuery),!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):"object"==typeof exports?exports.Holder=t():e.Holder=t()}(this,function(){return function(e){function t(i){if(n[i])return n[i].exports;var o=n[i]={exports:{},id:i,loaded:!1};return e[i].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){(function(t){function i(e,t,n,i){var s=o(n.substr(n.lastIndexOf(e.domain)),e);s&&r({mode:null,el:i,flags:s,engineSettings:t})}function o(e,t){for(var n={theme:T(R.settings.themes.gray,null),stylesheets:t.stylesheets,holderURL:[]},i=!1,o=String.fromCharCode(11),r=e.replace(/([^\\])\//g,"$1"+o).split(o),s=/%[0-9a-f]{2}/gi,a=r.length,l=0;a>l;l++){var c=r[l];if(c.match(s))try{c=decodeURIComponent(c)}catch(e){c=r[l]}var u=!1;if(R.flags.dimensions.match(c))i=!0,n.dimensions=R.flags.dimensions.output(c),u=!0;else if(R.flags.fluid.match(c))i=!0,n.dimensions=R.flags.fluid.output(c),n.fluid=!0,u=!0;else if(R.flags.textmode.match(c))n.textmode=R.flags.textmode.output(c),u=!0;else if(R.flags.colors.match(c)){var d=R.flags.colors.output(c);n.theme=T(n.theme,d),u=!0}else if(t.themes[c])t.themes.hasOwnProperty(c)&&(n.theme=T(t.themes[c],null)),u=!0;else if(R.flags.font.match(c))n.font=R.flags.font.output(c),u=!0;else if(R.flags.auto.match(c))n.auto=!0,u=!0;else if(R.flags.text.match(c))n.text=R.flags.text.output(c),u=!0;else if(R.flags.size.match(c))n.size=R.flags.size.output(c),u=!0;else if(R.flags.random.match(c)){null==R.vars.cache.themeKeys&&(R.vars.cache.themeKeys=Object.keys(t.themes));var f=R.vars.cache.themeKeys[0|Math.random()*R.vars.cache.themeKeys.length];n.theme=T(t.themes[f],null),u=!0}u&&n.holderURL.push(c)}return n.holderURL.unshift(t.domain),n.holderURL=n.holderURL.join("/"),!!i&&n}function r(e){var t=e.mode,n=e.el,i=e.flags,o=e.engineSettings,r=i.dimensions,a=i.theme,l=r.width+"x"+r.height;if(t=null==t?i.fluid?"fluid":"image":t,null!=i.text&&(a.text=i.text,"object"===n.nodeName.toLowerCase())){for(var d=a.text.split("\\n"),f=0;f1){var d=0,f=0,p=e.width*R.setup.lineWrapRatio,h=0;u=new o.Group("line"+h);for(var g=0;g=p||v===!0)&&(t(s,u,d,s.properties.leading),d=0,f+=s.properties.leading,h+=1,u=new o.Group("line"+h),u.y=f),v!==!0&&(c.moveTo(d,0),d+=a.spaceWidth+m.width,u.add(c))}t(s,u,d,s.properties.leading);for(var y in s.children)u=s.children[y],u.moveTo((s.width-u.width)/2,null,null);s.moveTo((e.width-s.width)/2,(e.height-s.height)/2,null),(e.height-s.height)/2<0&&s.moveTo(null,0,null)}else c=new o.Text(e.text),u=new o.Group("line0"),u.add(c),s.add(u),s.moveTo((e.width-a.boundingBox.width)/2,(e.height-a.boundingBox.height)/2,null);return i}function l(e,t,n){var i=parseInt(e,10),o=parseInt(t,10),r=Math.max(i,o),s=Math.min(i,o),a=.8*Math.min(s,r*R.defaults.scale);return Math.round(Math.max(n,a))}function c(e){var t;t=null==e||null==e.nodeType?R.vars.resizableImages:[e];for(var n=0,i=t.length;i>n;n++){var o=t[n];if(o.holderData){var r=o.holderData.flags,a=$(o);if(a){if(!o.holderData.resizeUpdate)continue;if(r.fluid&&r.auto){var l=o.holderData.fluidConfig;switch(l.mode){case"width":a.height=a.width/l.ratio;break;case"height":a.width=a.height*l.ratio}}var c={mode:"image",holderSettings:{dimensions:a,theme:r.theme,flags:r},el:o,engineSettings:o.holderData.engineSettings};"exact"==r.textmode&&(r.exactDimensions=a,c.holderSettings.dimensions=r.dimensions),s(c)}else p(o)}}}function u(e){if(e.holderData){var t=$(e);if(t){var n=e.holderData.flags,i={fluidHeight:"%"==n.dimensions.height.slice(-1),fluidWidth:"%"==n.dimensions.width.slice(-1),mode:null,initialDimensions:t};i.fluidWidth&&!i.fluidHeight?(i.mode="width",i.ratio=i.initialDimensions.width/parseFloat(n.dimensions.height)):!i.fluidWidth&&i.fluidHeight&&(i.mode="height",i.ratio=parseFloat(n.dimensions.width)/i.initialDimensions.height),e.holderData.fluidConfig=i}else p(e)}}function d(){for(var e,n=[],i=Object.keys(R.vars.invisibleImages),o=0,r=i.length;r>o;o++)e=R.vars.invisibleImages[i[o]],$(e)&&"img"==e.nodeName.toLowerCase()&&(n.push(e),delete R.vars.invisibleImages[i[o]]);n.length&&B.run({images:n}),t.requestAnimationFrame(d)}function f(){R.vars.visibilityCheckStarted||(t.requestAnimationFrame(d),R.vars.visibilityCheckStarted=!0)}function p(e){e.holderData.invisibleId||(R.vars.invisibleId+=1,R.vars.invisibleImages["i"+R.vars.invisibleId]=e,e.holderData.invisibleId=R.vars.invisibleId)}function h(e,t){return null==t?document.createElement(e):document.createElementNS(t,e)}function g(e,t){for(var n in t)e.setAttribute(n,t[n])}function m(e,t,n){var i,o;null==e?(e=h("svg",j),i=h("defs",j),o=h("style",j),g(o,{type:"text/css"}),i.appendChild(o),e.appendChild(i)):o=e.querySelector("style"),e.webkitMatchesSelector&&e.setAttribute("xmlns",j);for(var r=0;r=0;a--){var l=s.createProcessingInstruction("xml-stylesheet",'href="'+r[a]+'" rel="stylesheet"');s.insertBefore(l,s.firstChild)}var c=s.createProcessingInstruction("xml",'version="1.0" encoding="UTF-8" standalone="yes"');s.insertBefore(c,s.firstChild),s.removeChild(s.documentElement),o=i.serializeToString(s)}var u=i.serializeToString(e);return u=u.replace(/\&(\#[0-9]{2,}\;)/g,"&$1"),o+u}}function y(){return t.DOMParser?(new DOMParser).parseFromString("","application/xml"):void 0}function b(e){R.vars.debounceTimer||e.call(this),R.vars.debounceTimer&&t.clearTimeout(R.vars.debounceTimer),R.vars.debounceTimer=t.setTimeout(function(){R.vars.debounceTimer=null,e.call(this)},R.setup.debounce)}function A(){b(function(){c(null)})}var x=n(1),w=n(2),C=n(3),T=C.extend,E=C.cssProps,S=C.encodeHtmlEntity,k=C.decodeHtmlEntity,N=C.imageExists,D=C.getNodeArray,$=C.dimensionCheck,j="http://www.w3.org/2000/svg",L=8,O="2.6.0",I="\nCreated with Holder.js "+O+".\nLearn more at http://holderjs.com\n(c) 2012-2015 Ivan Malopinsky - http://imsky.co\n",B={version:O,addTheme:function(e,t){return null!=e&&null!=t&&(R.settings.themes[e]=t),delete R.vars.cache.themeKeys,this},addImage:function(e,t){var n=document.querySelectorAll(t);if(n.length)for(var i=0,o=n.length;o>i;i++){var r=h("img"),s={};s[R.vars.dataAttr]=e,g(r,s),n[i].appendChild(r)}return this},setResizeUpdate:function(e,t){e.holderData&&(e.holderData.resizeUpdate=!!t,e.holderData.resizeUpdate&&c(e))},run:function(e){e=e||{};var n={},s=T(R.settings,e);R.vars.preempted=!0,R.vars.dataAttr=s.dataAttr||R.vars.dataAttr,n.renderer=s.renderer?s.renderer:R.setup.renderer,-1===R.setup.renderers.join(",").indexOf(n.renderer)&&(n.renderer=R.setup.supportsSVG?"svg":R.setup.supportsCanvas?"canvas":"html");var a=D(s.images),l=D(s.bgnodes),c=D(s.stylenodes),u=D(s.objects);n.stylesheets=[],n.svgXMLStylesheet=!0,n.noFontFallback=!!s.noFontFallback&&s.noFontFallback;for(var d=0;d1){n.nodeValue="";for(var A=0;A=0?t:1)}function r(e){x?o(e):w.push(e)}null==document.readyState&&document.addEventListener&&(document.addEventListener("DOMContentLoaded",function e(){document.removeEventListener("DOMContentLoaded",e,!1),document.readyState="complete"},!1),document.readyState="loading");var s=e.document,a=s.documentElement,l="load",c=!1,u="on"+l,d="complete",f="readyState",p="attachEvent",h="detachEvent",g="addEventListener",m="DOMContentLoaded",v="onreadystatechange",y="removeEventListener",b=g in s,A=c,x=c,w=[];if(s[f]===d)o(t);else if(b)s[g](m,n,c),e[g](l,n,c);else{s[p](v,n),e[p](u,n);try{A=null==e.frameElement&&a}catch(e){}A&&A.doScroll&&!function e(){if(!x){try{A.doScroll("left")}catch(t){return o(e,50)}i(),t()}}()}return r.version="1.4.0",r.isReady=function(){return x},r}e.exports="undefined"!=typeof window&&t(window)},function(e,t,n){var i=n(4),o=function(e){function t(e,t){for(var n in t)e[n]=t[n];return e}var n=1,o=i.defclass({constructor:function(e){n++,this.parent=null,this.children={},this.id=n,this.name="n"+n,null!=e&&(this.name=e),this.x=0,this.y=0,this.z=0,this.width=0,this.height=0},resize:function(e,t){null!=e&&(this.width=e),null!=t&&(this.height=t)},moveTo:function(e,t,n){this.x=null!=e?e:this.x,this.y=null!=t?t:this.y,this.z=null!=n?n:this.z},add:function(e){var t=e.name;if(null!=this.children[t])throw"SceneGraph: child with that name already exists: "+t;this.children[t]=e,e.parent=this}}),r=i(o,function(t){this.constructor=function(){t.constructor.call(this,"root"),this.properties=e}}),s=i(o,function(e){function n(n,i){if(e.constructor.call(this,n),this.properties={fill:"#000"},null!=i)t(this.properties,i);else if(null!=n&&"string"!=typeof n)throw"SceneGraph: invalid node name"}this.Group=i.extend(this,{constructor:n,type:"group"}),this.Rect=i.extend(this,{constructor:n,type:"rect"}),this.Text=i.extend(this,{constructor:function(e){n.call(this),this.properties.text=e},type:"text"})}),a=new r;return this.Shape=s,this.root=a,this};e.exports=o},function(e,t){(function(e){t.extend=function(e,t){var n={};for(var i in e)e.hasOwnProperty(i)&&(n[i]=e[i]);if(null!=t)for(var o in t)t.hasOwnProperty(o)&&(n[o]=t[o]);return n},t.cssProps=function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n+":"+e[n]);return t.join(";")},t.encodeHtmlEntity=function(e){for(var t=[],n=0,i=e.length-1;i>=0;i--)n=e.charCodeAt(i),t.unshift(n>128?["",n,";"].join(""):e[i]);return t.join("")},t.getNodeArray=function(t){var n=null;return"string"==typeof t?n=document.querySelectorAll(t):e.NodeList&&t instanceof e.NodeList?n=t:e.Node&&t instanceof e.Node?n=[t]:e.HTMLCollection&&t instanceof e.HTMLCollection?n=t:t instanceof Array?n=t:null===t&&(n=[]),n},t.imageExists=function(e,t){var n=new Image;n.onerror=function(){t.call(this,!1)},n.onload=function(){t.call(this,!0)},n.src=e},t.decodeHtmlEntity=function(e){return e.replace(/(\d+);/g,function(e,t){return String.fromCharCode(t)})},t.dimensionCheck=function(e){var t={height:e.clientHeight,width:e.clientWidth};return!(!t.height||!t.width)&&t}}).call(t,function(){return this}())},function(e){var t=function(){},n=Array.prototype.slice,i=function(e,i){var o=t.prototype="function"==typeof e?e.prototype:e,r=new t,s=i.apply(r,n.call(arguments,2).concat(o));if("object"==typeof s)for(var a in s)r[a]=s[a];if(!r.hasOwnProperty("constructor"))return r;var l=r.constructor;return l.prototype=r,l};i.defclass=function(e){var t=e.constructor;return t.prototype=e,t},i.extend=function(e,t){return i(e,function(e){return this.uber=e,t})},e.exports=i}])}),!function(e){"use strict";function t(e){return e.replace(/,/g,".").replace(/[^0-9\.]/g,"")}function n(e){return parseFloat(t(e))>=10}var i,o={bridge:null,version:"0.0.0",disabled:null,outdated:null,ready:null},r={},s=0,a={},l=0,c={},u=null,d=null,f=function(){var e,t,n,i,o="ZeroClipboard.swf";
+if(document.currentScript&&(i=document.currentScript.src));else{var r=document.getElementsByTagName("script");if("readyState"in r[0])for(e=r.length;e--&&("interactive"!==r[e].readyState||!(i=r[e].src)););else if("loading"===document.readyState)i=r[r.length-1].src;else{for(e=r.length;e--;){if(n=r[e].src,!n){t=null;break}if(n=n.split("#")[0].split("?")[0],n=n.slice(0,n.lastIndexOf("/")+1),null==t)t=n;else if(t!==n){t=null;break}}null!==t&&(i=t)}}return i&&(i=i.split("#")[0].split("?")[0],o=i.slice(0,i.lastIndexOf("/")+1)+o),o}(),p=function(){var e=/\-([a-z])/g,t=function(e,t){return t.toUpperCase()};return function(n){return n.replace(e,t)}}(),h=function(t,n){var i,o,r;return e.getComputedStyle?i=e.getComputedStyle(t,null).getPropertyValue(n):(o=p(n),i=t.currentStyle?t.currentStyle[o]:t.style[o]),"cursor"!==n||i&&"auto"!==i||(r=t.tagName.toLowerCase(),"a"!==r)?i:"pointer"},g=function(t){t||(t=e.event);var n;this!==e?n=this:t.target?n=t.target:t.srcElement&&(n=t.srcElement),R.activate(n)},m=function(e,t,n){e&&1===e.nodeType&&(e.addEventListener?e.addEventListener(t,n,!1):e.attachEvent&&e.attachEvent("on"+t,n))},v=function(e,t,n){e&&1===e.nodeType&&(e.removeEventListener?e.removeEventListener(t,n,!1):e.detachEvent&&e.detachEvent("on"+t,n))},y=function(e,t){if(!e||1!==e.nodeType)return e;if(e.classList)return e.classList.contains(t)||e.classList.add(t),e;if(t&&"string"==typeof t){var n=(t||"").split(/\s+/);if(1===e.nodeType)if(e.className){for(var i=" "+e.className+" ",o=e.className,r=0,s=n.length;s>r;r++)i.indexOf(" "+n[r]+" ")<0&&(o+=" "+n[r]);e.className=o.replace(/^\s+|\s+$/g,"")}else e.className=t}return e},b=function(e,t){if(!e||1!==e.nodeType)return e;if(e.classList)return e.classList.contains(t)&&e.classList.remove(t),e;if(t&&"string"==typeof t||void 0===t){var n=(t||"").split(/\s+/);if(1===e.nodeType&&e.className)if(t){for(var i=(" "+e.className+" ").replace(/[\n\t]/g," "),o=0,r=n.length;r>o;o++)i=i.replace(" "+n[o]+" "," ");e.className=i.replace(/^\s+|\s+$/g,"")}else e.className=""}return e},A=function(){var e,t,n,i=1;return"function"==typeof document.body.getBoundingClientRect&&(e=document.body.getBoundingClientRect(),t=e.right-e.left,n=document.body.offsetWidth,i=Math.round(t/n*100)/100),i},x=function(t,n){var i={left:0,top:0,width:0,height:0,zIndex:k(n)-1};if(t.getBoundingClientRect){var o,r,s,a=t.getBoundingClientRect();"pageXOffset"in e&&"pageYOffset"in e?(o=e.pageXOffset,r=e.pageYOffset):(s=A(),o=Math.round(document.documentElement.scrollLeft/s),r=Math.round(document.documentElement.scrollTop/s));var l=document.documentElement.clientLeft||0,c=document.documentElement.clientTop||0;i.left=a.left+o-l,i.top=a.top+r-c,i.width="width"in a?a.width:a.right-a.left,i.height="height"in a?a.height:a.bottom-a.top}return i},w=function(e,t){var n=null==t||t&&t.cacheBust===!0&&t.useNoCache===!0;return n?(-1===e.indexOf("?")?"?":"&")+"noCache="+(new Date).getTime():""},C=function(t){var n,i,o,r=[],s=[],a=[];if(t.trustedOrigins&&("string"==typeof t.trustedOrigins?s.push(t.trustedOrigins):"object"==typeof t.trustedOrigins&&"length"in t.trustedOrigins&&(s=s.concat(t.trustedOrigins))),t.trustedDomains&&("string"==typeof t.trustedDomains?s.push(t.trustedDomains):"object"==typeof t.trustedDomains&&"length"in t.trustedDomains&&(s=s.concat(t.trustedDomains))),s.length)for(n=0,i=s.length;i>n;n++)if(s.hasOwnProperty(n)&&s[n]&&"string"==typeof s[n]){if(o=$(s[n]),!o)continue;if("*"===o){a=[o];break}a.push.apply(a,[o,"//"+o,e.location.protocol+"//"+o])}return a.length&&r.push("trustedOrigins="+encodeURIComponent(a.join(","))),"string"==typeof t.jsModuleId&&t.jsModuleId&&r.push("jsModuleId="+encodeURIComponent(t.jsModuleId)),r.join("&")},T=function(e,t,n){if("function"==typeof t.indexOf)return t.indexOf(e,n);var i,o=t.length;for("undefined"==typeof n?n=0:0>n&&(n=o+n),i=n;o>i;i++)if(t.hasOwnProperty(i)&&t[i]===e)return i;return-1},E=function(e){if("string"==typeof e)throw new TypeError("ZeroClipboard doesn't accept query strings.");return e.length?e:[e]},S=function(t,n,i,o){o?e.setTimeout(function(){t.apply(n,i)},0):t.apply(n,i)},k=function(e){var t,n;return e&&("number"==typeof e&&e>0?t=e:"string"==typeof e&&(n=parseInt(e,10))&&!isNaN(n)&&n>0&&(t=n)),t||("number"==typeof F.zIndex&&F.zIndex>0?t=F.zIndex:"string"==typeof F.zIndex&&(n=parseInt(F.zIndex,10))&&!isNaN(n)&&n>0&&(t=n)),t||0},N=function(e,t){if(e&&t!==!1&&"undefined"!=typeof console&&console&&(console.warn||console.log)){var n="`"+e+"` is deprecated. See docs for more info:\n https://github.com/zeroclipboard/zeroclipboard/blob/master/docs/instructions.md#deprecations";console.warn?console.warn(n):console.log(n)}},D=function(){var e,t,n,i,o,r,s=arguments[0]||{};for(e=1,t=arguments.length;t>e;e++)if(null!=(n=arguments[e]))for(i in n)if(n.hasOwnProperty(i)){if(o=s[i],r=n[i],s===r)continue;void 0!==r&&(s[i]=r)}return s},$=function(e){if(null==e||""===e)return null;if(e=e.replace(/^\s+|\s+$/g,""),""===e)return null;var t=e.indexOf("//");e=-1===t?e:e.slice(t+2);var n=e.indexOf("/");return e=-1===n?e:-1===t||0===n?null:e.slice(0,n),e&&".swf"===e.slice(-4).toLowerCase()?null:e||null},j=function(){var e=function(e,t){var n,i,o;if(null!=e&&"*"!==t[0]&&("string"==typeof e&&(e=[e]),"object"==typeof e&&"length"in e))for(n=0,i=e.length;i>n;n++)if(e.hasOwnProperty(n)&&(o=$(e[n]))){if("*"===o){t.length=0,t.push("*");break}-1===T(o,t)&&t.push(o)}},t={always:"always",samedomain:"sameDomain",never:"never"};return function(n,i){var o,r=i.allowScriptAccess;if("string"==typeof r&&(o=r.toLowerCase())&&/^always|samedomain|never$/.test(o))return t[o];var s=$(i.moviePath);null===s&&(s=n);var a=[];e(i.trustedOrigins,a),e(i.trustedDomains,a);var l=a.length;if(l>0){if(1===l&&"*"===a[0])return"always";if(-1!==T(n,a))return 1===l&&n===s?"sameDomain":"always"}return"never"}}(),L=function(e){if(null==e)return[];if(Object.keys)return Object.keys(e);var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t},O=function(e){if(e)for(var t in e)e.hasOwnProperty(t)&&delete e[t];return e},I=function(){try{return document.activeElement}catch(e){}return null},B=function(){var e=!1;if("boolean"==typeof o.disabled)e=o.disabled===!1;else{if("function"==typeof ActiveXObject)try{new ActiveXObject("ShockwaveFlash.ShockwaveFlash")&&(e=!0)}catch(e){}!e&&navigator.mimeTypes["application/x-shockwave-flash"]&&(e=!0)}return e},R=function(e,t){return this instanceof R?(this.id=""+s++,a[this.id]={instance:this,elements:[],handlers:{}},e&&this.clip(e),"undefined"!=typeof t&&(N("new ZeroClipboard(elements, options)",F.debug),R.config(t)),this.options=R.config(),"boolean"!=typeof o.disabled&&(o.disabled=!B()),void(o.disabled===!1&&o.outdated!==!0&&null===o.bridge&&(o.outdated=!1,o.ready=!1,P()))):new R(e,t)};R.prototype.setText=function(e){return e&&""!==e&&(r["text/plain"]=e,o.ready===!0&&o.bridge&&"function"==typeof o.bridge.setText?o.bridge.setText(e):o.ready=!1),this},R.prototype.setSize=function(e,t){return o.ready===!0&&o.bridge&&"function"==typeof o.bridge.setSize?o.bridge.setSize(e,t):o.ready=!1,this};var H=function(e){o.ready===!0&&o.bridge&&"function"==typeof o.bridge.setHandCursor?o.bridge.setHandCursor(e):o.ready=!1};R.prototype.destroy=function(){this.unclip(),this.off(),delete a[this.id]};var M=function(){var e,t,n,i=[],o=L(a);for(e=0,t=o.length;t>e;e++)n=a[o[e]].instance,n&&n instanceof R&&i.push(n);return i};R.version="1.3.5";var F={swfPath:f,trustedDomains:e.location.host?[e.location.host]:[],cacheBust:!0,forceHandCursor:!1,zIndex:999999999,debug:!0,title:null,autoActivate:!0};R.config=function(e){if("object"==typeof e&&null!==e&&D(F,e),"string"!=typeof e||!e){var t={};for(var n in F)F.hasOwnProperty(n)&&(t[n]="object"==typeof F[n]&&null!==F[n]?"length"in F[n]?F[n].slice(0):D({},F[n]):F[n]);return t}return F.hasOwnProperty(e)?F[e]:void 0},R.destroy=function(){R.deactivate();for(var e in a)if(a.hasOwnProperty(e)&&a[e]){var t=a[e].instance;t&&"function"==typeof t.destroy&&t.destroy()}var n=z(o.bridge);n&&n.parentNode&&(n.parentNode.removeChild(n),o.ready=null,o.bridge=null)},R.activate=function(e){i&&(b(i,F.hoverClass),b(i,F.activeClass)),i=e,y(e,F.hoverClass),q();var t=F.title||e.getAttribute("title");if(t){var n=z(o.bridge);n&&n.setAttribute("title",t)}var r=F.forceHandCursor===!0||"pointer"===h(e,"cursor");H(r)},R.deactivate=function(){var e=z(o.bridge);e&&(e.style.left="0px",e.style.top="-9999px",e.removeAttribute("title")),i&&(b(i,F.hoverClass),b(i,F.activeClass),i=null)};var P=function(){var t,n,i=document.getElementById("global-zeroclipboard-html-bridge");if(!i){var r=R.config();r.jsModuleId="string"==typeof u&&u||"string"==typeof d&&d||null;var s=j(e.location.host,F),a=C(r),l=F.moviePath+w(F.moviePath,F),c=' ';i=document.createElement("div"),i.id="global-zeroclipboard-html-bridge",i.setAttribute("class","global-zeroclipboard-container"),i.style.position="absolute",i.style.left="0px",i.style.top="-9999px",i.style.width="15px",i.style.height="15px",i.style.zIndex=""+k(F.zIndex),document.body.appendChild(i),i.innerHTML=c}t=document["global-zeroclipboard-flash-bridge"],t&&(n=t.length)&&(t=t[n-1]),o.bridge=t||i.children[0].lastElementChild},z=function(e){for(var t=/^OBJECT|EMBED$/,n=e&&e.parentNode;n&&t.test(n.nodeName)&&n.parentNode;)n=n.parentNode;return n||null},q=function(){if(i){var e=x(i,F.zIndex),t=z(o.bridge);t&&(t.style.top=e.top+"px",t.style.left=e.left+"px",t.style.width=e.width+"px",t.style.height=e.height+"px",t.style.zIndex=e.zIndex+1),o.ready===!0&&o.bridge&&"function"==typeof o.bridge.setSize?o.bridge.setSize(e.width,e.height):o.ready=!1}return this};R.prototype.on=function(e,t){var n,i,r,s={},l=a[this.id]&&a[this.id].handlers;if("string"==typeof e&&e)r=e.toLowerCase().split(/\s+/);else if("object"==typeof e&&e&&"undefined"==typeof t)for(n in e)e.hasOwnProperty(n)&&"string"==typeof n&&n&&"function"==typeof e[n]&&this.on(n,e[n]);if(r&&r.length){for(n=0,i=r.length;i>n;n++)e=r[n].replace(/^on/,""),s[e]=!0,l[e]||(l[e]=[]),l[e].push(t);s.noflash&&o.disabled&&U.call(this,"noflash",{}),s.wrongflash&&o.outdated&&U.call(this,"wrongflash",{flashVersion:o.version}),s.load&&o.ready&&U.call(this,"load",{flashVersion:o.version})}return this},R.prototype.off=function(e,t){var n,i,o,r,s,l=a[this.id]&&a[this.id].handlers;if(0===arguments.length)r=L(l);else if("string"==typeof e&&e)r=e.split(/\s+/);else if("object"==typeof e&&e&&"undefined"==typeof t)for(n in e)e.hasOwnProperty(n)&&"string"==typeof n&&n&&"function"==typeof e[n]&&this.off(n,e[n]);if(r&&r.length)for(n=0,i=r.length;i>n;n++)if(e=r[n].toLowerCase().replace(/^on/,""),s=l[e],s&&s.length)if(t)for(o=T(t,s);-1!==o;)s.splice(o,1),o=T(t,s,o);else l[e].length=0;return this},R.prototype.handlers=function(e){var t,n=null,i=a[this.id]&&a[this.id].handlers;if(i){if("string"==typeof e&&e)return i[e]?i[e].slice(0):null;n={};for(t in i)i.hasOwnProperty(t)&&i[t]&&(n[t]=i[t].slice(0))}return n};var _=function(t,n,i,o){var r=a[this.id]&&a[this.id].handlers[t];if(r&&r.length){var s,l,c,u=n||this;for(s=0,l=r.length;l>s;s++)c=r[s],n=u,"string"==typeof c&&"function"==typeof e[c]&&(c=e[c]),"object"==typeof c&&c&&"function"==typeof c.handleEvent&&(n=c,c=c.handleEvent),"function"==typeof c&&S(c,n,i,o)}return this};R.prototype.clip=function(e){e=E(e);for(var t=0;ti;i++)r=a[n[i]].instance,r&&r instanceof R&&s.push(r);return s};F.hoverClass="zeroclipboard-is-hover",F.activeClass="zeroclipboard-is-active",F.trustedOrigins=null,F.allowScriptAccess=null,F.useNoCache=!0,F.moviePath="ZeroClipboard.swf",R.detectFlashSupport=function(){return N("ZeroClipboard.detectFlashSupport",F.debug),B()},R.dispatch=function(e,t){if("string"==typeof e&&e){var n=e.toLowerCase().replace(/^on/,"");if(n)for(var o=i&&F.autoActivate===!0?W(i):M(),r=0,s=o.length;s>r;r++)U.call(o[r],n,t)}},R.prototype.setHandCursor=function(e){return N("ZeroClipboard.prototype.setHandCursor",F.debug),e="boolean"==typeof e?e:!!e,H(e),F.forceHandCursor=e,this},R.prototype.reposition=function(){return N("ZeroClipboard.prototype.reposition",F.debug),q()},R.prototype.receiveEvent=function(e,t){if(N("ZeroClipboard.prototype.receiveEvent",F.debug),"string"==typeof e&&e){var n=e.toLowerCase().replace(/^on/,"");n&&U.call(this,n,t)}},R.prototype.setCurrent=function(e){return N("ZeroClipboard.prototype.setCurrent",F.debug),R.activate(e),this},R.prototype.resetBridge=function(){return N("ZeroClipboard.prototype.resetBridge",F.debug),R.deactivate(),this},R.prototype.setTitle=function(e){if(N("ZeroClipboard.prototype.setTitle",F.debug),e=e||F.title||i&&i.getAttribute("title")){var t=z(o.bridge);t&&t.setAttribute("title",e)}return this},R.setDefaults=function(e){N("ZeroClipboard.setDefaults",F.debug),R.config(e)},R.prototype.addEventListener=function(e,t){return N("ZeroClipboard.prototype.addEventListener",F.debug),this.on(e,t)},R.prototype.removeEventListener=function(e,t){return N("ZeroClipboard.prototype.removeEventListener",F.debug),this.off(e,t)},R.prototype.ready=function(){return N("ZeroClipboard.prototype.ready",F.debug),o.ready===!0};var U=function(e,s){e=e.toLowerCase().replace(/^on/,"");var a=s&&s.flashVersion&&t(s.flashVersion)||null,l=i,c=!0;switch(e){case"load":if(a){if(!n(a))return void U.call(this,"onWrongFlash",{flashVersion:a});o.outdated=!1,o.ready=!0,o.version=a}break;case"wrongflash":a&&!n(a)&&(o.outdated=!0,o.ready=!1,o.version=a);break;case"mouseover":y(l,F.hoverClass);break;case"mouseout":F.autoActivate===!0&&R.deactivate();break;case"mousedown":y(l,F.activeClass);break;case"mouseup":b(l,F.activeClass);break;case"datarequested":if(l){var u=l.getAttribute("data-clipboard-target"),d=u?document.getElementById(u):null;if(d){var f=d.value||d.textContent||d.innerText;f&&this.setText(f)}else{var p=l.getAttribute("data-clipboard-text");p&&this.setText(p)}}c=!1;break;case"complete":O(r),l&&l!==I()&&l.focus&&l.focus()}var h=l,g=[this,s];return _.call(this,e,h,g,c)};"function"==typeof define&&define.amd?define(["require","exports","module"],function(e,t,n){return u=n&&n.id||null,R}):"object"==typeof module&&module&&"object"==typeof module.exports&&module.exports&&"function"==typeof e.require?(d=module.id||null,module.exports=R):e.ZeroClipboard=R}(function(){return this}());var anchors=new AnchorJS;!function(e){"use strict";e(function(){var t=e(window),n=e(document.body);n.scrollspy({target:".docs-sidebar"}),t.on("load",function(){n.scrollspy("refresh")}),e(".docs-container [href=#]").click(function(e){e.preventDefault()}),setTimeout(function(){var t=e(".docs-sidebar");t.affix({offset:{top:function(){var n=t.offset().top,i=parseInt(t.children(0).css("margin-top"),10),o=e(".docs-nav").height();return this.top=n-o-i},bottom:function(){return this.bottom=e(".docs-footer").outerHeight(!0)}}})},100),setTimeout(function(){e(".bs-top").affix()},100),function(){var t=e("#bs-theme-stylesheet"),n=e(".docs-theme-toggle"),i=function(){t.attr("href",t.attr("data-href")),n.text("禁用主题预览"),localStorage.setItem("previewTheme",!0)};localStorage.getItem("previewTheme")&&i(),n.click(function(){var e=t.attr("href");e&&0!==e.indexOf("data")?(t.attr("href",""),n.text("主题预览"),localStorage.removeItem("previewTheme")):i()})}(),e(".tooltip-demo").tooltip({selector:'[data-toggle="tooltip"]',container:"body"}),e(".popover-demo").popover({selector:'[data-toggle="popover"]',container:"body"}),e(".tooltip-test").tooltip(),e(".popover-test").popover(),e(".docs-popover").popover(),e("#loading-example-btn").on("click",function(){var t=e(this);t.button("loading"),setTimeout(function(){t.button("reset")},3e3)}),e("#exampleModal").on("show.bs.modal",function(t){var n=e(t.relatedTarget),i=n.data("whatever"),o=e(this);o.find(".modal-title").text("New message to "+i),o.find(".modal-body input").val(i)}),e(".docs-activate-animated-progressbar").on("click",function(){e(this).siblings(".progress").find(".progress-bar-striped").toggleClass("active")}),ZeroClipboard.config({moviePath:"source/ZeroClipboard.swf",hoverClass:"btn-clipboard-hover"}),e(".highlight").each(function(){var t='复制
';e(this).before(t)});var i=new ZeroClipboard(e(".btn-clipboard")),o=e("#global-zeroclipboard-html-bridge");i.on("load",function(){o.data("placement","top").attr("title","复制到剪贴板").tooltip(),i.on("dataRequested",function(t){var n=e(this).parent().nextAll(".highlight").first();t.setText(n.text())}),i.on("complete",function(){o.attr("title","复制成功!").tooltip("fixTitle").tooltip("show").attr("title","复制到剪贴板").tooltip("fixTitle")})}),i.on("noflash wrongflash",function(){e(".zero-clipboard").remove(),ZeroClipboard.destroy()})})}(jQuery),function(){"use strict";anchors.options.placement="left",anchors.add(".docs-section > h1, .docs-section > h2, .docs-section > h3, .docs-section > h4, .docs-section > h5")}();
\ No newline at end of file
diff --git a/docs/source/shBrush-css.js b/docs/source/shBrush-css.js
new file mode 100644
index 0000000..0ecf398
--- /dev/null
+++ b/docs/source/shBrush-css.js
@@ -0,0 +1,75 @@
+;(function()
+{
+ // CommonJS
+ SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+ function Brush()
+ {
+ function getKeywordsCSS(str)
+ {
+ return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b';
+ };
+
+ function getValuesCSS(str)
+ {
+ return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b';
+ };
+
+ var keywords = 'ascent azimuth background-attachment background-color background-image background-position ' +
+ 'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
+ 'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
+ 'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
+ 'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
+ 'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
+ 'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
+ 'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
+ 'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
+ 'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
+ 'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
+ 'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
+ 'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
+ 'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
+
+ var values = 'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
+ 'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
+ 'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double '+
+ 'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
+ 'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
+ 'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
+ 'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
+ 'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
+ 'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
+ 'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
+ 'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
+ 'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
+ 'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
+ 'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
+
+ var fonts = '[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';
+
+ this.regexList = [
+ { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings
+ { regex: /\#[a-fA-F0-9]{3,6}/g, css: 'value' }, // html colors
+ { regex: /(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)/g, css: 'value' }, // sizes
+ { regex: /!important/g, css: 'color3' }, // !important
+ { regex: new RegExp(getKeywordsCSS(keywords), 'gm'), css: 'keyword' }, // keywords
+ { regex: new RegExp(getValuesCSS(values), 'g'), css: 'value' }, // values
+ { regex: new RegExp(this.getKeywords(fonts), 'g'), css: 'color1' } // fonts
+ ];
+
+ this.forHtmlScript({
+ left: /(<|<)\s*style.*?(>|>)/gi,
+ right: /(<|<)\/\s*style\s*(>|>)/gi
+ });
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['css'];
+
+ SyntaxHighlighter.brushes.CSS = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/docs/source/shBrush-js.js b/docs/source/shBrush-js.js
new file mode 100644
index 0000000..8791447
--- /dev/null
+++ b/docs/source/shBrush-js.js
@@ -0,0 +1,36 @@
+;(function()
+{
+ // CommonJS
+ SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+ function Brush()
+ {
+ var keywords = 'break case catch class continue ' +
+ 'default delete do else enum export extends false ' +
+ 'for function if implements import in instanceof ' +
+ 'interface let new null package private protected ' +
+ 'static return super switch ' +
+ 'this throw true try typeof var while with yield';
+
+ var r = SyntaxHighlighter.regexLib;
+
+ this.regexList = [
+ { regex: r.multiLineDoubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: r.multiLineSingleQuotedString, css: 'string' }, // single quoted strings
+ { regex: r.singleLineCComments, css: 'comments' }, // one line comments
+ { regex: r.multiLineCComments, css: 'comments' }, // multiline comments
+ { regex: /\s*#.*/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // keywords
+ ];
+
+ this.forHtmlScript(r.scriptScriptTags);
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['js', 'jscript', 'javascript', 'json'];
+
+ SyntaxHighlighter.brushes.JScript = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/docs/source/shBrush-sass.js b/docs/source/shBrush-sass.js
new file mode 100644
index 0000000..aa04da0
--- /dev/null
+++ b/docs/source/shBrush-sass.js
@@ -0,0 +1,94 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ function getKeywordsCSS(str)
+ {
+ return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b';
+ };
+
+ function getValuesCSS(str)
+ {
+ return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b';
+ };
+
+ var keywords = 'ascent azimuth background-attachment background-color background-image background-position ' +
+ 'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
+ 'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
+ 'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
+ 'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
+ 'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
+ 'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
+ 'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
+ 'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
+ 'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
+ 'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
+ 'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
+ 'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
+ 'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
+
+ var values = 'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
+ 'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
+ 'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero digits disc dotted double '+
+ 'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
+ 'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
+ 'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
+ 'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
+ 'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
+ 'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
+ 'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
+ 'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
+ 'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
+ 'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
+ 'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
+
+ var fonts = '[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';
+
+ var statements = '!important !default';
+ var preprocessor = '@import @extend @debug @warn @if @for @while @mixin @include';
+
+ var r = SyntaxHighlighter.regexLib;
+
+ this.regexList = [
+ { regex: r.multiLineCComments, css: 'comments' }, // multiline comments
+ { regex: r.singleLineCComments, css: 'comments' }, // singleline comments
+ { regex: r.doubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: r.singleQuotedString, css: 'string' }, // single quoted strings
+ { regex: /\#[a-fA-F0-9]{3,6}/g, css: 'value' }, // html colors
+ { regex: /\b(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)\b/g, css: 'value' }, // sizes
+ { regex: /\$\w+/g, css: 'variable' }, // variables
+ { regex: new RegExp(this.getKeywords(statements), 'g'), css: 'color3' }, // statements
+ { regex: new RegExp(this.getKeywords(preprocessor), 'g'), css: 'preprocessor' }, // preprocessor
+ { regex: new RegExp(getKeywordsCSS(keywords), 'gm'), css: 'keyword' }, // keywords
+ { regex: new RegExp(getValuesCSS(values), 'g'), css: 'value' }, // values
+ { regex: new RegExp(this.getKeywords(fonts), 'g'), css: 'color1' } // fonts
+ ];
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['sass', 'scss'];
+
+ SyntaxHighlighter.brushes.Sass = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/docs/source/shCore.js b/docs/source/shCore.js
new file mode 100644
index 0000000..b47b645
--- /dev/null
+++ b/docs/source/shCore.js
@@ -0,0 +1,17 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");K a=f.1w;f=M(f.1m,t(f)+(e||""));I(a)f.1w={1m:a.1m,19:a.19?a.19.1a(0):N};H f}6 t(f){H(f.1J?"g":"")+(f.4s?"i":"")+(f.4p?"m":"")+(f.4v?"x":"")+(f.3n?"y":"")}6 B(f,e,a,b){K c=u.L,d,h,g;v=R;5K{O(;c--;){g=u[c];I(a&g.3r&&(!g.2p||g.2p.W(b))){g.2q.12=e;I((h=g.2q.X(f))&&h.P===e){d={3k:g.2b.W(b,h,a),1C:h};1N}}}}5v(i){1S i}5q{v=11}H d}6 p(f,e,a){I(3b.Z.1i)H f.1i(e,a);O(a=a||0;a-1},3d:6(g){e+=g}};c1&&p(e,"")>-1){a=15(J.1m,n.Q.W(t(J),"g",""));n.Q.W(f.1a(e.P),a,6(){O(K c=1;c<14.L-2;c++)I(14[c]===1d)e[c]=1d})}I(J.1w&&J.1w.19)O(K b=1;be.P&&J.12--}H e};I(!D)15.Z.1A=6(f){(f=n.X.W(J,f))&&J.1J&&!f[0].L&&J.12>f.P&&J.12--;H!!f};1r.Z.1C=6(f){M.1R(f)||(f=15(f));I(f.1J){K e=n.1C.1p(J,14);f.12=0;H e}H f.X(J)};1r.Z.Q=6(f,e){K a=M.1R(f),b,c;I(a&&1j e.58()==="3f"&&e.1i("${")===-1&&y)H n.Q.1p(J,14);I(a){I(f.1w)b=f.1w.19}Y f+="";I(1j e==="6")c=n.Q.W(J,f,6(){I(b){14[0]=1f 1r(14[0]);O(K d=0;dd.L-3;){i=1r.Z.1a.W(g,-1)+i;g=1Q.3i(g/10)}H(g?d[g]||"":"$")+i}Y{g=+i;I(g<=d.L-3)H d[g];g=b?p(b,i):-1;H g>-1?d[g+1]:h}})})}I(a&&f.1J)f.12=0;H c};1r.Z.1e=6(f,e){I(!M.1R(f))H n.1e.1p(J,14);K a=J+"",b=[],c=0,d,h;I(e===1d||+e<0)e=5D;Y{e=1Q.3i(+e);I(!e)H[]}O(f=M.3c(f);d=f.X(a);){I(f.12>c){b.U(a.1a(c,d.P));d.L>1&&d.P=e)1N}f.12===d.P&&f.12++}I(c===a.L){I(!n.1A.W(f,"")||h)b.U("")}Y b.U(a.1a(c));H b.L>e?b.1a(0,e):b};M.1h(/\\(\\?#[^)]*\\)/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"});M.1h(/\\((?!\\?)/,6(){J.19.U(N);H"("});M.1h(/\\(\\?<([$\\w]+)>/,6(f){J.19.U(f[1]);J.2N=R;H"("});M.1h(/\\\\k<([\\w$]+)>/,6(f){K e=p(J.19,f[1]);H e>-1?"\\\\"+(e+1)+(3R(f.2S.3a(f.P+f[0].L))?"":"(?:)"):f[0]});M.1h(/\\[\\^?]/,6(f){H f[0]==="[]"?"\\\\b\\\\B":"[\\\\s\\\\S]"});M.1h(/^\\(\\?([5A]+)\\)/,6(f){J.3d(f[1]);H""});M.1h(/(?:\\s+|#.*)+/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"},M.1B,6(){H J.2K("x")});M.1h(/\\./,6(){H"[\\\\s\\\\S]"},M.1B,6(){H J.2K("s")})})();1j 2e!="1d"&&(2e.M=M);K 1v=6(){6 r(a,b){a.1l.1i(b)!=-1||(a.1l+=" "+b)}6 t(a){H a.1i("3e")==0?a:"3e"+a}6 B(a){H e.1Y.2A[t(a)]}6 p(a,b,c){I(a==N)H N;K d=c!=R?a.3G:[a.2G],h={"#":"1c",".":"1l"}[b.1o(0,1)]||"3h",g,i;g=h!="3h"?b.1o(1):b.5u();I((a[h]||"").1i(g)!=-1)H a;O(a=0;d&&a\'+c+"17>"});H a}6 n(a,b){a.1e("\\n");O(K c="",d=0;d<50;d++)c+=" ";H a=v(a,6(h){I(h.1i("\\t")==-1)H h;O(K g=0;(g=h.1i("\\t"))!=-1;)h=h.1o(0,g)+c.1o(0,b-g%b)+h.1o(g+1,h.L);H h})}6 x(a){H a.Q(/^\\s+|\\s+$/g,"")}6 D(a,b){I(a.Pb.P)H 1;Y I(a.Lb.L)H 1;H 0}6 y(a,b){6 c(k){H k[0]}O(K d=N,h=[],g=b.2D?b.2D:c;(d=b.1I.X(a))!=N;){K i=g(d,b);I(1j i=="3f")i=[1f e.2L(i,d.P,b.23)];h=h.1O(i)}H h}6 E(a){K b=/(.*)((&1G;|&1y;).*)/;H a.Q(e.3A.3M,6(c){K d="",h=N;I(h=b.X(c)){c=h[1];d=h[2]}H\'\'+c+""+d})}6 z(){O(K a=1E.36("1k"),b=[],c=0;c<1z 4I="1Z://2y.3L.3K/4L/5L"><3J><4N 1Z-4M="5G-5M" 6K="2O/1z; 6J=6I-8" /><1t>6L 1v1t>3J><3B 1L="25-6M:6Q,6P,6O,6N-6F;6y-2f:#6x;2f:#6w;25-22:6v;2O-3D:3C;">1v3v 3.0.76 (72 73 3x)1Z://3u.2w/1v70 17 6U 71.6T 6X-3x 6Y 6D.6t 61 60 J 1k, 5Z 5R 5V <2R/>5U 5T 5S!3B>1z>\'}},1Y:{2j:N,2A:{}},1U:{},3A:{6n:/\\/\\*[\\s\\S]*?\\*\\//2c,6m:/\\/\\/.*$/2c,6l:/#.*$/2c,6k:/"([^\\\\"\\n]|\\\\.)*"/g,6o:/\'([^\\\\\'\\n]|\\\\.)*\'/g,6p:1f M(\'"([^\\\\\\\\"]|\\\\\\\\.)*"\',"3z"),6s:1f M("\'([^\\\\\\\\\']|\\\\\\\\.)*\'","3z"),6q:/(&1y;|<)!--[\\s\\S]*?--(&1G;|>)/2c,3M:/\\w+:\\/\\/[\\w-.\\/?%&=:@;]*/g,6a:{18:/(&1y;|<)\\?=?/g,1b:/\\?(&1G;|>)/g},69:{18:/(&1y;|<)%=?/g,1b:/%(&1G;|>)/g},6d:{18:/(&1y;|<)\\s*1k.*?(&1G;|>)/2T,1b:/(&1y;|<)\\/\\s*1k\\s*(&1G;|>)/2T}},16:{1H:6(a){6 b(i,k){H e.16.2o(i,k,e.13.1x[k])}O(K c=\'\',d=e.16.2x,h=d.2X,g=0;g";H c},2o:6(a,b,c){H\'<2W>\'+c+"2W>"},2b:6(a){K b=a.1F,c=b.1l||"";b=B(p(b,".20",R).1c);K d=6(h){H(h=15(h+"6f(\\\\w+)").X(c))?h[1]:N}("6g");b&&d&&e.16.2x[d].2B(b);a.3N()},2x:{2X:["21","2P"],21:{1H:6(a){I(a.V("2l")!=R)H"";K b=a.V("1t");H e.16.2o(a,"21",b?b:e.13.1x.21)},2B:6(a){a=1E.6j(t(a.1c));a.1l=a.1l.Q("47","")}},2P:{2B:6(){K a="68=0";a+=", 18="+(31.30-33)/2+", 32="+(31.2Z-2Y)/2+", 30=33, 2Z=2Y";a=a.Q(/^,/,"");a=1P.6Z("","38",a);a.2C();K b=a.1E;b.6W(e.13.1x.37);b.6V();a.2C()}}}},35:6(a,b){K c;I(b)c=[b];Y{c=1E.36(e.13.34);O(K d=[],h=0;h(.*?))\\\\]$"),s=1f M("(?<27>[\\\\w-]+)\\\\s*:\\\\s*(?<1T>[\\\\w-%#]+|\\\\[.*?\\\\]|\\".*?\\"|\'.*?\')\\\\s*;?","g");(j=s.X(k))!=N;){K o=j.1T.Q(/^[\'"]|[\'"]$/g,"");I(o!=N&&m.1A(o)){o=m.X(o);o=o.2V.L>0?o.2V.1e(/\\s*,\\s*/):[]}l[j.27]=o}g={1F:g,1n:C(i,l)};g.1n.1D!=N&&d.U(g)}H d},1M:6(a,b){K c=J.35(a,b),d=N,h=e.13;I(c.L!==0)O(K g=0;g")==o-3){m=m.4h(0,o-3);s=R}l=s?m:l}I((i.1t||"")!="")k.1t=i.1t;k.1D=j;d.2Q(k);b=d.2F(l);I((i.1c||"")!="")b.1c=i.1c;i.2G.74(b,i)}}},2E:6(a){w(1P,"4k",6(){e.1M(a)})}};e.2E=e.2E;e.1M=e.1M;e.2L=6(a,b,c){J.1T=a;J.P=b;J.L=a.L;J.23=c;J.1V=N};e.2L.Z.1q=6(){H J.1T};e.4l=6(a){6 b(j,l){O(K m=0;md)1N;Y I(g.P==c.P&&g.L>c.L)a[b]=N;Y I(g.P>=c.P&&g.P\'+c+""},3Q:6(a,b){K c="",d=a.1e("\\n").L,h=2u(J.V("2i-1s")),g=J.V("2z-1s-2t");I(g==R)g=(h+d-1).1q().L;Y I(3R(g)==R)g=0;O(K i=0;i\'+j+"17>":"")+i)}H a},4f:6(a){H a?"<4a>"+a+"4a>":""},4b:6(a,b){6 c(l){H(l=l?l.1V||g:g)?l+" ":""}O(K d=0,h="",g=J.V("1D",""),i=0;i|&1y;2R\\s*\\/?&1G;/2T;I(e.13.46==R)b=b.Q(h,"\\n");I(e.13.44==R)b=b.Q(h,"");b=b.1e("\\n");h=/^\\s*/;g=4Q;O(K i=0;i0;i++){K k=b[i];I(x(k).L!=0){k=h.X(k);I(k==N){a=a;1N a}g=1Q.4q(k[0].L,g)}}I(g>0)O(i=0;i\'+(J.V("16")?e.16.1H(J):"")+\'<3Z 5z="0" 5H="0" 5J="0">\'+J.4f(J.V("1t"))+"<3T><3P>"+(1u?\'<2d 1g="1u">\'+J.3Q(a)+"2d>":"")+\'<2d 1g="17">\'+b+"2d>3P>3T>3Z>"},2F:6(a){I(a===N)a="";J.17=a;K b=J.3Y("T");b.3X=J.1H(a);J.V("16")&&w(p(b,".16"),"5c",e.16.2b);J.V("3V-17")&&w(p(b,".17"),"56",f);H b},2Q:6(a){J.1c=""+1Q.5d(1Q.5n()*5k).1q();e.1Y.2A[t(J.1c)]=J;J.1n=C(e.2v,a||{});I(J.V("2k")==R)J.1n.16=J.1n.1u=11},5j:6(a){a=a.Q(/^\\s+|\\s+$/g,"").Q(/\\s+/g,"|");H"\\\\b(?:"+a+")\\\\b"},5f:6(a){J.28={18:{1I:a.18,23:"1k"},1b:{1I:a.1b,23:"1k"},17:1f M("(?<18>"+a.18.1m+")(?<17>.*?)(?<1b>"+a.1b.1m+")","5o")}}};H e}();1j 2e!="1d"&&(2e.1v=1v);',62,441,'||||||function|||||||||||||||||||||||||||||||||||||return|if|this|var|length|XRegExp|null|for|index|replace|true||div|push|getParam|call|exec|else|prototype||false|lastIndex|config|arguments|RegExp|toolbar|code|left|captureNames|slice|right|id|undefined|split|new|class|addToken|indexOf|typeof|script|className|source|params|substr|apply|toString|String|line|title|gutter|SyntaxHighlighter|_xregexp|strings|lt|html|test|OUTSIDE_CLASS|match|brush|document|target|gt|getHtml|regex|global|join|style|highlight|break|concat|window|Math|isRegExp|throw|value|brushes|brushName|space|alert|vars|http|syntaxhighlighter|expandSource|size|css|case|font|Fa|name|htmlScript|dA|can|handler|gm|td|exports|color|in|href|first|discoveredBrushes|light|collapse|object|cache|getButtonHtml|trigger|pattern|getLineHtml|nbsp|numbers|parseInt|defaults|com|items|www|pad|highlighters|execute|focus|func|all|getDiv|parentNode|navigator|INSIDE_CLASS|regexList|hasFlag|Match|useScriptTags|hasNamedCapture|text|help|init|br|input|gi|Error|values|span|list|250|height|width|screen|top|500|tagName|findElements|getElementsByTagName|aboutDialog|_blank|appendChild|charAt|Array|copyAsGlobal|setFlag|highlighter_|string|attachEvent|nodeName|floor|backref|output|the|TypeError|sticky|Za|iterate|freezeTokens|scope|type|textarea|alexgorbatchev|version|margin|2010|005896|gs|regexLib|body|center|align|noBrush|require|childNodes|DTD|xhtml1|head|org|w3|url|preventDefault|container|tr|getLineNumbersHtml|isNaN|userAgent|tbody|isLineHighlighted|quick|void|innerHTML|create|table|links|auto|smart|tab|stripBrs|tabs|bloggerMode|collapsed|plain|getCodeLinesHtml|caption|getMatchesHtml|findMatches|figureOutLineNumbers|removeNestedMatches|getTitleHtml|brushNotHtmlScript|substring|createElement|Highlighter|load|HtmlScript|Brush|pre|expand|multiline|min|Can|ignoreCase|find|blur|extended|toLowerCase|aliases|addEventListener|innerText|textContent|wasn|select|createTextNode|removeChild|option|same|frame|xmlns|dtd|twice|1999|equiv|meta|htmlscript|transitional|1E3|expected|PUBLIC|DOCTYPE|on|W3C|XHTML|TR|EN|Transitional||configured|srcElement|Object|after|run|dblclick|matchChain|valueOf|constructor|default|switch|click|round|execAt|forHtmlScript|token|gimy|functions|getKeywords|1E6|escape|within|random|sgi|another|finally|supply|MSIE|ie|toUpperCase|catch|returnValue|definition|event|border|imsx|constructing|one|Infinity|from|when|Content|cellpadding|flags|cellspacing|try|xhtml|Type|spaces|2930402|hosted_button_id|lastIndexOf|donate|active|development|keep|to|xclick|_s|Xml|please|like|you|paypal|cgi|cmd|webscr|bin|highlighted|scrollbars|aspScriptTags|phpScriptTags|sort|max|scriptScriptTags|toolbar_item|_|command|command_|number|getElementById|doubleQuotedString|singleLinePerlComments|singleLineCComments|multiLineCComments|singleQuotedString|multiLineDoubleQuotedString|xmlComments|alt|multiLineSingleQuotedString|If|https|1em|000|fff|background|5em|xx|bottom|75em|Gorbatchev|large|serif|CDATA|continue|utf|charset|content|About|family|sans|Helvetica|Arial|Geneva|3em|nogutter|Copyright|syntax|close|write|2004|Alex|open|JavaScript|highlighter|July|02|replaceChild|offset|83'.split('|'),0,{}))
diff --git a/docs/theme/ydoc.css b/docs/theme/ydoc.css
new file mode 100644
index 0000000..ef71761
--- /dev/null
+++ b/docs/theme/ydoc.css
@@ -0,0 +1,90 @@
+*{
+ color: #333;
+}
+.ydoc {
+ background: #fff;
+}
+::selection{
+ color: #fff;
+ background-color: #66b5e6;
+}
+
+.ydoc-header {
+ background-image: none;
+ box-shadow: none;
+ background-color: #07233c;
+}
+.ydoc-header a, .ydoc-nav{
+ color: #fff;
+}
+.ydoc-nav .active, .ydoc-nav .active a, .ydoc-nav li a:hover{
+ color: rgb(70, 160, 231);
+}
+.ydoc .ydoc-banner-bg{
+ background-image: url(http://ww1.sinaimg.cn/large/7921624bgy1feqpemihxaj24mo1pudpq.jpg);
+ background-repeat:no-repeat;
+ background-size:100% 230px;
+}
+.ydoc-banner-area h1, .ydoc-banner-area p{
+ color: rgba(232, 231, 229, 0.75);
+ font-family:Arial;
+ font-weight: bold;
+ *filter: Glow(color=#fff, strength=1);
+}
+
+
+/* content */
+.ydoc-container-content{
+ box-shadow: 0 0 10px #97b9e1;
+}
+/* content-left */
+/*.ydoc-container-content .content-left{
+ padding-left:4%;
+}*/
+.ydoc-container-content .docs-sidebar.affix{
+ top:0px;
+}
+.ydoc-container-content .docs-sidebar .docs-sidenav li a:hover {
+ background-color: #dff0ff;
+ border-left-color: #dff0ff;
+}
+.ydoc-container-content .docs-sidebar .docs-sidenav li.active a, .ydoc-container-content .docs-sidebar .docs-sidenav li.active a:hover {
+ border-left: 2px solid #96c3ea;
+ color: rgb(70, 160, 231);
+}
+.ydoc-container .docs-sidebar:before{
+ background-color: #dff0ff;
+}
+/* content-right */
+.markdown-body h1, .markdown-body h2{
+ border-bottom: 1px solid #dff0ff;
+}
+.markdown-body pre {
+ background-color: #fdfeff;
+ border: 1px solid #dff0ff;
+}
+/*.con-head{
+ color:#f00;
+}*/
+.markdown-body blockquote.api strong{
+ color:#e62929;
+}
+.prop-type{
+ color:#f00;
+}
+/* footer */
+.ydoc .footer {
+ background: #07233c;
+}
+
+/* mobile style */
+@media screen and (max-width: 767px){
+ .ydoc .ydoc-nav .navbar-left li a:hover, .ydoc .ydoc-nav .navbar-right li a:hover{
+ color: #96c3ea;
+ }
+ .ydoc-container-content .docs-sidebar .docs-sidenav li a:hover {
+ background-color: #222;
+ }
+}
+
+
diff --git a/docs/util-TransPXToTop.html b/docs/util-TransPXToTop.html
new file mode 100644
index 0000000..a015407
--- /dev/null
+++ b/docs/util-TransPXToTop.html
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 方法
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TransPxToDp
+
+ 0.17.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
React Native 的长度单位为 dp,意思是独立像素,不是真实的物理像素,1dp 在不同 PixelRatio(像素比)的设备上会等于不同 px,比如 iPhone 456 是 2px,iPhone 6s 是 3px,所以在 rn 代码里写一个宽度为 1 的边框,在 iPhone 5 上看上去会有 2 像素宽,在 iPhone 6s 上看上去会有 3 像素宽。
+
+dp 即 device-independent pixels,或 dip,表示设备独立像素;PixelRatio 则描述物理像素和独立像素的比值,即 PixelRatio = 物理像素 / dp。
+
+
transPxToDp
就是为了解决这个问题。使用了 transPxToDp
之后,设置 1 的宽度,在 iPhone 5 实际设置为 0.5,在 iPhone 6s 实际设置为 0.33。
+
Demo
+

+
Example
+
+import transPxToDp from 'rnx-ui/util/transPxToDp';
+
+
+const styles = StyleSheet.create({
+ foo: {
+
+ borderTopWidth: transPxToDp(1),
+ },
+});
+
+
⚠️ 注意
+
+在安卓设备下,如果 lineHeight
是小数会红屏,需要再取整下。
+
+如果想实现视觉效果较好的最细宽度,推荐使用 Stylesheet.hairlineWidth
,但如果就是要实现纯粹的最细宽度,那就用 transPxToDp(1)
吧。
+
+
+
+在屏幕像素比(PixelRatio)为 3.75 以下设备,hairlineWidth
和 transPxToDp(1)
是一样的,在 3.75 及以上设备,hairlineWidth
是 transPxToDp(1)
的两倍或两倍以上。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/util-Validator.html b/docs/util-Validator.html
new file mode 100644
index 0000000..dff492b
--- /dev/null
+++ b/docs/util-Validator.html
@@ -0,0 +1,285 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 方法
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Validator
+
+ 0.17.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
Example
+
+ import React from 'react';
+ import {
+ StyleSheet,
+ ScrollView,
+ } from 'react-native';
+ import {
+ PView,
+ } from 'rnplus';
+ import PhoneNumInput from 'rnx-ui/PhoneNumInput';
+ import SmsCaptchaInput from 'rnx-ui/SmsCaptchaInput';
+ import Btn from 'rnx-ui/Btn';
+ import Validator from 'rnx-ui/util/Validator';
+ import {
+ All,
+ NavBar,
+ } from 'BizComponent';
+
+ const styles = StyleSheet.create({
+ scrollView: {
+ paddingHorizontal: 10,
+ paddingTop: 10,
+ },
+ btn: {
+ marginTop: 10,
+ },
+ });
+
+ class RnxUiValidator extends PView {
+ constructor(props) {
+ super(props);
+
+ this.onPress = this.onPress.bind(this);
+
+ const validator = new Validator();
+ this.validator = validator;
+ this.collectValidate = validator.collect;
+ }
+ onPress() {
+ const res = this.validator.run();
+ console.log(res);
+ }
+ render() {
+ return (
+ <All>
+ <NavBar title="Validator" />
+ <ScrollView style={styles.scrollView}>
+ <PhoneNumInput
+ collectValidate={this.collectValidate}
+ name="HANDSOME_NAME"
+ readableName="帅气的名字"
+ />
+ <SmsCaptchaInput collectValidate={this.collectValidate} />
+ <Btn
+ style={styles.btn}
+ onPress={this.onPress}
+ />
+ </ScrollView>
+ </All>
+ );
+ }
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
方法
+
+
+
+ collect
+
+ #
+
+
+
用来收集基础表单组件的校验方法,通常为基础表单组件的 collectValidate 属性的值。
+
+
+
+
+
+
+
+ run
+
+ #
+
+
+
用来运行结果,返回一个对象。
+如果运行正确,返回对象的 err
属性值为 0,返回对象的 data
属性值为包含所有收集表单的名字和值的映射;
+如果运行错误,返回对象的 err
属性值为 1,返回对象的 data
属性值为出错信息。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/util.html b/docs/util.html
new file mode 100644
index 0000000..3793e26
--- /dev/null
+++ b/docs/util.html
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
+ RNX-UI Documentation 方法
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TransPxToDp
+
+ 0.17.0
+
+
+
+
+
+
使用说明
+
+
+
+
+
+
React Native 的长度单位为 dp,意思是独立像素,不是真实的物理像素,1dp 在不同 PixelRatio(像素比)的设备上会等于不同 px,比如 iPhone 456 是 2px,iPhone 6s 是 3px,所以在 rn 代码里写一个宽度为 1 的边框,在 iPhone 5 上看上去会有 2 像素宽,在 iPhone 6s 上看上去会有 3 像素宽。
+
+dp 即 device-independent pixels,或 dip,表示设备独立像素;PixelRatio 则描述物理像素和独立像素的比值,即 PixelRatio = 物理像素 / dp。
+
+
transPxToDp
就是为了解决这个问题。使用了 transPxToDp
之后,设置 1 的宽度,在 iPhone 5 实际设置为 0.5,在 iPhone 6s 实际设置为 0.33。
+
Demo
+

+
Example
+
+import transPxToDp from 'rnx-ui/util/transPxToDp';
+
+
+const styles = StyleSheet.create({
+ foo: {
+
+ borderTopWidth: transPxToDp(1),
+ },
+});
+
+
⚠️ 注意
+
+在安卓设备下,如果 lineHeight
是小数会红屏,需要再取整下。
+
+如果想实现视觉效果较好的最细宽度,推荐使用 Stylesheet.hairlineWidth
,但如果就是要实现纯粹的最细宽度,那就用 transPxToDp(1)
吧。
+
+
+
+在屏幕像素比(PixelRatio)为 3.75 以下设备,hairlineWidth
和 transPxToDp(1)
是一样的,在 3.75 及以上设备,hairlineWidth
是 transPxToDp(1)
的两倍或两倍以上。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/HeaderedSheet.gif b/img/HeaderedSheet.gif
new file mode 100644
index 0000000..d6a11c6
Binary files /dev/null and b/img/HeaderedSheet.gif differ
diff --git a/img/ImgHolder.gif b/img/ImgHolder.gif
new file mode 100644
index 0000000..6838b60
Binary files /dev/null and b/img/ImgHolder.gif differ
diff --git a/img/Loading.png b/img/Loading.png
new file mode 100644
index 0000000..49fcd41
Binary files /dev/null and b/img/Loading.png differ
diff --git a/img/NavBar.png b/img/NavBar.png
new file mode 100644
index 0000000..c13f695
Binary files /dev/null and b/img/NavBar.png differ
diff --git a/img/RefreshView.gif b/img/RefreshView.gif
new file mode 100644
index 0000000..0eeeed8
Binary files /dev/null and b/img/RefreshView.gif differ
diff --git a/img/Sheet.gif b/img/Sheet.gif
new file mode 100644
index 0000000..42d8bc9
Binary files /dev/null and b/img/Sheet.gif differ
diff --git a/img/SmsCaptchaInput.png b/img/SmsCaptchaInput.png
new file mode 100644
index 0000000..437c6bf
Binary files /dev/null and b/img/SmsCaptchaInput.png differ
diff --git a/img/TabBar.png b/img/TabBar.png
new file mode 100644
index 0000000..9028fe7
Binary files /dev/null and b/img/TabBar.png differ
diff --git a/util/transPxToDp/demo.png b/img/TransPxToDp.png
similarity index 100%
rename from util/transPxToDp/demo.png
rename to img/TransPxToDp.png
diff --git a/img/btn.png b/img/btn.png
new file mode 100644
index 0000000..c4b2a84
Binary files /dev/null and b/img/btn.png differ
diff --git a/img/phoneNumInput.png b/img/phoneNumInput.png
new file mode 100644
index 0000000..bd28a80
Binary files /dev/null and b/img/phoneNumInput.png differ
diff --git a/package.json b/package.json
index fc622f5..31d6bcd 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,8 @@
"babel-jest": "18.0.0",
"jest": "18.1.0",
"react-test-renderer": "15.4.2",
- "pre-commit": "^1.2.2"
+ "pre-commit": "^1.2.2",
+ "ydoc-theme-library": "0.0.1"
},
"jest": {
"preset": "react-native"
diff --git a/styles/theme/ydoc.css b/styles/theme/ydoc.css
new file mode 100644
index 0000000..ef71761
--- /dev/null
+++ b/styles/theme/ydoc.css
@@ -0,0 +1,90 @@
+*{
+ color: #333;
+}
+.ydoc {
+ background: #fff;
+}
+::selection{
+ color: #fff;
+ background-color: #66b5e6;
+}
+
+.ydoc-header {
+ background-image: none;
+ box-shadow: none;
+ background-color: #07233c;
+}
+.ydoc-header a, .ydoc-nav{
+ color: #fff;
+}
+.ydoc-nav .active, .ydoc-nav .active a, .ydoc-nav li a:hover{
+ color: rgb(70, 160, 231);
+}
+.ydoc .ydoc-banner-bg{
+ background-image: url(http://ww1.sinaimg.cn/large/7921624bgy1feqpemihxaj24mo1pudpq.jpg);
+ background-repeat:no-repeat;
+ background-size:100% 230px;
+}
+.ydoc-banner-area h1, .ydoc-banner-area p{
+ color: rgba(232, 231, 229, 0.75);
+ font-family:Arial;
+ font-weight: bold;
+ *filter: Glow(color=#fff, strength=1);
+}
+
+
+/* content */
+.ydoc-container-content{
+ box-shadow: 0 0 10px #97b9e1;
+}
+/* content-left */
+/*.ydoc-container-content .content-left{
+ padding-left:4%;
+}*/
+.ydoc-container-content .docs-sidebar.affix{
+ top:0px;
+}
+.ydoc-container-content .docs-sidebar .docs-sidenav li a:hover {
+ background-color: #dff0ff;
+ border-left-color: #dff0ff;
+}
+.ydoc-container-content .docs-sidebar .docs-sidenav li.active a, .ydoc-container-content .docs-sidebar .docs-sidenav li.active a:hover {
+ border-left: 2px solid #96c3ea;
+ color: rgb(70, 160, 231);
+}
+.ydoc-container .docs-sidebar:before{
+ background-color: #dff0ff;
+}
+/* content-right */
+.markdown-body h1, .markdown-body h2{
+ border-bottom: 1px solid #dff0ff;
+}
+.markdown-body pre {
+ background-color: #fdfeff;
+ border: 1px solid #dff0ff;
+}
+/*.con-head{
+ color:#f00;
+}*/
+.markdown-body blockquote.api strong{
+ color:#e62929;
+}
+.prop-type{
+ color:#f00;
+}
+/* footer */
+.ydoc .footer {
+ background: #07233c;
+}
+
+/* mobile style */
+@media screen and (max-width: 767px){
+ .ydoc .ydoc-nav .navbar-left li a:hover, .ydoc .ydoc-nav .navbar-right li a:hover{
+ color: #96c3ea;
+ }
+ .ydoc-container-content .docs-sidebar .docs-sidenav li a:hover {
+ background-color: #222;
+ }
+}
+
+
diff --git a/util/Validator/README.md b/util/Validator/Validator.md
similarity index 72%
rename from util/Validator/README.md
rename to util/Validator/Validator.md
index bc7c3a1..5ae44d4 100644
--- a/util/Validator/README.md
+++ b/util/Validator/Validator.md
@@ -1,20 +1,6 @@
-# Validator
+#### Example
-表单校验工具
-
-## Example
-
-```js
-/**
- * 校验器
- *
- * @method collect
- * 用来收集基础表单组件的校验方法,通常为基础表单组件的 collectValidate 属性的值。
- * @method run
- * 用来运行结果,返回一个对象。
- * 如果运行正确,返回对象的 `err` 属性值为 0,返回对象的 `data` 属性值为包含所有收集表单的名字和值的映射;
- * 如果运行错误,返回对象的 `err` 属性值为 1,返回对象的 `data` 属性值为出错信息。
- */
+```JavaScript
import React from 'react';
import {
diff --git a/util/Validator/index.js b/util/Validator/index.js
index 6d178ec..2891eda 100644
--- a/util/Validator/index.js
+++ b/util/Validator/index.js
@@ -1,10 +1,8 @@
/**
- * 校验器
- *
- * @method collect 用来收集基础表单组件的校验方法,通常为基础表单组件的 collectValidate 属性的值。
- * @method run 用来运行结果,返回一个对象。
- * 如果运行正确,返回对象的 `err` 属性值为 0,返回对象的 `data` 属性值为包含所有收集表单的名字和值的映射;
- * 如果运行错误,返回对象的 `err` 属性值为 1,返回对象的 `data` 属性值为出错信息。
+ * @component Validator
+ * @version 0.17.0
+ * @description 表单校验工具
+ * @instructions {instruInfo: ./util/Validator/Validator.md}
*/
class Validator {
@@ -20,7 +18,16 @@ class Validator {
err: 0,
data: {},
};
-
+ /**
+ * @method collect
+ * @description 用来收集基础表单组件的校验方法,通常为基础表单组件的 collectValidate 属性的值。
+ */
+ /**
+ * @method run
+ * @description 用来运行结果,返回一个对象。
+ * 如果运行正确,返回对象的 `err` 属性值为 0,返回对象的 `data` 属性值为包含所有收集表单的名字和值的映射;
+ * 如果运行错误,返回对象的 `err` 属性值为 1,返回对象的 `data` 属性值为出错信息。
+ */
this.validateList.some((item) => {
const itemRes = item();
diff --git a/util/transPxToDp/README.md b/util/transPxToDp/TransPxToDp.md
similarity index 87%
rename from util/transPxToDp/README.md
rename to util/transPxToDp/TransPxToDp.md
index 7df386f..f521b0f 100644
--- a/util/transPxToDp/README.md
+++ b/util/transPxToDp/TransPxToDp.md
@@ -1,8 +1,3 @@
-# transPxToDp
-
-像素(px)转虚拟像素(dp)方法
-
-
React Native 的长度单位为 dp,意思是独立像素,不是真实的物理像素,1dp 在不同 PixelRatio(像素比)的设备上会等于不同 px,比如 iPhone 456 是 2px,iPhone 6s 是 3px,所以在 rn 代码里写一个宽度为 1 的边框,在 iPhone 5 上看上去会有 2 像素宽,在 iPhone 6s 上看上去会有 3 像素宽。
@@ -10,30 +5,30 @@ React Native 的长度单位为 dp,意思是独立像素,不是真实的物
`transPxToDp` 就是为了解决这个问题。使用了 `transPxToDp` 之后,设置 1 的宽度,在 iPhone 5 实际设置为 0.5,在 iPhone 6s 实际设置为 0.33。
-### ⚠️ 注意
-
-1. 在安卓设备下,如果 `lineHeight` 是小数会红屏,需要再取整下。
-2. 如果想实现视觉效果较好的最细宽度,推荐使用 `Stylesheet.hairlineWidth
-`,但如果就是要实现纯粹的最细宽度,那就用 `transPxToDp(1)` 吧。
+#### Demo
+
-> 在屏幕像素比(PixelRatio)为 3.75 以下设备,`hairlineWidth` 和 `transPxToDp(1)` 是一样的,在 3.75 及以上设备,`hairlineWidth` 是 `transPxToDp(1)` 的两倍或两倍以上。
## Example
-```js
-/**
- * px 转 dp
- * @param {Number} px
- * @return {Number} dp
- */
+```JavaScript
import transPxToDp from 'rnx-ui/util/transPxToDp';
// 设置一个宽度为 1 像素的顶部边框
const styles = StyleSheet.create({
foo: {
- borderTopWidth: transPxToDp(1),
+ //transPxToDp传的参数是px
+ borderTopWidth: transPxToDp(1),
},
});
```
+### ⚠️ 注意
+
+1. 在安卓设备下,如果 `lineHeight` 是小数会红屏,需要再取整下。
+
+2. 如果想实现视觉效果较好的最细宽度,推荐使用 `Stylesheet.hairlineWidth
+`,但如果就是要实现纯粹的最细宽度,那就用 `transPxToDp(1)` 吧。
+
+> 在屏幕像素比(PixelRatio)为 3.75 以下设备,`hairlineWidth` 和 `transPxToDp(1)` 是一样的,在 3.75 及以上设备,`hairlineWidth` 是 `transPxToDp(1)` 的两倍或两倍以上。
diff --git a/util/transPxToDp/TransPxToDp.png b/util/transPxToDp/TransPxToDp.png
new file mode 100644
index 0000000..7a6c5e9
Binary files /dev/null and b/util/transPxToDp/TransPxToDp.png differ
diff --git a/util/transPxToDp/index.js b/util/transPxToDp/index.js
index 81c4080..26144ee 100644
--- a/util/transPxToDp/index.js
+++ b/util/transPxToDp/index.js
@@ -1,14 +1,16 @@
/**
- * px 转 dp
- * 注意:
- * 在安卓设备下,如果 lineHeight 是浮点数会红屏,需要再取整下
+ * @component TransPxToDp
+ * @version 0.17.0
+ * @description 像素(px)转虚拟像素(dp)方法
+ *
+ * @instructions {instruInfo: ./util/transPxToDp/TransPxToDp.md}
*/
import { PixelRatio } from 'react-native';
-const dpi = PixelRatio.get();
+const dpi = PixelRatio.get(); // 返回设备的像素密度
/**
- * pix 转 dp
+ * @description pix 转 dp
* @param {Number} px
* @return {Number} dp
*/
diff --git a/ydoc.config b/ydoc.config
new file mode 100644
index 0000000..6b590d1
--- /dev/null
+++ b/ydoc.config
@@ -0,0 +1,255 @@
+{
+ "name": "RNX-UI",
+ "dest": "./docs",
+ "examplePath": "./demo/component",
+ "instructionsInfoPath": "./",
+ "common": {
+ "title": "RNX-UI Documentation",
+ "footer": "© 2017 RNX-UI Team. Build by YDoc.",
+ "home": "RNX-UI",
+ "navbars": [],
+ },
+ "options": {
+ "insertCSS": [
+ "theme/ydoc.css"
+ ],
+ "insertJS": [
+ "theme/ydoc.js"
+ ],
+ "hasPageName": true
+ },
+ "resources": {
+ "theme": "./styles/theme"
+ },
+
+ "pages": [
+ {
+ "name": "index",
+ "title": "RNX-UI",
+ "banner": {
+ "title": "RNX-UI",
+ "description": "RNX-UI 当前版本:v0.17.0
"
+ },
+ "content": "./README.md"
+ },
+ {
+ "name": "component",
+ "title": "组件",
+ "banner": {
+ "title": "组件",
+ "description": "组件的说明文档"
+ },
+ "content": {
+ "type": "blocks",
+ "sidebar": true,
+ "multi": true,
+ "index": "./All/index.js",
+ "pages": [
+ {
+ "name": "All",
+ "content": "./All/index.js",
+ },
+ {
+ "name": "Navigtor"
+ },
+ {
+ "name": "Navbar",
+ "content": "./Navbar/index.js",
+ "sub": true
+ },
+ {
+ "name": "TabBar",
+ "content": "./TabBar/index.js",
+ "sub": true
+ },
+ {
+ "name": "Data Entry"
+ },
+ {
+ "name": "AddAndSubtract",
+ "content": "./AddAndSubtract/index.js",
+ "sub": true
+ },
+ {
+ "name": "Btn",
+ "content": "./Btn/index.js",
+ "sub": true
+ },
+ {
+ "name": "ImgRollView",
+ "content": "./ImgRollView/index.js",
+ "sub": true
+ },
+ {
+ "name": "ImgPicker",
+ "content": "./ImgPicker/index.js",
+ "sub": true
+ },
+ {
+ "name": "NumericKeyBoard",
+ "content": "./NumericKeyBoard/index.js",
+ "sub": true
+ },
+ {
+ "name": "PhoneNumInput",
+ "content": "./PhoneNumInput/index.js",
+ "sub": true
+ },
+ {
+ "name": "SmsCaptchaInput",
+ "content": "./SmsCaptchaInput/index.js",
+ "sub": true
+ },
+ {
+ "name": "VirtualPasswordInput",
+ "content": "./VirtualPasswordInput/index.js",
+ "sub": true
+ },
+ {
+ "name": "Data Display"
+ },
+ {
+ "name": "Badge",
+ "content": "./Badge/index.js",
+ "sub": true
+ },
+ {
+ "name": "CardView",
+ "content": "./CardView/index.js",
+ "sub": true
+ },
+ {
+ "name": "DynamicText",
+ "content": "./DynamicText/index.js",
+ "sub": true
+ },
+ {
+ "name": "ImgHolder",
+ "content": "./ImgHolder/index.js",
+ "sub": true
+ },
+ {
+ "name": "RefreshView",
+ "content": "./RefreshView/index.js",
+ "sub": true
+ },
+ {
+ "name":"Feedback"
+ },
+ {
+ "name": "ActionSheet",
+ "content": "./ActionSheet/index.js",
+ "sub": true
+ },
+ {
+ "name": "Alert",
+ "content": "./Alert/index.js",
+ "sub": true
+ },
+ {
+ "name": "Confirm",
+ "content": "./Confirm/index.js",
+ "sub": true
+ },
+ {
+ "name": "Dialog",
+ "content": "./Dialog/index.js",
+ "sub": true
+ },
+ {
+ "name": "Drop",
+ "content": "./Drop/index.js",
+ "sub": true,
+ },
+ {
+ "name": "Dropper",
+ "content": "./Drop/Dropper/index.js",
+ "sub": true,
+ },
+ {
+ "name": "Emitter",
+ "content": "./Drop/Emitter/index.js",
+ "sub": true,
+ },
+ {
+ "name": "Receiver",
+ "content": "./Drop/Receiver/index.js",
+ "sub": true,
+ },
+ {
+ "name": "HeaderedSheet",
+ "content": "./HeaderedSheet/index.js",
+ "sub": true
+ },
+ {
+ "name": "Loading",
+ "content": "./Loading/index.js",
+ "sub": true
+ },
+ {
+ "name": "Overlay",
+ "content": "./Overlay/index.js",
+ "sub": true
+ },
+ {
+ "name": "Sheet",
+ "content": "./Sheet/index.js",
+ "sub": true
+ },
+ {
+ "name": "ToolTip",
+ "content": "./ToolTip/index.js",
+ "sub": true
+ },
+ {
+ "name": "Other"
+ },
+ {
+ "name": "KeyboardAdaptiveView",
+ "content": "./KeyboardAdaptiveView/index.js",
+ "sub": true
+ },
+
+ ]
+ }
+ },
+ {
+ "name": "util",
+ "title": "方法",
+ "banner": {
+ "title": "方法",
+ "description": "方法的说明文档"
+ },
+ "content": {
+ "type": "blocks",
+ "sidebar": true,
+ "multi": true,
+ "index": "./util/transPXToDp/index.js",
+ "pages": [
+ {
+ "name":"Method"
+ },
+ {
+ "name": "TransPXToTop",
+ "content": "./util/transPXToDp/index.js",
+ "sub": true
+ },
+ {
+ "name": "Validator",
+ "content": "./util/Validator/index.js",
+ "sub": true
+ },
+ ]
+ }
+ },
+ {
+ "name": "CHANGELOG",
+ "title": "版本",
+ "banner": {
+ "title": "版本",
+ "description": "RNX-UI 的历史版本发布时间及变更记录,帮助你追溯到每个版本的演进过程。"
+ },
+ "content": "./CHANGELOG.md"
+ },
+ ]
+}
\ No newline at end of file