diff --git a/README.md b/README.md index d88b811..2b4792e 100644 --- a/README.md +++ b/README.md @@ -53,3 +53,8 @@ NODE_ENV=production gulp ``` gulp publish ``` + + +## 数据更新 + +使用 jsdom 拉取远程内容,进行更新 diff --git a/app/fonts/FontAwesome.otf b/app/fonts/FontAwesome.otf new file mode 100644 index 0000000..f7936cc Binary files /dev/null and b/app/fonts/FontAwesome.otf differ diff --git a/app/fonts/fontawesome-webfont.eot b/app/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..33b2bb8 Binary files /dev/null and b/app/fonts/fontawesome-webfont.eot differ diff --git a/app/fonts/fontawesome-webfont.svg b/app/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..1ee89d4 --- /dev/null +++ b/app/fonts/fontawesome-webfont.svg @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/fonts/fontawesome-webfont.ttf b/app/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..ed9372f Binary files /dev/null and b/app/fonts/fontawesome-webfont.ttf differ diff --git a/app/fonts/fontawesome-webfont.woff b/app/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..8b280b9 Binary files /dev/null and b/app/fonts/fontawesome-webfont.woff differ diff --git a/app/fonts/fontawesome-webfont.woff2 b/app/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..3311d58 Binary files /dev/null and b/app/fonts/fontawesome-webfont.woff2 differ diff --git a/app/humans.txt b/app/humans.txt new file mode 100755 index 0000000..0481f94 --- /dev/null +++ b/app/humans.txt @@ -0,0 +1,14 @@ +# humanstxt.org/ +# The humans responsible & technology colophon + +# TEAM + + -- -- + +# THANKS + + + +# TECHNOLOGY COLOPHON + + HTML5, CSS3 diff --git a/app/i/favicon.ico b/app/i/favicon.ico new file mode 100644 index 0000000..73d4f91 Binary files /dev/null and b/app/i/favicon.ico differ diff --git a/app/i/favicon.png b/app/i/favicon.png new file mode 100755 index 0000000..0958158 Binary files /dev/null and b/app/i/favicon.png differ diff --git a/app/i/icons.png b/app/i/icons.png new file mode 100644 index 0000000..7bca5a0 Binary files /dev/null and b/app/i/icons.png differ diff --git a/app/i/icons@2x.png b/app/i/icons@2x.png new file mode 100644 index 0000000..2dce063 Binary files /dev/null and b/app/i/icons@2x.png differ diff --git a/app/i/logo.png b/app/i/logo.png new file mode 100755 index 0000000..51db8c0 Binary files /dev/null and b/app/i/logo.png differ diff --git a/app/index.html b/app/index.html new file mode 100755 index 0000000..c5fac26 --- /dev/null +++ b/app/index.html @@ -0,0 +1,36 @@ + + + + + + + + + + + ReactUI DevDocs API Documentation + + + + + + + + + + + + + + + + + + + + diff --git a/app/js/app-routes.jsx b/app/js/app-routes.jsx new file mode 100644 index 0000000..a4cc3a3 --- /dev/null +++ b/app/js/app-routes.jsx @@ -0,0 +1,48 @@ +"use strict" + +import {Route, Router} from 'react-router' +import createHistory from 'history/lib/createHashHistory' + +// var DefaultRoute = Router.DefaultRoute; +// var NotFoundRoute = Router.NotFoundRoute; + +const history = createHistory({ queryKey: false }) +let menulist = [] + +// function addMenu(list) { +// list.forEach(function (menu, index) { +// if (menu.component) { +// menulist.push( +// +// ) +// } +// }) +// } +// require('./menulist').forEach(function (list) { +// addMenu(list) +// }) + +// import Master from './pages/master.jsx' +// import Home from './pages/home.jsx' +import Home from './pages/app.jsx' +import NotFoundRoute from './modules/404.jsx' +import ErrRoute from './modules/500.jsx' + +/* + + + + + + +*/ + +const AppRoutes = ( + + + + + +) + +export default AppRoutes diff --git a/app/js/app.js b/app/js/app.js new file mode 100644 index 0000000..c740dce --- /dev/null +++ b/app/js/app.js @@ -0,0 +1 @@ +console.log('helloooo') diff --git a/app/js/app.jsx b/app/js/app.jsx new file mode 100644 index 0000000..19c1c75 --- /dev/null +++ b/app/js/app.jsx @@ -0,0 +1,41 @@ +"use strict" + +// global.uiRequire = function (src) { +// if (src) { +// return require('../../src/' + src) +// } else { +// return require('../../src/') +// } +// } +// +// import ReactDOM from 'react-dom' +// const AppRoutes = require('./app-routes.jsx') +// +// ReactDOM.render( +// AppRoutes, +// document.getElementById('body') +// ) + +import ReactDOM from 'react-dom' +const AppRoutes = require('./app-routes.jsx') + +ReactDOM.render( + AppRoutes, + document.body +) + +// document.addEventListener('DOMContentLoaded', function() { +// Router.run(routes, +// Router.HashLocation, +// function(Root, state) { +// React.render(, document.body); +// }); +// }); + + +// static files +// require('file?name=index.html!../index.html') +// require('../json/countries.json') +// require('../json/form.json') +// require('../json/text-value.json') +// require('../json/tree.json') diff --git a/app/js/data/array.js b/app/js/data/array.js new file mode 100644 index 0000000..9660b73 --- /dev/null +++ b/app/js/data/array.js @@ -0,0 +1 @@ +module.exports = ["南京", "北京", "上海", "广州", "深圳", "成都", "重庆", "西安"] diff --git a/app/js/data/text-value.js b/app/js/data/text-value.js new file mode 100644 index 0000000..ee9623d --- /dev/null +++ b/app/js/data/text-value.js @@ -0,0 +1,10 @@ +module.exports = [ + { "id": "nanjing", "text": "南京" }, + { "id": "beijing", "text": "北京" }, + { "id": "guangzhou", "text": "广州" }, + { "id": "shenzhen", "text": "深圳" }, + { "id": "chengdu", "text": "成都" }, + { "id": "chongqing", "text": "重庆" }, + { "id": "shanghai", "text": "上海" } +] + diff --git a/app/js/menulist.js b/app/js/menulist.js new file mode 100644 index 0000000..e5dc5b7 --- /dev/null +++ b/app/js/menulist.js @@ -0,0 +1,52 @@ +"use strict" + +var app_layout = ''; + +/* + +<%= " #{app_layout}" if app_layout %> +<%= "/ #{@doc['name']}" if @doc %> + +<% unless @doc %> +<% App.docs.each do |slug, doc| %> +<%= doc['name'] %> +<% end %> +<% end %> + + +*/ + + +module.exports = [ + + // [ + // { path: '/form', text: 'Form', component: require('./pages/form.jsx') }, + // { path: '/formControl', text: 'FormControl', component: require('./pages/formControl.jsx') }, + // { path: '/formSubmit', text: 'FormSubmit', component: require('./pages/formSubmit.jsx') }, + // { path: '/checkbox', text: 'Checkbox', component: require('./pages/checkbox.jsx') }, + // { path: '/checkboxGroup', text: 'CheckboxGroup', component: require('./pages/checkboxGroup.jsx') }, + // { path: '/datetime', text: 'Datetime', component: require('./pages/datetime.jsx') }, + // { path: '/input', text: 'Input', component: require('./pages/input.jsx') }, + // { path: '/radioGroup', text: 'RadioGroup', component: require('./pages/radioGroup.jsx') }, + // { path: '/rating', text: 'Rating', component: require('./pages/rating.jsx') }, + // { path: '/select', text: 'Select', component: require('./pages/select.jsx') }, + // { path: '/tree', text: 'Tree', component: require('./pages/tree.jsx') }, + // { path: '/upload', text: 'Upload', component: require('./pages/upload.jsx') } + // ], + // [ + // { path: '/table', text: 'Table', component: require('./pages/table.jsx') }, + // { path: '/filter', text: 'Filter', component: require('./pages/filter.jsx') }, + // { path: '/button', text: 'Button', component: require('./pages/button.jsx') }, + // { path: '/icon', text: 'Icon', component: require('./pages/icon.jsx') }, + // { path: '/pagination', text: 'Pagination', component: require('./pages/pagination.jsx') }, + // { path: '/message', text: 'Message', component: require('./pages/message.jsx') }, + // { path: '/modal', text: 'Modal', component: require('./pages/modal.jsx') }, + // { path: '/dataSource', text: 'DataSource', component: require('./pages/dataSource.jsx') }, + // { path: '/lang', text: 'Lang', component: require('./pages/lang.jsx') } + // ] +] diff --git a/app/js/modules/404.jsx b/app/js/modules/404.jsx new file mode 100644 index 0000000..fe2f60d --- /dev/null +++ b/app/js/modules/404.jsx @@ -0,0 +1,19 @@ +'use strict'; + +import React from 'react' + +var Component = React.createClass({ + render: function() { + return ( +
+

Oops!

+

+ The page you were looking for doesn't exist.
+ Go back to devdocs.io. +

+
+ ); + } +}); + +export default Component diff --git a/app/js/modules/500.jsx b/app/js/modules/500.jsx new file mode 100644 index 0000000..fe2f60d --- /dev/null +++ b/app/js/modules/500.jsx @@ -0,0 +1,19 @@ +'use strict'; + +import React from 'react' + +var Component = React.createClass({ + render: function() { + return ( +
+

Oops!

+

+ The page you were looking for doesn't exist.
+ Go back to devdocs.io. +

+
+ ); + } +}); + +export default Component diff --git a/app/js/nav-list.jsx b/app/js/nav-list.jsx new file mode 100644 index 0000000..b2a60a4 --- /dev/null +++ b/app/js/nav-list.jsx @@ -0,0 +1,74 @@ +"use strict" + +import React from 'react' +import classnames from 'classnames' +import menulist from './menulist' +const { Icon } = global.uiRequire() + +export default class NavList extends React.Component { + static displayName = 'NavList' + + static propTypes = { + onToggle: React.PropTypes.func + } + + static contextTypes = { + history: React.PropTypes.object.isRequired + } + + state = { + active: true + } + + getClasses (name, path) { + return classnames(name, { + active: this.context.history.isActive(path) + }) + } + + pathChange (path) { + if (!this.context.history.isActive(path)) { + this.context.history.pushState(null, path) + } + } + + getRoutesList (paths, index) { + let list = paths.map(function (r, i) { + if (r.path) { + return ( +
  • + {r.text} +
  • + ) + } else if (r.hr) { + return (
    ) + } else if (r.text) { + return ( +
  • + {r.text} +
  • + ) + } + }, this) + + return
      {list}
    + } + + render () { + let list = menulist.map(function (paths, index) { + return this.getRoutesList(paths, index) + }, this) + + return ( +
    + React UI + +
    +
    + {list} +
    +
    +
    + ) + } +} diff --git a/app/js/pages/app.jsx b/app/js/pages/app.jsx new file mode 100644 index 0000000..6506f95 --- /dev/null +++ b/app/js/pages/app.jsx @@ -0,0 +1,41 @@ +'use strict'; + + +import React from 'react' + +var Component = React.createClass({ + render: function() { + return ( +
    +
    + + +
    + + +
    +
    +

    + Developer +

    + +
    +
    +
    + list afd dd +
    +
    +
    +
    +
    +
    + ); + } +}); + +export default Component diff --git a/app/js/pages/build.jsx b/app/js/pages/build.jsx new file mode 100644 index 0000000..975aeb3 --- /dev/null +++ b/app/js/pages/build.jsx @@ -0,0 +1,118 @@ +'use strict' + +import React from 'react' +import data from '../../../../server/data' +const {Button, Grid} = global.uiRequire() +const clone = global.uiRequire('utils/clone') + +export default class Page extends React.Component { + static displayName = 'Pages/Build' + + state = { + building: false, + components: clone(data) + } + + handleChange (key) { + let components = this.state.components + let target = components[key] + if (!target.$checked) { + target.$checked = true + let keys = target.dependencies || [] + keys.forEach(k => { + components[k].$checked = true + }) + } else { + target.$checked = false + let keys = Object.keys(components) + for (let i = 0, count = keys.length; i < count; i++) { + let c = components[keys[i]] + if (c.$checked && c.dependencies && c.dependencies.indexOf(key) >= 0) { + target.$checked = true + break + } + } + } + this.setState({ components }) + } + + selectAll (e) { + let checked = e.target.checked + let components = this.state.components + Object.keys(components).map((key) => { + components[key].$checked = checked + }) + this.setState({ components }) + } + + submit () { + this.setState({ building: true }) + } + + render () { + let components = this.state.components + let checkedNum = 0 + let list = Object.keys(components).map((key, i) => { + let component = components[key] + checkedNum += component.$checked ? 1 : 0 + return ( + + + + ) + }) + + return ( +
    +
    +

    Build

    +
    + +
    +
    + 选择需要的组件 + +
    +
    + +
    +
    + {list} +
    + + + + + + + + + +
    + + +
    +
    +
    + ) + } +} diff --git a/app/js/pages/button.jsx b/app/js/pages/button.jsx new file mode 100644 index 0000000..ca2899c --- /dev/null +++ b/app/js/pages/button.jsx @@ -0,0 +1,123 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Button, Icon} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName: 'Pages/Button' + + disableExample (event) { + let button = this.refs.button + if (event.target.checked) { + button.disable(我被禁用了) + } else { + button.enable('我又可以使用了') + } + } + + render () { + return ( +
    +
    +

    Button

    +

    按钮

    +
    + +
    +
    +{``}
    +          
    + +

    普通按钮

    +

    + {' '} + +

    + +
    +{`
    +`}
    +          
    + +

    带图标按钮

    +

    + {' '} + +

    +
    {'\r'}
    + +

    Status

    +

    + {' '} + {' '} + {' '} + {' '} + {' '} + +

    + +
    +{`
    +
    +
    +
    +
    +
    +`}
    +          
    +

    需要扩展可以添加className

    +

    + +

    +
    {''}
    + +

    once

    +

    + +

    +
    {''}
    + +

    enable(elem)/disabled(elem)

    +

    两个实例方法 enable(启用) 和 disable (禁用),可以传入一个参数(字符串或者element)替换按钮内容

    +

    + {' '} + +

    + +
    +{`
    +`}
    +          
    + +
    +{`disableExample: function (event) {
    +  var button = this.refs.button;
    +  if (event.target.checked) {
    +    button.disable(我被禁用了);
    +  } else {
    +    button.enable("我又可以使用了");
    +  }
    +}`}
    +          
    + +
    +
    + ) + } +} + diff --git a/app/js/pages/checkbox.jsx b/app/js/pages/checkbox.jsx new file mode 100644 index 0000000..36991e9 --- /dev/null +++ b/app/js/pages/checkbox.jsx @@ -0,0 +1,54 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Checkbox} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Checkbox' + + render () { + return ( +
    +
    +

    Checkbox

    +

    复选框

    +
    + +
    + +
    +{``}
    +          
    + +

    Example

    +

    + +

    +
    {''}
    + +

    Readonly

    +

    + +

    +
    {''}
    + +

    getValue()

    +

    获取值,选中状态下如果有 value,返回 value ,否则返回 true ,未选中状态返回 false

    + +

    setValue(value)

    +

    如果 value 值与 props.value 相等,或者值为 true 或者 1 ,设置为选中状态

    + +
    +
    + ) + } +} diff --git a/app/js/pages/checkboxGroup.jsx b/app/js/pages/checkboxGroup.jsx new file mode 100644 index 0000000..50d0c4b --- /dev/null +++ b/app/js/pages/checkboxGroup.jsx @@ -0,0 +1,92 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +import textValue from '../data/text-value' +const {CheckboxGroup, dataSource } = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Checkbox' + + render () { + return ( +
    +
    +

    Checkbox Group

    +

    一组复选框

    +
    + +
    + +
    +{``}
    +
    +          
    + + +

    数据结构

    +
    标准结构为 text, id key组成的数组
    +
    {'[{"text":"北京","id":"beijing"},{"text":"上海", "id":"shanghai"}]'}
    +
    可以使用自定义数组,指定 textTpl, valueTpl
    +
    {'[{"cn":"北京","py":"beijing"},{"cn":"上海", "py":"shanghai"}]'}
    +
    可以使用一维数组,这种情况下,显示文字与值相同
    +
    {'["北京","上海","广州"]'}
    + +

    Object Data

    +
    + +
    +
    {''}
    +
    +{`data = [
    +  { "id": "nanjing", "text": "南京" },
    +  { "id": "beijing", "text": "北京" },
    +  { "id": "guangzhou", "text": "广州" },
    +  { "id": "shenzhen", "text": "深圳" },
    +  { "id": "chengdu", "text": "成都" },
    +  { "id": "chongqing", "text": "重庆" },
    +  { "id": "shanghai", "text": "上海" }
    +]`}
    +          
    + +

    Array Data

    +
    + console.log(this.refs.array.getValue())} inline={true} value={["北京", "广州"]} data={["南京", "北京", "上海", "广州", "深圳", "成都", "重庆", "西安"]} /> +
    +
    {''}
    + +

    Readonly

    +
    + +
    +
    {''}
    + +

    Remote Data

    +
    + console.log(this.refs.remote.getValue())} inline={true} value="shanghai,chengdu" data={ dataSource("json/text-value.json", null, { cache: true }) } /> +
    +
    {''}
    + +

    Data Sep

    +
    + console.log(this.refs.sep.getValue())} inline={true} sep="|" value="shanghai|chengdu" data={ dataSource("json/text-value.json", null, { cache: true }) } /> +
    +
    {''}
    +
    + + +
    + ) + } +} diff --git a/app/js/pages/dataSource.jsx b/app/js/pages/dataSource.jsx new file mode 100644 index 0000000..78450c6 --- /dev/null +++ b/app/js/pages/dataSource.jsx @@ -0,0 +1,58 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/DataSource' + + render () { + return ( +
    +
    +

    dataSource

    +

    数据接口

    +
    + +
    +

    Select, Tree 等控件需要从服务器远程获取数据的接口。

    +

    接口返回一个方法,then成功回调,catch失败回调,complete成功与失败都会调用

    +

    ReactUI内部提供了一个dataSource,使用Qwest实现的,可以用其他的Ajax框架自行实现。

    +
    +{`function (src, data, options) {
    +  let stacks = {
    +        'then': [],
    +        'catch': [],
    +        'complete': []
    +      },
    +      promises = ['then', 'catch', 'complete'],
    +      req = null,
    +
    +  qwest = function () {
    +    req = Qwest.get(src, data, options)
    +    promises.forEach(p => {
    +      req[p](res => {
    +        stacks[p].forEach(func => {
    +          func(res)
    +        })
    +      })
    +    })
    +    return qwest
    +  }
    +
    +  promises.forEach(p => {
    +    qwest[p] = func => {
    +      stacks[p].push(func)
    +      return qwest
    +    }
    +  })
    +
    +  return qwest
    +}`}
    +          
    +
    +
    + ) + } +} diff --git a/app/js/pages/datetime.jsx b/app/js/pages/datetime.jsx new file mode 100644 index 0000000..5d99b35 --- /dev/null +++ b/app/js/pages/datetime.jsx @@ -0,0 +1,65 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Datetime} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Datetime' + + handleChange (ref) { + var value = 'value:' + this.refs['d-' + ref].getValue() + React.findDOMNode(this.refs['p-' + ref]).innerHTML = value + } + + render () { + return ( +
    +
    +

    Datetime

    +

    日期 / 时间 选择器

    +
    + +
    +
    +{``}
    +          
    + +

    Example

    + +
    +
    {``}
    + +

    dateOnly

    + +
    +
    {``}
    + +

    timeOnly

    + +
    +
    {``}
    + +

    readOnly

    + +
    {``}
    + +

    unixtime

    + +
    +
    {``}
    +
    +
    + ) + } +} diff --git a/app/js/pages/filter.jsx b/app/js/pages/filter.jsx new file mode 100644 index 0000000..0945a07 --- /dev/null +++ b/app/js/pages/filter.jsx @@ -0,0 +1,119 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' +const { Filter, dataSource } = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Filter' + + state = { + filterText: '' + } + + render () { + let options = [{ + label: '姓名', + name: 'name', + ops: ['like', '=', 'startWidth'] + }, { + label: '年龄', + name: 'age', + ops: ['>=', '<'], + type: 'number' + }, { + label: '生日', + name: 'birthday', + ops: ['>=', '<'], + type: 'datetime' + }, { + label: '地区', + name: 'office', + ops: ['='], + type: 'select', + props: { data: ['Tokyo', 'Singapore', 'New York', 'London', 'San Francisco'] } + }, { + label: '国籍', + name: 'country', + ops: ['='], + type: 'select', + props: { data: dataSource('json/countries.json'), optionTpl: '{country}', valueTpl: '{en}' } + }] + + return ( +
    +
    +

    Filter

    +

    筛选器

    +
    + +
    +
    +{`
    +options = {
    +  label: 'string'  // 显示的文字,必填
    +  name: 'string'   // 对应的字段名称,必填
    +  ops: ['string']  // 可选方法,默认值为 ['=', 'like', '>', '>=', '<', '<=', 'in', 'not in']
    +  type: 'string'   // 选择值的类型,可选值为 'text', 'number', 'integer', 'datetime', 'select'
    +                   // 默认值为 'text'
    +  props: object    // type 为 Component 的参数
    +  'op': function   // 如果ops包含自定义方法,需要在前端做筛选,在此实现
    +}`}
    +          
    + +

    local

    +
    + 当local设置为 true 时,onFilter 返回的对象会包括当前选定 op 的方法,用来进行过滤。这个方法为返回值为 bool。
    +
    +{`startWidth: function (d, value) {
    +  return d.name.indexOf(value) === 0
    +}`}
    +            
    + 示例见 Table。 +
    + +

    Example

    + this.setState({ filterText: JSON.stringify(fs) })} options={options} /> +
    {this.state.filterText}
    +
    +{`let options = [{
    +  label: '姓名',
    +  name: 'name',
    +  ops: ['like', '=', 'startWidth']
    +}, {
    +  label: '年龄',
    +  name: 'age',
    +  ops: ['>=', '<'],
    +  type: 'number'
    +}, {
    +  label: '生日',
    +  name: 'birthday',
    +  ops: ['>=', '<'],
    +  type: 'datetime'
    +}, {
    +  label: '地区',
    +  name: 'office',
    +  ops: ['='],
    +  type: 'select',
    +  props: { data: ['Tokyo', 'Singapore', 'New York', 'London', 'San Francisco'] }
    +}, {
    +  label: '国籍',
    +  name: 'country',
    +  ops: ['='],
    +  type: 'select',
    +  props: { data: dataSource('json/countries.json'), optionTpl: '{country}', valueTpl: '{en}' }
    +}]
    + this.setState({ filterText: JSON.stringify(fs) })} options={options} />
    +`}
    +          
    +
    +
    + ) + } +} diff --git a/app/js/pages/form.jsx b/app/js/pages/form.jsx new file mode 100644 index 0000000..6212d19 --- /dev/null +++ b/app/js/pages/form.jsx @@ -0,0 +1,137 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' +const {Form, FormControl, Button, FormSubmit, Icon, Input, RadioGroup, dataSource} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Form' + + state = { + layout: 'inline' + } + + render () { + return ( +
    +
    +

    Form

    +

    表单

    +
    + +
    +
    +{`
    // 数据验证成功后回调事件 + {children} +
    `} +
    +

    dataSource 参见这里

    +

    0.3 版更新,From 不再提供内置 Ajax 提交功能,需要在onSubmit中进行提交

    + +

    layout

    +
    + layout: + this.setState({ layout })} /> +
    +
    +
    + + + + + 提交 + + + +

    获取 / 提交数据

    +

    注:本文档使用了一个 json 文件模拟服务端返回数据,提交会提示 500 错误

    + +
    console.log(data)} data={dataSource("json/form.json")}> + + + + + + + + + + + + + + + + + + + + + + + + 选择文件} /> + + + 提交 + 处理中 + + + +
    +{`
    console.log(data)} data={dataSource("json/form.json")}> + + + + + + + + + + + + + + + + + + + + + + 选择文件} /> + + + 提交 + 处理中 + + +`} +
    + +

    Methods

    +

    getValue()

    +

    获取当前所有注册FormControl的value,结果为json

    + +

    getReference(name)

    +

    Form 下不能使用 ref 获取引用,需要引用时使用 getReference 方法。name 为 FormControl 的 name

    +
    +
    + ) + } +} diff --git a/app/js/pages/formControl.jsx b/app/js/pages/formControl.jsx new file mode 100644 index 0000000..c42e43c --- /dev/null +++ b/app/js/pages/formControl.jsx @@ -0,0 +1,344 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' +let {FormControl, Button, Input, Icon, Grid, dataSource} = global.uiRequire() + +const gridProps = { + width: 12, + responsive: 'lg' +} + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/FormControl' + + renderExample (type, component) { + component = component || 'Input' + return ( +
    +

    {type} => {component}

    +
    + + + + + +
    +              {``}
    +            
    +
    +
    +
    + ) + } + + render () { + return ( +
    +
    +

    FormControl

    +

    表单元素

    +
    + +
    +

    一系列表单控件的马甲,统一封装用来实现表单数据验证,输入提示,动态创建表单等功能。可以通过 getReference() 这个方法获取被封装的控件。

    +
    +{``}
    +          
    + +

    数据验证属性

    +

    FormControl 会根据这些属性自动验证输入,自动生成提示文字和错误信息,文字在 Lang 中设置。

    +
    +{``}
    +          
    + +

    已注册控件

    + +
    +

    text => Input

    +
    + + + + + +
    +  {``}
    +                
    +
    +
    +
    + + {this.renderExample('email')} + {this.renderExample('alpha')} + {this.renderExample('alphanum')} + {this.renderExample('url')} + {this.renderExample('integer')} + {this.renderExample('number')} + {this.renderExample('password')} + + {this.renderExample('date', 'Datetime')} + {this.renderExample('time', 'Datetime')} + {this.renderExample('datetime', 'Datetime')} + +
    +

    textarea => Input

    +
    + + + + + +
    +                  {``}
    +                
    +
    +
    +
    + +
    +

    select => Select

    +
    + + + + + +
    +{``}
    +                
    +
    +
    +
    + +
    +

    tree => Tree

    +
    + + + + + +
    +{``}
    +                
    +
    +
    +
    + +
    +

    checkbox => Checkbox

    +
    + + + + + +
    +                  {``}
    +                
    +
    +
    +
    + +
    +

    checkbox-group => CheckboxGroup

    +
    + + + + + +
    +{``}
    +                
    +
    +
    +
    + +
    +

    radio-group => RadioGroup

    +
    + + + + + +
    +{``}
    +                
    +
    +
    +
    + +
    +

    rating => RadioGroup

    +
    + + , ]} + /> + + + +
    +{`, ]}
    + />`}
    +                
    +
    +
    +
    + +
    +

    upload => Upload

    +
    + + 选择文件} /> + + + +
    +{` 选择文件}
    +/>`}
    +                
    +
    +
    +
    + +

    Children

    +

    可以使用 children 来处理一些复杂结构。注意每个 FormControl 只能有一个表单组件,类型必须和 FormControl 的 type 相同。

    + + + + + + + +
    +{`
    +  
    +    
    +    
    +  
    +`}
    +          
    + +

    自定义 FormControl

    +

    + FormControl 提供一个静态方法 register,将一个 Component 注册为 FormControl 成员。
    + 每个注册为 FormControl 的控件必须实现 getValue() , setValue(data) 这两个接口。 +

    +
    +{`FormControl.register(
    +  type,       // string,控件类型,唯一。如果同名,后注册的将会覆盖先注册的控件
    +  render,     // function,匹配到类型时,调用render方法返回相应控件
    +  valueType,  // 'string|array|number',控件值类型,三选一,数据验证时调用
    +)`}
    +          
    +
    +
    + ) + } +} diff --git a/app/js/pages/formSubmit.jsx b/app/js/pages/formSubmit.jsx new file mode 100644 index 0000000..8836ba9 --- /dev/null +++ b/app/js/pages/formSubmit.jsx @@ -0,0 +1,35 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/FormSubmit' + + render () { + return ( +
    +
    +

    FormSubmit

    +

    表单提交按钮

    +
    + +
    +

    Button 的一个马甲,封装了一层响应 Form 状态

    +
    {`{children}`}
    +

    如果children为两个元素,只会显示第一个元素内容,当按钮锁定时,显示第二个元素内容。

    +
    +{`
    +  提交
    +  处理中...
    +
    +`}
    +          
    + +

    示例参见 Form

    +
    +
    + ) + } +} diff --git a/app/js/pages/home.jsx b/app/js/pages/home.jsx new file mode 100644 index 0000000..9332376 --- /dev/null +++ b/app/js/pages/home.jsx @@ -0,0 +1,25 @@ +"use strict" + +import React from 'react' +const {Icon} = global.uiRequire() + +export default class Home extends React.Component { + static displayName = 'Home' + + render () { + return ( +
    +
    +
    +

    React UI

    +

    React组件库,样式基于yahoo的purecss

    + +
    +
    +
    + ) + } +} diff --git a/app/js/pages/icon.jsx b/app/js/pages/icon.jsx new file mode 100644 index 0000000..13af8dd --- /dev/null +++ b/app/js/pages/icon.jsx @@ -0,0 +1,68 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Icon} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Icon' + + render () { + return ( +
    +
    +

    Icon

    +

    图标,使用

    +
    + +
    +

    + 支持 font-awesomematerial-design-iconic-font
    + 默认的前缀为 icon,如果使用less,生成这两个字体的css时,指定 prefixicon
    + 如果使用这两个字体原生的前缀 fa 或者 zmdi,调用 Icon.setPrefix(prefix) 这个全局方法设置 +

    + +
    +{``}
    +          
    + +

    Normal

    + home +
    {' camera-retro'}
    + +

    Spin

    + +     + +
    {'\r'}
    + +

    Size

    + normal
    + lg
    + 2x
    + 3x
    + 4x
    + 5x +
    +{`
    +
    +
    +
    +
    +`}
    +          
    + +

    Method

    +

    有两个实例方法控制旋转,spinunspin

    +
    {'icon.spin()\ricon.unspin()'}
    +
    +
    + ) + } +} diff --git a/app/js/pages/input.jsx b/app/js/pages/input.jsx new file mode 100644 index 0000000..8cdbf79 --- /dev/null +++ b/app/js/pages/input.jsx @@ -0,0 +1,36 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Input' + + render () { + return ( +
    +
    +

    Input

    +

    输入框

    +
    + +
    +
    +{``}
    +          
    + +

    示例见 FormControl

    +
    +
    + ) + } +} diff --git a/app/js/pages/lang.jsx b/app/js/pages/lang.jsx new file mode 100644 index 0000000..af4621c --- /dev/null +++ b/app/js/pages/lang.jsx @@ -0,0 +1,47 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Lang: {getLang}} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Lang' + + state = { + path: 'buttons.ok', + text: getLang('request.status.405') + } + + handleChange (event) { + let path = event.target.value + this.setState({ path }) + } + + render () { + return ( +
    +
    +

    Language

    +

    语言包

    +
    + +
    +
    所有提示文字信息都放在 lang 下。
    +

    setLang(map[,map2...])

    +
    更新或者增加信息。
    + +

    getLang(path)

    +
    获取信息,path. 分隔字符串。
    +
    + +
    {JSON.stringify(getLang(this.state.path), null, 4) || 'undefined'}
    +
    + +

    当前信息

    +
    {JSON.stringify(getLang(), null, 4)}
    +
    +
    + ) + } +} diff --git a/app/js/pages/master.jsx b/app/js/pages/master.jsx new file mode 100644 index 0000000..9cb6b9e --- /dev/null +++ b/app/js/pages/master.jsx @@ -0,0 +1,30 @@ +"use strict" + +import React from 'react' +import classnames from 'classnames' +import NavList from '../nav-list.jsx' + +export default class Page extends React.Component { + static displayName = 'Master' + + static propTypes = { + children: React.PropTypes.any + } + + state = { + navShow: false + } + + navToggle (show) { + this.setState({ navShow: show }) + } + + render () { + return ( +
    + +
    {this.props.children}
    +
    + ) + } +} diff --git a/app/js/pages/message.jsx b/app/js/pages/message.jsx new file mode 100644 index 0000000..9c5986b --- /dev/null +++ b/app/js/pages/message.jsx @@ -0,0 +1,44 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Message, Icon} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Message' + + render () { + return ( +
    +
    +

    Message

    +

    通知 / 消息

    +
    + +
    +

    全局方法

    +
    {'Message.show(content, type)'}
    +

    content:内容,必填,值为 stringelement

    +

    type:样式,会增加一个class messsage-[type],默认值为 info

    + +

    Example

    +

    Message.show("Info message.")}>info message

    +
    {'Message.show("info message.")'}
    + +

    Message.show("error message.", "error")}>error message

    +
    {'Message.show("error message.", "error")'}
    + +

    Message.show(

    , "warning")}>element message

    +
    {'Message.show(

    title

    span message
    , "warning")'}
    + +

    Message.show( success and icon, "success")}>success message

    +
    {'Message.success( success and icon, "success")'}
    + +

    扩展

    +

    默认会添加 message-extend 类,可以通过这个类进行扩展。

    +
    +
    + ) + } +} diff --git a/app/js/pages/modal.jsx b/app/js/pages/modal.jsx new file mode 100644 index 0000000..b8b2b39 --- /dev/null +++ b/app/js/pages/modal.jsx @@ -0,0 +1,204 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' +const {Button, Modal, Form, FormControl} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Modal' + + state = { + index: 0 + } + + multOpen () { + let index = this.state.index + 1, + width = Math.ceil((Math.random() + 1) * 400), + ps = [] + + for (var i = 1; i <= index; i++) { + ps.push(

    {`第 ${i} 层Modal`}

    ) + } + + let options = { + header: `第 ${index} 层Modal`, + width: width, + content: ( + + ), + onClose: () => { + this.setState({ index: index - 1 }) + }, + buttons: { + '关闭': true + } + } + Modal.open(options) + this.setState({ index }) + } + + render () { + let openOptions = { + header: '一个弹出表单', + content: ( +
    +
    + + + + +
    + ), + width: 700, + buttons: { + '取消': true, + '重置': () => { + let form = this.refs.form + form.setData({}) + }, + '确定': () => { + let form = this.refs.form + let suc = form.validate() + if (suc) { + alert(JSON.stringify(form.getValue())) + return true + } + } + } + } + + return ( +
    +
    +

    Modal

    +

    对话框

    +
    + +
    +
    Modal 为全局对象,所有的方法都为静态方法。
    +

    Modal.open(options)

    +
    +{`options = {
    +  clickaway: {bool},         // 为 true 时,点击页面空白部分关闭Modal,默认值为 false
    +  header: {string|element},  // 标题,值为 string 或者 ReactElement,可为空
    +  content: {string|element}, // 内容,值为 string 或者 ReactElement,必填
    +  width: {int|string},       // 宽度,默认值为 500
    +  onClose: function,         // 当Modal关闭时触发
    +  buttons: {
    +    {text}: function         // text 为按钮文字,function 返回 true 或者值为 true,关闭 Modal
    +  }
    +}`}
    +          
    +
    + +
    +
    +{`Modal.open(
    +  header: '一个弹出表单',
    +  content: (
    +    
    +
    + + + + +
    + ), + width: 700, + buttons: { + '取消': true, + '重置': () => { + let form = this.refs.form + form.setData({}) + }, + '确定': () => { + let form = this.refs.form + let suc = form.validate() + if (suc) { + alert(JSON.stringify(form.getValue())) + return true + } + } + } +)`} +
    + +

    Modal.alert(content)

    +
    快捷方式, contentstring 或者 ReactElement
    +
    + +
    +
    {`Modal.alert('这是一个alert')`}
    + +

    Modal.confirm(content, onOk)

    +
    快捷方式, contentstring 或者 ReactElementonOkfunction ,点击确定后回调。
    +
    + +
    +
    +{`Modal.confirm(
    +  
    +

    如果你知道要做什么,请点确定。

    +

    如果你不知道,点取消吧。

    +
    , + () => { alert('点击了确定') } +)`} +
    + +

    Modal.close(data)

    +
    关闭最上层弹出的Modal
    + +

    多层弹出

    +
    + +
    +
    +{`multOpen () {
    +  let index = this.state.index + 1,
    +      width = Math.ceil((Math.random() + 1) * 400),
    +      ps = []
    +
    +  for (var i = 1; i <= index; i++) {
    +    ps.push(

    {'第 ' + i + ' 层Modal'}

    ) + } + + let options = { + header: '第 ' + index + ' 层Modal', + width: width, + content: ( + + ), + onClose: () => { + this.setState({ index: index - 1 }) + }, + buttons: { + '关闭': true + } + } + Modal.open(options) + this.setState({ index }) +} +mult open +`} +
    +
    +
    + ) + } +} diff --git a/app/js/pages/pagination.jsx b/app/js/pages/pagination.jsx new file mode 100644 index 0000000..3214be4 --- /dev/null +++ b/app/js/pages/pagination.jsx @@ -0,0 +1,61 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' +const {Pagination, Input, Checkbox} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Pagination' + + state = { + index: 2, + size: 20, + total: 1000, + pages: 10, + jumper: false + } + + onChange (index) { + this.setState({ index }) + } + + render () { + return ( +
    +
    +

    Pagination

    +

    分页

    +
    + +
    +
    +{``}
    +          
    + +

    Example

    + + +

    index: this.setState({index: parseInt(v)})} />

    +

    size: this.setState({size: parseInt(v)})} />

    +

    total: this.setState({total: parseInt(v)})} />

    +

    pages: this.setState({pages: parseInt(v)})} />

    +

    this.setState({jumper})} value={this.state.jumper} />

    +
    +
    + ) + } +} diff --git a/app/js/pages/radioGroup.jsx b/app/js/pages/radioGroup.jsx new file mode 100644 index 0000000..4d65fc2 --- /dev/null +++ b/app/js/pages/radioGroup.jsx @@ -0,0 +1,86 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {RadioGroup, dataSource} = global.uiRequire() +const textValue = require('../data/text-value') + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Checkbox' + + state = { + inline: false + } + + render () { + return ( +
    +
    +

    Radio Group

    +

    一组单选框

    +
    + +
    + +
    +{``}
    +          
    + + +

    数据结构

    +
    标准结构为 text, value key组成的数组
    +
    {'[{"text":"北京","id":"beijing"},{"text":"上海", "id":"shanghai"}]'}
    +
    可以使用自定义数组,指定 textTpl, valueTpl
    +
    {'[{"cn":"北京","en":"beijing"},{"cn":"上海", "en":"shanghai"}]'}
    +
    可以使用一维数组,这种情况下,显示文字与值相同
    +
    {'["北京","上海","广州"]'}
    + +

    Object Data

    +
    + +
    +
    {''}
    +
    +{`data = [
    +  { "id": "nanjing", "text": "南京" },
    +  { "id": "beijing", "text": "北京" },
    +  { "id": "guangzhou", "text": "广州" },
    +  { "id": "shenzhen", "text": "深圳" },
    +  { "id": "chengdu", "text": "成都" },
    +  { "id": "chongqing", "text": "重庆" },
    +  { "id": "shanghai", "text": "上海" }
    +]`}
    +          
    + +

    Array Data

    +
    + +
    +
    {''}
    + +

    Readonly

    +
    + +
    +
    {''}
    + +

    Remote Data

    +
    + +
    +
    {''}
    +
    +
    + ) + } +} diff --git a/app/js/pages/rating.jsx b/app/js/pages/rating.jsx new file mode 100644 index 0000000..61e5049 --- /dev/null +++ b/app/js/pages/rating.jsx @@ -0,0 +1,136 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Rating, Icon, RadioGroup, Checkbox} = global.uiRequire() + +Rating.register('star', [ + , + +]) + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Rating' + + state = { + readOnly: false, + maxValue: 5, + value: 3, + theme: 'star' + } + + render () { + return ( +
    +
    +

    Rating

    +

    评分

    +
    + +
    +
    +{`
    +
    +Rating.register( // 注册一个主题,供重复调用
    +  string,        // 主题名称
    +  array          // 等同与 icons
    +)
    +`}
    +          
    + +

    Example

    +
    + this.setState({ value })} + /> +
    + +
    + maxValue: + this.setState({ maxValue })} value={this.state.maxValue} data={[5, 10, 12, 20]} /> +
    + +
    + this.setState({ + icons: checked ? + [, ] : + null + })} + text={'设置icons为heart'} /> +
    + +
    + this.setState({ readOnly })} text={'readOnly'} /> +
    + +
    + value: + this.setState({ value: event.target.value })} type="text" value={this.state.value} /> +
    + +
    + +
    +{`// 注册主题
    +Rating.register('star', [
    +  ,
    +  
    +])
    +
    +// state
    +getInitialState: function () {
    +  return {
    +    readOnly: false,
    +    maxValue: 5,
    +    value: 3,
    +    theme: 'star'
    +  }
    +}
    +
    +this.setState({ value })}
    +/>
    +
    +maxValue: this.setState({ maxValue })}
    +  value={this.state.maxValue} data={[5, 10, 12, 20]} />
    +
    +this.setState({
    +    icons: checked ?
    +      [,
    +       ] :
    +      null
    +  })}
    +  text={'设置icons为heart'} />
    +
    +this.setState({ readOnly })}
    +  text={'readOnly'} />
    +
    +value: this.setState({ value: event.target.value })}
    +  type="text" value={this.state.value} />
    +`}
    +          
    +
    +
    + ) + } +} diff --git a/app/js/pages/select.jsx b/app/js/pages/select.jsx new file mode 100644 index 0000000..f33212c --- /dev/null +++ b/app/js/pages/select.jsx @@ -0,0 +1,119 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Select, dataSource, Button} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Select' + + state = { + country: '' + } + + render () { + return ( +
    +
    +

    Select

    +

    下拉列表

    +
    + +
    +
    +{`
    +            {' '}
    +            
    + this.setState({ country }) }
    +            value={this.state.country}
    +            data={dataSource("json/countries.json")} />
    +          
    +          
    +{`
    +          
    +{`
    +          
    +{`
    +            
    +            
    + +

    + DevDocs +

    + + +
    +
    + list +
    +
    +
    +
    +
    +
    + ); + } +}); + +export default Component diff --git a/app/less/app.less b/app/less/app.less new file mode 100755 index 0000000..6590f9c --- /dev/null +++ b/app/less/app.less @@ -0,0 +1,155 @@ + +@import "./base"; +@import "./mixins"; +@import "./components"; + +h1,h2,h3,h4,p{margin:5px 0;} +h3,h4{font-size: 14px;} +html{height: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-size: 10px;} +.iqg-dimmer-active{height: 100%; overflow: hidden;} +body,input,textarea,select,button{text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased;} +a{text-decoration: none;} +body{color: #333; font-family: @base-font-family; font-size: 14px; overflow-y: scroll;} +.gray{color: @smallGray;} +.iqg-pages {display: flex;flex-direction: column;} +.iqg-page{box-sizing: border-box;} +.iqg-header {margin-bottom: 0;} + +.iqg-main { flex: 1;} +.iqg p.blank { padding: 10px 26px;} +.iqg-panel .pure-button{margin:5px;} +.iqg-dimmer { + position: fixed; + right: 0; + bottom: 0; + width: 100%; + height: 100%; + background-color: rgba(0,0,0,.6); + z-index: 1100; + opacity: 0; +} +.iqg-dimmer.iqg-active { + opacity: 1; +} +.iqg-ajax{overflow: hidden;} +.ajax-loading{ + // height: 100%; + // min-height: 200px; + // text-align: center; + // &:before{content: '';width: 0; height: 100%; vertical-align: middle;} + display: flex; + justify-content: center; + flex-direction: column; + min-height: 200px; + text-align: center; + + .iqg-icon-spinner{vertical-align: middle;} + .iqg-icon-spinner:before{font-size: 2em;} +} + +// headerBar +.header-bar{height: 49px;} + +// tabs 日期选择 +.box-title{ background-color:@lightGray; padding: 10px 26px;} +.box-title p{margin: 6px 0 0;} +.iqg-tabs{ + border-bottom: 1px solid @midGray; + width: 100%; + box-sizing: border-box; + .iqg-tab{ display: inline-block;color: @mainColor; font-size: 14px; width: 44px; height: 34px; line-height: 34px; text-align: center; border-radius: 2px; margin-right: 10px;cursor: pointer;} + .iqg-tab-active{ background-color:@mainColor; color: @white; } +} +.iqg-topbar{min-height: 82px;} + +.iqg-list{ + .list-box{ overflow: hidden;} + .link-block{display: block;box-sizing: border-box; overflow: hidden; padding: 1px 26px; width: 100%; margin-top: -1px; + &:active{ + background-color: #E3E3E3; + } + } + .link-block .item{overflow: hidden; margin-top: -1px; min-height: 44px; +line-height: 44px; border-top: 1px solid @midGray;} + a{ + .num{color: @smallGray; float: right; margin-left: 10px; text-align: right;} + .title{ overflow: hidden; font-size: 16px;color: @black;} + .title p{ margin:0; padding: 0; white-space: nowrap; overflow: hidden;text-overflow: ellipsis;} + } +} + +// 二级列表 +.sub-list-title{ + position: relative; + font-size: 14px; + //padding-right: 150px; + h3,.iqg-select-btn{ display: inline-block; vertical-align: middle;} + h3{width:100%;box-sizing:border-box;padding-right: 120px;font-weight: normal; overflow: hidden; margin:0; line-height: 20px; } + .iqg-select-btn{ + margin-left:-120px;width: 120px; color: @mainColor;text-align: right; + } + .iqg-btn{display:inline-block;vertical-align: middle;margin-left: 5px; min-width: 40px; min-height: 34px; line-height: 34px; box-sizing: border-box;text-align: center; + i{width: 20px;} + i:before{ font-size: 20px;vertical-align: middle;} + } + .iqg-arr-btn{ + position:relative; min-width: 70px; border:1px solid @mainColor; border-radius: 3px; + &:before{content: ''; position: absolute; bottom: 3px; right: 3px; + display:inline-block; width: 0;height: 0; border-color: transparent @mainColor @mainColor transparent; border-width: 4px; border-style: solid; } + } +} +.iqg-star{ + display: block; overflow: hidden; clear: both; width: 100px;height: 16px; margin: -10px 0 8px -3px; + span,i{float: left; line-height: 1; overflow: hidden;} + i{box-sizing: border-box;width: 100px; padding: 0 4px;} + i:before{.am-icon-font; content: '\f005\20\f005\20\f005\20\f005\20\f005'; font-size: 16px; color: #F3F210; text-shadow: 1px 1px rgb(216, 216, 159);} +} + +.load-more{ text-align: center; height: 40px; line-height: 40px; cursor: pointer;} + + +//弹层 +.iqg-dimmer{ background-color: rgba(255, 255, 255, 0.95)} +.iqg-lay{ + background: none; + .iqg-popup-hd, + .iqg-popup-bd{ border:none; background: none;} + .iqg-close{right: auto; left: 10px; top: 10px;border: none; width:50px; height:50px; background: none; color:@mainColor;font-size:30px; } + .iqg-close:hover{ + transform: inherit; + color:@mainColor; + outline: none; + } +} +.iqg-types { + .lay-title{font-size: 14px; color: @smallGray; font-weight: normal; margin-bottom: 20px;} + .iqg-btn{ display: block;margin: 10px auto; width: 100px; height: 30px; line-height: 30px; color: @mainColor; text-align: center; } + .iqg-btn-active{ color: @white; background: @mainColor; border-radius: 3px; } +} + +//详情列表 +.list-detail { + margin: 10px 0; + &:before{ + display: block; + content: ''; + background: #F1F1F1; + width: 100%; + height: 5px; + } + ul{margin:0;;padding: 1px 0;list-style-type: none; overflow: hidden;} + li{ + margin: -1px 26px 0; padding: 0 0px 0 10px; border-top: 1px solid #CACACA; min-height: 30px; line-height: 30px; overflow: hidden; + + &.title{background-color: #E0E0E0; border-top:none; margin: 0; padding: 0 26px 0 36px;} + &.title span{ color: @black;} + .time{color:@smallGray; display: block;overflow: hidden; padding: 5px 0;line-height: 20px;} + .value, + .num{float: right; min-width: 60px; text-align: center;} + } +} +.iqg-chart{ text-align: center;} +.iqg-chart h3{ font-weight: normal;} +.strong{ font-weight: bold;} +.chart-box{box-sizing: border-box; width: 100%; overflow: hidden; height: 300px;} +.scroll-box{overflow-x: auto; height: 320px; margin: 0 20px;} diff --git a/app/less/base.less b/app/less/base.less new file mode 100644 index 0000000..7e19023 --- /dev/null +++ b/app/less/base.less @@ -0,0 +1,161 @@ +// @import "../../node_modules/amazeui/less/variables"; +// @import "../../node_modules/amazeui/less/mixins"; + +@ns: ~"iqg-"; + +@black: #000; +@white: #fff; +@gray-darker: lighten(@black, 13.5%); // #222 +@gray-dark: lighten(@black, 20%); // #333 +@gray: lighten(@black, 33.5%); // #555 +@gray-light: lighten(@black, 60%); // #999 +@gray-lighter: lighten(@black, 93.5%); // #eee + +// Brand Colors +// ----------------------------------------------------------------------------- + +@global-primary: #0e90d2; // #157EFB; //#428bca; +@global-secondary: lighten(@global-primary, 15%); +@global-success: #5eb95e; // #53D76A; //#5cb85c; +@global-warning: #F37B1D; // #FD9426; // #f0ad4e; +@global-danger: #dd514c; // #FC3159; //#da314b; +@global-info: @global-secondary; + +@mainColor: #FC6522; +@lightGray: #eee; +@midGray: #ddd; +@white: #fff; +@smallGray: #999; + +@global-background: @white; +@global-border: #ddd; + +@font-family-sans-serif: "Segoe UI", "Lucida Grande", Helvetica, Arial, "Microsoft YaHei", FreeSans, Arimo, "Droid Sans","wenquanyi micro hei","Hiragino Sans GB", "Hiragino Sans GB W3", "FontAwesome", sans-serif; + +@font-family-serif: Georgia, "Times New Roman", Times, SimSun, "FontAwesome", serif; //FangSong, STFangSong + +@font-family-monospace: Monaco, Menlo, Consolas, "Courier New", "FontAwesome", monospace; + +@font-family-kai: Georgia, "Times New Roman", Times, Kai, "Kaiti SC", KaiTi, BiauKai, "FontAwesome", serif; + +// Font size +// ----------------------------------------------------------------------------- + +@global-font-size: 1.6rem; //16px +@global-line-height: 1.6; +@font-size-base: @global-font-size; + +@line-height-base: @global-line-height; +@line-height-computed: floor(@font-size-base * @line-height-base); // 2 + + +@font-size-xxs: @global-font-size - 0.6; // 10px - 1rem +@font-size-xs: @global-font-size - 0.4; // 12px +@font-size-sm: @global-font-size - 0.2; // 14px +//@font-size-default: @global-font-size; // 16px +@font-size-lg: @global-font-size + 0.2; // 18px +@font-size-xl: @global-font-size + 0.8; // 24px +@font-size-xxl: @global-font-size * 2; // 32px +@font-size-xxxl: @global-font-size * 2 + 1; // 42px + + +// Global spacing +// ============================================================================= + +@global-spacing: 1.6rem; + +@global-spacing-xs: 0.5rem; +@global-spacing-sm: 1rem; +@global-spacing-lg: 2.4rem; +@global-spacing-xl: 3.2rem; + + +// Margin +// ----------------------------------------------------------------------------- + +@global-margin: @global-spacing; + +@global-margin-xs: @global-spacing-xs; +@global-margin-sm: @global-spacing-sm; + +@global-margin-lg: @global-spacing-lg; +@global-margin-xl: @global-spacing-xl; + + +// Border radius +// ----------------------------------------------------------------------------- + +@global-radius: 0; +@radius-normal: 2px; +@radius-lg: 5px; +@radius-sm: 1px; + +@global-rounded: 1000px; +@global-square: 0; + +// Base +// ============================================================================= + +@base-background: @global-background; +@base-font-family: @font-family-sans-serif; +@base-font-weight: normal; +@base-font-size: @global-font-size; +@base-line-height: @global-line-height; +@base-text-color: @gray-dark; + +// em element +@base-em-color: #D05; + +// ins element +@base-ins-background: #ffa; +@base-ins-color: @gray-dark; + +// mark element +@base-mark-background: #ffa; +@base-mark-color: @gray-dark; + +// selection +@base-selection-background: @global-primary; +@base-selection-color: @white; + +@base-margin-vertical: @global-spacing; + + +// ============================================================================= +// Z-index +// ============================================================================= + +@global-z-index: 1000; + +@z-index-topbar-fixed: @global-z-index; +@z-index-sticky: @global-z-index + 10; +@z-index-dropdown: @global-z-index + 20; +@z-index-popover: @global-z-index + 30; +@z-index-offcanvas: @global-z-index + 90; +@z-index-dimmer: @global-z-index + 100; +@z-index-modal: @global-z-index + 110; +@z-index-datepicker: @global-z-index + 120; +@z-index-pureview: @global-z-index + 120; +@z-index-nprogress: @global-z-index + 1000; + +.clearfix() { + &:before, + &:after { + content: " "; + display: table; + } + + &:after { + clear: both; + } +} + +.@{ns}cf { + .clearfix(); +} + +.fl,.fr{display: inline;} +.fl{float: left;} +.fr{float: right;} +.tc{text-align: center;} + diff --git a/app/less/components.less b/app/less/components.less new file mode 100644 index 0000000..14cd8a8 --- /dev/null +++ b/app/less/components.less @@ -0,0 +1,544 @@ + +//icon +//////////////////////////////////////////////////////////// + +// @fa-font-path: '//dn-amui.qbox.me/font-awesome/4.3.0/fonts'; +@fa-font-path: '../fonts'; +@fa-css-prefix: ~"@{ns}icon"; +@fa-version: '4.3.0'; + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); + // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} +.am-icon-font() { + display: inline-block; // 1 + font: normal normal normal @global-font-size/1 "FontAwesome", sans-serif; // shortening font declaration + /*font-weight: normal; // 2 + font-style: normal; // 2 + vertical-align: baseline; // 3 + line-height: 1; // 4*/ + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; // 5 + -moz-osx-font-smoothing: grayscale; + transform: translate(0, 0); // ensures no half-pixel rendering in firefox +} +[class*="@{ns}icon-"] { + display: inline-block; + font-style: normal; + + &:before { + .am-icon-font; + } +} +[class*="@{ns}icon-"]:before { + display: inline-block; + font: normal normal normal 1.6rem/1 FontAwesome,sans-serif; + font-size: inherit; + text-rendering: auto; + transform: translate(0,0); +} +@fa-var-spinner: "\f110"; +@fa-var-star: "\f005"; +@fa-var-bars: "\f0c9"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; + +.@{fa-css-prefix}-spinner:before { + content: @fa-var-spinner; +} +.@{fa-css-prefix}-star:before { + content: @fa-var-star; +} +.@{fa-css-prefix}-sort-numeric-asc:before { + content: @fa-var-sort-numeric-asc; +} +.@{fa-css-prefix}-sort-numeric-desc:before { + content: @fa-var-sort-numeric-desc; +} + +@keyframes icon-spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(359deg); + } +} + +.@{ns}icon-spin { + animation: icon-spin 2s infinite linear; +} + +//header +//////////////////////////////////////////////////////////// +.@{ns}header{ + position: relative;box-sizing: border-box;top: 0; width: 100%; height: 49px; line-height: 49px; padding: 0 10px; + .@{ns}header-nav{ position: absolute; top: 0; + >a{display: inline-block; min-width: 40px; text-align: center;} + img{height: 16px; width: auto; vertical-align: middle;} + } + .@{ns}header-left{left: 5px;} + .@{ns}header-right{right: 5px;} + .@{ns}header-title{margin: 0 24%;font-size: 2rem;font-weight: 400;text-align: center;display: block;word-wrap: normal;text-overflow: ellipsis;white-space: nowrap;overflow: hidden;} +} +.@{ns}header-default{ + background-color: #ff6600; + .@{ns}header-nav>a{color:@gray-lighter;} + .@{ns}header-title{ color: @white;} + .@{ns}header-icon{font-size: 20px;} +} +.@{ns}header-fixed{position: fixed; z-index: 100;} + +//modal +//////////////////////////////////////////////////////////// + +// Name: Modal +// +// Description: Define style for Modal Plugin +// +// TODO: 1. 宽度自适应的情况 +// 2. 最大高度限制 +// 3. 不同屏幕宽度下设置不同大小 +// +// ============================================================================= + + +// Modal Variables +// ============================================================================= + +@modal-bg-color: #f8f8f8; +@modal-btn-color : @global-primary; +@modal-btn-bg: @modal-bg-color; +@modal-btn-active-bg: #d4d4d4; +@modal-duration: 300ms; +@modal-border-color: #dedede; +@modal-border-radius: @global-radius; + +@modal-actions-duration: @modal-duration; +@modal-actions-btn-bg: rgba(243, 243, 243, 0.95); +@modal-actions-active-btn-bg: #dcdcdc; + +@modal-popup-duration: @modal-duration; + +@modal-lg: 810px; +@modal-md: 540px; +@modal-sm: 270px; + + +/* ========================================================================== + Component: Modal Plugin + ============================================================================ */ + +.@{ns}modal { + width: @modal-sm; + position: fixed; + display: none; + z-index: @z-index-modal; + left: 50%; + margin-left: -@modal-sm/2; + margin-top: 0; + top: 50%; + text-align: center; + border-radius: @modal-border-radius; + opacity: 0; + // transform: translate3d(0, 0, 0) scale(1.185); + transform: scale(1.185); + transition-property: transform, opacity; + backface-visibility: hidden; + perspective: 1000px; + + &:focus { + outline: 0; + } + + &.@{ns}modal-active { + opacity: 1; + transition-duration: @modal-duration; + // transform: translate3d(0, 0, 0) scale(1); + transform: scale(1); + } + + &.@{ns}modal-out { + opacity: 0; + z-index: @z-index-modal - 1; + transition-duration: @modal-duration; + // transform: translate3d(0, 0, 0) scale(0.815); + transform: scale(0.815); + } + + //@media @medium-up { + width: @modal-md; + margin-left: -@modal-md/2; + //} + + /*@media @large-up { + width: @modal-lg; + margin-left: -@modal-lg/2; + }*/ + .hook-modal; +} + +.@{ns}modal-dialog { + border-radius: @modal-border-radius; + background: @modal-bg-color; + .hook-modal-dialog; +} + +.@{ns}modal-hd { + padding: 15px 10px 5px 10px; + font-size: 1.8rem; + font-weight: 500; + + .@{ns}modal-bd { + padding-top: 0; + } + .@{ns}close { + position: absolute; + top: 4px; + right: 4px; + } + .hook-modal-hd; +} + +.@{ns}modal-bd { + padding: 15px 10px; + text-align: center; + border-bottom: 1px solid @modal-border-color; + border-radius: 2px 2px 0 0; + // References https://github.com/allmobilize/amazeui/issues/464 + // overflow: hidden; + + + .@{ns}modal-bd { + margin-top: 5px; + } + .hook-modal-hd; +} + +// Prompt input +.@{ns}modal-prompt-input { + display: block; + margin: 5px auto 0 auto; + border-radius: @modal-border-radius; + padding: 5px; + line-height: 1.8rem; + width: 80%; + border: 1px solid @modal-border-color; + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + appearance: none; + + &:focus { + outline: none; + border-color: darken(@modal-border-color, 3%); + } + .hook-modal-prompt-input; +} + +.@{ns}modal-footer { + height: 44px; + overflow: hidden; + display: table; + width: 100%; + border-collapse: collapse; + .hook-modal-footer; +} + +.@{ns}modal-btn { + display: table-cell!important; + padding: 0 5px; + height: 44px; + box-sizing: border-box !important; + font-size: 1.6rem; + line-height: 44px; + text-align: center; + color: @global-primary; + .text-overflow(block); + cursor: pointer; + border-right: 1px solid @modal-border-color; + + &:first-child { + border-radius: 0 0 0 @modal-border-radius; + } + + &:last-child { + border-right: none; + border-radius: 0 0 @modal-border-radius 0; + } + + &:first-child:last-child { + border-radius: 0 0 @modal-border-radius @modal-border-radius; + } + + &.@{ns}modal-btn-bold { + font-weight: 500; + } + + &:active { + background: @modal-btn-active-bg; + } + + & + .@{ns}modal-btn { + border-left: 1px solid @modal-border-color; + } + + .hook-modal-btn; +} + + +// without buttons +// ----------------------------------------------------------------------------- + +.@{ns}modal-no-btn { + .@{ns}modal-dialog { + border-radius: @global-radius; + border-bottom: none; + } + + .@{ns}modal-bd { + border-bottom: none; + } + + .@{ns}modal-footer { + display: none; + } + + .hook-modal-no-btn; +} + + +// Loading +// ============================================================================= + +.@{ns}modal-loading { + // width: @modal-sm !important; + // margin-left: -@modal-sm/2 !important; + + .@{ns}modal-bd { + border-bottom: none; + } + + .@{ns}icon-spin { + display: inline-block; + font-size: 2.4rem; + } + + .@{ns}modal-footer { + display: none; + } + + .hook-modal-loading; +} + +// loadmask +// ============================================================================= +.@{ns}modal-loadmask { + .@{ns}modal-dialog { + background: none; + } + .@{ns}icon-spin { + color: @white; + font-size: 4rem; + } +} + +// Modal - Action +// ======================================================================== + +.@{ns}modal-actions { + position: fixed; + left: 0; + bottom: 0; + z-index: @z-index-modal; + width: 100%; + text-align: center; + border-radius: @modal-border-radius; + transform: translateY(100%); + transition: transform @modal-actions-duration; + + &.@{ns}modal-active { + transform: translateY(0); + } + + &.@{ns}modal-out { + z-index: @z-index-modal - 1; + transform: translateY(100%); + } + + .hook-modal-actions; +} + +.@{ns}modal-actions-group { + margin: 10px; + .@{ns}list { + margin: 0; + border-radius: @modal-border-radius; + & > li { + margin-bottom: 0; + border-bottom: none; + .text-overflow(); + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.015); + & > a { + padding: 1rem; + .text-overflow(); + } + &:first-child { + border-top: none; + .border-top-radius(@modal-border-radius); + } + + &:last-child { + border-bottom: none; + .border-bottom-radius(@modal-border-radius); + } + } + } +} + +.@{ns}modal-actions-header { + padding: 1rem; + color: @gray-light; + font-size: 1.4rem; +} + +.@{ns}modal-actions-danger { + color: @global-danger; + a { + color: inherit; + } +} + + +// Modal Popup +// ======================================================================== + +.@{ns}popup { + position: fixed; + left: 0; + top: 0; + width: 100%; + height: 100%; + z-index: @z-index-modal; + background: #fff; + display: none; + overflow: hidden; + transition-property: transform; + transform: translateY(100%); + + &.@{ns}modal-active, + &.@{ns}modal-out { + transition-duration: @modal-popup-duration; + } + + &.@{ns}modal-active { + transform: translateY(0); + } + + &.@{ns}modal-out { + transform: translateY(100%); + } + + // iPad Modal + @media all and (min-width: 630px) and (min-height: 630px) { + width: 630px; + height: 630px; + left: 50%; + top: 50%; + margin-left: -315px; + margin-top: -315px; + transform: translateY(1024px); + + &.@{ns}modal-active { + transform: translateY(0); + } + + &.@{ns}modal-out { + transform: translateY(1024px); + } + } + + .hook-popup; +} + +.@{ns}popup-inner { + padding-top: 44px; + height: 100%; + box-sizing: border-box; + .scrollable(); + .hook-popup-inner; +} + +.@{ns}popup-hd { + position: absolute; + top: 0; + width: 100%; + height: 43px; + border-bottom: 1px solid @modal-border-color; + background-color: #fff; + + .@{ns}popup-title { + font-size: 1.8rem; + font-weight: bold; + line-height: 43px; + + text-align: center; + margin: 0 30px; + color: @gray-dark; + .text-overflow(); + } + + .@{ns}close { + position: absolute; + right: 10px; + top: 8px; + cursor: pointer; + transition: all 0.3s; + color: @gray-light; + + &:hover { + transform: rotate(360deg); + color: @gray; + } + } + + .hook-popup-hd; +} + +.@{ns}popup-bd { + box-sizing: border-box; + min-height: 100%; + padding: 15px; + background: #f8f8f8; + color: @gray; + .hook-popup-bd; +} + + +// Hooks +// ============================================================================= + +.hook-modal() {} +.hook-modal-hd() {} +.hook-modal-bd() {} +.hook-modal-footer() {} +.hook-modal-dialog() {} +.hook-modal-prompt-input() {} +.hook-modal-btn() {} +.hook-modal-no-btn() {} +.hook-modal-loading() {} +.hook-modal-actions() {} + +.hook-popup() {} +.hook-popup-inner() {} +.hook-popup-hd() {} +.hook-popup-bd() {} diff --git a/app/less/mixins.less b/app/less/mixins.less new file mode 100644 index 0000000..a38ffb5 --- /dev/null +++ b/app/less/mixins.less @@ -0,0 +1,69 @@ + + +.clearfix() { + &:before, + &:after { + content: " "; + display: table; + } + + &:after { + clear: both; + } +} + +.@{ns}cf { + .clearfix(); +} + +.fl,.fr{display: inline;} +.fl{float: left;} +.fr{float: right;} +.tc{text-align: center;} + +.scrollable() { + overflow: auto; + -webkit-overflow-scrolling: touch; +} +.text-overflow(@display: block) { + display: @display; + word-wrap: normal; /* for IE */ + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.text-hide() { + font: ~"0/0" a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +// Single side border-radius +// ----------------------------------------------------------------------------- +.border-top-radius(@radius) { + border-top-right-radius: @radius; + border-top-left-radius: @radius; +} + +.border-right-radius(@radius) { + border-bottom-right-radius: @radius; + border-top-right-radius: @radius; +} + +.border-bottom-radius(@radius) { + border-bottom-right-radius: @radius; + border-bottom-left-radius: @radius; +} + +.border-left-radius(@radius) { + border-bottom-left-radius: @radius; + border-top-left-radius: @radius; +} + +// Opacity +// ----------------------------------------------------------------------------- +.opacity(@opacity) { + opacity: @opacity; +} diff --git a/app/manifest.json b/app/manifest.json new file mode 100755 index 0000000..40fa1cb --- /dev/null +++ b/app/manifest.json @@ -0,0 +1,24 @@ +{ + "name": "Amaze UI Starter Kit", + "short_name": "AMUISK", + "icons": [ + { + "src": "i/touch/icon-128x128.png", + "sizes": "128x128" + }, + { + "src": "i/touch/apple-touch-icon.png", + "sizes": "152x152" + }, + { + "src": "i/touch/ms-touch-icon-144x144-precomposed.png", + "sizes": "144x144" + }, + { + "src": "i/touch/chrome-touch-icon-192x192.png", + "sizes": "192x192" + } + ], + "start_url": "/index.html?homescreen=1", + "display": "standalone" +} diff --git a/app/manifest.webapp b/app/manifest.webapp new file mode 100755 index 0000000..8eb40fd --- /dev/null +++ b/app/manifest.webapp @@ -0,0 +1,29 @@ +{ + "version": "1.0.0", + "name": "Amaze UI React Starter Kit", + "launch_path": "/index.html", + "description": "An Amaze UI template that helps you build fast, modern mobile web apps.", + "icons": { + "128": "/i/touch/icon-128x128.png" + }, + "developer": { + "name": "", + "url": "" + }, + "installs_allowed_from": [ + "*" + ], + "default_locale": "zh_CN", + "permissions": { + }, + "locales": { + "en": { + "name": "Amaze UI React Starter Kit", + "description": "An Amaze UI React template that helps you build fast, modern mobile web apps.", + }, + "zh_CN": { + "name": "Amaze UI React 启动工具包", + "description": "Amaze UI React 新手入门快速上手工具包" + } + } +} diff --git a/app/robots.txt b/app/robots.txt new file mode 100755 index 0000000..d0e5f1b --- /dev/null +++ b/app/robots.txt @@ -0,0 +1,5 @@ +# www.robotstxt.org/ + +# Allow crawling of all content +User-agent: * +Disallow: diff --git a/app/scss/application-dark.css.scss b/app/scss/application-dark.css.scss new file mode 100644 index 0000000..20c2fc1 --- /dev/null +++ b/app/scss/application-dark.css.scss @@ -0,0 +1,74 @@ +//= depend_on icons.png +//= depend_on icons@2x.png + +//= require vendor/open-sans + +/*! + * Copyright 2013-2015 Thibaut Courouble and other contributors + * + * This source code is licensed under the terms of the Mozilla + * Public License, v. 2.0, a copy of which may be obtained at: + * http://mozilla.org/MPL/2.0/ + */ + +@import 'global/variables-dark', + 'global/icons', + 'global/classes', + 'global/base'; + +@import 'components/app', + 'components/header', + 'components/notif', + 'components/sidebar', + 'components/content', + 'components/page', + 'components/fail', + 'components/path', + 'components/notice', + 'components/prism', + 'components/mobile'; + +@import 'pages/base', + 'pages/angular', + 'pages/apache', + 'pages/bower', + 'pages/c', + 'pages/chai', + 'pages/clojure', + 'pages/coffeescript', + 'pages/d3', + 'pages/drupal', + 'pages/ember', + 'pages/express', + 'pages/git', + 'pages/go', + 'pages/haskell', + 'pages/jquery', + 'pages/knockout', + 'pages/laravel', + 'pages/lua', + 'pages/mdn', + 'pages/meteor', + 'pages/modernizr', + 'pages/moment', + 'pages/nginx', + 'pages/node', + 'pages/npm', + 'pages/opentsdb', + 'pages/phaser', + 'pages/php', + 'pages/phpunit', + 'pages/postgres', + 'pages/q', + 'pages/rdoc', + 'pages/react', + 'pages/redis', + 'pages/requirejs', + 'pages/rethinkdb', + 'pages/rfc', + 'pages/rust', + 'pages/socketio', + 'pages/sphinx', + 'pages/underscore', + 'pages/yard', + 'pages/yii'; diff --git a/app/scss/application.css.scss b/app/scss/application.css.scss new file mode 100644 index 0000000..dcb6b62 --- /dev/null +++ b/app/scss/application.css.scss @@ -0,0 +1,74 @@ +//= depend_on icons.png +//= depend_on icons@2x.png + +//= require vendor/open-sans + +/*! + * Copyright 2013-2015 Thibaut Courouble and other contributors + * + * This source code is licensed under the terms of the Mozilla + * Public License, v. 2.0, a copy of which may be obtained at: + * http://mozilla.org/MPL/2.0/ + */ + +@import 'global/variables', + 'global/icons', + 'global/classes', + 'global/base'; + +@import 'components/app', + 'components/header', + 'components/notif', + 'components/sidebar', + 'components/content', + 'components/page', + 'components/fail', + 'components/path', + 'components/notice', + 'components/prism', + 'components/mobile'; + +@import 'pages/base', + 'pages/angular', + 'pages/apache', + 'pages/bower', + 'pages/c', + 'pages/chai', + 'pages/clojure', + 'pages/coffeescript', + 'pages/d3', + 'pages/drupal', + 'pages/ember', + 'pages/express', + 'pages/git', + 'pages/go', + 'pages/haskell', + 'pages/jquery', + 'pages/knockout', + 'pages/laravel', + 'pages/lua', + 'pages/mdn', + 'pages/meteor', + 'pages/modernizr', + 'pages/moment', + 'pages/nginx', + 'pages/node', + 'pages/npm', + 'pages/opentsdb', + 'pages/phaser', + 'pages/php', + 'pages/phpunit', + 'pages/postgres', + 'pages/q', + 'pages/rdoc', + 'pages/react', + 'pages/redis', + 'pages/requirejs', + 'pages/rethinkdb', + 'pages/rfc', + 'pages/rust', + 'pages/socketio', + 'pages/sphinx', + 'pages/underscore', + 'pages/yard', + 'pages/yii'; diff --git a/app/scss/components/_app.scss b/app/scss/components/_app.scss new file mode 100644 index 0000000..9effe63 --- /dev/null +++ b/app/scss/components/_app.scss @@ -0,0 +1,45 @@ +._app { + position: relative; + z-index: 1; + height: 100%; + padding-top: $headerHeight; + overflow: hidden; + background: $contentBackground; + -webkit-transition: opacity .2s; + transition: opacity .2s; + @extend %border-box; + + ._booting > & { opacity: 0; } + ._noscript > & { display: none; } + + &._max-width { + margin: 0 auto; + max-width: $maxWidth; + box-shadow: 1px 0 $headerBorder, -1px 0 $headerBorder; + } +} + +._booting { + opacity: 0; + + &._loading, &._loading:before { opacity: 1; } + + &:before { + content: 'Loading\2026'; + position: absolute; + top: 50%; + left: 0; + right: 0; + line-height: 1; + margin-top: -.75em; + font-size: 4rem; + color: $loadingText; + text-align: center; + letter-spacing: -.125rem; + opacity: 0; + -webkit-transition: opacity .1s .3s; + transition: opacity .1s .3s; + } +} + +._noscript { opacity: 1; } diff --git a/app/scss/components/_content.scss b/app/scss/components/_content.scss new file mode 100644 index 0000000..3df6d5b --- /dev/null +++ b/app/scss/components/_content.scss @@ -0,0 +1,499 @@ +// +// Content +// + +._container { + position: relative; + z-index: $contentZ; + height: 100%; + margin-left: $sidebarWidth; + pointer-events: none; + @extend %border-box; + + @media #{$mediumScreen} { margin-left: $sidebarMediumWidth; } +} + +._content { + position: relative; + height: 100%; + overflow-y: scroll; + margin-left: .875rem; + padding: 1.25rem 1.5rem 0; + font-size: .875rem; + pointer-events: auto; + -webkit-overflow-scrolling: touch; + @extend %border-box; + + -webkit-padding-start: .75rem; + -webkit-padding-end: 1rem; + + @media (-moz-overlay-scrollbars) { padding-left: .75rem; } + @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { margin-left: 0; } + + &:after { // padding bottom + content: ''; + display: block; + margin-bottom: 1.25rem; + } + + &::-webkit-scrollbar { -webkit-appearance: none; } + &::-webkit-scrollbar:vertical { width: 14px; } + &::-webkit-scrollbar:horizontal { height: 14px } + &::-webkit-scrollbar-button { display: none; } + &::-webkit-scrollbar-track { background: $contentBackground; } + &::-webkit-scrollbar-thumb { + min-height: 2rem; + background: $scrollbarColor; + background-clip: padding-box; + border: 5px solid $contentBackground; + border-radius: 10px; + + &:active { + background-color: $scrollbarColorHover; + border-width: 4px; + } + } +} + +._content-loading:before { + opacity: 1; + @extend ._booting:before; +} + +// +// Splash screen +// + +._splash-title { + color: $splashText; + cursor: default; + opacity: 1; + margin-top: -1.25em; + @extend ._booting:before, %user-select-none; +} + +._splash-sponsors { + position: absolute; + top: 50%; + left: 0; + right: 0; + margin-top: 1.25rem; + text-align: center; + line-height: 2rem; +} + +._splash-sponsor { + position: relative; + display: inline-block; + vertical-align: top; + margin: .5rem 1.5rem; + + ._logo-thx { opacity: .3; } + &:hover ._logo-thx { opacity: .6; } + + ._logo-info { + right: 50%; + margin-right: -9rem; + } +} + +// +// Intro +// + +._intro { text-align: center; } + +._intro-message { + position: relative; + display: inline-block; + vertical-align: top; + max-width: 37rem; + padding: 1rem 1.25rem; + text-align: left; + @extend %note, %note-green; +} + +._intro-hide { + float: right; + line-height: 1.5rem; + cursor: pointer; +} + +._intro-title { + margin: 0 0 1rem; + font-size: 1rem; + line-height: 1.5rem; +} + +._intro-list { + margin: 1rem 0; + padding-left: 2.25rem; +} + +._intro-link { cursor: pointer; } + +._intro-sponsors { + position: absolute; + bottom: 1rem; + right: 1rem; + margin: 0; + line-height: 1.5rem; +} + +._intro-sponsor { + display: inline-block; + vertical-align: top; + margin-left: .5em; + + &:hover { text-decoration: none; } +} + +// +// Error +// + +._error { + position: absolute; + top: 50%; + left: 0; + right: 0; + padding: 0 2rem; + line-height: 1.5rem; + text-align: center; +} + +._error-title { + margin: -5.5rem 0 1rem; + line-height: 2rem; + font-size: 1.5rem; +} + +._error-text { + margin: 0 0 1rem; + color: $textColorLight; +} + +._error-links { + font-size: 1rem; + font-weight: bold; +} + +._error-link { padding: 0 .5rem; } + +// +// Heading +// + +._lined-heading, +%lined-heading { + white-space: nowrap; + overflow: hidden; + word-wrap: normal; + overflow-wrap: normal; + + &:after { + content: ''; + display: inline-block; + vertical-align: middle; + width: 100%; + height: 1px; + line-height: 0; + margin-left: 1rem; + background: $boxBorderLight; + } +} + +// +// Table of contents +// + +._toc { + float: right; + max-width: 15em; + margin: .25rem 0 1.5rem 1.5rem; + padding: .625rem 1rem; + @extend %box; + + + h1, + ._lined-heading { margin-top: 0; } +} + +._toc-title { + margin: 0 0 .5rem; + font-size: inherit; + font-weight: bold; +} + +._toc-list { + margin: 0; + padding: 0 1em 0 0; + list-style: none; +} + +._toc-link { @extend %internal-link; } + +// +// Static page +// + +._static { + padding-bottom: 2em; + + > ._lined-heading:first-child { margin-top: 0; } +} + +// +// Credits table +// + +._credits { + width: 100%; + + td:first-child, td:last-child { white-space: nowrap; } +} + +// +// Doc table +// + +._docs { + width: 100%; + margin-top: .75rem; + line-height: 1.5rem; + + th, td { + width: 1%; + white-space: nowrap; + + &:first-child { width: auto; } + &:last-child { width: 12rem; } + } + + td > a { cursor: pointer; } +} + +._docs-name:before { + float: left; + margin: .25rem .5rem .25rem 0; + @extend %icon; +} + +._docs-size { text-align: right; } + +._docs-tools { + overflow: hidden; + line-height: 1.5rem; +} + +._docs-links { + float: right; + padding: .375rem .125rem; + @extend %box; +} + +._docs-link { + display: none; + vertical-align: top; + padding: 0 .75rem; + cursor: pointer; + + &._show { display: inline-block; } + &._show ~ &._show { border-left: 1px solid $boxBorder; } +} + +._docs-label { + display: block; + overflow: hidden; + margin: 1px 0; + padding: .375rem .5rem; + + > input { + display: inline-block; + vertical-align: top; + margin: .25rem; + width: 1rem; + height: 1rem; + } +} + +// +// News +// + +._content { + ._news-row { + position: relative; + padding-left: 10em; + font-size: .8125rem; + color: $textColorLight; + + + ._news-row { margin-top: 1em; } + } + + ._news-title { + display: block; + font-size: .875rem; + color: $textColor; + } + + ._news-date { + position: absolute; + top: 0; + left: 0; + font-size: .875rem; + } +} + +// +// Keyboard shortcuts +// + +._shortcuts-title { + width: 16rem; + max-width: 40%; + margin: 2rem 0 1rem; + font-size: 1rem; + text-align: right; +} + +._shortcuts-dl { margin: 1rem 0; } + +._shortcuts-dt { + float: left; + clear: left; + margin: 0 0 .75rem; + width: 16rem; + max-width: 40%; + font-weight: normal; + text-align: right; +} + +._shortcuts-dd { + display: block; + margin: 0 0 .75rem; + padding: 1px 0 1px .75rem; + overflow: hidden; +} + +._shortcut-code { + display: inline-block; + vertical-align: top; + padding: 0 .5em; + @extend %label; +} + +// +// Abbreviations +// + +._abbreviations td { @extend %code; } + +// +// Utilities +// + +._note { @extend %note; } +._note-green { @extend %note-green; } +._label { @extend %label; } +._highlight { background: $highlightBackground !important; } + +._github-btn { + display: inline-block; + vertical-align: text-top; + margin-left: .25rem; +} + +._logo-thx { + position: relative; + display: inline-block; + vertical-align: top; + height: 1.5rem; + overflow: hidden; + text-indent: -20rem; + background-position: center center; + background-repeat: no-repeat; +} + +._logo-info { + top: auto; + bottom: 100%; + right: 0; + max-width: 18.25rem; + margin-bottom: .75rem; + padding: .5rem .75rem; + line-height: 1.375rem; + text-align: left; + pointer-events: none; + @extend %notif; + + :hover > & { opacity: 1; } +} + +._shopify-logo { + width: 5.5rem; + background-image: image-url('shopify.png'); + background-size: 5.5rem 1.5rem; + + @media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + background-image: image-url('shopify@2x.png'); + } +} + +._splash-sponsor > ._shopify-logo { + background-image: image-url('shopify-bw.png'); + + @if $style == 'dark' { + filter: invert(100%); + -webkit-filter: invert(100%); + } + + @media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + background-image: image-url('shopify-bw@2x.png'); + } +} + +._jetbrains-logo { + top: 1px; + width: 5rem; + background-image: image-url('jetbrains.png'); + background-size: 5rem 1.5rem; + + @media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + background-image: image-url('jetbrains@2x.png'); + } +} + +._splash-sponsor > ._jetbrains-logo { + background-image: image-url('jetbrains-bw.png'); + + @if $style == 'dark' { + filter: invert(100%); + -webkit-filter: invert(100%); + } + + @media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + background-image: image-url('jetbrains-bw@2x.png'); + } +} + +._code-school-logo { + width: 7rem; + background-image: image-url('code-school.png'); + background-size: 7rem 1.25rem; + + @media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + background-image: image-url('code-school@2x.png'); + } +} + +._splash-sponsor > ._code-school-logo { + background-image: image-url('code-school-bw.png'); + + @if $style == 'dark' { + filter: invert(100%); + -webkit-filter: invert(100%); + } + + @media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + background-image: image-url('code-school-bw@2x.png'); + } +} diff --git a/app/scss/components/_fail.scss b/app/scss/components/_fail.scss new file mode 100644 index 0000000..2dcc66b --- /dev/null +++ b/app/scss/components/_fail.scss @@ -0,0 +1,36 @@ +._fail { + display: block; + position: relative; + top: 1.5rem; + width: 24rem; + max-width: 90%; + margin: 0 auto; + padding: 1rem 1.5rem; + background: #eaefef; + border-radius: 5px; + @extend %border-box; + + &:after { // margin + content: ''; + position: relative; + top: 3rem; + float: left; + width: 1px; + height: 1px; + } +} + +._fail-title { + margin: 0 0 1rem; + font-size: 1rem; + font-weight: bold; +} + +._fail-text, ._fail-list { + margin: 0 0 1rem; + font-size: .875rem; +} + +._fail-text:last-child { margin: 0; } + +._fail-link { float: right; } diff --git a/app/scss/components/_header.scss b/app/scss/components/_header.scss new file mode 100644 index 0000000..8aca9dd --- /dev/null +++ b/app/scss/components/_header.scss @@ -0,0 +1,160 @@ +// +// Header +// + +._header { + position: absolute; + z-index: $headerZ; + top: 0; + left: 0; + right: 0; + height: $headerHeight; + line-height: $headerHeight; + background: $headerBackground; + border-bottom: 1px solid $headerBorder; + @extend %user-select-none; + + a:focus { outline: 0; } +} + +// +// Navigation menu +// + +._nav { + float: right; + margin-right: .5rem; + font-size: .875rem; + color: $textColor; +} + +._nav-link, +._nav-link:hover { + position: relative; + float: left; + padding: 0 1.25rem; + color: inherit; + text-decoration: none; + + @media #{$mediumScreen} { padding: 0 .75rem; } +} + +._nav-link { + &:before, &:after { + position: absolute; + left: 50%; + bottom: 0; + width: 0; + height: 0; + margin-left: -.375rem; + border: .375rem solid transparent; + border-bottom-color: darken($headerBorder, 2%); + } + + &:after { + bottom: -1px; + border-bottom-color: $contentBackground; + } +} + +._nav-current { + &:before, &:after { content: ''; } +} + +// +// Logo +// + +._logo { + position: relative; + float: left; + height: $headerHeight; + margin: 0; + line-height: inherit; + font-size: inherit; + cursor: default; + + > ._nav-link { + float: none; + margin-left: .75rem; + padding: 0 .25rem; + } +} + +// +// Search form +// + +._search { + position: relative; + float: left; + width: $sidebarWidth; + height: 100%; + padding: .5rem 0 .5rem .5rem; + @extend %border-box; + + @media #{$mediumScreen} { width: $sidebarMediumWidth; } + + &:before { + position: absolute; + top: 1rem; + left: 1rem; + opacity: .4; + @if $style == 'dark' { + @extend %icon, %icon-search-white; + } @else { + @extend %icon, %icon-search; + } + } +} + +._search-input { + display: block; + width: 100%; + height: 100%; + padding: 0 .75rem 1px 1.75rem; + font-size: .875rem; + background: $contentBackground; + border: 1px solid; + border-color: darken($headerBorder, 2%); + border-radius: 3px; + + &:focus { + outline: 0; + @if $inputFocusBorder { + border-color: $inputFocusBorder; + box-shadow: 0 0 1px $inputFocusBorder; + } + } +} + +._search-clear { + display: none; + position: absolute; + top: .5em; + right: 0; + padding: .5em; + cursor: pointer; + opacity: .3; + + &:hover { opacity: .5; } + @if $style == 'dark' { + &:before { @extend %icon, %icon-close-white; } + } @else { + &:before { @extend %icon, %icon-clear; } + } + ._search-active > & { display: block; } +} + +._search-tag { + display: none; + position: absolute; + top: .875rem; + left: .875rem; + padding: 0 .5rem; + line-height: 1.25rem; + font-size: .875rem; + color: $textColorLight; + background: darken($headerBackground, 5%); + border-radius: 2px; +} diff --git a/app/scss/components/_mobile.scss b/app/scss/components/_mobile.scss new file mode 100644 index 0000000..0724d39 --- /dev/null +++ b/app/scss/components/_mobile.scss @@ -0,0 +1,213 @@ +// +// Mobile overrides +// + +._mobile { + font-size: 100%; + + // Layout + + body { -ms-overflow-style: -ms-autohiding-scrollbar; } + + ._app, ._container, ._content { overflow: visible; } + + ._container { + margin: 0; + border: 0; + } + + ._content { + position: static; + height: auto; + margin: 0; + padding: .75rem 1rem 2.5rem; + } + + ._booting:before, ._content-loading:before { font-size: 3rem; } + + // Header + + ._header { position: fixed; } + + ._logo, ._nav { display: none; } + ._home-link, ._menu-link { display: block; } + + ._search { + float: none; + width: auto; + overflow: hidden; + padding-left: 2px; + padding-right: 2px; + border-right: 0; + + &:before { left: .5rem; } + } + + ._search-tag { left: .325rem; } + + // Sidebar + + ._sidebar { + position: static; + min-height: 100%; + overflow: visible; + padding-bottom: 2rem; + + > ._list { padding-bottom: 0; } + } + + ._list, ._sidebar-footer { width: 100%; } + + ._list-item { + white-space: normal; + word-wrap: break-word; + overflow-wrap: break-word; + box-shadow: none; + } + + ._list-result { + padding-left: 2.375rem; + + &:before { + position: absolute; + top: .25rem; + left: .75rem; + } + } + + ._list-link { display: none; } + + ._sidebar-footer { + position: static; + margin-top: .5rem; + font-weight: bold; + + &:before { content: none; } + } + + ._sidebar-footer-save { + margin-top: 1rem; + box-shadow: 0 1px $noteGreenBorder, 0 -1px $noteGreenBorder; + } + + // Splash + + ._splash-sponsors { margin-top: 1rem; } + + ._splash-sponsor { + position: static; + + ._logo-info { + left: 1rem; + right: 1rem; + width: auto; + max-width: none; + margin: 0; + } + } + + // Notice + + ._notice { + position: fixed; + left: 0; + padding: 0 .5rem; + + ~ ._sidebar { padding-bottom: 4rem; } + } + + ._notice-text { font-size: .75em; } + + // Notification + + ._notif { position: fixed; } + + // Table of contents + + ._toc { + float: none; + max-width: none; + margin-left: 0; + } +} + +// +// Fix viewport on Windows Phone +// + +@-ms-viewport { width: device-width; } +@media (orientation: portrait) and (min-device-width: 720px) and (max-device-width: 768px), + (orientation: landscape) and (device-width: 1280px) and (max-device-height: 768px) { + @-ms-viewport { width: 50%; } +} + +// +// Header buttons +// + +%mobile-link { + display: none; + position: relative; + float: left; + width: 2.5rem; + height: 100%; + + &:before { + position: absolute; + top: 50%; + left: 50%; + margin: -.5rem 0 0 -.5rem; + @extend %icon; + } +} + +._home-link { + @extend %mobile-link; + + &:before { @extend %icon-home; } +} + +._menu-link { + float: right; + @extend %mobile-link; + + &:before { @extend %icon-menu; } +} + +// +// Navigation menu +// + +._mobile-nav { + margin: .25rem 0 1.25rem; + padding: 0; + line-height: 2.8; + overflow: hidden; + @extend %box; +} + +._mobile-nav-link { + float: left; + width: 25%; + text-align: center; + font-weight: bold; +} + +// +// Intro +// + +._mobile-intro { + > ._intro-list { padding-left: 1.5rem; } + + > ._intro-hide, + > ._intro-sponsors { + position: static; + float: none; + display: block; + margin-top: .75rem; + text-align: center; + } + + ._intro-sponsor { margin: .5em .75em; } +} diff --git a/app/scss/components/_notice.scss b/app/scss/components/_notice.scss new file mode 100644 index 0000000..74749db --- /dev/null +++ b/app/scss/components/_notice.scss @@ -0,0 +1,35 @@ +._notice { + position: absolute; + z-index: $noticeZ; + bottom: 0; + left: $sidebarWidth; + right: 0; + height: 2.5rem; + padding: 0 1.25rem; + background: $noticeBackground; + box-shadow: inset 0 1px $noticeBorder; + + @media #{$mediumScreen} { left: $sidebarMediumWidth; } + + &:not(._top) ~ ._container { padding-bottom: 2.5rem; } + + &._top { + bottom: auto; + top: $headerHeight; + margin-top: 1px; + box-shadow: inset 0 -1px $noticeBorder; + + ~ ._container { padding-top: 2.5rem; } + } +} + +._notice-text { + display: table-cell; + vertical-align: middle; + margin: 0; + height: 2.5rem; + line-height: 1rem; + font-size: .875rem; +} + +._notice-link { cursor: pointer; } diff --git a/app/scss/components/_notif.scss b/app/scss/components/_notif.scss new file mode 100644 index 0000000..2bfa10e --- /dev/null +++ b/app/scss/components/_notif.scss @@ -0,0 +1,106 @@ +._notif, %notif { + position: absolute; + z-index: 2; + top: 1rem; + right: 1rem; + width: 25rem; + max-width: 90%; + padding: .625rem 1rem; + font-size: .75rem; + color: $notifColor; + background: $notifBackground; + border-radius: .25rem; + transition: opacity .2s; + opacity: 0; + cursor: default; + @extend %border-box, %user-select-none; + + &._in { opacity: 1; } +} + +._notif-title { + margin: 0 0 .375rem; + line-height: 1rem; + font-size: inherit; +} + +._notif-text { margin-bottom: 0; } +._notif-text + ._notif-text { margin-top: .25rem; } + +._notif-info { + float: right; + color: $textColorLight; +} + +._notif-link, +._notif-link:hover { + color: inherit; + text-decoration: underline; +} + +._notif-close { + position: absolute; + top: 0; + right: 0; + padding: .625rem; + opacity: .9; + cursor: pointer; + + &:before { @extend %icon, %icon-close-white; } +} + +._notif-news { + width: 20rem; + max-height: 85%; + overflow-y: auto; + + > ._notif-title { + margin-bottom: .5rem; + text-align: center; + } + + > ._news-row { + line-height: 1.125rem; + font-size: .6875rem; + color: $notifColorLight; + margin-bottom: .25rem; + + + ._news-row { margin-top: .75rem; } + } + + ._news-title { + display: block; + margin-bottom: .25rem; + font-size: .75rem; + font-weight: normal; + color: white; + } + + ._news-date { + float: right; + margin-left: 1rem; + font-weight: bold; + } + + code { + display: inline-block; + vertical-align: baseline; + line-height: 0; + margin: 0 .25rem; + padding: 0; + color: inherit; + background: none; + border: 0; + } +} + +._notif-list { + margin: .5em 0; + padding-left: 1rem; +} + +._notif-tip { + color: $textColor; + background: rgba($tipBackground, .95); + border: 1px solid $tipBorder; +} diff --git a/app/scss/components/_page.scss b/app/scss/components/_page.scss new file mode 100644 index 0000000..93db11e --- /dev/null +++ b/app/scss/components/_page.scss @@ -0,0 +1,92 @@ +// +// Page +// + +._page { + position: relative; + min-height: calc(100% - 1.25rem); + + &._page-error { position: static; } + + > h1 { @extend ._lined-heading; } + > h1:first-child { margin-top: 0; } + + a[href^="http:"], a[href^="https:"] { @extend %external-link; } + + a:not([href]) { + color: inherit; + text-decoration: none; + } + + iframe { + display: block; + margin-bottom: 1em; + padding: 1px; + border: 1px dotted $boxBorder; + border-radius: 3px; + } +} + +// +// Links +// + +._links { + position: absolute; + top: 0; + right: 0; + margin: 0; + line-height: 2em; + text-align: right; + + + h1 { margin-top: 0; } + + @media (max-width: 1023px) { display: none; } +} + +._links-link { + display: inline-block; + vertical-align: top; + padding: 0 .5rem; + background: $contentBackground; + @extend %internal-link; + + & + & { margin-left: .75rem; } + &:first-child { padding-left: 1rem; } + &:last-child { padding-right: 0; } +} + +// +// Attribution box +// + +._attribution { + clear: both; + margin: 2rem 0 1.5rem; + font-size: .75rem; + color: $textColorLight; + text-align: center; + -webkit-font-smoothing: subpixel-antialiased; + + & + & { margin-top: 1.5rem; } + & + & > ._attribution-link { display: none; } +} + +._attribution-p { + display: inline-block; + margin: 0; + padding: .25rem .75rem; + background: $labelBackground; + border-radius: 3px; +} + +._attribution-link { @extend %internal-link; } + +// +// Entry list +// + +._entry-list { + padding-left: 1em; + list-style: none; +} diff --git a/app/scss/components/_path.scss b/app/scss/components/_path.scss new file mode 100644 index 0000000..f79eeb5 --- /dev/null +++ b/app/scss/components/_path.scss @@ -0,0 +1,48 @@ +._path { + position: absolute; + z-index: $noticeZ - 1; + bottom: 0; + left: $sidebarWidth; + right: 0; + height: 2rem; + line-height: 2rem; + padding: 0 .375rem; + font-size: .875rem; + background: $pathBackground; + box-shadow: inset 0 1px $pathBorder; + + @media #{$mediumScreen} { left: $sidebarMediumWidth; } + + ~ ._container { padding-bottom: 2rem; } + a:focus { outline: 0; } +} + +._path-item { + position: relative; + display: inline-block; + vertical-align: top; + margin: 0 1rem 0 0; + padding: 0 .375rem; + color: $textColor; + + &:first-child:before { + content: ''; + float: left; + width: 1rem; + height: 1rem; + margin: .5rem .375rem 0 0; + @extend %icon; + } + + & + &:after { + content: ''; + position: absolute; + top: 50%; + right: 100%; + width: 1rem; + height: 1rem; + margin: -.5rem 0 0 0; + pointer-events: none; + @extend %icon, %icon-path; + } +} diff --git a/app/scss/components/_prism.scss b/app/scss/components/_prism.scss new file mode 100644 index 0000000..36926c5 --- /dev/null +++ b/app/scss/components/_prism.scss @@ -0,0 +1,82 @@ +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata, +.token.punctuation { + color: $textColorLight; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + @if $style == 'dark' { + color: #eb8160; + } @else { + color: #905; + } +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + @if $style == 'dark' { + color: #ddcf88; + } @else { + color: #5e8e01; + } +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + @if $style == 'dark' { + color: #b1c676; + } @else { + color: #a67f59; + } +} + +.token.atrule, +.token.attr-value, +.token.keyword { + @if $style == 'dark' { + color: #91b3ed; + } @else { + color: #0070a3; + } +} + +.token.function { + @if $style == 'dark' { + color: #c79e6b; + } @else { + color: #dd4a68; + } +} + +.token.regex, +.token.important, +.token.variable { + @if $style == 'dark' { + color: #e9c062; + } @else { + color: #e90; + } +} + +.token.important { + font-weight: bold; +} diff --git a/app/scss/components/_sidebar.scss b/app/scss/components/_sidebar.scss new file mode 100644 index 0000000..4512362 --- /dev/null +++ b/app/scss/components/_sidebar.scss @@ -0,0 +1,452 @@ +// +// Sidebar +// + +._sidebar { + position: absolute; + z-index: $sidebarZ; + top: $headerHeight; + bottom: 0; + left: 0; + margin-top: 1px; + overflow-x: hidden; + overflow-y: scroll; + background: $sidebarBackground; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: none; // IE 10 doesn't support pointer-events + @extend %user-select-none; + + &::-webkit-scrollbar { -webkit-appearance: none; width: 10px; } + &::-webkit-scrollbar-button { display: none; } + &::-webkit-scrollbar-track { background: $contentBackground; } + &::-webkit-scrollbar-thumb { + min-height: 2rem; + background: $scrollbarColor; + background-clip: padding-box; + border: 3px solid $contentBackground; + border-radius: 5px; + + &:active { + background-color: $scrollbarColorHover; + border-width: 2px; + } + } + + a:focus { outline: 0; } +} + +._resizer { + position: absolute; + z-index: $sidebarZ + 1; + top: $headerHeight; + bottom: 0; + left: $sidebarWidth; + margin-left: -2px; + width: 3px; + cursor: col-resize; +} + +// +// List +// + +._list { + margin: 0; + padding: 0; + list-style: none; + width: $sidebarWidth; + box-shadow: inset -1px 0 $sidebarBorder; + @extend %border-box; + + @media #{$mediumScreen} { width: $sidebarMediumWidth; } + + ._sidebar > & { + min-height: 100%; + padding-bottom: 3.5rem; + } +} + +._list-title { + position: relative; + margin: .5rem 0 0; + padding-left: 2.25rem; + line-height: 2rem; + font-size: .75rem; + color: $textColorLight; + text-transform: uppercase; + cursor: default; +} + +._list-item { + display: block; + position: relative; + overflow: hidden; + padding: .25rem .75rem; + line-height: 1.5rem; + font-size: .875rem; + white-space: nowrap; + word-wrap: normal; + overflow-wrap: normal; + text-overflow: ellipsis; + cursor: default; + background: $sidebarBackground; + box-shadow: inset -1px 0 $sidebarBorder; + + &, &:hover { + color: inherit; + text-decoration: none; + } + + &.focus, + &.focus:hover, + &.active, + &.active:hover { + color: $focusText; + background: $focusBackground; + box-shadow: inset -1px 0 $focusBorder; + } + + &.active, + &.active:hover { + color: $selectionText; + background: $selectionBackground; + box-shadow: inset -1px 0 $selectionBorder; + } + + &:before { + float: left; + margin: .25rem .625rem 0 0; + @extend %icon; + } +} + +._list-count, ._list-enable { + float: right; + font-size: .75rem; + + .focus > &, + .active > & { + color: inherit; + } +} + +._list-count { + color: $textColorLighter; + pointer-events: none; + + ._list-disabled:hover > & { display: none; } +} + +._list-enable { + display: none; + color: $linkColor; + cursor: pointer; + + &:hover { text-decoration: underline; } + ._list-disabled:hover > & { display: block; } +} + +// +// List hierarchy +// + +._list-dir, +%_list-dir { + padding-left: 2.25rem; +} + +._list-disabled { + @extend %_list-dir; + + &, &:hover { color: $textColorLight; } + &:before { opacity: .7; } +} + +._list-arrow { + position: absolute; + top: 0; + left: .25rem; + padding: .5rem; + cursor: pointer; + opacity: .4; + + &:hover { opacity: .65; } + + &:before { + @if $style == 'dark' { + @extend %icon, %icon-dir-white; + } @else { + @extend %icon, %icon-dir; + } + + .open > &, .open-title > & { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + } + } +} + +._list-sub { + > ._list-item { padding-left: 2.75rem; } + > ._list-item:before { content: none; } + > ._list-dir { line-height: 1.375rem; } + + ._list-arrow { + left: 1rem; + padding: .4375rem; + } +} + +// +// List pagination +// + +._list-pagelink { + color: $linkColor; + cursor: pointer; + + &:hover { + color: $linkColorHover; + text-decoration: underline; + } +} + +// +// Search results +// + +._list-result.active { + padding-right: 1.75rem; + + > ._list-reveal { display: block; } +} + +._list-reveal { + display: none; + position: absolute; + top: 0; + bottom: 0; + right: 0; + width: 1.75rem; + cursor: pointer; + + &:before { + content: ''; + position: absolute; + bottom: 50%; + left: .5rem; + width: .75rem; + height: 1px; + background: rgba($selectionText, .9); + box-shadow: 0 -3px rgba($selectionText, .9), // top line + 0 3px rgba($selectionText, .9); // bottom line + } +} + +// +// List note +// + +._list-note { + padding: .5rem .75rem; + line-height: 1.25rem; + font-size: .8125rem; + color: $textColorLight; + + & + & { padding-top: 0; } +} + +._list-note-link { cursor: pointer; } + +// +// List hover clone +// + +._list-hover.clone { + position: fixed; + z-index: $hoverZ; + left: 0; + overflow: visible; + min-width: $sidebarWidth; + padding: .25rem .75rem; + pointer-events: none; + -webkit-font-smoothing: subpixel-antialiased; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + @extend %border-box; + + @media #{$mediumScreen} { min-width: $sidebarMediumWidth; } + + &:not(._list-result) { + padding-left: 2.75rem; + + &:before { content: none; } + } +} + +// +// List picker +// + +._list-checkbox { + position: absolute; + top: .5rem; + right: -1rem; + width: 1rem; + height: 1rem; + transition: .2s; +} + +._list-label { + cursor: pointer; + transition: .2s; + @extend %_list-dir; + + ._in > & { padding-left: .75rem; } + ._in > & > ._list-checkbox { right: .5rem } +} + +._list-label-off { + opacity: 0; + padding-left: .75rem; + + ._in > & { opacity: 1; } + > ._list-checkbox { right: .5rem; } +} + +._list-link { + display: block; + margin-top: .75rem; + font-size: .8125rem; + text-align: center; + @extend %external-link; + + &:after { visibility: hidden; } + &:hover:after { visibility: visible; } +} + +// +// Footer +// + +._sidebar-footer { + position: fixed; + bottom: 0; + left: 0; + width: $sidebarWidth; + background: $sidebarBackground; + box-shadow: inset -1px 0 $sidebarBorder; + + @media #{$mediumScreen} { width: $sidebarMediumWidth; } + + ._max-width & { + left: calc(50% - #{$maxWidth} / 2); + @media (max-width: #{$maxWidth}) { left: 0; } + } + + &:before { + content: ''; + position: absolute; + bottom: 100%; + left: 0; + right: 1px; + height: 1em; + background-image: -webkit-linear-gradient(top, rgba($sidebarBackground, 0), rgba($sidebarBackground, .95)); + background-image: linear-gradient(to bottom, rgba($sidebarBackground, 0), rgba($sidebarBackground, .95)); + pointer-events: none; + } +} + +._sidebar-footer-link { + position: relative; + display: block; + overflow: hidden; + height: 2.5rem; + line-height: 1rem; + padding: .75rem .25rem .75rem .75rem; + font-size: .875em; + cursor: pointer; + @extend %border-box; + + &, &:hover { + color: inherit; + text-decoration: none; + } + + &:before { + float: left; + margin-right: .625rem; + @extend %icon; + } +} + +._sidebar-footer-edit { + @if $style == 'dark' { + &:before { @extend %icon-settings-white; } + } @else { + &:before { @extend %icon-settings; } + } +} + +._sidebar-footer-light { + float: right; + width: 2rem; + padding: 0; + opacity: .65; + + &:before { + float: none; + position: absolute; + top: .75rem; + left: .25rem; + + @if $style == 'dark' { + @extend %icon-light-white; + } @else { + @extend %icon-light; + } + } +} + +._sidebar-footer-layout { + float: right; + width: 2rem; + padding: 0; + opacity: .65; + + &:before { + float: none; + position: absolute; + top: .75rem; + left: .375rem; + @if $style == 'dark' { + @extend %icon-expand-white; + } @else { + @extend %icon-expand; + } + + ._max-width & { + @if $style == 'dark' { + @extend %icon-contract-white; + } @else { + @extend %icon-contract; + } + } + } + + @media (max-width: #{$maxWidth + .1rem}) { display: none; } +} + +._sidebar-footer-save { + margin-right: 1px; + font-weight: bold; + background: $noteGreenBackground; + box-shadow: inset 0 1px $noteGreenBorder, + 1px 0 $noteGreenBorder; + + @if $style == 'dark' { + &:before { @extend %icon-check-white; } + } @else { + &:before { @extend %icon-check; } + } +} diff --git a/app/scss/global/_base.scss b/app/scss/global/_base.scss new file mode 100644 index 0000000..3a20b84 --- /dev/null +++ b/app/scss/global/_base.scss @@ -0,0 +1,184 @@ +html { + height: 100%; + font-size: 100%; + background: $documentBackground; + + @media #{$mediumScreen} { font-size: 93.75%; } +} + +body { + height: 100%; + margin: 0; + overflow: auto; + font: normal 1em/1.7 $baseFont; + color: $textColor; + word-wrap: break-word; + overflow-wrap: break-word; + -webkit-tap-highlight-color: rgba(black, 0); + -webkit-touch-callout: none; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a { + color: $linkColor; + text-decoration: none; + + &:hover { + color: $linkColorHover; + text-decoration: underline; + } +} + +img { + max-width: 100%; + height: auto; + border: 0; +} + +h1, h2, h3, h4, h5, h6 { + margin: 1.5em 0 1em; + line-height: 1.3; + font-weight: bold; +} + +h1 { font-size: 1.5em; } +h2 { font-size: 1.375em; } +h3 { font-size: 1.25em; } +h4 { font-size: 1.125em; } +h5, h6 { font-size: 1em; } + +p { margin: 0 0 1em; } +p:last-child { margin-bottom: 0; } + +b, strong { font-weight: bold; } + +small { font-size: .9em; } + +ul, ol { + margin: 1.5em 0; + padding: 0 0 0 2em; + list-style: disc outside; +} + +ul ul { list-style-type: circle; } +ol { list-style-type: decimal; } +ol ol { list-style-type: lower-alpha; } +ol ol ol { list-style-type: lower-roman; } + +li + li { margin-top: .25em; } +li > ul, li > ol, dd > ul, dd > ol { margin: .5em 0; } +li > p { margin-bottom: .25em; } + +dl { margin: 1.5em 0; } +dt { font-weight: bold; } +dd { + margin: .375em; + padding-left: 1em; + + + dt { margin-top: 1em; } +} + +dfn, var { font-style: normal; } + +abbr, acronym, dfn { + cursor: help; + border-bottom: 1px dotted $textColor; +} + +pre, code, samp, %pre, %code { + font-family: $monoFont; + font-weight: normal; + font-style: normal; + font-size: .9em; + color: $textColor; + white-space: pre-wrap; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} + +pre, %pre { + margin: 1.5em 0; + padding: .375rem .75rem; + line-height: 1.5; + overflow: auto; + @extend %box; +} + +a > code { color: inherit; } + +table { + margin: 1.5em 0; + background: none; + border: 1px solid $boxBorder; + border-collapse: separate; + border-spacing: 0; + border-radius: 3px; +} + +th, td { + vertical-align: top; + padding: .3em .7em; + padding-bottom: -webkit-calc(.3em + 1px); + padding-bottom: calc(.3em + 1px); + text-align: left; +} + +th { + border: 0; + border-bottom: 1px solid $boxBorder; + border-radius: 0; + @extend %heading-box; + + &:empty { background: none; } + + + th, + td { border-left: 1px solid $boxBorder; } + + tr:first-child > &:first-child { border-top-left-radius: 3px; } + tr:first-child > &:last-child { border-top-right-radius: 3px; } + tr:last-child > &:first-child { border-bottom-left-radius: 3px; } + thead > tr:last-child > &:first-child { border-bottom-left-radius: 0; } + tr:last-child > & { border-bottom-width: 0; } + thead > tr:last-child > & { border-bottom-width: 1px; } +} + +td { + border-bottom: 1px solid $boxBorderLight; + + + td { border-left: 1px solid $boxBorderLight; } + tr:last-child > & { border-bottom: 0; } + + > pre:only-child, > p:only-child, > ul:only-child, > ol:only-child { + margin-top: 0; + margin-bottom: 0; + } + > pre:last-child, > p:last-child, > ul:last-child, > ol:last-child { margin-bottom: 0; } +} + +input { + margin: 0; + font-family: inherit; + font-size: 100%; + color: $textColor; + line-height: normal; + @extend %border-box; +} + +input[type="search"] { -webkit-appearance: none; } + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-ms-clear { display: none; } + +::-moz-focus-inner { + padding: 0 !important; + border: 0 !important; +} + +::-webkit-input-placeholder { color: $textColorLighter; } +::-moz-placeholder { color: $textColorLighter; opacity: 1; } +:-ms-input-placeholder { color: $textColorLighter; } diff --git a/app/scss/global/_classes.scss b/app/scss/global/_classes.scss new file mode 100644 index 0000000..33d209f --- /dev/null +++ b/app/scss/global/_classes.scss @@ -0,0 +1,112 @@ +// +// Utilities +// + +%border-box { + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +%user-select-none { + -webkit-user-select: none; + -moz-user-select: -moz-none; + -ms-user-select: none; + user-select: none; +} + +// +// Boxes +// + +%box { + background: $boxBackground; + border: 1px solid $boxBorder; + border-radius: 3px; +} + +%heading-box { + background: $boxHeaderBackground; + border: 1px solid $boxBorder; + border-radius: 3px; +} + +%block-heading { + line-height: 1.25rem; + margin: 2em 0 1em; + padding: .5em .75em; + font-size: 1rem; + overflow: hidden; + @extend %heading-box; +} + +// +// Notes +// + +%note { + margin: 1.5rem 0; + padding: .5rem .875rem; + background: $noteBackground; + border: 1px solid $noteBorder; + border-radius: 3px; +} + +%label { + margin: 0 1px; + padding: 1px 4px 2px; + background: $labelBackground; + border-radius: 3px; +} + +%block-label { + display: block; + line-height: 1.375rem; + margin: 2em 0 1em; + padding-left: .5em; + padding-right: .5em; + font-size: inherit; + border: 1px solid $boxBorder; + border-radius: 2px; + @extend %label; +} + +%note-green, %label-green { + background: $noteGreenBackground; + border-color: $noteGreenBorder; +} + +%note-blue, %label-blue { + background: $noteBlueBackground; + border-color: $noteBlueBorder; +} + +%note-orange, %label-orange { + background: $noteOrangeBackground; + border-color: $noteOrangeBorder; +} + +%note-red, %label-red { + background: $noteRedBackground; + border-color: $noteRedBorder; +} + +// +// External links +// + +%external-link { + &:after { + display: inline-block; + width: .5rem; + height: .4375rem; + margin: .125rem 0 0 .0625rem; + vertical-align: top; + @if $style == 'dark' { + @extend %icon, %icon-link-white; + } @else { + @extend %icon, %icon-link; + } + } +} + +%internal-link:after { content: none !important; } diff --git a/app/scss/global/_icons.scss b/app/scss/global/_icons.scss new file mode 100644 index 0000000..f1cf528 --- /dev/null +++ b/app/scss/global/_icons.scss @@ -0,0 +1,114 @@ +%icon { + content: ''; + display: block; + width: 1rem; + height: 1rem; + background-image: image-url('icons.png'); + background-size: 10rem 10rem; +} + +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + %icon { background-image: image-url('icons@2x.png'); } +} + +%darkIconFix { + @if $style == 'dark' { + filter: invert(100%) grayscale(100%); + -webkit-filter: invert(100%) grayscale(100%); + } +} + +%icon-dir { background-position: 0 0; } +%icon-search { background-position: -1rem 0; } +%icon-link { background-position: -2.25rem -.25rem; } +%icon-clear { background-position: -3rem 0; } +%icon-close-white { background-position: -4rem 0; } +%icon-settings { background-position: -5rem 0; } +%icon-check { background-position: -6rem 0; } +._icon-http:before { background-position: -7rem 0; @extend %darkIconFix !optional; } +._icon-jquery:before { background-position: -8rem 0; @extend %darkIconFix !optional; } +._icon-underscore:before { background-position: -9rem 0; @extend %darkIconFix !optional; } +._icon-html:before { background-position: 0 -1rem; } +._icon-css:before { background-position: -1rem -1rem; } +._icon-dom:before { background-position: -2rem -1rem; } +._icon-dom_events:before { background-position: -3rem -1rem; } +._icon-javascript:before { background-position: -4rem -1rem; } +._icon-backbone:before { background-position: -5rem -1rem; @extend %darkIconFix !optional; } +._icon-node:before { background-position: -6rem -1rem; } +._icon-sass:before { background-position: -7rem -1rem; } +._icon-less:before { background-position: -8rem -1rem; } +._icon-angular:before { background-position: -9rem -1rem; } +._icon-coffeescript:before { background-position: 0 -2rem; @extend %darkIconFix !optional; } +._icon-ember:before { background-position: -1rem -2rem; } +%icon-menu { background-position: -2rem -2rem; } +%icon-home { background-position: -3rem -2rem; } +._icon-jqueryui:before { background-position: -4rem -2rem; } +._icon-jquerymobile:before { background-position: -5rem -2rem; } +._icon-lodash:before { background-position: -6rem -2rem; } +._icon-php:before { background-position: -7rem -2rem; } +._icon-ruby:before, +._icon-minitest:before { background-position: -8rem -2rem; } +._icon-rails:before { background-position: -9rem -2rem; } +._icon-python:before, +._icon-python2:before { background-position: 0 -3rem; } +._icon-git:before { background-position: -1rem -3rem; } +._icon-redis:before { background-position: -2rem -3rem; } +._icon-postgresql:before { background-position: -3rem -3rem; } +._icon-d3:before { background-position: -4rem -3rem; } +._icon-knockout:before { background-position: -5rem -3rem; } +._icon-moment:before { background-position: -6rem -3rem; @extend %darkIconFix !optional; } +._icon-c:before { background-position: -7rem -3rem; } +%icon-path { background-position: -8rem -3rem; } +._icon-yii:before, +._icon-yii1:before { background-position: -9rem -3rem; } +._icon-cpp:before { background-position: 0 -4rem; } +._icon-go:before { background-position: -1rem -4rem; } +._icon-express:before { background-position: -2rem -4rem; } +._icon-grunt:before { background-position: -3rem -4rem; } +._icon-rust:before { background-position: -4rem -4rem; @extend %darkIconFix !optional; } +._icon-laravel:before { background-position: -5rem -4rem; } +._icon-haskell:before { background-position: -6rem -4rem; } +._icon-requirejs:before { background-position: -7rem -4rem; } +._icon-chai:before { background-position: -8rem -4rem; } +._icon-sinon:before { background-position: -9rem -4rem; @extend %darkIconFix !optional; } +._icon-cordova:before { background-position: 0 -5rem; } +._icon-markdown:before { background-position: -1rem -5rem; @extend %darkIconFix !optional; } +._icon-django:before { background-position: -2rem -5rem; } +._icon-xpath:before { background-position: -3rem -5rem; } +._icon-nginx:before { background-position: -4rem -5rem; } +._icon-svg:before { background-position: -5rem -5rem; } +._icon-marionette:before { background-position: -6rem -5rem; } +._icon-mongoose:before { background-position: -7rem -5rem; } +._icon-phpunit:before { background-position: -8rem -5rem; } +._icon-nokogiri:before { background-position: -9rem -5rem; @extend %darkIconFix !optional; } +._icon-rethinkdb:before { background-position: 0 -6rem; } +._icon-react:before { background-position: -1rem -6rem; } +._icon-socketio:before { background-position: -2rem -6rem; } +._icon-modernizr:before { background-position: -3rem -6rem; } +._icon-bower:before { background-position: -4rem -6rem; } +%icon-search-white { background-position: -5rem -6rem; } +%icon-dir-white { background-position: -6rem -6rem; } +%icon-link-white { background-position: -7.25rem -6.25rem; } +%icon-settings-white { background-position: -8rem -6rem; } +%icon-check-white { background-position: -9rem -6rem; } +%icon-light { background-position: 0 -7rem; } +%icon-light-white { background-position: -1rem -7rem; } +._icon-iojs:before { background-position: -2rem -7rem; @extend %darkIconFix !optional; } +._icon-lua:before { background-position: -3rem -7rem; @extend %darkIconFix !optional; } +._icon-clojure:before { background-position: -4rem -7rem; } +._icon-symfony:before { background-position: -5rem -7rem; } +._icon-mocha:before { background-position: -6rem -7rem; } +._icon-meteor:before { background-position: -7rem -7rem; @extend %darkIconFix !optional; } +._icon-npm:before { background-position: -8rem -7rem; } +._icon-apache_http_server:before { background-position: -9rem -7rem; } +._icon-drupal:before { background-position: 0 -8rem; } +._icon-webpack:before { background-position: -1rem -8rem; @extend %darkIconFix !optional; } +._icon-phaser:before { background-position: -2rem -8rem; } +._icon-vue:before { background-position: -3rem -8rem; } +._icon-opentsdb:before { background-position: -4rem -8rem; } +._icon-q:before { background-position: -5rem -8rem; } +%icon-expand { background-position: -6rem -8rem; } +%icon-contract { background-position: -7rem -8rem; } +%icon-expand-white { background-position: -8rem -8rem; } +%icon-contract-white { background-position: -9rem -8rem; } +._icon-react_native:before { background-position: 0 -9rem; } diff --git a/app/scss/global/_variables.scss b/app/scss/global/_variables.scss new file mode 100644 index 0000000..c3677c4 --- /dev/null +++ b/app/scss/global/_variables.scss @@ -0,0 +1,87 @@ +$baseFont: 'Open Sans', Helvetica, Arial, sans-serif; +$monoFont: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + +$style: 'light'; + +$maxWidth: 80rem; +$headerHeight: 3rem; +$sidebarWidth: 18rem; +$sidebarMediumWidth: 16rem; + +$contentBackground: #fff; +$documentBackground: #fafafa; + +$textColor: #333; +$textColorLight: #666; +$textColorLighter: #999; + +$inputFocusBorder: #35b5f4; + +$focusBackground: #e5e5e5; +$focusBorder: #d4d4d4; +$focusText: #000; + +$loadingText: #ccc; +$splashText: #bbb; +$promoText: #bbb; + +$selectionBackground: #398df0; +$selectionBorder: #196fc2; +$selectionText: #fff; + +$highlightBackground: #fffdcd; + +$linkColor: #0082c6; +$linkColorHover: #0072c5; + +$headerBackground: #f0f0f0; +$headerBorder: #d9d9d9; + +$sidebarBackground: #f9f9f9; +$sidebarBorder: #e3e3e3; + +$scrollbarColor: #d2d2d2; +$scrollbarColorHover: #aaa; + +$pathBackground: $sidebarBackground; +$pathBorder: $sidebarBorder; + +$noticeBackground: #faf9e2; +$noticeBorder: #e2e2c1; + +$boxBackground: #fafafa; +$boxBorder: #d8d8d8; +$boxBorderLight: #e5e5e5; +$boxHeaderBackground: #f5f5f5; + +$noteBackground: #f8f8dd; +$noteBorder: #d3d952; + +$noteGreenBackground: #e7f8e1; +$noteGreenBorder: #89da70; + +$noteBlueBackground: #d4f3fd; +$noteBlueBorder: #94bbeb; + +$noteOrangeBackground: #fbe6d1; +$noteOrangeBorder: #ec8b01; + +$noteRedBackground: #fed5d3; +$noteRedBorder: #dc7874; + +$labelBackground: #f4f4f4; + +$notifBackground: rgba(#333, .85); +$notifColor: #fff; +$notifColorLight: #bbb; + +$tipBackground: #fffdcd; +$tipBorder: #e7dca9; + +$mediumScreen: '(max-width: 800px)'; + +$contentZ: 1; +$sidebarZ: 2; +$headerZ: 3; +$noticeZ: 4; +$hoverZ: 5; diff --git a/app/scss/global/variables-dark.scss b/app/scss/global/variables-dark.scss new file mode 100644 index 0000000..de68053 --- /dev/null +++ b/app/scss/global/variables-dark.scss @@ -0,0 +1,87 @@ +$baseFont: 'Open Sans', Helvetica, Arial, sans-serif; +$monoFont: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + +$style: 'dark'; + +$maxWidth: 80rem; +$headerHeight: 3rem; +$sidebarWidth: 18rem; +$sidebarMediumWidth: 16rem; + +$contentBackground: #303030; +$documentBackground: #404040; + +$textColor: #c9c9c9; +$textColorLight: #858585; +$textColorLighter: #706f6f; + +$inputFocusBorder: #444; + +$focusBackground: #3d3d3e; +$focusBorder: #3d3d3e; +$focusText: #f7f2f2; + +$loadingText: #666; +$splashText: #666; +$promoText: #666; + +$selectionBackground: #346fce; +$selectionBorder: #346fce; +$selectionText: #fff; + +$highlightBackground: #3d4449; + +$linkColor: #fff; +$linkColorHover: #fff; + +$headerBackground: #1c1c1c; +$headerBorder: #1c1c1c; + +$sidebarBackground: #262626; +$sidebarBorder: #262626; + +$scrollbarColor: #515151; +$scrollbarColorHover: #888; + +$pathBackground: $headerBackground; +$pathBorder: $headerBorder; + +$noticeBackground: #1c1c1c; +$noticeBorder: #1c1c1c; + +$boxBackground: #262626; +$boxBorder: #000; +$boxBorderLight: #000; +$boxHeaderBackground: #262626; + +$noteBackground: #3a4031; +$noteBorder: #000; + +$noteGreenBackground: #223e23; +$noteGreenBorder: #000; + +$noteBlueBackground: #223546; +$noteBlueBorder: #000; + +$noteOrangeBackground: #523121; +$noteOrangeBorder: #000; + +$noteRedBackground: #5b1f22; +$noteRedBorder: #000; + +$labelBackground: #3c3c3e; + +$notifBackground: rgba(#000, .85); +$notifColor: #fff; +$notifColorLight: #bbb; + +$tipBackground: #3d4449; +$tipBorder: #566166; + +$mediumScreen: '(max-width: 800px)'; + +$contentZ: 1; +$sidebarZ: 2; +$headerZ: 3; +$noticeZ: 4; +$hoverZ: 5; diff --git a/app/scss/pages/_angular.scss b/app/scss/pages/_angular.scss new file mode 100644 index 0000000..c290d67 --- /dev/null +++ b/app/scss/pages/_angular.scss @@ -0,0 +1,54 @@ +._angular { + h2 { @extend %block-heading; } + + // + // Index + // + + .nav-index-section { + margin: 1.5em 0 1em -2em; + list-style: none; + font-weight: bold; + text-transform: capitalize; + } + + // + // Other + // + + h3, h4 { font-size: 1rem; } + + .alert { @extend %note; } + .alert-success { @extend %note-green; } + .alert-error { @extend %note-red; } + + p > code, li > code, td > code { @extend %label; } + + .view-source, .improve-docs { + position: relative; + float: right; + line-height: 1.7rem; + padding-left: 1em; + font-size: .875rem; + background: $contentBackground; + } + + .defs { + padding-left: 1rem; + list-style: none; + + > li > h3:first-child { + margin: 0 0 1em -1rem; + @extend %block-label, %label-blue; + } + + > li + li { margin-top: 2em; } + + h4 { + margin: 1em 0 .5em; + font-size: 1em; + } + + ul { list-style-type: disc; } + } +} diff --git a/app/scss/pages/_apache.scss b/app/scss/pages/_apache.scss new file mode 100644 index 0000000..ff494bb --- /dev/null +++ b/app/scss/pages/_apache.scss @@ -0,0 +1,6 @@ +._apache { + @extend %simple; + + .note, .warning { @extend %note; } + .warning { @extend %note-red; } +} diff --git a/app/scss/pages/_base.scss b/app/scss/pages/_base.scss new file mode 100644 index 0000000..ef7d422 --- /dev/null +++ b/app/scss/pages/_base.scss @@ -0,0 +1,30 @@ +%simple { + padding-left: 1rem; + + h1, h2, h3 { margin-left: -1rem; } + h2 { @extend %block-heading; } + h3 { @extend %block-label, %label-blue; } + h4 { font-size: inherit; } + + ._mobile & { + padding-left: 0; + + h1, h2, h3 { margin-left: 0; } + } + + p > code, li > code { @extend %label; } + blockquote { @extend %note; } +} + +._cordova, +._grunt, +._less, +._lodash, +._marionette, +._markdown, +._mocha, +._mongoose, +._sinon, +._webpack { + @extend %simple; +} diff --git a/app/scss/pages/_bower.scss b/app/scss/pages/_bower.scss new file mode 100644 index 0000000..538f093 --- /dev/null +++ b/app/scss/pages/_bower.scss @@ -0,0 +1,7 @@ +._bower { + h2 { @extend %block-heading; } + h3 { @extend %block-label, %label-blue; } + h4 { @extend %block-label; } + + code { @extend %label; } +} diff --git a/app/scss/pages/_c.scss b/app/scss/pages/_c.scss new file mode 100644 index 0000000..5f68c61 --- /dev/null +++ b/app/scss/pages/_c.scss @@ -0,0 +1,51 @@ +._c { + > h2, > h3 { @extend %block-heading; } + > h4 { @extend %block-label, %label-blue; } + .fmbox { @extend %note; } + code, .t-mark, .t-mark-rev { @extend %label; } + + .t-mark, .t-mark-rev { + white-space: nowrap; + @extend %label-green; + } + + .t-dcl-begin pre { + margin: 0; + padding: 0; + line-height: inherit; + background: none; + border: 0; + } + + .t-lines > span { display: block; } // numeric/fenv, string/byte, etc. + + .t-spar { // language/switch, language/for, etc. + font-style: italic; + color: $textColorLight; + } + .t-sdsc-nopad dl, .t-sdsc-nopad dd { margin: 0; } + + td { + > h3, > h5 { + margin: 0; + line-height: inherit; + } + + > ul { margin: 0; } + + > .t-dsc-member-div > div { // utility/functional + float: left; + + + div { margin-left: .5em; } + } + } + + .t-inheritance-diagram { + display: table; + margin: 1rem 0; + padding: .375rem; + font-size: .75rem; + border: 1px solid $boxBorder; + border-radius: 2px; + } +} diff --git a/app/scss/pages/_chai.scss b/app/scss/pages/_chai.scss new file mode 100644 index 0000000..19c24ab --- /dev/null +++ b/app/scss/pages/_chai.scss @@ -0,0 +1,5 @@ +._chai { + @extend %simple; + + li.tag span { margin-right: 5px; } +} diff --git a/app/scss/pages/_clojure.scss b/app/scss/pages/_clojure.scss new file mode 100644 index 0000000..9f5e5db --- /dev/null +++ b/app/scss/pages/_clojure.scss @@ -0,0 +1,10 @@ +._clojure { + h2:not([id]) { @extend %block-heading; } + h2[id], h3 { @extend %block-label, %label-blue; } + + .type { + float: right; + font-size: .9em; + color: $textColorLight; + } +} diff --git a/app/scss/pages/_coffeescript.scss b/app/scss/pages/_coffeescript.scss new file mode 100644 index 0000000..af4125f --- /dev/null +++ b/app/scss/pages/_coffeescript.scss @@ -0,0 +1,18 @@ +._coffeescript { + @extend %simple; + + // CoffeeScript / JavaScript code blocks + > .code { + margin: 1.5em 0; + overflow: hidden; + + > pre { + float: left; + width: 49%; + margin: 0; + @extend %border-box; + + &:last-child { float: right; } + } + } +} diff --git a/app/scss/pages/_d3.scss b/app/scss/pages/_d3.scss new file mode 100644 index 0000000..0d34d1d --- /dev/null +++ b/app/scss/pages/_d3.scss @@ -0,0 +1,6 @@ +._d3 { + > h2 { @extend %block-heading; } + > h3, > h4 { font-size: 1rem; } + > h6 { @extend %block-label, %label-blue; } + code { @extend %label; } +} diff --git a/app/scss/pages/_drupal.scss b/app/scss/pages/_drupal.scss new file mode 100644 index 0000000..c865d36 --- /dev/null +++ b/app/scss/pages/_drupal.scss @@ -0,0 +1,4 @@ +._drupal { + h3 { @extend %block-heading; } + .signature { @extend %note, %note-blue; } +} diff --git a/app/scss/pages/_ember.scss b/app/scss/pages/_ember.scss new file mode 100644 index 0000000..cea8541 --- /dev/null +++ b/app/scss/pages/_ember.scss @@ -0,0 +1,53 @@ +._ember { + > .class-info { @extend %note, %note-blue; } + > .class-info > p { margin: 0; } + + > .description > h2, > .description > h3 { font-size: 1rem; } + + .item-entry { padding-left: 1rem; } + + .title { + margin-left: -1rem; + @extend %block-heading; + + > h2, > .args, > .flag { + display: inline-block; + vertical-align: top; + margin: 0; + line-height: inherit; + font-size: inherit; + } + + > .flag { // "static" + margin-left: .5em; + color: $textColorLight; + } + + > .type { + float: right; + font-weight: normal; + } + } + + .meta { // "defined in" + color: $textColorLight; + margin-bottom: 1em; + } + + .return, .params { + margin-top: 1.5em; + + > h3 { + display: inline-block; + vertical-align: top; + margin: 0 0 1em; + font-size: inherit; + @extend %label, %label-blue; + } + } + + dl { margin: 0 1em; } + dt + dt, dd + dt { margin-top: .5em; } + + p > code { @extend %label; } +} diff --git a/app/scss/pages/_express.scss b/app/scss/pages/_express.scss new file mode 100644 index 0000000..de1bf21 --- /dev/null +++ b/app/scss/pages/_express.scss @@ -0,0 +1,6 @@ +._express { + @extend %simple; + + .doc-box { @extend %note; } + .doc-warn { @extend %note-red; } +} diff --git a/app/scss/pages/_git.scss b/app/scss/pages/_git.scss new file mode 100644 index 0000000..1d5cad3 --- /dev/null +++ b/app/scss/pages/_git.scss @@ -0,0 +1,22 @@ +._git { + padding-left: 1rem; + + > h1, + > h2, + > .reference-menu, + > .callout, + > h1 + .sectionbody { + margin-left: -1rem; + } + + > h2 { @extend %block-heading; } + h3 { font-size: 1rem; } + + > .callout, + > h1 + .sectionbody { + @extend %note, %note-green; + } + + code { @extend %label; } + em { font-style: normal; } +} diff --git a/app/scss/pages/_go.scss b/app/scss/pages/_go.scss new file mode 100644 index 0000000..218fa0d --- /dev/null +++ b/app/scss/pages/_go.scss @@ -0,0 +1,5 @@ +._go { + @extend %simple; + + #short-nav, table.dir { margin-left: -1rem; } +} diff --git a/app/scss/pages/_haskell.scss b/app/scss/pages/_haskell.scss new file mode 100644 index 0000000..2992879 --- /dev/null +++ b/app/scss/pages/_haskell.scss @@ -0,0 +1,25 @@ +._haskell { + > h2 { @extend %block-heading; } + > h3 { @extend %block-label; } + h4 { font-size: 1em; } + + .module + .package, p.src > .link { float: right; } + + .src { + white-space: normal; + @extend %code; + } + p.src { @extend %block-label, %label-blue; } + dt.src { white-space: normal; } + + .top > .subs { margin-left: 2em; } + .subs p.src { margin-top: 1em; } + + dt > code, .complexity, .version { @extend %label; } + .complexity, .version { @extend %label-green; } + + table { margin: 1em 0; } + td > pre { margin: 0; } + + .warning { @extend %note; } +} diff --git a/app/scss/pages/_jquery.scss b/app/scss/pages/_jquery.scss new file mode 100644 index 0000000..76a44e5 --- /dev/null +++ b/app/scss/pages/_jquery.scss @@ -0,0 +1,137 @@ +._jquery { + // + // Index page + // + + h2.entry-title { + margin: 0 0 1.5rem; + font-size: 1rem; + font-weight: normal; + } + + .entry-summary { + margin: -1rem 0 1.5rem; + padding-right: 1.5rem; + } + + .post:not(:only-of-type), + .page:not(:only-of-type) { + width: 50%; + float: left; + + &:nth-of-type(2n+1) { clear: both; } + } + + // + // Article page + // + + // Table of contents + + .toc > h4 { font-size: inherit; } + + .toc-list { + margin-top: 0; + font-weight: bold; + + > li + li { margin-top: 1em; } + > li > ul { font-weight: normal; } + > li > ul > li + li { margin-top: 0; } + } + + // Headings + + .section-title, .entry-wrapper > h3, .underline { @extend %block-heading; } + + .name > .version-details, + .section-title > .version-details, + .returns, + .option-type { + float: right; + font-weight: bold; + margin-left: 1em; + } + + // Method signatures + + .signatures { + padding: 0; + list-style: none; + } + + .signature { + + .signature { margin-top: 1em; } + + > .name { + margin-top: 1em; + @extend %block-label, %label-blue; + } + + > ul { + padding-left: 1em; + list-style: none; + + > li + li { margin-top: 1em; } + > li > ul { list-style-type: disc; } + } + } + + // Examples + + .entry-example { + > h4 { + margin: 2em 0 1.5em; + line-height: inherit; + font-size: inherit; + font-weight: normal; + } + } + + // Quick nav (jQuery UI) + + #quick-nav { + margin-bottom: 2em; + max-width: 38em; + overflow: hidden; + @extend %note, %note-blue; + + > h2 { + margin: .25rem 0 1rem; + font-size: 1rem; + + > a { float: right; } + } + } + + .quick-nav-section { + width: 33%; + float: left; + + > h3 { + margin: 0 0 .5em; + font-size: inherit; + } + } + + // Options (jQuery UI) + + .api-item { + padding-left: 1rem; + + > h3 { + margin-left: -1rem; + @extend %block-label, %label-blue; + } + } + + // Misc + + p > code, li > code { @extend %label; } + .warning { @extend %note; } + + .name > a, + .version-details > a { + color: inherit; + @extend %internal-link; + } +} diff --git a/app/scss/pages/_knockout.scss b/app/scss/pages/_knockout.scss new file mode 100644 index 0000000..d6bd68e --- /dev/null +++ b/app/scss/pages/_knockout.scss @@ -0,0 +1,6 @@ +._knockout { + > h2 { @extend %block-heading; } + > h3 { @extend %block-label, %label-blue; } + p > code { @extend %label; } + .liveExample { @extend %note; } +} diff --git a/app/scss/pages/_laravel.scss b/app/scss/pages/_laravel.scss new file mode 100644 index 0000000..d3b11bd --- /dev/null +++ b/app/scss/pages/_laravel.scss @@ -0,0 +1,8 @@ +._laravel { + h2 { @extend %block-heading; } + h3 { @extend %block-label, %label-blue; } + h4 { font-size: 1em; } + + blockquote { @extend %note; } + p > code { @extend %label; } +} diff --git a/app/scss/pages/_lua.scss b/app/scss/pages/_lua.scss new file mode 100644 index 0000000..68cca61 --- /dev/null +++ b/app/scss/pages/_lua.scss @@ -0,0 +1,5 @@ +._lua { + @extend %simple; + + .apii { float: right; } +} diff --git a/app/scss/pages/_mdn.scss b/app/scss/pages/_mdn.scss new file mode 100644 index 0000000..ba66479 --- /dev/null +++ b/app/scss/pages/_mdn.scss @@ -0,0 +1,99 @@ +._mdn { + .index { // HTML, CSS + -webkit-columns: 16em; + -moz-columns: 16em; + columns: 16em; + + > span { + display: block; + font-size: 1rem; + font-weight: bold; + } + + ul, ol { + margin: 0 0 1em; + padding: 0; + line-height: 1.5; + list-style: none; + } + + li { padding-left: 1em; } + } + + > h2 { @extend %block-heading; } + + > .note, + .notice, + .overheadIndicator, + .syntaxbox, // CSS, JavaScript + .twopartsyntaxbox, // CSS + .inheritsbox, // JavaScript + .eval:first-of-type { // JavaScript + @extend %note; + } + + > .note { + em { + font-style: normal; + font-weight: bold; + } + + > ul { margin: 1em 0; } + > p:last-child, > ul:last-child { margin-bottom: 0; } + } + + .inlineIndicator { + white-space: nowrap; + @extend %label; + } + + .syntaxbox a, // CSS + .twopartsyntaxbox a, // CSS + .inlineIndicator > a { + color: inherit; + @extend %internal-link; + } + + .deprecated, .obsolete { @extend %label-red; } + .nonStandard, .projectSpecific, .experimental { @extend %label-orange; } + + .htmlelt, + .cssprop { + display: table; + @extend %note, %note-blue; + + > li { + display: table-row; + margin: 0; + + > dfn { + display: table-cell; + padding: .125rem 1.5rem .125rem 0; + white-space: pre; + border: 0; + cursor: inherit; + + &:after { content: ':'; } + } + } + + th, td { + background: none; + border: 0; + } + } + + dt > strong > code, // HTML element attribute + dl > dt > code { // CSS property value, Javascript function argument + font-family: inherit; + font-weight: bold; + } + + .eventinfo { // DOM event + > dd + dt { margin-top: 0; } + } + + .cleared { clear: both; } // CSS/box-shadow + + code > strong { font-weight: normal; } +} diff --git a/app/scss/pages/_meteor.scss b/app/scss/pages/_meteor.scss new file mode 100644 index 0000000..0de5a9b --- /dev/null +++ b/app/scss/pages/_meteor.scss @@ -0,0 +1,15 @@ +._meteor { + @extend %simple; + + .note, .warning { @extend %note; } + .warning { @extend %note-red; } + + dl.args { margin-left: 1rem; } + + .locus, .src-code { float: right; } + .locus, .type, .src-code { + margin-left: .5em; + font-size: .9em; + } + .locus, .type { color: $textColorLight; } +} diff --git a/app/scss/pages/_modernizr.scss b/app/scss/pages/_modernizr.scss new file mode 100644 index 0000000..eb34fe3 --- /dev/null +++ b/app/scss/pages/_modernizr.scss @@ -0,0 +1,8 @@ +._modernizr { + h2 { @extend %block-heading; } + h3 { @extend %block-label, %label-blue; } + h4 { font-size: 1em; } + + code { @extend %label; } + blockquote { @extend %note; } +} diff --git a/app/scss/pages/_moment.scss b/app/scss/pages/_moment.scss new file mode 100644 index 0000000..eb5eb39 --- /dev/null +++ b/app/scss/pages/_moment.scss @@ -0,0 +1,7 @@ +._moment { + > h2 { @extend %block-heading; } + > h3 { @extend %block-label, %label-blue; } + > h3 > span { float: right;} + h4 { font-size: 1em; } + code { @extend %label; } +} diff --git a/app/scss/pages/_nginx.scss b/app/scss/pages/_nginx.scss new file mode 100644 index 0000000..57cdba9 --- /dev/null +++ b/app/scss/pages/_nginx.scss @@ -0,0 +1,6 @@ +._nginx { + h4 { @extend %block-heading; } + .note { @extend %note; } + .directive { margin: 2.5em 0 1em; } + td > pre { margin: 0; } +} diff --git a/app/scss/pages/_node.scss b/app/scss/pages/_node.scss new file mode 100644 index 0000000..fc35ba8 --- /dev/null +++ b/app/scss/pages/_node.scss @@ -0,0 +1,17 @@ +._node { + .api_stability_0, .api_stability_1 { @extend %note, %note-red; } + .api_stability_2 { @extend %note; } + .api_stability_3, .api_stability_4 { @extend %note, %note-green; } + .api_stability_5 { @extend %note, %note-blue; } + + > h2 { @extend %block-heading; } + > h3 { @extend %block-label, %label-blue; } + > h4 { @extend %block-label; } + > h2 + h2, > h3 + h3 { margin-top: 0; } + + > p > code, .type { + white-space: normal; + @extend %label; + } +} + diff --git a/app/scss/pages/_npm.scss b/app/scss/pages/_npm.scss new file mode 100644 index 0000000..9bbcc74 --- /dev/null +++ b/app/scss/pages/_npm.scss @@ -0,0 +1,15 @@ +._npm { + @extend %simple; + + .pageColumns { + padding-left: 0; + list-style: none; + } + + .faint.heading { + font-size: .9em; + color: $textColorLight; + } + + .youtube-video iframe { width: 420px; height: 315px; } +} diff --git a/app/scss/pages/_opentsdb.scss b/app/scss/pages/_opentsdb.scss new file mode 100644 index 0000000..308f1c4 --- /dev/null +++ b/app/scss/pages/_opentsdb.scss @@ -0,0 +1,10 @@ +._opentsdb { + @extend %simple; + + .admonition { @extend %note; } + .admonition.warning { @extend %note-orange; } + .admonition-title { + margin: 0 0 .25rem; + font-weight: bold; + } +} diff --git a/app/scss/pages/_phaser.scss b/app/scss/pages/_phaser.scss new file mode 100644 index 0000000..2effc2a --- /dev/null +++ b/app/scss/pages/_phaser.scss @@ -0,0 +1,10 @@ +._phaser { + @extend %simple; + + .type-signature, dt.tag-source { + color: #666; + font-weight: normal; + } + + .deprecated-notice { @extend %note; } +} diff --git a/app/scss/pages/_php.scss b/app/scss/pages/_php.scss new file mode 100644 index 0000000..4386bd5 --- /dev/null +++ b/app/scss/pages/_php.scss @@ -0,0 +1,31 @@ +._php { + h1 { + margin-top: 0; + @extend %lined-heading; + } + + h3.title { @extend %block-heading; } + + .verinfo { + float: right; + font-weight: bold; + } + + .classsynopsis, + .description > .constructorsynopsis, + .description > .methodsynopsis, + .description > .fieldsynopsis { @extend %note, %note-blue; } + + .classsynopsisinfo_comment { color: $textColorLight; } + + .classsynopsisinfo_comment, + .classsynopsis > .constructorsynopsis, + .classsynopsis > .methodsynopsis, + .classsynopsis > .fieldsynopsis { margin-left: 1em; } + + blockquote.note { @extend %note; } + blockquote.note > p { margin-bottom: 0; } + + div.warning { @extend %note, %note-red; } + div.tip { @extend %note, %note-green; } +} diff --git a/app/scss/pages/_phpunit.scss b/app/scss/pages/_phpunit.scss new file mode 100644 index 0000000..47130f6 --- /dev/null +++ b/app/scss/pages/_phpunit.scss @@ -0,0 +1,18 @@ +._phpunit { + > h2 { @extend %block-heading; } + > h3 { @extend %block-label, %label-blue; } + > h4 { font-size: 1em; } + + > p > code { @extend %label; } + + .warning, .alert { + @extend %note; + + > h3 { + margin: 0 0 .5em; + font-size: 1em; + } + } + + .alert-danger { @extend %note-red; } +} diff --git a/app/scss/pages/_postgres.scss b/app/scss/pages/_postgres.scss new file mode 100644 index 0000000..da8dc08 --- /dev/null +++ b/app/scss/pages/_postgres.scss @@ -0,0 +1,13 @@ +._postgres { + padding-left: 1rem; + + h1, h1 ~ p, h2 { margin-left: -1rem; } + h2 { @extend %block-heading; } + + .VARIABLELIST dt { @extend %block-label, %label-blue; } + + blockquote.NOTE, blockquote.IMPORTANT { @extend %note; } + blockquote.TIP { @extend %note, %note-green; } + + p > code { @extend %label; } +} diff --git a/app/scss/pages/_q.scss b/app/scss/pages/_q.scss new file mode 100644 index 0000000..7f6e7c0 --- /dev/null +++ b/app/scss/pages/_q.scss @@ -0,0 +1,5 @@ +._q { + > h2, > h3 { @extend %block-heading; } + > h4 { @extend %block-label, %label-blue; } + code { @extend %label; } +} diff --git a/app/scss/pages/_rdoc.scss b/app/scss/pages/_rdoc.scss new file mode 100644 index 0000000..ae18b32 --- /dev/null +++ b/app/scss/pages/_rdoc.scss @@ -0,0 +1,46 @@ +._rdoc { + > .description, > .documentation-section { padding-left: 1rem; } + > .description > h2, header > h3, > h2 { @extend %block-heading; } + > .description > h2, header > h3, .method-heading { margin-left: -1rem; } + .description > h1 { font-size: 1rem; } + .method-description > h2, h3, h4, h5, h6 { font-size: 1em; } + + .method-heading { + font-weight: bold; + @extend %block-label, %label-blue; + + + .method-heading { margin-top: -.5em; } + } + + > .meta { + @extend %note, %note-blue; + + > dd { margin: 0; } + > dd + dt { margin-top: .5em; } + } + + a.method-click-advice { + float: right; + font-size: .75rem; + color: $linkColor; + cursor: pointer; + @extend %user-select-none; + + &:hover { text-decoration: underline; } + } + + .method-description { position: relative; } + + .method-source-code { + display: none; + position: absolute; + z-index: 1; + top: 0; + left: -1em; + right: 0; + background: rgba($contentBackground, .95); + box-shadow: 0 1em 1em 1em $contentBackground; + + > pre { margin: 0; } + } +} diff --git a/app/scss/pages/_react.scss b/app/scss/pages/_react.scss new file mode 100644 index 0000000..1b7c674 --- /dev/null +++ b/app/scss/pages/_react.scss @@ -0,0 +1,11 @@ +._react { + > h2 { @extend %block-heading; } + > h3 { @extend %block-label, %label-blue; } + > h4 { @extend %block-label; } + + code { @extend %label; } + blockquote { @extend %note; } + + span.platform { float: right; } + span.propType, span.platform { font-weight: normal; } +} diff --git a/app/scss/pages/_redis.scss b/app/scss/pages/_redis.scss new file mode 100644 index 0000000..feecaa7 --- /dev/null +++ b/app/scss/pages/_redis.scss @@ -0,0 +1,49 @@ +._redis { + padding-left: 1rem; + + // Index + + > .commands { + padding-left: 0; + list-style: none; + + > li { margin-bottom: 1em; } + } + + .command, .summary { display: block; } + + .args { + font-size: .75rem; + color: $textColorLight; + } + + // Others + + > h1, > h2, > .metadata, > h1 ~ p { margin-left: -1rem; } + > h2 ~ p { margin-left: 0; } + + > h2 { @extend %block-heading; } + p > code { @extend %label; } + + > .metadata { @extend %note, %note-green; } + > .metadata > p { margin: 0; } + + > .example { + white-space: normal; + @extend %pre; + + > .prompt { + float: left; + margin-right: .5em; + color: $textColorLight; + } + + > code { + display: block; + clear: left; + margin-bottom: .5em; + + &:last-child { margin-bottom: 0; } + } + } +} diff --git a/app/scss/pages/_requirejs.scss b/app/scss/pages/_requirejs.scss new file mode 100644 index 0000000..34fddb4 --- /dev/null +++ b/app/scss/pages/_requirejs.scss @@ -0,0 +1,5 @@ +._requirejs { + @extend %simple; + + ul.index ul { margin: .5em 0; } +} diff --git a/app/scss/pages/_rethinkdb.scss b/app/scss/pages/_rethinkdb.scss new file mode 100644 index 0000000..841a984 --- /dev/null +++ b/app/scss/pages/_rethinkdb.scss @@ -0,0 +1,9 @@ +._rethinkdb { + > h2 { @extend %block-heading; } + code { @extend %label; } + + .api_command_illustration { + float: right; + margin: 0 0 1em 1em; + } +} diff --git a/app/scss/pages/_rfc.scss b/app/scss/pages/_rfc.scss new file mode 100644 index 0000000..b522b30 --- /dev/null +++ b/app/scss/pages/_rfc.scss @@ -0,0 +1,15 @@ +._rfc-pre { + font-size: .8125rem; + min-width: 38rem; + @extend %code; + + > h2 { @extend %block-heading; } + > h3 { @extend %block-label, %label-blue; } + > h4 { @extend %block-label; } + > h3, > h4 { font-size: .875rem; } + + > h1, > h2, > h3, > h4, > h5 { + margin: 0; + font-family: $baseFont; + } +} diff --git a/app/scss/pages/_rust.scss b/app/scss/pages/_rust.scss new file mode 100644 index 0000000..200415d --- /dev/null +++ b/app/scss/pages/_rust.scss @@ -0,0 +1,10 @@ +._rust { + @extend %simple; + + h4 { @extend %block-label; } + .docblock { margin-left: 1em; } + + div.stability { margin-bottom: 1em; } + em.stab, span.stab { @extend %label; } + em.stab.unstable, span.stab.unstable { @extend %label-orange; } +} diff --git a/app/scss/pages/_socketio.scss b/app/scss/pages/_socketio.scss new file mode 100644 index 0000000..633dcbb --- /dev/null +++ b/app/scss/pages/_socketio.scss @@ -0,0 +1,24 @@ +._socketio { + > h2 { @extend %block-heading; } + > h3 { @extend %block-label, %label-blue; } + > h2, > h3 { clear: both; } + h4 { font-size: 1em; } + + .ezcol-one-half { + margin: .5em 0 1.5em; + float: left; + width: 50%; + padding-right: .5em; + @extend %border-box; + + &.ezcol-last { + float: right; + padding: 0 0 0 .5em; + } + + > h4 { margin: 0 0 1em; } + > pre { margin: 1em 0 0; } + } + + code { @extend %label; } +} diff --git a/app/scss/pages/_sphinx.scss b/app/scss/pages/_sphinx.scss new file mode 100644 index 0000000..44b9f1f --- /dev/null +++ b/app/scss/pages/_sphinx.scss @@ -0,0 +1,26 @@ +._sphinx { + h2, h3 { @extend %block-heading; } + dl:not(.docutils) > dt { @extend %block-label, %label-blue; } + dt + dt { margin-top: -.5em; } + + .note, .admonition, .versionadded, .versionchanged, .deprecated-removed { @extend %note; } + .deprecated-removed { @extend %note-red; } + .versionmodified { font-weight: bold; } + + p > code, li > code { @extend %label; } + + .admonition-title { + float: left; + margin: 0 .5em 0 0; + font-weight: bold; + + &:after { content: ':'; } + } + + .admonition > dl { + clear: left; + margin: 0; + } + + ul.simple { margin: 1em 0; } +} diff --git a/app/scss/pages/_underscore.scss b/app/scss/pages/_underscore.scss new file mode 100644 index 0000000..f592e39 --- /dev/null +++ b/app/scss/pages/_underscore.scss @@ -0,0 +1,25 @@ +._underscore { + padding-left: 1rem; + + > h1, > h2, .header { margin-left: -1rem; } + > h2 { @extend %block-heading; } + + .header { + display: inline-block; + vertical-align: top; + margin-bottom: 1em; + } + + > p[id] { margin-top: 2rem; } + > pre { margin-top: 1em; } + + .header + code { + margin-left: 1em; + @extend %label; + } + + .alias { + margin-left: 1em; + font-style: italic; + } +} diff --git a/app/scss/pages/_vue.scss b/app/scss/pages/_vue.scss new file mode 100644 index 0000000..a744021 --- /dev/null +++ b/app/scss/pages/_vue.scss @@ -0,0 +1,5 @@ +._vue { + @extend %simple; + + p.tip { @extend %note; } +} diff --git a/app/scss/pages/_yard.scss b/app/scss/pages/_yard.scss new file mode 100644 index 0000000..8df2a22 --- /dev/null +++ b/app/scss/pages/_yard.scss @@ -0,0 +1,16 @@ +._yard { + > h2 { @extend %block-heading; } + .signature { @extend %block-label, %label-blue; } + + > .method_details { + padding-left: 1rem; + + > .signature { margin-left: -1rem; } + > .signature .overload { display: block; } + + h3 { font-size: inherit; } + ul, pre { margin: 1em 0; } + } + + .tag_title { font-weight: bold; } +} diff --git a/app/scss/pages/_yii.scss b/app/scss/pages/_yii.scss new file mode 100644 index 0000000..e27623d --- /dev/null +++ b/app/scss/pages/_yii.scss @@ -0,0 +1,14 @@ +._yii { + h2 { @extend %block-heading; } + h3 { @extend %block-label, %label-blue; } + h4 { font-size: 1em; } + + blockquote { @extend %note; } + + .detail-header-tag, .detailHeaderTag { + float: right; + color: $textColorLight; + } + + .param-type-col { white-space: nowrap; } +} diff --git a/app/scss/vendor/open-sans.css b/app/scss/vendor/open-sans.css new file mode 100644 index 0000000..b1a3948 --- /dev/null +++ b/app/scss/vendor/open-sans.css @@ -0,0 +1,32 @@ +/*! + * Copyright 2013 + * Open Sans is licensed under the Apache License version 2.0. + */ + +@font-face { + font-family: 'Open Sans'; + src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Open Sans'; + src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: 'Open Sans'; + src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: 'Open Sans'; + src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); + font-weight: bold; + font-style: italic; +} diff --git a/app/venders/es5-shim.min.js b/app/venders/es5-shim.min.js new file mode 100644 index 0000000..f4277c5 --- /dev/null +++ b/app/venders/es5-shim.min.js @@ -0,0 +1,7 @@ +/*! + * https://github.com/es-shims/es5-shim + * @license es5-shim Copyright 2009-2015 by contributors, MIT License + * see https://github.com/es-shims/es5-shim/blob/v4.1.14/LICENSE + */ +(function(e,t){"use strict";if(typeof define==="function"&&define.amd){define(t)}else if(typeof exports==="object"){module.exports=t()}else{e.returnExports=t()}})(this,function(){var e=Array;var t=e.prototype;var r=Object;var n=r.prototype;var i=Function.prototype;var a=String;var o=a.prototype;var l=Number;var u=l.prototype;var f=t.slice;var s=t.splice;var c=t.push;var v=t.unshift;var p=t.concat;var h=i.call;var g=Math.max;var y=Math.min;var d=n.toString;var w=typeof Symbol==="function"&&typeof Symbol.toStringTag==="symbol";var m;var b=Function.prototype.toString,T=function tryFunctionObject(e){try{b.call(e);return true}catch(t){return false}},x="[object Function]",O="[object GeneratorFunction]";m=function isCallable(e){if(typeof e!=="function"){return false}if(w){return T(e)}var t=d.call(e);return t===x||t===O};var S;var j=RegExp.prototype.exec,E=function tryRegexExec(e){try{j.call(e);return true}catch(t){return false}},I="[object RegExp]";S=function isRegex(e){if(typeof e!=="object"){return false}return w?E(e):d.call(e)===I};var D;var k=String.prototype.valueOf,U=function tryStringObject(e){try{k.call(e);return true}catch(t){return false}},N="[object String]";D=function isString(e){if(typeof e==="string"){return true}if(typeof e!=="object"){return false}return w?U(e):d.call(e)===N};var F=function(e){var t=r.defineProperty&&function(){try{var e={};r.defineProperty(e,"x",{enumerable:false,value:e});for(var t in e){return false}return e.x===e}catch(n){return false}}();var n;if(t){n=function(e,t,n,i){if(!i&&t in e){return}r.defineProperty(e,t,{configurable:true,enumerable:false,writable:true,value:n})}}else{n=function(e,t,r,n){if(!n&&t in e){return}e[t]=r}}return function defineProperties(t,r,i){for(var a in r){if(e.call(r,a)){n(t,a,r[a],i)}}}}(n.hasOwnProperty);var M=function isPrimitive(e){var t=typeof e;return e===null||t!=="object"&&t!=="function"};var R={ToInteger:function ToInteger(e){var t=+e;if(t!==t){t=0}else if(t!==0&&t!==1/0&&t!==-(1/0)){t=(t>0||-1)*Math.floor(Math.abs(t))}return t},ToPrimitive:function ToPrimitive(e){var t,r,n;if(M(e)){return e}r=e.valueOf;if(m(r)){t=r.call(e);if(M(t)){return t}}n=e.toString;if(m(n)){t=n.call(e);if(M(t)){return t}}throw new TypeError},ToObject:function(e){if(e==null){throw new TypeError("can't convert "+e+" to object")}return r(e)},ToUint32:function ToUint32(e){return e>>>0}};var A=function Empty(){};F(i,{bind:function bind(e){var t=this;if(!m(t)){throw new TypeError("Function.prototype.bind called on incompatible "+t)}var n=f.call(arguments,1);var i;var a=function(){if(this instanceof i){var a=t.apply(this,p.call(n,f.call(arguments)));if(r(a)===a){return a}return this}else{return t.apply(e,p.call(n,f.call(arguments)))}};var o=g(0,t.length-n.length);var l=[];for(var u=0;u1){a=arguments[1]}if(!m(e)){throw new TypeError("Array.prototype.forEach callback must be a function")}while(++n1){o=arguments[1]}if(!m(t)){throw new TypeError("Array.prototype.map callback must be a function")}for(var l=0;l1){o=arguments[1]}if(!m(e)){throw new TypeError("Array.prototype.filter callback must be a function")}for(var l=0;l1){i=arguments[1]}if(!m(e)){throw new TypeError("Array.prototype.every callback must be a function")}for(var a=0;a1){i=arguments[1]}if(!m(e)){throw new TypeError("Array.prototype.some callback must be a function")}for(var a=0;a=2){a=arguments[1]}else{do{if(i in r){a=r[i++];break}if(++i>=n){throw new TypeError("reduce of empty array with no initial value")}}while(true)}for(;i=2){i=arguments[1]}else{do{if(a in r){i=r[a--];break}if(--a<0){throw new TypeError("reduceRight of empty array with no initial value")}}while(true)}if(a<0){return i}do{if(a in r){i=e(i,r[a],a,t)}}while(a--);return i}},!X);var Y=t.indexOf&&[0,1].indexOf(1,2)!==-1;F(t,{indexOf:function indexOf(e){var t=G&&D(this)?Z(this,""):R.ToObject(this);var r=R.ToUint32(t.length);if(r===0){return-1}var n=0;if(arguments.length>1){n=R.ToInteger(arguments[1])}n=n>=0?n:g(0,r+n);for(;n1){n=y(n,R.ToInteger(arguments[1]))}n=n>=0?n:r-Math.abs(n);for(;n>=0;n--){if(n in t&&e===t[n]){return n}}return-1}},q);var K=function(){var e=[1,2];var t=e.splice();return e.length===2&&J(t)&&t.length===0}();F(t,{splice:function splice(e,t){if(arguments.length===0){return[]}else{return s.apply(this,arguments)}}},!K);var Q=function(){var e={};t.splice.call(e,0,0,1);return e.length===1}();F(t,{splice:function splice(e,t){if(arguments.length===0){return[]}var r=arguments;this.length=g(R.ToInteger(this.length),0);if(arguments.length>0&&typeof t!=="number"){r=f.call(arguments);if(r.length<2){c.call(r,this.length-e)}else{r[1]=R.ToInteger(t)}}return s.apply(this,r)}},!Q);var V=function(){var t=new e(1e5);t[8]="x";t.splice(1,1);return t.indexOf("x")===7}();var W=function(){var e=256;var t=[];t[e]="a";t.splice(e+1,0,"b");return t[e]==="a"}();F(t,{splice:function splice(e,t){var r=R.ToObject(this);var n=[];var i=R.ToUint32(r.length);var o=R.ToInteger(e);var l=o<0?g(i+o,0):y(o,i);var u=y(g(R.ToInteger(t),0),i-l);var s=0;var c;while(si-u+p){delete r[s-1];s-=1}}else if(p>u){s=i-u;while(s>l){c=a(s+u-1);h=a(s+p-1);if($(r,c)){r[h]=r[c]}else{delete r[h]}s-=1}}s=l;for(var d=0;d=0&&!J(e)&&m(e.callee)};var se=ue(arguments)?ue:fe;F(r,{keys:function keys(e){var t=m(e);var r=se(e);var n=e!==null&&typeof e==="object";var i=n&&D(e);if(!n&&!t&&!r){throw new TypeError("Object.keys called on a non-object")}var o=[];var l=ee&&t;if(i&&te||r){for(var u=0;u9999?"+":"")+P("00000"+Math.abs(n),0<=n&&n<=9999?-4:-6);t=e.length;while(t--){r=e[t];if(r<10){e[t]="0"+r}}return n+"-"+f.call(e,0,2).join("-")+"T"+f.call(e,2).join(":")+"."+P("000"+this.getUTCMilliseconds(),-3)+"Z"}},ye||de);var we=function(){try{return Date.prototype.toJSON&&new Date(NaN).toJSON()===null&&new Date(he).toJSON().indexOf(ge)!==-1&&Date.prototype.toJSON.call({toISOString:function(){return true}})}catch(e){return false}}();if(!we){Date.prototype.toJSON=function toJSON(e){var t=r(this);var n=R.ToPrimitive(t);if(typeof n==="number"&&!isFinite(n)){return null}var i=t.toISOString;if(!m(i)){throw new TypeError("toISOString property is not callable")}return i.call(t)}}var me=Date.parse("+033658-09-27T01:46:40.000Z")===1e15;var be=!isNaN(Date.parse("2012-04-04T24:00:00.500Z"))||!isNaN(Date.parse("2012-11-31T23:59:59.000Z"))||!isNaN(Date.parse("2012-12-31T23:59:60.000Z"));var Te=isNaN(Date.parse("2000-01-01T00:00:00.000Z"));if(Te||be||!me){Date=function(e){var t=function Date(r,n,i,o,l,u,f){var s=arguments.length;var c;if(this instanceof e){c=s===1&&a(r)===r?new e(t.parse(r)):s>=7?new e(r,n,i,o,l,u,f):s>=6?new e(r,n,i,o,l,u):s>=5?new e(r,n,i,o,l):s>=4?new e(r,n,i,o):s>=3?new e(r,n,i):s>=2?new e(r,n):s>=1?new e(r):new e}else{c=e.apply(this,arguments)}if(!M(c)){F(c,{constructor:t},true)}return c};var r=new RegExp("^"+"(\\d{4}|[+-]\\d{6})"+"(?:-(\\d{2})"+"(?:-(\\d{2})"+"(?:"+"T(\\d{2})"+":(\\d{2})"+"(?:"+":(\\d{2})"+"(?:(\\.\\d{1,}))?"+")?"+"("+"Z|"+"(?:"+"([-+])"+"(\\d{2})"+":(\\d{2})"+")"+")?)?)?)?"+"$");var n=[0,31,59,90,120,151,181,212,243,273,304,334,365];var i=function dayFromMonth(e,t){var r=t>1?1:0;return n[t]+Math.floor((e-1969+r)/4)-Math.floor((e-1901+r)/100)+Math.floor((e-1601+r)/400)+365*(e-1970)};var o=function toUTC(t){return l(new e(1970,0,1,0,0,0,t))};for(var u in e){if($(e,u)){t[u]=e[u]}}F(t,{now:e.now,UTC:e.UTC},true);t.prototype=e.prototype;F(t.prototype,{constructor:t},true);var f=function parse(t){var n=r.exec(t);if(n){var a=l(n[1]),u=l(n[2]||1)-1,f=l(n[3]||1)-1,s=l(n[4]||0),c=l(n[5]||0),v=l(n[6]||0),p=Math.floor(l(n[7]||0)*1e3),h=Boolean(n[4]&&!n[8]),g=n[9]==="-"?1:-1,y=l(n[10]||0),d=l(n[11]||0),w;var m=c>0||v>0||p>0;if(s<(m?24:25)&&c<60&&v<60&&p<1e3&&u>-1&&u<12&&y<24&&d<60&&f>-1&&f=0){r+=Oe.data[t];Oe.data[t]=Math.floor(r/e);r=r%e*Oe.base}},numToString:function numToString(){var e=Oe.size;var t="";while(--e>=0){if(t!==""||e===0||Oe.data[e]!==0){var r=a(Oe.data[e]);if(t===""){t=r}else{t+=P("0000000",0,7-r.length)+r}}}return t},pow:function pow(e,t,r){return t===0?r:t%2===1?pow(e,t-1,r*e):pow(e*e,t/2,r)},log:function log(e){var t=0;var r=e;while(r>=4096){t+=12;r/=4096}while(r>=2){t+=1;r/=2}return t}};F(u,{toFixed:function toFixed(e){var t,r,n,i,o,u,f,s;t=l(e);t=t!==t?0:Math.floor(t);if(t<0||t>20){throw new RangeError("Number.toFixed called with invalid number of decimals")}r=l(this);if(r!==r){return"NaN"}if(r<=-1e21||r>=1e21){return a(r)}n="";if(r<0){n="-";r=-r}i="0";if(r>1e-21){o=Oe.log(r*Oe.pow(2,69,1))-69;u=o<0?r*Oe.pow(2,-o,1):r/Oe.pow(2,o,1);u*=4503599627370496;o=52-o;if(o>0){Oe.multiply(0,u);f=t;while(f>=7){Oe.multiply(1e7,0);f-=7}Oe.multiply(Oe.pow(10,f,1),0);f=o-1;while(f>=23){Oe.divide(1<<23);f-=23}Oe.divide(1<0){s=i.length;if(s<=t){i=n+P("0.0000000000000000000",0,t-s+2)+i}else{i=n+P(i,0,s-t)+"."+P(i,s-t)}}else{i=n+i}return i}},xe);if("ab".split(/(?:ab)*/).length!==2||".".split(/(.?)(.?)/).length!==4||"tesst".split(/(s)*/)[1]==="t"||"test".split(/(?:)/,-1).length!==4||"".split(/.?/).length||".".split(/()()/).length>1){(function(){var e=typeof/()??/.exec("")[1]==="undefined";var t=Math.pow(2,32)-1;o.split=function(r,n){var i=this;if(typeof r==="undefined"&&n===0){return[]}if(!S(r)){return Z(this,r,n)}var a=[];var o=(r.ignoreCase?"i":"")+(r.multiline?"m":"")+(r.unicode?"u":"")+(r.sticky?"y":""),l=0,u,s,v,p;var h=new RegExp(r.source,o+"g");i+="";if(!e){u=new RegExp("^"+h.source+"$(?!\\s)",o)}var g=typeof n==="undefined"?t:R.ToUint32(n);s=h.exec(i);while(s){v=s.index+s[0].length;if(v>l){c.call(a,P(i,l,s.index));if(!e&&s.length>1){s[0].replace(u,function(){for(var e=1;e1&&s.index=g){break}}if(h.lastIndex===s.index){h.lastIndex++}s=h.exec(i)}if(l===i.length){if(p||!h.test("")){c.call(a,"")}}else{c.call(a,P(i,l))}return a.length>g?P(a,0,g):a}})()}else if("0".split(void 0,0).length){o.split=function split(e,t){if(typeof e==="undefined"&&t===0){return[]}return Z(this,e,t)}}var Se=o.replace;var je=function(){var e=[];"x".replace(/x(.)?/g,function(t,r){c.call(e,r)});return e.length===1&&typeof e[0]==="undefined"}();if(!je){o.replace=function replace(e,t){var r=m(t);var n=S(e)&&/\)[*?]/.test(e.source);if(!r||!n){return Se.call(this,e,t)}else{var i=function(r){var n=arguments.length;var i=e.lastIndex;e.lastIndex=0;var a=e.exec(r)||[];e.lastIndex=i;c.call(a,arguments[n-2],arguments[n-1]);return t.apply(this,a)};return Se.call(this,e,i)}}}var Ee=o.substr;var Ie="".substr&&"0b".substr(-1)!=="b";F(o,{substr:function substr(e,t){var r=e;if(e<0){r=g(this.length+e,0)}return Ee.call(this,r,t)}},Ie);var De=" \n \f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003"+"\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028"+"\u2029\ufeff";var ke="\u200b";var Ue="["+De+"]";var Ne=new RegExp("^"+Ue+Ue+"*");var Fe=new RegExp(Ue+Ue+"*$");var Me=o.trim&&(De.trim()||!ke.trim());F(o,{trim:function trim(){if(typeof this==="undefined"||this===null){throw new TypeError("can't convert "+this+" to object")}return a(this).replace(Ne,"").replace(Fe,"")}},Me);if(parseInt(De+"08")!==8||parseInt(De+"0x16")!==22){parseInt=function(e){var t=/^0[xX]/;return function parseInt(r,n){var i=a(r).trim();var o=l(n)||(t.test(i)?16:10);return e(i,o)}}(parseInt)}}); +//# sourceMappingURL=es5-shim.map diff --git a/app/venders/prettify.min.js b/app/venders/prettify.min.js new file mode 100644 index 0000000..745aef6 --- /dev/null +++ b/app/venders/prettify.min.js @@ -0,0 +1 @@ +!function(){var e=null;window.PR_SHOULD_USE_CONTINUATION=!0,function(){function t(e){function t(e){var t=e.charCodeAt(0);if(92!==t)return t;var i=e.charAt(1);return(t=u[i])?t:i>="0"&&"7">=i?parseInt(e.substring(1),8):"u"===i||"x"===i?parseInt(e.substring(2),16):e.charCodeAt(1)}function i(e){return 32>e?(16>e?"\\x0":"\\x")+e.toString(16):(e=String.fromCharCode(e),"\\"===e||"-"===e||"]"===e||"^"===e?"\\"+e:e)}function n(e){var n=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],r="^"===n[0],s=["["];r&&s.push("^");for(var r=r?1:0,o=n.length;o>r;++r){var a=n[r];if(/\\[bdsw]/i.test(a))s.push(a);else{var l,a=t(a);o>r+2&&"-"===n[r+1]?(l=t(n[r+2]),r+=2):l=a,e.push([a,l]),65>l||a>122||(65>l||a>90||e.push([32|Math.max(65,a),32|Math.min(l,90)]),97>l||a>122||e.push([-33&Math.max(97,a),-33&Math.min(l,122)]))}}for(e.sort(function(e,t){return e[0]-t[0]||t[1]-e[1]}),n=[],o=[],r=0;e.length>r;++r)a=e[r],a[0]<=o[1]+1?o[1]=Math.max(o[1],a[1]):n.push(o=a);for(r=0;n.length>r;++r)a=n[r],s.push(i(a[0])),a[1]>a[0]&&(a[1]+1>a[0]&&s.push("-"),s.push(i(a[1])));return s.push("]"),s.join("")}function r(e){for(var t=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),r=t.length,a=[],l=0,h=0;r>l;++l){var c=t[l];"("===c?++h:"\\"===c.charAt(0)&&(c=+c.substring(1))&&(h>=c?a[c]=-1:t[l]=i(c))}for(l=1;a.length>l;++l)-1===a[l]&&(a[l]=++s);for(h=l=0;r>l;++l)c=t[l],"("===c?(++h,a[h]||(t[l]="(?:")):"\\"===c.charAt(0)&&(c=+c.substring(1))&&h>=c&&(t[l]="\\"+a[c]);for(l=0;r>l;++l)"^"===t[l]&&"^"!==t[l+1]&&(t[l]="");if(e.ignoreCase&&o)for(l=0;r>l;++l)c=t[l],e=c.charAt(0),c.length>=2&&"["===e?t[l]=n(c):"\\"!==e&&(t[l]=c.replace(/[A-Za-z]/g,function(e){return e=e.charCodeAt(0),"["+String.fromCharCode(-33&e,32|e)+"]"}));return t.join("")}for(var s=0,o=!1,a=!1,l=0,h=e.length;h>l;++l){var c=e[l];if(c.ignoreCase)a=!0;else if(/[a-z]/i.test(c.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){o=!0,a=!1;break}}for(var u={b:8,t:9,n:10,v:11,f:12,r:13},d=[],l=0,h=e.length;h>l;++l){if(c=e[l],c.global||c.multiline)throw Error(""+c);d.push("(?:"+r(c)+")")}return RegExp(d.join("|"),a?"gi":"g")}function i(e,t){function i(e){var l=e.nodeType;if(1==l){if(!n.test(e.className)){for(l=e.firstChild;l;l=l.nextSibling)i(l);l=e.nodeName.toLowerCase(),("br"===l||"li"===l)&&(r[a]="\n",o[a<<1]=s++,o[1|a++<<1]=e)}}else(3==l||4==l)&&(l=e.nodeValue,l.length&&(l=t?l.replace(/\r\n?/g,"\n"):l.replace(/[\t\n\r ]+/g," "),r[a]=l,o[a<<1]=s,s+=l.length,o[1|a++<<1]=e))}var n=/(?:^|\s)nocode(?:\s|$)/,r=[],s=0,o=[],a=0;return i(e),{a:r.join("").replace(/\n$/,""),d:o}}function n(e,t,i,n){t&&(e={a:t,e:e},i(e),n.push.apply(n,e.g))}function r(e){for(var t=void 0,i=e.firstChild;i;i=i.nextSibling)var n=i.nodeType,t=1===n?t?e:i:3===n?x.test(i.nodeValue)?e:t:t;return t===e?void 0:t}function s(i,r){function s(e){for(var t=e.e,i=[t,"pln"],c=0,u=e.a.match(o)||[],d={},p=0,f=u.length;f>p;++p){var m,g=u[p],y=d[g],v=void 0;if("string"==typeof y)m=!1;else{var b=a[g.charAt(0)];if(b)v=g.match(b[1]),y=b[0];else{for(m=0;l>m;++m)if(b=r[m],v=g.match(b[1])){y=b[0];break}v||(y="pln")}!(m=y.length>=5&&"lang-"===y.substring(0,5))||v&&"string"==typeof v[1]||(m=!1,y="src"),m||(d[g]=y)}if(b=c,c+=g.length,m){m=v[1];var L=g.indexOf(m),x=L+m.length;v[2]&&(x=g.length-v[2].length,L=x-m.length),y=y.substring(5),n(t+b,g.substring(0,L),s,i),n(t+b+L,m,h(y,m),i),n(t+b+x,g.substring(x),s,i)}else i.push(t+b,y)}e.g=i}var o,a={};(function(){for(var n=i.concat(r),s=[],l={},h=0,c=n.length;c>h;++h){var u=n[h],d=u[3];if(d)for(var p=d.length;--p>=0;)a[d.charAt(p)]=u;u=u[1],d=""+u,l.hasOwnProperty(d)||(s.push(u),l[d]=e)}s.push(/[\S\s]/),o=t(s)})();var l=r.length;return s}function o(t){var i=[],n=[];t.tripleQuotedStrings?i.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,e,"'\""]):t.multiLineStrings?i.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,e,"'\"`"]):i.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,e,"\"'"]),t.verbatimStrings&&n.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,e]);var r=t.hashComments;if(r&&(t.cStyleComments?(r>1?i.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,e,"#"]):i.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,e,"#"]),n.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,e])):i.push(["com",/^#[^\n\r]*/,e,"#"])),t.cStyleComments&&(n.push(["com",/^\/\/[^\n\r]*/,e]),n.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,e])),r=t.regexLiterals){var o=(r=r>1?"":"\n\r")?".":"[\\S\\s]";n.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+r+"])(?:[^/\\x5B\\x5C"+r+"]|\\x5C"+o+"|\\x5B(?:[^\\x5C\\x5D"+r+"]|\\x5C"+o+")*(?:\\x5D|$))+/")+")")])}return(r=t.types)&&n.push(["typ",r]),r=(""+t.keywords).replace(/^ | $/g,""),r.length&&n.push(["kwd",RegExp("^(?:"+r.replace(/[\s,]+/g,"|")+")\\b"),e]),i.push(["pln",/^\s+/,e," \r\n  "]),r="^.[^\\s\\w.$@'\"`/\\\\]*",t.regexLiterals&&(r+="(?!s*/)"),n.push(["lit",/^@[$_a-z][\w$@]*/i,e],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,e],["pln",/^[$_a-z][\w$@]*/i,e],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,e,"0123456789"],["pln",/^\\[\S\s]?/,e],["pun",RegExp(r),e]),s(i,n)}function a(e,t,i){function n(e){var t=e.nodeType;if(1!=t||s.test(e.className)){if((3==t||4==t)&&i){var l=e.nodeValue,h=l.match(o);h&&(t=l.substring(0,h.index),e.nodeValue=t,(l=l.substring(h.index+h[0].length))&&e.parentNode.insertBefore(a.createTextNode(l),e.nextSibling),r(e),t||e.parentNode.removeChild(e))}}else if("br"===e.nodeName)r(e),e.parentNode&&e.parentNode.removeChild(e);else for(e=e.firstChild;e;e=e.nextSibling)n(e)}function r(e){function t(e,i){var n=i?e.cloneNode(!1):e,r=e.parentNode;if(r){var r=t(r,1),s=e.nextSibling;r.appendChild(n);for(var o=s;o;o=s)s=o.nextSibling,r.appendChild(o)}return n}for(;!e.nextSibling;)if(e=e.parentNode,!e)return;for(var i,e=t(e.nextSibling,0);(i=e.parentNode)&&1===i.nodeType;)e=i;h.push(e)}for(var s=/(?:^|\s)nocode(?:\s|$)/,o=/\r\n?|\n/,a=e.ownerDocument,l=a.createElement("li");e.firstChild;)l.appendChild(e.firstChild);for(var h=[l],c=0;h.length>c;++c)n(h[c]);t===(0|t)&&h[0].setAttribute("value",t);var u=a.createElement("ol");u.className="linenums";for(var t=Math.max(0,0|t-1)||0,c=0,d=h.length;d>c;++c)l=h[c],l.className="L"+(c+t)%10,l.firstChild||l.appendChild(a.createTextNode(" ")),u.appendChild(l);e.appendChild(u)}function l(e,t){for(var i=t.length;--i>=0;){var n=t[i];w.hasOwnProperty(n)?u.console&&console.warn("cannot override language handler %s",n):w[n]=e}}function h(e,t){return e&&w.hasOwnProperty(e)||(e=/^\s*=+s[1],t=/\n/g,o=e.a,a=o.length,n=0,l=e.d,c=l.length,r=0,d=e.g,p=d.length,f=0;d[p]=a;var m,g;for(g=m=0;p>g;)d[g]!==d[g+2]?(d[m++]=d[g++],d[m++]=d[g++]):g+=2;for(p=m,g=m=0;p>g;){for(var y=d[g],v=d[g+1],b=g+2;p>=b+2&&d[b+1]===v;)b+=2;d[m++]=y,d[m++]=v,g=b}d.length=m;var L,x=e.c;x&&(L=x.style.display,x.style.display="none");try{for(;c>r;){var C,w=l[r+2]||a,S=d[f+2]||a,b=Math.min(w,S),O=l[r+1];if(1!==O.nodeType&&(C=o.substring(n,b))){s&&(C=C.replace(t,"\r")),O.nodeValue=C;var _=O.ownerDocument,E=_.createElement("span");E.className=d[f+1];var k=O.parentNode;k.replaceChild(E,O),E.appendChild(O),w>n&&(l[r+1]=O=_.createTextNode(o.substring(b,w)),k.insertBefore(O,E.nextSibling))}n=b,n>=w&&(r+=2),n>=S&&(f+=2)}}finally{x&&(x.style.display=L)}}catch(T){u.console&&console.log(T&&T.stack||T)}}var u=window,d=["break,continue,do,else,for,if,return,while"],p=[[d,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],f=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],m=[p,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],g=[m,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],p=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],y=[d,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],v=[d,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],b=[d,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],d=[d,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],L=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,x=/\S/,C=o({keywords:[f,g,p,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",y,v,d],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),w={};l(C,["default-code"]),l(s([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]),l(s([["pln",/^\s+/,e," \r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,e,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]),l(s([],[["atv",/^[\S\s]+/]]),["uq.val"]),l(o({keywords:f,hashComments:!0,cStyleComments:!0,types:L}),["c","cc","cpp","cxx","cyc","m"]),l(o({keywords:"null,true,false"}),["json"]),l(o({keywords:g,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:L}),["cs"]),l(o({keywords:m,cStyleComments:!0}),["java"]),l(o({keywords:d,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]),l(o({keywords:y,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]),l(o({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]),l(o({keywords:v,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]),l(o({keywords:p,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]),l(o({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]),l(o({keywords:b,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]),l(s([],[["str",/^[\S\s]+/]]),["regex"]);var S=u.PR={createSimpleLexer:s,registerLangHandler:l,sourceDecorator:o,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:u.prettyPrintOne=function(e,t,i){var n=document.createElement("div");return n.innerHTML="
    "+e+"
    ",n=n.firstChild,i&&a(n,i,!0),c({h:t,j:i,c:n,i:1}),n.innerHTML},prettyPrint:u.prettyPrint=function(t,i){function n(){for(var i=u.PR_SHOULD_USE_CONTINUATION?f.now()+250:1/0;l.length>g&&i>f.now();g++){for(var s=l[g],h=w,d=s;d=d.previousSibling;){var p=d.nodeType,S=(7===p||8===p)&&d.nodeValue;if(S?!/^\??prettify\b/.test(S):3!==p||/\S/.test(d.nodeValue))break;if(S){h={},S.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(e,t,i){h[t]=i});break}}if(d=s.className,(h!==w||v.test(d))&&!b.test(d)){for(p=!1,S=s.parentNode;S;S=S.parentNode)if(C.test(S.tagName)&&S.className&&v.test(S.className)){p=!0;break}if(!p){if(s.className+=" prettyprinted",p=h.lang,!p){var O,p=d.match(y);!p&&(O=r(s))&&x.test(O.tagName)&&(p=O.className.match(y)),p&&(p=p[1])}if(L.test(s.tagName))S=1;else var S=s.currentStyle,_=o.defaultView,S=(S=S?S.whiteSpace:_&&_.getComputedStyle?_.getComputedStyle(s,e).getPropertyValue("white-space"):0)&&"pre"===S.substring(0,3);_=h.linenums,(_="true"===_||+_)||(_=(_=d.match(/\blinenums\b(?::(\d+))?/))?_[1]&&_[1].length?+_[1]:!0:!1),_&&a(s,_,S),m={h:p,c:s,j:_,i:S},c(m)}}}l.length>g?setTimeout(n,250):"function"==typeof t&&t()}for(var s=i||document.body,o=s.ownerDocument||document,s=[s.getElementsByTagName("pre"),s.getElementsByTagName("code"),s.getElementsByTagName("xmp")],l=[],h=0;s.length>h;++h)for(var d=0,p=s[h].length;p>d;++d)l.push(s[h][d]);var s=e,f=Date;f.now||(f={now:function(){return+new Date}});var m,g=0,y=/\blang(?:uage)?-([\w.]+)(?!\S)/,v=/\bprettyprint\b/,b=/\bprettyprinted\b/,L=/pre|xmp/i,x=/^code$/i,C=/^(?:pre|code|xmp)$/i,w={};n()}};"function"==typeof define&&define.amd&&define("google-code-prettify",[],function(){return S})}()}(); \ No newline at end of file diff --git a/app/venders/react-0.14.0.js b/app/venders/react-0.14.0.js new file mode 100644 index 0000000..8e4bbee --- /dev/null +++ b/app/venders/react-0.14.0.js @@ -0,0 +1,16 @@ +/** + * React v0.14.0 + * + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.React=e()}}(function(){return function e(t,n,r){function o(i,u){if(!n[i]){if(!t[i]){var s="function"==typeof require&&require;if(!u&&s)return s(i,!0);if(a)return a(i,!0);var l=new Error("Cannot find module '"+i+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[i]={exports:{}};t[i][0].call(c.exports,function(e){var n=t[i][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[i].exports}for(var a="function"==typeof require&&require,i=0;i8&&11>=x),N=32,P=String.fromCharCode(N),w=f.topLevelTypes,R={beforeInput:{phasedRegistrationNames:{bubbled:C({onBeforeInput:null}),captured:C({onBeforeInputCapture:null})},dependencies:[w.topCompositionEnd,w.topKeyPress,w.topTextInput,w.topPaste]},compositionEnd:{phasedRegistrationNames:{bubbled:C({onCompositionEnd:null}),captured:C({onCompositionEndCapture:null})},dependencies:[w.topBlur,w.topCompositionEnd,w.topKeyDown,w.topKeyPress,w.topKeyUp,w.topMouseDown]},compositionStart:{phasedRegistrationNames:{bubbled:C({onCompositionStart:null}),captured:C({onCompositionStartCapture:null})},dependencies:[w.topBlur,w.topCompositionStart,w.topKeyDown,w.topKeyPress,w.topKeyUp,w.topMouseDown]},compositionUpdate:{phasedRegistrationNames:{bubbled:C({onCompositionUpdate:null}),captured:C({onCompositionUpdateCapture:null})},dependencies:[w.topBlur,w.topCompositionUpdate,w.topKeyDown,w.topKeyPress,w.topKeyUp,w.topMouseDown]}},I=!1,S=null,T={eventTypes:R,extractEvents:function(e,t,n,r,o){return[l(e,t,n,r,o),d(e,t,n,r,o)]}};t.exports=T},{127:127,145:145,15:15,19:19,20:20,88:88,92:92}],4:[function(e,t,n){"use strict";function r(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}var o={animationIterationCount:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,stopOpacity:!0,strokeDashoffset:!0,strokeOpacity:!0,strokeWidth:!0},a=["Webkit","ms","Moz","O"];Object.keys(o).forEach(function(e){a.forEach(function(t){o[r(t,e)]=o[e]})});var i={background:{backgroundAttachment:!0,backgroundColor:!0,backgroundImage:!0,backgroundPositionX:!0,backgroundPositionY:!0,backgroundRepeat:!0},backgroundPosition:{backgroundPositionX:!0,backgroundPositionY:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0},outline:{outlineWidth:!0,outlineStyle:!0,outlineColor:!0}},u={isUnitlessNumber:o,shorthandPropertyExpansions:i};t.exports=u},{}],5:[function(e,t,n){"use strict";var r=e(4),o=e(127),a=e(69),i=(e(129),e(102)),u=e(140),s=e(147),l=(e(150),s(function(e){return u(e)})),c=!1,p="cssFloat";if(o.canUseDOM){var d=document.createElement("div").style;try{d.font=""}catch(f){c=!0}void 0===document.documentElement.style.cssFloat&&(p="styleFloat")}var h={createMarkupForStyles:function(e){var t="";for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];null!=r&&(t+=l(n)+":",t+=i(n,r)+";")}return t||null},setValueForStyles:function(e,t){var n=e.style;for(var o in t)if(t.hasOwnProperty(o)){var a=i(o,t[o]);if("float"===o&&(o=p),a)n[o]=a;else{var u=c&&r.shorthandPropertyExpansions[o];if(u)for(var s in u)n[s]="";else n[o]=""}}}};a.measureMethods(h,"CSSPropertyOperations",{setValueForStyles:"setValueForStyles"}),t.exports=h},{102:102,127:127,129:129,140:140,147:147,150:150,4:4,69:69}],6:[function(e,t,n){"use strict";function r(){this._callbacks=null,this._contexts=null}var o=e(24),a=e(23),i=e(141);a(r.prototype,{enqueue:function(e,t){this._callbacks=this._callbacks||[],this._contexts=this._contexts||[],this._callbacks.push(e),this._contexts.push(t)},notifyAll:function(){var e=this._callbacks,t=this._contexts;if(e){e.length!==t.length?i(!1):void 0,this._callbacks=null,this._contexts=null;for(var n=0;n8));var A=!1;_.canUseDOM&&(A=M("input")&&(!("documentMode"in document)||document.documentMode>9));var L={get:function(){return k.get.call(this)},set:function(e){T=""+e,k.set.call(this,e)}},U={eventTypes:R,extractEvents:function(e,t,n,o,a){var i,u;if(r(t)?O?i=s:u=l:N(t)?A?i=f:(i=v,u=h):m(t)&&(i=g),i){var c=i(e,t,n);if(c){var p=x.getPooled(R.change,c,o,a);return p.type="change",b.accumulateTwoPhaseDispatches(p),p}}u&&u(e,t,n)}};t.exports=U},{111:111,116:116,117:117,127:127,145:145,15:15,16:16,19:19,81:81,90:90}],8:[function(e,t,n){"use strict";var r=0,o={createReactRootIndex:function(){return r++}};t.exports=o},{}],9:[function(e,t,n){"use strict";function r(e,t,n){var r=n>=e.childNodes.length?null:e.childNodes.item(n);e.insertBefore(t,r)}var o=e(12),a=e(65),i=e(69),u=e(121),s=e(122),l=e(141),c={dangerouslyReplaceNodeWithMarkup:o.dangerouslyReplaceNodeWithMarkup,updateTextContent:s,processUpdates:function(e,t){for(var n,i=null,c=null,p=0;pt||e.hasOverloadedBooleanValue&&t===!1}var a=e(10),i=e(69),u=e(119),s=(e(150),/^[a-zA-Z_][\w\.\-]*$/),l={},c={},p={createMarkupForID:function(e){return a.ID_ATTRIBUTE_NAME+"="+u(e)},setAttributeForID:function(e,t){e.setAttribute(a.ID_ATTRIBUTE_NAME,t)},createMarkupForProperty:function(e,t){var n=a.properties.hasOwnProperty(e)?a.properties[e]:null;if(n){if(o(n,t))return"";var r=n.attributeName;return n.hasBooleanValue||n.hasOverloadedBooleanValue&&t===!0?r+'=""':r+"="+u(t)}return a.isCustomAttribute(e)?null==t?"":e+"="+u(t):null},createMarkupForCustomAttribute:function(e,t){return r(e)&&null!=t?e+"="+u(t):""},setValueForProperty:function(e,t,n){var r=a.properties.hasOwnProperty(t)?a.properties[t]:null;if(r){var i=r.mutationMethod;if(i)i(e,n);else if(o(r,n))this.deleteValueForProperty(e,t);else if(r.mustUseAttribute){var u=r.attributeName,s=r.attributeNamespace;s?e.setAttributeNS(s,u,""+n):r.hasBooleanValue||r.hasOverloadedBooleanValue&&n===!0?e.setAttribute(u,""):e.setAttribute(u,""+n)}else{var l=r.propertyName;r.hasSideEffects&&""+e[l]==""+n||(e[l]=n)}}else a.isCustomAttribute(t)&&p.setValueForAttribute(e,t,n)},setValueForAttribute:function(e,t,n){r(t)&&(null==n?e.removeAttribute(t):e.setAttribute(t,""+n))},deleteValueForProperty:function(e,t){var n=a.properties.hasOwnProperty(t)?a.properties[t]:null;if(n){var r=n.mutationMethod;if(r)r(e,void 0);else if(n.mustUseAttribute)e.removeAttribute(n.attributeName);else{var o=n.propertyName,i=a.getDefaultValueForProperty(e.nodeName,o);n.hasSideEffects&&""+e[o]===i||(e[o]=i)}}else a.isCustomAttribute(t)&&e.removeAttribute(t)}};i.measureMethods(p,"DOMPropertyOperations",{setValueForProperty:"setValueForProperty",setValueForAttribute:"setValueForAttribute",deleteValueForProperty:"deleteValueForProperty"}),t.exports=p},{10:10,119:119,150:150,69:69}],12:[function(e,t,n){"use strict";function r(e){return e.substring(1,e.indexOf(" "))}var o=e(127),a=e(132),i=e(133),u=e(137),s=e(141),l=/^(<[^ \/>]+)/,c="data-danger-index",p={dangerouslyRenderMarkup:function(e){o.canUseDOM?void 0:s(!1);for(var t,n={},p=0;p-1?void 0:i(!1),!l.plugins[n]){t.extractEvents?void 0:i(!1),l.plugins[n]=t;var r=t.eventTypes;for(var a in r)o(r[a],t,a)?void 0:i(!1)}}}function o(e,t,n){l.eventNameDispatchConfigs.hasOwnProperty(n)?i(!1):void 0,l.eventNameDispatchConfigs[n]=e;var r=e.phasedRegistrationNames;if(r){for(var o in r)if(r.hasOwnProperty(o)){var u=r[o];a(u,t,n)}return!0}return e.registrationName?(a(e.registrationName,t,n),!0):!1}function a(e,t,n){l.registrationNameModules[e]?i(!1):void 0,l.registrationNameModules[e]=t,l.registrationNameDependencies[e]=t.eventTypes[n].dependencies}var i=e(141),u=null,s={},l={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},injectEventPluginOrder:function(e){u?i(!1):void 0,u=Array.prototype.slice.call(e),r()},injectEventPluginsByName:function(e){var t=!1;for(var n in e)if(e.hasOwnProperty(n)){var o=e[n];s.hasOwnProperty(n)&&s[n]===o||(s[n]?i(!1):void 0,s[n]=o,t=!0)}t&&r()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return l.registrationNameModules[t.registrationName]||null;for(var n in t.phasedRegistrationNames)if(t.phasedRegistrationNames.hasOwnProperty(n)){var r=l.registrationNameModules[t.phasedRegistrationNames[n]];if(r)return r}return null},_resetEventPlugins:function(){u=null;for(var e in s)s.hasOwnProperty(e)&&delete s[e];l.plugins.length=0;var t=l.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=l.registrationNameModules;for(var o in r)r.hasOwnProperty(o)&&delete r[o]}};t.exports=l},{141:141}],18:[function(e,t,n){"use strict";function r(e){return e===m.topMouseUp||e===m.topTouchEnd||e===m.topTouchCancel}function o(e){return e===m.topMouseMove||e===m.topTouchMove}function a(e){return e===m.topMouseDown||e===m.topTouchStart}function i(e,t,n,r){var o=e.type||"unknown-event";e.currentTarget=v.Mount.getNode(r),t?f.invokeGuardedCallbackWithCatch(o,n,e,r):f.invokeGuardedCallback(o,n,e,r),e.currentTarget=null}function u(e,t){var n=e._dispatchListeners,r=e._dispatchIDs;if(Array.isArray(n))for(var o=0;oe&&n[e]===o[e];e++);var i=r-e;for(t=1;i>=t&&n[r-t]===o[a-t];t++);var u=t>1?1-t:void 0;return this._fallbackText=o.slice(e,u),this._fallbackText}}),o.addPoolingTo(r),t.exports=r},{114:114,23:23,24:24}],21:[function(e,t,n){"use strict";var r,o=e(10),a=e(127),i=o.injection.MUST_USE_ATTRIBUTE,u=o.injection.MUST_USE_PROPERTY,s=o.injection.HAS_BOOLEAN_VALUE,l=o.injection.HAS_SIDE_EFFECTS,c=o.injection.HAS_NUMERIC_VALUE,p=o.injection.HAS_POSITIVE_NUMERIC_VALUE,d=o.injection.HAS_OVERLOADED_BOOLEAN_VALUE;if(a.canUseDOM){var f=document.implementation;r=f&&f.hasFeature&&f.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")}var h={isCustomAttribute:RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/),Properties:{accept:null,acceptCharset:null,accessKey:null,action:null,allowFullScreen:i|s,allowTransparency:i,alt:null,async:s,autoComplete:null,autoPlay:s,capture:i|s,cellPadding:null,cellSpacing:null,charSet:i,challenge:i,checked:u|s,classID:i,className:r?i:u,cols:i|p,colSpan:null,content:null,contentEditable:null,contextMenu:i,controls:u|s,coords:null,crossOrigin:null,data:null,dateTime:i,defer:s,dir:null,disabled:i|s,download:d,draggable:null,encType:null,form:i,formAction:i,formEncType:i,formMethod:i,formNoValidate:s,formTarget:i,frameBorder:i,headers:null,height:i,hidden:i|s,high:null,href:null,hrefLang:null,htmlFor:null,httpEquiv:null,icon:null,id:u,inputMode:i,is:i,keyParams:i,keyType:i,label:null,lang:null,list:i,loop:u|s,low:null,manifest:i,marginHeight:null,marginWidth:null,max:null,maxLength:i,media:i,mediaGroup:null,method:null,min:null,minLength:i,multiple:u|s,muted:u|s,name:null,noValidate:s,open:s,optimum:null,pattern:null,placeholder:null,poster:null,preload:null,radioGroup:null,readOnly:u|s,rel:null,required:s,role:i,rows:i|p,rowSpan:null,sandbox:null,scope:null,scoped:s,scrolling:null,seamless:i|s,selected:u|s,shape:null,size:i|p,sizes:i,span:p,spellCheck:null,src:null,srcDoc:u,srcSet:i,start:c,step:null,style:null,summary:null,tabIndex:null,target:null,title:null,type:null,useMap:null,value:u|l,width:i,wmode:i,wrap:null,about:i,datatype:i,inlist:i,prefix:i,property:i,resource:i,"typeof":i,vocab:i,autoCapitalize:null,autoCorrect:null,autoSave:null,itemProp:i,itemScope:i|s,itemType:i,itemID:i,itemRef:i,results:null,security:i,unselectable:i},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMPropertyNames:{autoCapitalize:"autocapitalize",autoComplete:"autocomplete",autoCorrect:"autocorrect",autoFocus:"autofocus",autoPlay:"autoplay",autoSave:"autosave",encType:"encoding",hrefLang:"hreflang",radioGroup:"radiogroup",spellCheck:"spellcheck",srcDoc:"srcdoc",srcSet:"srcset"}};t.exports=h},{10:10,127:127}],22:[function(e,t,n){"use strict";function r(e){null!=e.checkedLink&&null!=e.valueLink?l(!1):void 0}function o(e){r(e),null!=e.value||null!=e.onChange?l(!1):void 0}function a(e){r(e),null!=e.checked||null!=e.onChange?l(!1):void 0}function i(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}var u=e(72),s=e(71),l=e(141),c=(e(150),{button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0}),p={value:function(e,t,n){return!e[t]||c[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.")},checked:function(e,t,n){return!e[t]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.")},onChange:u.func},d={},f={checkPropTypes:function(e,t,n){for(var r in p){if(p.hasOwnProperty(r))var o=p[r](t,r,e,s.prop);o instanceof Error&&!(o.message in d)&&(d[o.message]=!0,i(n))}},getValue:function(e){return e.valueLink?(o(e),e.valueLink.value):e.value},getChecked:function(e){return e.checkedLink?(a(e),e.checkedLink.value):e.checked},executeOnChange:function(e,t){return e.valueLink?(o(e),e.valueLink.requestChange(t.target.value)):e.checkedLink?(a(e),e.checkedLink.requestChange(t.target.checked)):e.onChange?e.onChange.call(void 0,t):void 0}};t.exports=f},{141:141,150:150,71:71,72:72}],23:[function(e,t,n){"use strict";function r(e,t){if(null==e)throw new TypeError("Object.assign target cannot be null or undefined");for(var n=Object(e),r=Object.prototype.hasOwnProperty,o=1;o=0||null!=t.is}function m(e){h(e),this._tag=e.toLowerCase(),this._renderedChildren=null,this._previousStyle=null,this._previousStyleCopy=null,this._rootNodeID=null,this._wrapperState=null,this._topLevelWrapper=null,this._nodeWithLegacyProperties=null}var g=e(2),y=e(5),C=e(10),b=e(11),_=e(15),E=e(26),x=e(31),D=e(36),M=e(41),N=e(42),P=e(43),w=e(47),R=e(63),I=e(64),S=e(69),T=e(80),k=e(23),O=e(104),A=e(141),L=(e(116),e(145)),U=e(121),F=e(122),B=(e(148),e(125),e(150),E.deleteListener),V=E.listenTo,j=E.registrationNameModules,W={string:!0,number:!0},K=L({style:null}),H=1,q=!1;try{Object.defineProperty({},"test",{get:function(){}}),q=!0}catch(Y){}var z={topAbort:"abort",topCanPlay:"canplay",topCanPlayThrough:"canplaythrough",topDurationChange:"durationchange",topEmptied:"emptied",topEncrypted:"encrypted",topEnded:"ended",topError:"error",topLoadedData:"loadeddata",topLoadedMetadata:"loadedmetadata",topLoadStart:"loadstart",topPause:"pause",topPlay:"play",topPlaying:"playing",topProgress:"progress",topRateChange:"ratechange",topSeeked:"seeked",topSeeking:"seeking",topStalled:"stalled",topSuspend:"suspend",topTimeUpdate:"timeupdate",topVolumeChange:"volumechange",topWaiting:"waiting"},G={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},X={listing:!0,pre:!0,textarea:!0},Q=(k({menuitem:!0},G),/^[a-zA-Z][a-zA-Z:_\.\-\d]*$/),$={},Z={}.hasOwnProperty;m.displayName="ReactDOMComponent",m.Mixin={construct:function(e){this._currentElement=e},mountComponent:function(e,t,n){this._rootNodeID=e;var r=this._currentElement.props;switch(this._tag){case"iframe":case"img":case"form":case"video":case"audio":this._wrapperState={listeners:null},t.getReactMountReady().enqueue(p,this);break;case"button":r=D.getNativeProps(this,r,n);break;case"input":M.mountWrapper(this,r,n),r=M.getNativeProps(this,r,n);break;case"option":N.mountWrapper(this,r,n),r=N.getNativeProps(this,r,n);break;case"select":P.mountWrapper(this,r,n),r=P.getNativeProps(this,r,n),n=P.processChildContext(this,r,n);break;case"textarea":w.mountWrapper(this,r,n),r=w.getNativeProps(this,r,n)}s(this,r);var o;if(t.useCreateElement){var a=n[R.ownerDocumentContextKey],i=a.createElement(this._currentElement.type);b.setAttributeForID(i,this._rootNodeID),R.getID(i),this._updateDOMProperties({},r,t,i),this._createInitialChildren(t,r,n,i),o=i}else{var u=this._createOpenTagMarkupAndPutListeners(t,r),l=this._createContentMarkup(t,r,n);o=!l&&G[this._tag]?u+"/>":u+">"+l+""}switch(this._tag){case"input":t.getReactMountReady().enqueue(d,this);case"button":case"select":case"textarea":r.autoFocus&&t.getReactMountReady().enqueue(g.focusDOMComponent,this)}return o},_createOpenTagMarkupAndPutListeners:function(e,t){var n="<"+this._currentElement.type;for(var r in t)if(t.hasOwnProperty(r)){var o=t[r];if(null!=o)if(j.hasOwnProperty(r))o&&l(this._rootNodeID,r,o,e);else{r===K&&(o&&(o=this._previousStyleCopy=k({},t.style)),o=y.createMarkupForStyles(o));var a=null;a=null!=this._tag&&v(this._tag,t)?b.createMarkupForCustomAttribute(r,o):b.createMarkupForProperty(r,o),a&&(n+=" "+a)}}if(e.renderToStaticMarkup)return n;var i=b.createMarkupForID(this._rootNodeID);return n+" "+i},_createContentMarkup:function(e,t,n){var r="",o=t.dangerouslySetInnerHTML;if(null!=o)null!=o.__html&&(r=o.__html);else{var a=W[typeof t.children]?t.children:null,i=null!=a?null:t.children;if(null!=a)r=O(a);else if(null!=i){var u=this.mountChildren(i,e,n);r=u.join("")}}return X[this._tag]&&"\n"===r.charAt(0)?"\n"+r:r},_createInitialChildren:function(e,t,n,r){var o=t.dangerouslySetInnerHTML;if(null!=o)null!=o.__html&&U(r,o.__html);else{var a=W[typeof t.children]?t.children:null,i=null!=a?null:t.children;if(null!=a)F(r,a);else if(null!=i)for(var u=this.mountChildren(i,e,n),s=0;st.end?(n=t.end,r=t.start):(n=t.start,r=t.end),o.moveToElementText(e),o.moveStart("character",n),o.setEndPoint("EndToStart",o),o.moveEnd("character",r-n),o.select()}function u(e,t){if(window.getSelection){var n=window.getSelection(),r=e[c()].length,o=Math.min(t.start,r),a="undefined"==typeof t.end?o:Math.min(t.end,r);if(!n.extend&&o>a){var i=a;a=o,o=i}var u=l(e,o),s=l(e,a);if(u&&s){var p=document.createRange();p.setStart(u.node,u.offset),n.removeAllRanges(),o>a?(n.addRange(p),n.extend(s.node,s.offset)):(p.setEnd(s.node,s.offset),n.addRange(p))}}}var s=e(127),l=e(113),c=e(114),p=s.canUseDOM&&"selection"in document&&!("getSelection"in window),d={getOffsets:p?o:a,setOffsets:p?i:u};t.exports=d},{113:113,114:114,127:127}],45:[function(e,t,n){"use strict";var r=e(49),o=e(78),a=e(82);r.inject();var i={renderToString:o.renderToString,renderToStaticMarkup:o.renderToStaticMarkup,version:a};t.exports=i},{49:49,78:78,82:82}],46:[function(e,t,n){"use strict";var r=e(9),o=e(11),a=e(31),i=e(63),u=e(23),s=e(104),l=e(122),c=(e(125),function(e){});u(c.prototype,{construct:function(e){this._currentElement=e,this._stringText=""+e,this._rootNodeID=null,this._mountIndex=0},mountComponent:function(e,t,n){if(this._rootNodeID=e,t.useCreateElement){var r=n[i.ownerDocumentContextKey],a=r.createElement("span");return o.setAttributeForID(a,e),i.getID(a),l(a,this._stringText),a}var u=s(this._stringText);return t.renderToStaticMarkup?u:""+u+""},receiveComponent:function(e,t){if(e!==this._currentElement){this._currentElement=e;var n=""+e;if(n!==this._stringText){this._stringText=n;var o=i.getNode(this._rootNodeID);r.updateTextContent(o,n)}}},unmountComponent:function(){a.unmountIDFromEnvironment(this._rootNodeID)}}),t.exports=c},{104:104,11:11,122:122,125:125,23:23,31:31,63:63,9:9}],47:[function(e,t,n){"use strict";function r(){this._rootNodeID&&c.updateWrapper(this)}function o(e){var t=this._currentElement.props,n=a.executeOnChange(t,e);return u.asap(r,this),n}var a=e(22),i=e(40),u=e(81),s=e(23),l=e(141),c=(e(150),{getNativeProps:function(e,t,n){null!=t.dangerouslySetInnerHTML?l(!1):void 0;var r=s({},t,{defaultValue:void 0,value:void 0,children:e._wrapperState.initialValue,onChange:e._wrapperState.onChange});return r},mountWrapper:function(e,t){var n=t.defaultValue,r=t.children;null!=r&&(null!=n?l(!1):void 0,Array.isArray(r)&&(r.length<=1?void 0:l(!1),r=r[0]),n=""+r),null==n&&(n="");var i=a.getValue(t);e._wrapperState={initialValue:""+(null!=i?i:n),onChange:o.bind(e)}},updateWrapper:function(e){var t=e._currentElement.props,n=a.getValue(t);null!=n&&i.updatePropertyByID(e._rootNodeID,"value",""+n)}});t.exports=c},{141:141,150:150,22:22,23:23,40:40,81:81}],48:[function(e,t,n){"use strict";function r(){this.reinitializeTransaction()}var o=e(81),a=e(98),i=e(23),u=e(133),s={initialize:u,close:function(){d.isBatchingUpdates=!1}},l={initialize:u,close:o.flushBatchedUpdates.bind(o)},c=[l,s];i(r.prototype,a.Mixin,{getTransactionWrappers:function(){return c}});var p=new r,d={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,r,o,a){var i=d.isBatchingUpdates;d.isBatchingUpdates=!0,i?e(t,n,r,o,a):p.perform(e,null,t,n,r,o,a)}};t.exports=d},{133:133,23:23,81:81,98:98}],49:[function(e,t,n){"use strict";function r(){M||(M=!0,g.EventEmitter.injectReactEventListener(m),g.EventPluginHub.injectEventPluginOrder(u),g.EventPluginHub.injectInstanceHandle(y),g.EventPluginHub.injectMount(C),g.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:x,EnterLeaveEventPlugin:s,ChangeEventPlugin:a,SelectEventPlugin:_,BeforeInputEventPlugin:o}),g.NativeComponent.injectGenericComponentClass(h),g.NativeComponent.injectTextComponentClass(v),g.Class.injectMixin(p),g.DOMProperty.injectDOMPropertyConfig(c),g.DOMProperty.injectDOMPropertyConfig(D),g.EmptyComponent.injectEmptyComponent("noscript"),g.Updates.injectReconcileTransaction(b),g.Updates.injectBatchingStrategy(f),g.RootIndex.injectCreateReactRootIndex(l.canUseDOM?i.createReactRootIndex:E.createReactRootIndex),g.Component.injectEnvironment(d))}var o=e(3),a=e(7),i=e(8),u=e(13),s=e(14),l=e(127),c=e(21),p=e(25),d=e(31),f=e(48),h=e(37),v=e(46),m=e(56),g=e(57),y=e(59),C=e(63),b=e(73),_=e(84),E=e(85),x=e(86),D=e(83),M=!1;t.exports={inject:r}},{127:127,13:13,14:14,21:21,25:25,3:3,31:31,37:37,46:46,48:48,56:56,57:57,59:59,63:63,7:7,73:73,8:8,83:83,84:84,85:85,86:86}],50:[function(e,t,n){"use strict";var r=e(34),o=e(23),a="function"==typeof Symbol&&Symbol["for"]&&Symbol["for"]("react.element")||60103,i={key:!0,ref:!0,__self:!0,__source:!0},u=function(e,t,n,r,o,i,u){var s={$$typeof:a,type:e,key:t,ref:n,props:u,_owner:i};return s};u.createElement=function(e,t,n){var o,a={},s=null,l=null,c=null,p=null;if(null!=t){l=void 0===t.ref?null:t.ref,s=void 0===t.key?null:""+t.key,c=void 0===t.__self?null:t.__self,p=void 0===t.__source?null:t.__source;for(o in t)t.hasOwnProperty(o)&&!i.hasOwnProperty(o)&&(a[o]=t[o])}var d=arguments.length-2;if(1===d)a.children=n;else if(d>1){for(var f=Array(d),h=0;d>h;h++)f[h]=arguments[h+2];a.children=f}if(e&&e.defaultProps){var v=e.defaultProps;for(o in v)"undefined"==typeof a[o]&&(a[o]=v[o])}return u(e,s,l,c,p,r.current,a)},u.createFactory=function(e){var t=u.createElement.bind(null,e);return t.type=e,t},u.cloneAndReplaceKey=function(e,t){var n=u(e.type,t,e.ref,e._self,e._source,e._owner,e.props);return n},u.cloneAndReplaceProps=function(e,t){var n=u(e.type,e.key,e.ref,e._self,e._source,e._owner,t);return n},u.cloneElement=function(e,t,n){var a,s=o({},e.props),l=e.key,c=e.ref,p=e._self,d=e._source,f=e._owner;if(null!=t){void 0!==t.ref&&(c=t.ref,f=r.current),void 0!==t.key&&(l=""+t.key);for(a in t)t.hasOwnProperty(a)&&!i.hasOwnProperty(a)&&(s[a]=t[a])}var h=arguments.length-2;if(1===h)s.children=n;else if(h>1){for(var v=Array(h),m=0;h>m;m++)v[m]=arguments[m+2];s.children=v}return u(e.type,l,c,p,d,f,s)},u.isValidElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===a},t.exports=u},{23:23,34:34}],51:[function(e,t,n){"use strict";function r(){if(p.current){var e=p.current.getName();if(e)return" Check the render method of `"+e+"`."}return""}function o(e,t){e._store&&!e._store.validated&&null==e.key&&(e._store.validated=!0,a("uniqueKey",e,t))}function a(e,t,n){var o=r();if(!o){var a="string"==typeof n?n:n.displayName||n.name;a&&(o=" Check the top-level render call using <"+a+">.")}var i=h[e]||(h[e]={});if(i[o])return null;i[o]=!0;var u={parentOrOwner:o,url:" See https://fb.me/react-warning-keys for more information.",childOwner:null};return t&&t._owner&&t._owner!==p.current&&(u.childOwner=" It was passed a child from "+t._owner.getName()+"."),u}function i(e,t){if("object"==typeof e)if(Array.isArray(e))for(var n=0;n=i;i++)if(o(e,i)&&o(t,i))r=i;else if(e.charAt(i)!==t.charAt(i))break;var u=e.substr(0,r);return a(u)?void 0:d(!1),u}function c(e,t,n,r,o,a){e=e||"",t=t||"",e===t?d(!1):void 0;var l=i(t,e);l||i(e,t)?void 0:d(!1);for(var c=0,p=l?u:s,f=e;;f=p(f,t)){var h;if(o&&f===e||a&&f===t||(h=n(f,l,r)),h===!1||f===t)break;c++1){var t=e.indexOf(f,1);return t>-1?e.substr(0,t):e}return null},traverseEnterLeave:function(e,t,n,r,o){var a=l(e,t);a!==e&&c(e,a,n,r,!1,!0),a!==t&&c(a,t,n,o,!0,!1)},traverseTwoPhase:function(e,t,n){e&&(c("",e,t,n,!0,!1),c(e,"",t,n,!1,!0))},traverseTwoPhaseSkipTarget:function(e,t,n){e&&(c("",e,t,n,!0,!0),c(e,"",t,n,!0,!0))},traverseAncestors:function(e,t,n){c("",e,t,n,!0,!1)},getFirstCommonAncestorID:l,_getNextDescendantID:s,isAncestorIDOf:i,SEPARATOR:f};t.exports=m},{141:141,76:76}],60:[function(e,t,n){"use strict";var r={remove:function(e){e._reactInternalInstance=void 0},get:function(e){return e._reactInternalInstance},has:function(e){return void 0!==e._reactInternalInstance},set:function(e,t){e._reactInternalInstance=t}};t.exports=r},{}],61:[function(e,t,n){"use strict";var r=e(28),o=e(30),a=e(29),i=e(38),u=e(50),s=(e(51),e(72)),l=e(82),c=e(23),p=e(118),d=u.createElement,f=u.createFactory,h=u.cloneElement,v={Children:{map:r.map,forEach:r.forEach,count:r.count,toArray:r.toArray,only:p},Component:o,createElement:d,cloneElement:h,isValidElement:u.isValidElement,PropTypes:s,createClass:a.createClass,createFactory:f,createMixin:function(e){return e},DOM:i,version:l,__spread:c};t.exports=v},{118:118,23:23,28:28,29:29,30:30,38:38,50:50,51:51,72:72,82:82}],62:[function(e,t,n){"use strict";var r=e(101),o=/\/?>/,a={CHECKSUM_ATTR_NAME:"data-react-checksum",addChecksumToMarkup:function(e){var t=r(e);return e.replace(o," "+a.CHECKSUM_ATTR_NAME+'="'+t+'"$&')},canReuseMarkup:function(e,t){var n=t.getAttribute(a.CHECKSUM_ATTR_NAME);n=n&&parseInt(n,10);var o=r(e);return o===n}};t.exports=a},{101:101}],63:[function(e,t,n){"use strict";function r(e,t){for(var n=Math.min(e.length,t.length),r=0;n>r;r++)if(e.charAt(r)!==t.charAt(r))return r;return e.length===t.length?-1:n}function o(e){return e?e.nodeType===W?e.documentElement:e.firstChild:null}function a(e){var t=o(e);return t&&Q.getID(t)}function i(e){var t=u(e);if(t)if(V.hasOwnProperty(t)){var n=V[t];n!==e&&(p(n,t)?L(!1):void 0,V[t]=e)}else V[t]=e;return t}function u(e){return e&&e.getAttribute&&e.getAttribute(B)||""}function s(e,t){var n=u(e);n!==t&&delete V[n],e.setAttribute(B,t),V[t]=e}function l(e){return V.hasOwnProperty(e)&&p(V[e],e)||(V[e]=Q.findReactNodeByID(e)),V[e]}function c(e){var t=N.get(e)._rootNodeID;return D.isNullComponentID(t)?null:(V.hasOwnProperty(t)&&p(V[t],t)||(V[t]=Q.findReactNodeByID(t)),V[t])}function p(e,t){if(e){u(e)!==t?L(!1):void 0;var n=Q.findReactContainerForID(t);if(n&&O(n,e))return!0}return!1}function d(e){delete V[e]}function f(e){var t=V[e];return t&&p(t,e)?void(G=t):!1}function h(e){G=null,M.traverseAncestors(e,f);var t=G;return G=null,t}function v(e,t,n,r,o,a){E.useCreateElement&&(a=T({},a),n.nodeType===W?a[H]=n:a[H]=n.ownerDocument);var i=R.mountComponent(e,t,r,a);e._renderedComponent._topLevelWrapper=e,Q._mountImageIntoNode(i,n,o,r)}function m(e,t,n,r,o){var a=S.ReactReconcileTransaction.getPooled(r);a.perform(v,null,e,t,n,a,r,o),S.ReactReconcileTransaction.release(a)}function g(e,t){for(R.unmountComponent(e),t.nodeType===W&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)}function y(e){var t=a(e);return t?t!==M.getReactRootIDFromNodeID(t):!1}function C(e){for(;e&&e.parentNode!==e;e=e.parentNode)if(1===e.nodeType){var t=u(e);if(t){var n,r=M.getReactRootIDFromNodeID(t),o=e;do if(n=u(o),o=o.parentNode,null==o)return null;while(n!==r);if(o===Y[r])return e}}return null}var b=e(10),_=e(26),E=(e(34),e(39)),x=e(50),D=e(53),M=e(59),N=e(60),P=e(62),w=e(69),R=e(74),I=e(80),S=e(81),T=e(23),k=e(134),O=e(130),A=e(115),L=e(141),U=e(121),F=e(123),B=(e(125),e(150),b.ID_ATTRIBUTE_NAME),V={},j=1,W=9,K=11,H="__ReactMount_ownerDocument$"+Math.random().toString(36).slice(2),q={},Y={},z=[],G=null,X=function(){};X.prototype.isReactComponent={},X.prototype.render=function(){return this.props};var Q={TopLevelWrapper:X,_instancesByReactRootID:q,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,r){return Q.scrollMonitor(n,function(){I.enqueueElementInternal(e,t),r&&I.enqueueCallbackInternal(e,r)}),e},_registerComponent:function(e,t){!t||t.nodeType!==j&&t.nodeType!==W&&t.nodeType!==K?L(!1):void 0,_.ensureScrollValueMonitoring();var n=Q.registerContainer(t);return q[n]=e,n},_renderNewRootComponent:function(e,t,n,r){var o=A(e,null),a=Q._registerComponent(o,t);return S.batchedUpdates(m,o,a,t,n,r),o},renderSubtreeIntoContainer:function(e,t,n,r){return null==e||null==e._reactInternalInstance?L(!1):void 0,Q._renderSubtreeIntoContainer(e,t,n,r)},_renderSubtreeIntoContainer:function(e,t,n,r){x.isValidElement(t)?void 0:L(!1);var i=new x(X,null,null,null,null,null,t),s=q[a(n)];if(s){var l=s._currentElement,c=l.props;if(F(c,t))return Q._updateRootComponent(s,i,n,r)._renderedComponent.getPublicInstance();Q.unmountComponentAtNode(n)}var p=o(n),d=p&&!!u(p),f=y(n),h=d&&!s&&!f,v=Q._renderNewRootComponent(i,n,h,null!=e?e._reactInternalInstance._processChildContext(e._reactInternalInstance._context):k)._renderedComponent.getPublicInstance();return r&&r.call(v),v},render:function(e,t,n){return Q._renderSubtreeIntoContainer(null,e,t,n)},registerContainer:function(e){var t=a(e);return t&&(t=M.getReactRootIDFromNodeID(t)),t||(t=M.createReactRootID()),Y[t]=e,t},unmountComponentAtNode:function(e){!e||e.nodeType!==j&&e.nodeType!==W&&e.nodeType!==K?L(!1):void 0;var t=a(e),n=q[t];if(!n){var r=(y(e),u(e));return r&&r===M.getReactRootIDFromNodeID(r),!1}return S.batchedUpdates(g,n,e),delete q[t],delete Y[t],!0},findReactContainerForID:function(e){var t=M.getReactRootIDFromNodeID(e),n=Y[t];return n},findReactNodeByID:function(e){var t=Q.findReactContainerForID(e);return Q.findComponentRoot(t,e)},getFirstReactDOM:function(e){return C(e)},findComponentRoot:function(e,t){var n=z,r=0,o=h(t)||e;for(n[0]=o.firstChild,n.length=1;r>"}var y=e(50),C=e(70),b=e(133),_=e(112),E="<>",x={array:o("array"),bool:o("boolean"),func:o("function"),number:o("number"),object:o("object"),string:o("string"),any:a(),arrayOf:i,element:u(),instanceOf:s,node:d(),objectOf:c,oneOf:l,oneOfType:p,shape:f};t.exports=x},{112:112,133:133,50:50,70:70}],73:[function(e,t,n){"use strict";function r(e){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=o.getPooled(null),this.useCreateElement=!e&&u.useCreateElement}var o=e(6),a=e(24),i=e(26),u=e(39),s=e(58),l=e(98),c=e(23),p={initialize:s.getSelectionInformation,close:s.restoreSelection},d={initialize:function(){var e=i.isEnabled();return i.setEnabled(!1),e},close:function(e){i.setEnabled(e)}},f={initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}},h=[p,d,f],v={getTransactionWrappers:function(){return h},getReactMountReady:function(){return this.reactMountReady},destructor:function(){o.release(this.reactMountReady),this.reactMountReady=null}};c(r.prototype,l.Mixin,v),a.addPoolingTo(r),t.exports=r},{23:23,24:24,26:26,39:39,58:58,6:6,98:98}],74:[function(e,t,n){"use strict";function r(){o.attachRefs(this,this._currentElement)}var o=e(75),a={mountComponent:function(e,t,n,o){var a=e.mountComponent(t,n,o);return e._currentElement&&null!=e._currentElement.ref&&n.getReactMountReady().enqueue(r,e),a},unmountComponent:function(e){o.detachRefs(e,e._currentElement),e.unmountComponent()},receiveComponent:function(e,t,n,a){var i=e._currentElement;if(t!==i||a!==e._context){var u=o.shouldUpdateRefs(i,t);u&&o.detachRefs(e,i),e.receiveComponent(t,n,a),u&&e._currentElement&&null!=e._currentElement.ref&&n.getReactMountReady().enqueue(r,e)}},performUpdateIfNecessary:function(e,t){e.performUpdateIfNecessary(t)}};t.exports=a},{75:75}],75:[function(e,t,n){"use strict"; +function r(e,t,n){"function"==typeof e?e(t.getPublicInstance()):a.addComponentAsRefTo(t,e,n)}function o(e,t,n){"function"==typeof e?e(null):a.removeComponentAsRefFrom(t,e,n)}var a=e(68),i={};i.attachRefs=function(e,t){if(null!==t&&t!==!1){var n=t.ref;null!=n&&r(n,e,t._owner)}},i.shouldUpdateRefs=function(e,t){var n=null===e||e===!1,r=null===t||t===!1;return n||r||t._owner!==e._owner||t.ref!==e.ref},i.detachRefs=function(e,t){if(null!==t&&t!==!1){var n=t.ref;null!=n&&o(n,e,t._owner)}},t.exports=i},{68:68}],76:[function(e,t,n){"use strict";var r={injectCreateReactRootIndex:function(e){o.createReactRootIndex=e}},o={createReactRootIndex:null,injection:r};t.exports=o},{}],77:[function(e,t,n){"use strict";var r={isBatchingUpdates:!1,batchedUpdates:function(e){}};t.exports=r},{}],78:[function(e,t,n){"use strict";function r(e){i.isValidElement(e)?void 0:h(!1);var t;try{p.injection.injectBatchingStrategy(l);var n=u.createReactRootID();return t=c.getPooled(!1),t.perform(function(){var r=f(e,null),o=r.mountComponent(n,t,d);return s.addChecksumToMarkup(o)},null)}finally{c.release(t),p.injection.injectBatchingStrategy(a)}}function o(e){i.isValidElement(e)?void 0:h(!1);var t;try{p.injection.injectBatchingStrategy(l);var n=u.createReactRootID();return t=c.getPooled(!0),t.perform(function(){var r=f(e,null);return r.mountComponent(n,t,d)},null)}finally{c.release(t),p.injection.injectBatchingStrategy(a)}}var a=e(48),i=e(50),u=e(59),s=e(62),l=e(77),c=e(79),p=e(81),d=e(134),f=e(115),h=e(141);t.exports={renderToString:r,renderToStaticMarkup:o}},{115:115,134:134,141:141,48:48,50:50,59:59,62:62,77:77,79:79,81:81}],79:[function(e,t,n){"use strict";function r(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.reactMountReady=a.getPooled(null),this.useCreateElement=!1}var o=e(24),a=e(6),i=e(98),u=e(23),s=e(133),l={initialize:function(){this.reactMountReady.reset()},close:s},c=[l],p={getTransactionWrappers:function(){return c},getReactMountReady:function(){return this.reactMountReady},destructor:function(){a.release(this.reactMountReady),this.reactMountReady=null}};u(r.prototype,i.Mixin,p),o.addPoolingTo(r),t.exports=r},{133:133,23:23,24:24,6:6,98:98}],80:[function(e,t,n){"use strict";function r(e){u.enqueueUpdate(e)}function o(e,t){var n=i.get(e);return n?n:null}var a=(e(34),e(50)),i=e(60),u=e(81),s=e(23),l=e(141),c=(e(150),{isMounted:function(e){var t=i.get(e);return t?!!t._renderedComponent:!1},enqueueCallback:function(e,t){"function"!=typeof t?l(!1):void 0;var n=o(e);return n?(n._pendingCallbacks?n._pendingCallbacks.push(t):n._pendingCallbacks=[t],void r(n)):null},enqueueCallbackInternal:function(e,t){"function"!=typeof t?l(!1):void 0,e._pendingCallbacks?e._pendingCallbacks.push(t):e._pendingCallbacks=[t],r(e)},enqueueForceUpdate:function(e){var t=o(e,"forceUpdate");t&&(t._pendingForceUpdate=!0,r(t))},enqueueReplaceState:function(e,t){var n=o(e,"replaceState");n&&(n._pendingStateQueue=[t],n._pendingReplaceState=!0,r(n))},enqueueSetState:function(e,t){var n=o(e,"setState");if(n){var a=n._pendingStateQueue||(n._pendingStateQueue=[]);a.push(t),r(n)}},enqueueSetProps:function(e,t){var n=o(e,"setProps");n&&c.enqueueSetPropsInternal(n,t)},enqueueSetPropsInternal:function(e,t){var n=e._topLevelWrapper;n?void 0:l(!1);var o=n._pendingElement||n._currentElement,i=o.props,u=s({},i.props,t);n._pendingElement=a.cloneAndReplaceProps(o,a.cloneAndReplaceProps(i,u)),r(n)},enqueueReplaceProps:function(e,t){var n=o(e,"replaceProps");n&&c.enqueueReplacePropsInternal(n,t)},enqueueReplacePropsInternal:function(e,t){var n=e._topLevelWrapper;n?void 0:l(!1);var o=n._pendingElement||n._currentElement,i=o.props;n._pendingElement=a.cloneAndReplaceProps(o,a.cloneAndReplaceProps(i,t)),r(n)},enqueueElementInternal:function(e,t){e._pendingElement=t,r(e)}});t.exports=c},{141:141,150:150,23:23,34:34,50:50,60:60,81:81}],81:[function(e,t,n){"use strict";function r(){N.ReactReconcileTransaction&&b?void 0:m(!1)}function o(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=c.getPooled(),this.reconcileTransaction=N.ReactReconcileTransaction.getPooled(!1)}function a(e,t,n,o,a,i){r(),b.batchedUpdates(e,t,n,o,a,i)}function i(e,t){return e._mountOrder-t._mountOrder}function u(e){var t=e.dirtyComponentsLength;t!==g.length?m(!1):void 0,g.sort(i);for(var n=0;t>n;n++){var r=g[n],o=r._pendingCallbacks;if(r._pendingCallbacks=null,f.performUpdateIfNecessary(r,e.reconcileTransaction),o)for(var a=0;ar;){for(;rr;r++)n+=t+=e.charCodeAt(r);return t%=o,n%=o,t|n<<16}var o=65521;t.exports=r},{}],102:[function(e,t,n){"use strict";function r(e,t){var n=null==t||"boolean"==typeof t||""===t;if(n)return"";var r=isNaN(t);return r||0===t||a.hasOwnProperty(e)&&a[e]?""+t:("string"==typeof t&&(t=t.trim()),t+"px")}var o=e(4),a=o.isUnitlessNumber;t.exports=r},{4:4}],103:[function(e,t,n){"use strict";function r(e,t,n,r,o){return o}e(23),e(150);t.exports=r},{150:150,23:23}],104:[function(e,t,n){"use strict";function r(e){return a[e]}function o(e){return(""+e).replace(i,r)}var a={"&":"&",">":">","<":"<",'"':""","'":"'"},i=/[&><"']/g;t.exports=o},{}],105:[function(e,t,n){"use strict";function r(e){return null==e?null:1===e.nodeType?e:o.has(e)?a.getNodeFromInstance(e):(null!=e.render&&"function"==typeof e.render?i(!1):void 0,void i(!1))}var o=(e(34),e(60)),a=e(63),i=e(141);e(150);t.exports=r},{141:141,150:150,34:34,60:60,63:63}],106:[function(e,t,n){"use strict";function r(e,t,n){var r=e,o=void 0===r[n];o&&null!=t&&(r[n]=t)}function o(e){if(null==e)return e;var t={};return a(e,r,t),t}var a=e(124);e(150);t.exports=o},{124:124,150:150}],107:[function(e,t,n){"use strict";var r=function(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)};t.exports=r},{}],108:[function(e,t,n){"use strict";function r(e){var t,n=e.keyCode;return"charCode"in e?(t=e.charCode,0===t&&13===n&&(t=13)):t=n,t>=32||13===t?t:0}t.exports=r},{}],109:[function(e,t,n){"use strict";function r(e){if(e.key){var t=a[e.key]||e.key;if("Unidentified"!==t)return t}if("keypress"===e.type){var n=o(e);return 13===n?"Enter":String.fromCharCode(n)}return"keydown"===e.type||"keyup"===e.type?i[e.keyCode]||"Unidentified":""}var o=e(108),a={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},i={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"};t.exports=r},{108:108}],110:[function(e,t,n){"use strict";function r(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n.getModifierState(e);var r=a[e];return r?!!n[r]:!1}function o(e){return r}var a={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};t.exports=o},{}],111:[function(e,t,n){"use strict";function r(e){var t=e.target||e.srcElement||window;return 3===t.nodeType?t.parentNode:t}t.exports=r},{}],112:[function(e,t,n){"use strict";function r(e){var t=e&&(o&&e[o]||e[a]);return"function"==typeof t?t:void 0}var o="function"==typeof Symbol&&Symbol.iterator,a="@@iterator";t.exports=r},{}],113:[function(e,t,n){"use strict";function r(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function o(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}function a(e,t){for(var n=r(e),a=0,i=0;n;){if(3===n.nodeType){if(i=a+n.textContent.length,t>=a&&i>=t)return{node:n,offset:t-a};a=i}n=r(o(n))}}t.exports=a},{}],114:[function(e,t,n){"use strict";function r(){return!a&&o.canUseDOM&&(a="textContent"in document.documentElement?"textContent":"innerText"),a}var o=e(127),a=null;t.exports=r},{127:127}],115:[function(e,t,n){"use strict";function r(e){return"function"==typeof e&&"undefined"!=typeof e.prototype&&"function"==typeof e.prototype.mountComponent&&"function"==typeof e.prototype.receiveComponent}function o(e){var t;if(null===e||e===!1)t=new i(o);else if("object"==typeof e){var n=e;!n||"function"!=typeof n.type&&"string"!=typeof n.type?l(!1):void 0,t="string"==typeof n.type?u.createInternalComponent(n):r(n.type)?new n.type(n):new c}else"string"==typeof e||"number"==typeof e?t=u.createInstanceForText(e):l(!1);return t.construct(e),t._mountIndex=0,t._mountImage=null,t}var a=e(33),i=e(52),u=e(66),s=e(23),l=e(141),c=(e(150),function(){});s(c.prototype,a.Mixin,{_instantiateReactComponent:o}),t.exports=o},{141:141,150:150,23:23,33:33,52:52,66:66}],116:[function(e,t,n){"use strict";function r(e,t){if(!a.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,r=n in document;if(!r){var i=document.createElement("div");i.setAttribute(n,"return;"),r="function"==typeof i[n]}return!r&&o&&"wheel"===e&&(r=document.implementation.hasFeature("Events.wheel","3.0")),r}var o,a=e(127);a.canUseDOM&&(o=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature("","")!==!0),t.exports=r},{127:127}],117:[function(e,t,n){"use strict";function r(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&o[e.type]||"textarea"===t)}var o={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};t.exports=r},{}],118:[function(e,t,n){"use strict";function r(e){return o.isValidElement(e)?void 0:a(!1),e}var o=e(50),a=e(141);t.exports=r},{141:141,50:50}],119:[function(e,t,n){"use strict";function r(e){return'"'+o(e)+'"'}var o=e(104);t.exports=r},{104:104}],120:[function(e,t,n){"use strict";var r=e(63);t.exports=r.renderSubtreeIntoContainer},{63:63}],121:[function(e,t,n){"use strict";var r=e(127),o=/^[ \r\n\t\f]/,a=/<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/,i=function(e,t){e.innerHTML=t};if("undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction&&(i=function(e,t){MSApp.execUnsafeLocalFunction(function(){e.innerHTML=t})}),r.canUseDOM){var u=document.createElement("div");u.innerHTML=" ",""===u.innerHTML&&(i=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),o.test(t)||"<"===t[0]&&a.test(t)){e.innerHTML=String.fromCharCode(65279)+t;var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t})}t.exports=i},{127:127}],122:[function(e,t,n){"use strict";var r=e(127),o=e(104),a=e(121),i=function(e,t){e.textContent=t};r.canUseDOM&&("textContent"in document.documentElement||(i=function(e,t){a(e,o(t))})),t.exports=i},{104:104,121:121,127:127}],123:[function(e,t,n){"use strict";function r(e,t){var n=null===e||e===!1,r=null===t||t===!1;if(n||r)return n===r;var o=typeof e,a=typeof t;return"string"===o||"number"===o?"string"===a||"number"===a:"object"===a&&e.type===t.type&&e.key===t.key}t.exports=r},{}],124:[function(e,t,n){"use strict";function r(e){return v[e]}function o(e,t){return e&&null!=e.key?i(e.key):t.toString(36)}function a(e){return(""+e).replace(m,r)}function i(e){return"$"+a(e)}function u(e,t,n,r){var a=typeof e;if(("undefined"===a||"boolean"===a)&&(e=null),null===e||"string"===a||"number"===a||l.isValidElement(e))return n(r,e,""===t?f+o(e,0):t),1;var s,c,v=0,m=""===t?f:t+h;if(Array.isArray(e))for(var g=0;g":i.innerHTML="<"+e+">",u[e]=!i.firstChild),u[e]?d[e]:null}var o=e(127),a=e(141),i=o.canUseDOM?document.createElement("div"):null,u={},s=[1,'"],l=[1,"","
    "],c=[3,"","
    "],p=[1,'',""],d={"*":[1,"?
    ","
    "],area:[1,"",""],col:[2,"","
    "],legend:[1,"
    ","
    "],param:[1,"",""],tr:[2,"","
    "],optgroup:s,option:s,caption:l,colgroup:l,tbody:l,tfoot:l,thead:l,td:c,th:c},f=["circle","clipPath","defs","ellipse","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","text","tspan"];f.forEach(function(e){d[e]=p,u[e]=!0}),t.exports=r},{127:127,141:141}],138:[function(e,t,n){"use strict";function r(e){return e===window?{x:window.pageXOffset||document.documentElement.scrollLeft,y:window.pageYOffset||document.documentElement.scrollTop}:{x:e.scrollLeft,y:e.scrollTop}}t.exports=r},{}],139:[function(e,t,n){"use strict";function r(e){return e.replace(o,"-$1").toLowerCase()}var o=/([A-Z])/g;t.exports=r},{}],140:[function(e,t,n){"use strict";function r(e){return o(e).replace(a,"-ms-")}var o=e(139),a=/^ms-/;t.exports=r},{139:139}],141:[function(e,t,n){"use strict";var r=function(e,t,n,r,o,a,i,u){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,r,o,a,i,u],c=0;s=new Error("Invariant Violation: "+t.replace(/%s/g,function(){return l[c++]}))}throw s.framesToPop=1,s}};t.exports=r},{}],142:[function(e,t,n){"use strict";function r(e){return!(!e||!("function"==typeof Node?e instanceof Node:"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName))}t.exports=r},{}],143:[function(e,t,n){"use strict";function r(e){return o(e)&&3==e.nodeType}var o=e(142);t.exports=r},{142:142}],144:[function(e,t,n){"use strict";var r=e(141),o=function(e){var t,n={};e instanceof Object&&!Array.isArray(e)?void 0:r(!1);for(t in e)e.hasOwnProperty(t)&&(n[t]=t);return n};t.exports=o},{141:141}],145:[function(e,t,n){"use strict";var r=function(e){var t;for(t in e)if(e.hasOwnProperty(t))return t;return null};t.exports=r},{}],146:[function(e,t,n){"use strict";function r(e,t,n){if(!e)return null;var r={};for(var a in e)o.call(e,a)&&(r[a]=t.call(n,e[a],a,e));return r}var o=Object.prototype.hasOwnProperty;t.exports=r},{}],147:[function(e,t,n){"use strict";function r(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n]}}t.exports=r},{}],148:[function(e,t,n){"use strict";function r(e,t){if(e===t)return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(var a=o.bind(t),i=0;ia;a++)r[a]=e[a];return r}var o=e(141);t.exports=r},{141:141}],150:[function(e,t,n){"use strict";var r=e(133),o=r;t.exports=o},{133:133}]},{},[1])(1)}); \ No newline at end of file diff --git a/app/venders/react-dom-0.14.0.js b/app/venders/react-dom-0.14.0.js new file mode 100644 index 0000000..43c53e2 --- /dev/null +++ b/app/venders/react-dom-0.14.0.js @@ -0,0 +1,12 @@ +/** + * ReactDOM v0.14.0 + * + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e(require("react"));else if("function"==typeof define&&define.amd)define(["react"],e);else{var f;f="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,f.ReactDOM=e(f.React)}}(function(e){return e.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED}); \ No newline at end of file diff --git a/docs/src/fonts/PTMono.woff2 b/docs/src/fonts/PTMono.woff2 new file mode 100644 index 0000000..c91f19f Binary files /dev/null and b/docs/src/fonts/PTMono.woff2 differ diff --git a/docs/src/fonts/Raleway.woff2 b/docs/src/fonts/Raleway.woff2 new file mode 100644 index 0000000..49afed4 Binary files /dev/null and b/docs/src/fonts/Raleway.woff2 differ diff --git a/docs/src/images/flags/ad.png b/docs/src/images/flags/ad.png new file mode 100644 index 0000000..625ca84 Binary files /dev/null and b/docs/src/images/flags/ad.png differ diff --git a/docs/src/images/flags/ae.png b/docs/src/images/flags/ae.png new file mode 100644 index 0000000..ef3a1ec Binary files /dev/null and b/docs/src/images/flags/ae.png differ diff --git a/docs/src/images/flags/af.png b/docs/src/images/flags/af.png new file mode 100644 index 0000000..a4742e2 Binary files /dev/null and b/docs/src/images/flags/af.png differ diff --git a/docs/src/images/flags/ag.png b/docs/src/images/flags/ag.png new file mode 100644 index 0000000..556d550 Binary files /dev/null and b/docs/src/images/flags/ag.png differ diff --git a/docs/src/images/flags/ai.png b/docs/src/images/flags/ai.png new file mode 100644 index 0000000..74ed29d Binary files /dev/null and b/docs/src/images/flags/ai.png differ diff --git a/docs/src/images/flags/al.png b/docs/src/images/flags/al.png new file mode 100644 index 0000000..92354cb Binary files /dev/null and b/docs/src/images/flags/al.png differ diff --git a/docs/src/images/flags/am.png b/docs/src/images/flags/am.png new file mode 100644 index 0000000..344a2a8 Binary files /dev/null and b/docs/src/images/flags/am.png differ diff --git a/docs/src/images/flags/an.png b/docs/src/images/flags/an.png new file mode 100644 index 0000000..633e4b8 Binary files /dev/null and b/docs/src/images/flags/an.png differ diff --git a/docs/src/images/flags/ao.png b/docs/src/images/flags/ao.png new file mode 100644 index 0000000..bcbd1d6 Binary files /dev/null and b/docs/src/images/flags/ao.png differ diff --git a/docs/src/images/flags/ar.png b/docs/src/images/flags/ar.png new file mode 100644 index 0000000..e5ef8f1 Binary files /dev/null and b/docs/src/images/flags/ar.png differ diff --git a/docs/src/images/flags/as.png b/docs/src/images/flags/as.png new file mode 100644 index 0000000..32f30e4 Binary files /dev/null and b/docs/src/images/flags/as.png differ diff --git a/docs/src/images/flags/at.png b/docs/src/images/flags/at.png new file mode 100644 index 0000000..0f15f34 Binary files /dev/null and b/docs/src/images/flags/at.png differ diff --git a/docs/src/images/flags/au.png b/docs/src/images/flags/au.png new file mode 100644 index 0000000..a01389a Binary files /dev/null and b/docs/src/images/flags/au.png differ diff --git a/docs/src/images/flags/aw.png b/docs/src/images/flags/aw.png new file mode 100644 index 0000000..a3579c2 Binary files /dev/null and b/docs/src/images/flags/aw.png differ diff --git a/docs/src/images/flags/ax.png b/docs/src/images/flags/ax.png new file mode 100644 index 0000000..1eea80a Binary files /dev/null and b/docs/src/images/flags/ax.png differ diff --git a/docs/src/images/flags/az.png b/docs/src/images/flags/az.png new file mode 100644 index 0000000..4ee9fe5 Binary files /dev/null and b/docs/src/images/flags/az.png differ diff --git a/docs/src/images/flags/ba.png b/docs/src/images/flags/ba.png new file mode 100644 index 0000000..c774992 Binary files /dev/null and b/docs/src/images/flags/ba.png differ diff --git a/docs/src/images/flags/bb.png b/docs/src/images/flags/bb.png new file mode 100644 index 0000000..0df19c7 Binary files /dev/null and b/docs/src/images/flags/bb.png differ diff --git a/docs/src/images/flags/bd.png b/docs/src/images/flags/bd.png new file mode 100644 index 0000000..076a8bf Binary files /dev/null and b/docs/src/images/flags/bd.png differ diff --git a/docs/src/images/flags/be.png b/docs/src/images/flags/be.png new file mode 100644 index 0000000..d86ebc8 Binary files /dev/null and b/docs/src/images/flags/be.png differ diff --git a/docs/src/images/flags/bf.png b/docs/src/images/flags/bf.png new file mode 100644 index 0000000..ab5ce8f Binary files /dev/null and b/docs/src/images/flags/bf.png differ diff --git a/docs/src/images/flags/bg.png b/docs/src/images/flags/bg.png new file mode 100644 index 0000000..0469f06 Binary files /dev/null and b/docs/src/images/flags/bg.png differ diff --git a/docs/src/images/flags/bh.png b/docs/src/images/flags/bh.png new file mode 100644 index 0000000..ea8ce68 Binary files /dev/null and b/docs/src/images/flags/bh.png differ diff --git a/docs/src/images/flags/bi.png b/docs/src/images/flags/bi.png new file mode 100644 index 0000000..5cc2e30 Binary files /dev/null and b/docs/src/images/flags/bi.png differ diff --git a/docs/src/images/flags/bj.png b/docs/src/images/flags/bj.png new file mode 100644 index 0000000..1cc8b45 Binary files /dev/null and b/docs/src/images/flags/bj.png differ diff --git a/docs/src/images/flags/bm.png b/docs/src/images/flags/bm.png new file mode 100644 index 0000000..c0c7aea Binary files /dev/null and b/docs/src/images/flags/bm.png differ diff --git a/docs/src/images/flags/bn.png b/docs/src/images/flags/bn.png new file mode 100644 index 0000000..8fb0984 Binary files /dev/null and b/docs/src/images/flags/bn.png differ diff --git a/docs/src/images/flags/bo.png b/docs/src/images/flags/bo.png new file mode 100644 index 0000000..ce7ba52 Binary files /dev/null and b/docs/src/images/flags/bo.png differ diff --git a/docs/src/images/flags/br.png b/docs/src/images/flags/br.png new file mode 100644 index 0000000..9b1a553 Binary files /dev/null and b/docs/src/images/flags/br.png differ diff --git a/docs/src/images/flags/bs.png b/docs/src/images/flags/bs.png new file mode 100644 index 0000000..639fa6c Binary files /dev/null and b/docs/src/images/flags/bs.png differ diff --git a/docs/src/images/flags/bt.png b/docs/src/images/flags/bt.png new file mode 100644 index 0000000..1d512df Binary files /dev/null and b/docs/src/images/flags/bt.png differ diff --git a/docs/src/images/flags/bv.png b/docs/src/images/flags/bv.png new file mode 100644 index 0000000..160b6b5 Binary files /dev/null and b/docs/src/images/flags/bv.png differ diff --git a/docs/src/images/flags/bw.png b/docs/src/images/flags/bw.png new file mode 100644 index 0000000..fcb1039 Binary files /dev/null and b/docs/src/images/flags/bw.png differ diff --git a/docs/src/images/flags/by.png b/docs/src/images/flags/by.png new file mode 100644 index 0000000..504774e Binary files /dev/null and b/docs/src/images/flags/by.png differ diff --git a/docs/src/images/flags/bz.png b/docs/src/images/flags/bz.png new file mode 100644 index 0000000..be63ee1 Binary files /dev/null and b/docs/src/images/flags/bz.png differ diff --git a/docs/src/images/flags/ca.png b/docs/src/images/flags/ca.png new file mode 100644 index 0000000..1f20419 Binary files /dev/null and b/docs/src/images/flags/ca.png differ diff --git a/docs/src/images/flags/catalonia.png b/docs/src/images/flags/catalonia.png new file mode 100644 index 0000000..5041e30 Binary files /dev/null and b/docs/src/images/flags/catalonia.png differ diff --git a/docs/src/images/flags/cc.png b/docs/src/images/flags/cc.png new file mode 100644 index 0000000..aed3d3b Binary files /dev/null and b/docs/src/images/flags/cc.png differ diff --git a/docs/src/images/flags/cd.png b/docs/src/images/flags/cd.png new file mode 100644 index 0000000..5e48942 Binary files /dev/null and b/docs/src/images/flags/cd.png differ diff --git a/docs/src/images/flags/cf.png b/docs/src/images/flags/cf.png new file mode 100644 index 0000000..da687bd Binary files /dev/null and b/docs/src/images/flags/cf.png differ diff --git a/docs/src/images/flags/cg.png b/docs/src/images/flags/cg.png new file mode 100644 index 0000000..a859792 Binary files /dev/null and b/docs/src/images/flags/cg.png differ diff --git a/docs/src/images/flags/ch.png b/docs/src/images/flags/ch.png new file mode 100644 index 0000000..242ec01 Binary files /dev/null and b/docs/src/images/flags/ch.png differ diff --git a/docs/src/images/flags/ci.png b/docs/src/images/flags/ci.png new file mode 100644 index 0000000..3f2c62e Binary files /dev/null and b/docs/src/images/flags/ci.png differ diff --git a/docs/src/images/flags/ck.png b/docs/src/images/flags/ck.png new file mode 100644 index 0000000..746d3d6 Binary files /dev/null and b/docs/src/images/flags/ck.png differ diff --git a/docs/src/images/flags/cl.png b/docs/src/images/flags/cl.png new file mode 100644 index 0000000..29c6d61 Binary files /dev/null and b/docs/src/images/flags/cl.png differ diff --git a/docs/src/images/flags/cm.png b/docs/src/images/flags/cm.png new file mode 100644 index 0000000..f65c5bd Binary files /dev/null and b/docs/src/images/flags/cm.png differ diff --git a/docs/src/images/flags/cn.png b/docs/src/images/flags/cn.png new file mode 100644 index 0000000..8914414 Binary files /dev/null and b/docs/src/images/flags/cn.png differ diff --git a/docs/src/images/flags/co.png b/docs/src/images/flags/co.png new file mode 100644 index 0000000..a118ff4 Binary files /dev/null and b/docs/src/images/flags/co.png differ diff --git a/docs/src/images/flags/cr.png b/docs/src/images/flags/cr.png new file mode 100644 index 0000000..c7a3731 Binary files /dev/null and b/docs/src/images/flags/cr.png differ diff --git a/docs/src/images/flags/cs.png b/docs/src/images/flags/cs.png new file mode 100644 index 0000000..8254790 Binary files /dev/null and b/docs/src/images/flags/cs.png differ diff --git a/docs/src/images/flags/cu.png b/docs/src/images/flags/cu.png new file mode 100644 index 0000000..083f1d6 Binary files /dev/null and b/docs/src/images/flags/cu.png differ diff --git a/docs/src/images/flags/cv.png b/docs/src/images/flags/cv.png new file mode 100644 index 0000000..a63f7ea Binary files /dev/null and b/docs/src/images/flags/cv.png differ diff --git a/docs/src/images/flags/cx.png b/docs/src/images/flags/cx.png new file mode 100644 index 0000000..48e31ad Binary files /dev/null and b/docs/src/images/flags/cx.png differ diff --git a/docs/src/images/flags/cy.png b/docs/src/images/flags/cy.png new file mode 100644 index 0000000..5b1ad6c Binary files /dev/null and b/docs/src/images/flags/cy.png differ diff --git a/docs/src/images/flags/cz.png b/docs/src/images/flags/cz.png new file mode 100644 index 0000000..c8403dd Binary files /dev/null and b/docs/src/images/flags/cz.png differ diff --git a/docs/src/images/flags/de.png b/docs/src/images/flags/de.png new file mode 100644 index 0000000..ac4a977 Binary files /dev/null and b/docs/src/images/flags/de.png differ diff --git a/docs/src/images/flags/dj.png b/docs/src/images/flags/dj.png new file mode 100644 index 0000000..582af36 Binary files /dev/null and b/docs/src/images/flags/dj.png differ diff --git a/docs/src/images/flags/dk.png b/docs/src/images/flags/dk.png new file mode 100644 index 0000000..e2993d3 Binary files /dev/null and b/docs/src/images/flags/dk.png differ diff --git a/docs/src/images/flags/dm.png b/docs/src/images/flags/dm.png new file mode 100644 index 0000000..5fbffcb Binary files /dev/null and b/docs/src/images/flags/dm.png differ diff --git a/docs/src/images/flags/do.png b/docs/src/images/flags/do.png new file mode 100644 index 0000000..5a04932 Binary files /dev/null and b/docs/src/images/flags/do.png differ diff --git a/docs/src/images/flags/dz.png b/docs/src/images/flags/dz.png new file mode 100644 index 0000000..335c239 Binary files /dev/null and b/docs/src/images/flags/dz.png differ diff --git a/docs/src/images/flags/ec.png b/docs/src/images/flags/ec.png new file mode 100644 index 0000000..0caa0b1 Binary files /dev/null and b/docs/src/images/flags/ec.png differ diff --git a/docs/src/images/flags/ee.png b/docs/src/images/flags/ee.png new file mode 100644 index 0000000..0c82efb Binary files /dev/null and b/docs/src/images/flags/ee.png differ diff --git a/docs/src/images/flags/eg.png b/docs/src/images/flags/eg.png new file mode 100644 index 0000000..8a3f7a1 Binary files /dev/null and b/docs/src/images/flags/eg.png differ diff --git a/docs/src/images/flags/eh.png b/docs/src/images/flags/eh.png new file mode 100644 index 0000000..90a1195 Binary files /dev/null and b/docs/src/images/flags/eh.png differ diff --git a/docs/src/images/flags/england.png b/docs/src/images/flags/england.png new file mode 100644 index 0000000..3a7311d Binary files /dev/null and b/docs/src/images/flags/england.png differ diff --git a/docs/src/images/flags/er.png b/docs/src/images/flags/er.png new file mode 100644 index 0000000..13065ae Binary files /dev/null and b/docs/src/images/flags/er.png differ diff --git a/docs/src/images/flags/es.png b/docs/src/images/flags/es.png new file mode 100644 index 0000000..c2de2d7 Binary files /dev/null and b/docs/src/images/flags/es.png differ diff --git a/docs/src/images/flags/et.png b/docs/src/images/flags/et.png new file mode 100644 index 0000000..2e893fa Binary files /dev/null and b/docs/src/images/flags/et.png differ diff --git a/docs/src/images/flags/europeanunion.png b/docs/src/images/flags/europeanunion.png new file mode 100644 index 0000000..d6d8711 Binary files /dev/null and b/docs/src/images/flags/europeanunion.png differ diff --git a/docs/src/images/flags/fam.png b/docs/src/images/flags/fam.png new file mode 100644 index 0000000..cf50c75 Binary files /dev/null and b/docs/src/images/flags/fam.png differ diff --git a/docs/src/images/flags/fi.png b/docs/src/images/flags/fi.png new file mode 100644 index 0000000..14ec091 Binary files /dev/null and b/docs/src/images/flags/fi.png differ diff --git a/docs/src/images/flags/fj.png b/docs/src/images/flags/fj.png new file mode 100644 index 0000000..cee9988 Binary files /dev/null and b/docs/src/images/flags/fj.png differ diff --git a/docs/src/images/flags/fk.png b/docs/src/images/flags/fk.png new file mode 100644 index 0000000..ceaeb27 Binary files /dev/null and b/docs/src/images/flags/fk.png differ diff --git a/docs/src/images/flags/fm.png b/docs/src/images/flags/fm.png new file mode 100644 index 0000000..066bb24 Binary files /dev/null and b/docs/src/images/flags/fm.png differ diff --git a/docs/src/images/flags/fo.png b/docs/src/images/flags/fo.png new file mode 100644 index 0000000..cbceb80 Binary files /dev/null and b/docs/src/images/flags/fo.png differ diff --git a/docs/src/images/flags/fr.png b/docs/src/images/flags/fr.png new file mode 100644 index 0000000..8332c4e Binary files /dev/null and b/docs/src/images/flags/fr.png differ diff --git a/docs/src/images/flags/ga.png b/docs/src/images/flags/ga.png new file mode 100644 index 0000000..0e0d434 Binary files /dev/null and b/docs/src/images/flags/ga.png differ diff --git a/docs/src/images/flags/gb.png b/docs/src/images/flags/gb.png new file mode 100644 index 0000000..ff701e1 Binary files /dev/null and b/docs/src/images/flags/gb.png differ diff --git a/docs/src/images/flags/gd.png b/docs/src/images/flags/gd.png new file mode 100644 index 0000000..9ab57f5 Binary files /dev/null and b/docs/src/images/flags/gd.png differ diff --git a/docs/src/images/flags/ge.png b/docs/src/images/flags/ge.png new file mode 100644 index 0000000..728d970 Binary files /dev/null and b/docs/src/images/flags/ge.png differ diff --git a/docs/src/images/flags/gf.png b/docs/src/images/flags/gf.png new file mode 100644 index 0000000..8332c4e Binary files /dev/null and b/docs/src/images/flags/gf.png differ diff --git a/docs/src/images/flags/gh.png b/docs/src/images/flags/gh.png new file mode 100644 index 0000000..4e2f896 Binary files /dev/null and b/docs/src/images/flags/gh.png differ diff --git a/docs/src/images/flags/gi.png b/docs/src/images/flags/gi.png new file mode 100644 index 0000000..e76797f Binary files /dev/null and b/docs/src/images/flags/gi.png differ diff --git a/docs/src/images/flags/gl.png b/docs/src/images/flags/gl.png new file mode 100644 index 0000000..ef12a73 Binary files /dev/null and b/docs/src/images/flags/gl.png differ diff --git a/docs/src/images/flags/gm.png b/docs/src/images/flags/gm.png new file mode 100644 index 0000000..0720b66 Binary files /dev/null and b/docs/src/images/flags/gm.png differ diff --git a/docs/src/images/flags/gn.png b/docs/src/images/flags/gn.png new file mode 100644 index 0000000..ea660b0 Binary files /dev/null and b/docs/src/images/flags/gn.png differ diff --git a/docs/src/images/flags/gp.png b/docs/src/images/flags/gp.png new file mode 100644 index 0000000..dbb086d Binary files /dev/null and b/docs/src/images/flags/gp.png differ diff --git a/docs/src/images/flags/gq.png b/docs/src/images/flags/gq.png new file mode 100644 index 0000000..ebe20a2 Binary files /dev/null and b/docs/src/images/flags/gq.png differ diff --git a/docs/src/images/flags/gr.png b/docs/src/images/flags/gr.png new file mode 100644 index 0000000..8651ade Binary files /dev/null and b/docs/src/images/flags/gr.png differ diff --git a/docs/src/images/flags/gs.png b/docs/src/images/flags/gs.png new file mode 100644 index 0000000..7ef0bf5 Binary files /dev/null and b/docs/src/images/flags/gs.png differ diff --git a/docs/src/images/flags/gt.png b/docs/src/images/flags/gt.png new file mode 100644 index 0000000..c43a70d Binary files /dev/null and b/docs/src/images/flags/gt.png differ diff --git a/docs/src/images/flags/gu.png b/docs/src/images/flags/gu.png new file mode 100644 index 0000000..92f37c0 Binary files /dev/null and b/docs/src/images/flags/gu.png differ diff --git a/docs/src/images/flags/gw.png b/docs/src/images/flags/gw.png new file mode 100644 index 0000000..b37bcf0 Binary files /dev/null and b/docs/src/images/flags/gw.png differ diff --git a/docs/src/images/flags/gy.png b/docs/src/images/flags/gy.png new file mode 100644 index 0000000..22cbe2f Binary files /dev/null and b/docs/src/images/flags/gy.png differ diff --git a/docs/src/images/flags/hk.png b/docs/src/images/flags/hk.png new file mode 100644 index 0000000..d5c380c Binary files /dev/null and b/docs/src/images/flags/hk.png differ diff --git a/docs/src/images/flags/hm.png b/docs/src/images/flags/hm.png new file mode 100644 index 0000000..a01389a Binary files /dev/null and b/docs/src/images/flags/hm.png differ diff --git a/docs/src/images/flags/hn.png b/docs/src/images/flags/hn.png new file mode 100644 index 0000000..96f8388 Binary files /dev/null and b/docs/src/images/flags/hn.png differ diff --git a/docs/src/images/flags/hr.png b/docs/src/images/flags/hr.png new file mode 100644 index 0000000..696b515 Binary files /dev/null and b/docs/src/images/flags/hr.png differ diff --git a/docs/src/images/flags/ht.png b/docs/src/images/flags/ht.png new file mode 100644 index 0000000..416052a Binary files /dev/null and b/docs/src/images/flags/ht.png differ diff --git a/docs/src/images/flags/hu.png b/docs/src/images/flags/hu.png new file mode 100644 index 0000000..7baafe4 Binary files /dev/null and b/docs/src/images/flags/hu.png differ diff --git a/docs/src/images/flags/id.png b/docs/src/images/flags/id.png new file mode 100644 index 0000000..c6bc0fa Binary files /dev/null and b/docs/src/images/flags/id.png differ diff --git a/docs/src/images/flags/ie.png b/docs/src/images/flags/ie.png new file mode 100644 index 0000000..26baa31 Binary files /dev/null and b/docs/src/images/flags/ie.png differ diff --git a/docs/src/images/flags/il.png b/docs/src/images/flags/il.png new file mode 100644 index 0000000..2ca772d Binary files /dev/null and b/docs/src/images/flags/il.png differ diff --git a/docs/src/images/flags/in.png b/docs/src/images/flags/in.png new file mode 100644 index 0000000..e4d7e81 Binary files /dev/null and b/docs/src/images/flags/in.png differ diff --git a/docs/src/images/flags/io.png b/docs/src/images/flags/io.png new file mode 100644 index 0000000..3e74b6a Binary files /dev/null and b/docs/src/images/flags/io.png differ diff --git a/docs/src/images/flags/iq.png b/docs/src/images/flags/iq.png new file mode 100644 index 0000000..878a351 Binary files /dev/null and b/docs/src/images/flags/iq.png differ diff --git a/docs/src/images/flags/ir.png b/docs/src/images/flags/ir.png new file mode 100644 index 0000000..c5fd136 Binary files /dev/null and b/docs/src/images/flags/ir.png differ diff --git a/docs/src/images/flags/is.png b/docs/src/images/flags/is.png new file mode 100644 index 0000000..b8f6d0f Binary files /dev/null and b/docs/src/images/flags/is.png differ diff --git a/docs/src/images/flags/it.png b/docs/src/images/flags/it.png new file mode 100644 index 0000000..89692f7 Binary files /dev/null and b/docs/src/images/flags/it.png differ diff --git a/docs/src/images/flags/jm.png b/docs/src/images/flags/jm.png new file mode 100644 index 0000000..7be119e Binary files /dev/null and b/docs/src/images/flags/jm.png differ diff --git a/docs/src/images/flags/jo.png b/docs/src/images/flags/jo.png new file mode 100644 index 0000000..11bd497 Binary files /dev/null and b/docs/src/images/flags/jo.png differ diff --git a/docs/src/images/flags/jp.png b/docs/src/images/flags/jp.png new file mode 100644 index 0000000..325fbad Binary files /dev/null and b/docs/src/images/flags/jp.png differ diff --git a/docs/src/images/flags/ke.png b/docs/src/images/flags/ke.png new file mode 100644 index 0000000..51879ad Binary files /dev/null and b/docs/src/images/flags/ke.png differ diff --git a/docs/src/images/flags/kg.png b/docs/src/images/flags/kg.png new file mode 100644 index 0000000..0a818f6 Binary files /dev/null and b/docs/src/images/flags/kg.png differ diff --git a/docs/src/images/flags/kh.png b/docs/src/images/flags/kh.png new file mode 100644 index 0000000..30f6bb1 Binary files /dev/null and b/docs/src/images/flags/kh.png differ diff --git a/docs/src/images/flags/ki.png b/docs/src/images/flags/ki.png new file mode 100644 index 0000000..2dcce4b Binary files /dev/null and b/docs/src/images/flags/ki.png differ diff --git a/docs/src/images/flags/km.png b/docs/src/images/flags/km.png new file mode 100644 index 0000000..812b2f5 Binary files /dev/null and b/docs/src/images/flags/km.png differ diff --git a/docs/src/images/flags/kn.png b/docs/src/images/flags/kn.png new file mode 100644 index 0000000..febd5b4 Binary files /dev/null and b/docs/src/images/flags/kn.png differ diff --git a/docs/src/images/flags/kp.png b/docs/src/images/flags/kp.png new file mode 100644 index 0000000..d3d509a Binary files /dev/null and b/docs/src/images/flags/kp.png differ diff --git a/docs/src/images/flags/kr.png b/docs/src/images/flags/kr.png new file mode 100644 index 0000000..9c0a78e Binary files /dev/null and b/docs/src/images/flags/kr.png differ diff --git a/docs/src/images/flags/kw.png b/docs/src/images/flags/kw.png new file mode 100644 index 0000000..96546da Binary files /dev/null and b/docs/src/images/flags/kw.png differ diff --git a/docs/src/images/flags/ky.png b/docs/src/images/flags/ky.png new file mode 100644 index 0000000..15c5f8e Binary files /dev/null and b/docs/src/images/flags/ky.png differ diff --git a/docs/src/images/flags/kz.png b/docs/src/images/flags/kz.png new file mode 100644 index 0000000..45a8c88 Binary files /dev/null and b/docs/src/images/flags/kz.png differ diff --git a/docs/src/images/flags/la.png b/docs/src/images/flags/la.png new file mode 100644 index 0000000..e28acd0 Binary files /dev/null and b/docs/src/images/flags/la.png differ diff --git a/docs/src/images/flags/lb.png b/docs/src/images/flags/lb.png new file mode 100644 index 0000000..d0d452b Binary files /dev/null and b/docs/src/images/flags/lb.png differ diff --git a/docs/src/images/flags/lc.png b/docs/src/images/flags/lc.png new file mode 100644 index 0000000..a47d065 Binary files /dev/null and b/docs/src/images/flags/lc.png differ diff --git a/docs/src/images/flags/li.png b/docs/src/images/flags/li.png new file mode 100644 index 0000000..6469909 Binary files /dev/null and b/docs/src/images/flags/li.png differ diff --git a/docs/src/images/flags/lk.png b/docs/src/images/flags/lk.png new file mode 100644 index 0000000..088aad6 Binary files /dev/null and b/docs/src/images/flags/lk.png differ diff --git a/docs/src/images/flags/lr.png b/docs/src/images/flags/lr.png new file mode 100644 index 0000000..89a5bc7 Binary files /dev/null and b/docs/src/images/flags/lr.png differ diff --git a/docs/src/images/flags/ls.png b/docs/src/images/flags/ls.png new file mode 100644 index 0000000..33fdef1 Binary files /dev/null and b/docs/src/images/flags/ls.png differ diff --git a/docs/src/images/flags/lt.png b/docs/src/images/flags/lt.png new file mode 100644 index 0000000..c8ef0da Binary files /dev/null and b/docs/src/images/flags/lt.png differ diff --git a/docs/src/images/flags/lu.png b/docs/src/images/flags/lu.png new file mode 100644 index 0000000..4cabba9 Binary files /dev/null and b/docs/src/images/flags/lu.png differ diff --git a/docs/src/images/flags/lv.png b/docs/src/images/flags/lv.png new file mode 100644 index 0000000..49b6998 Binary files /dev/null and b/docs/src/images/flags/lv.png differ diff --git a/docs/src/images/flags/ly.png b/docs/src/images/flags/ly.png new file mode 100644 index 0000000..b163a9f Binary files /dev/null and b/docs/src/images/flags/ly.png differ diff --git a/docs/src/images/flags/ma.png b/docs/src/images/flags/ma.png new file mode 100644 index 0000000..f386770 Binary files /dev/null and b/docs/src/images/flags/ma.png differ diff --git a/docs/src/images/flags/mc.png b/docs/src/images/flags/mc.png new file mode 100644 index 0000000..1aa830f Binary files /dev/null and b/docs/src/images/flags/mc.png differ diff --git a/docs/src/images/flags/md.png b/docs/src/images/flags/md.png new file mode 100644 index 0000000..4e92c18 Binary files /dev/null and b/docs/src/images/flags/md.png differ diff --git a/docs/src/images/flags/me.png b/docs/src/images/flags/me.png new file mode 100644 index 0000000..ac72535 Binary files /dev/null and b/docs/src/images/flags/me.png differ diff --git a/docs/src/images/flags/mg.png b/docs/src/images/flags/mg.png new file mode 100644 index 0000000..d2715b3 Binary files /dev/null and b/docs/src/images/flags/mg.png differ diff --git a/docs/src/images/flags/mh.png b/docs/src/images/flags/mh.png new file mode 100644 index 0000000..fb523a8 Binary files /dev/null and b/docs/src/images/flags/mh.png differ diff --git a/docs/src/images/flags/mk.png b/docs/src/images/flags/mk.png new file mode 100644 index 0000000..db173aa Binary files /dev/null and b/docs/src/images/flags/mk.png differ diff --git a/docs/src/images/flags/ml.png b/docs/src/images/flags/ml.png new file mode 100644 index 0000000..2cec8ba Binary files /dev/null and b/docs/src/images/flags/ml.png differ diff --git a/docs/src/images/flags/mm.png b/docs/src/images/flags/mm.png new file mode 100644 index 0000000..f464f67 Binary files /dev/null and b/docs/src/images/flags/mm.png differ diff --git a/docs/src/images/flags/mn.png b/docs/src/images/flags/mn.png new file mode 100644 index 0000000..9396355 Binary files /dev/null and b/docs/src/images/flags/mn.png differ diff --git a/docs/src/images/flags/mo.png b/docs/src/images/flags/mo.png new file mode 100644 index 0000000..deb801d Binary files /dev/null and b/docs/src/images/flags/mo.png differ diff --git a/docs/src/images/flags/mp.png b/docs/src/images/flags/mp.png new file mode 100644 index 0000000..298d588 Binary files /dev/null and b/docs/src/images/flags/mp.png differ diff --git a/docs/src/images/flags/mq.png b/docs/src/images/flags/mq.png new file mode 100644 index 0000000..010143b Binary files /dev/null and b/docs/src/images/flags/mq.png differ diff --git a/docs/src/images/flags/mr.png b/docs/src/images/flags/mr.png new file mode 100644 index 0000000..319546b Binary files /dev/null and b/docs/src/images/flags/mr.png differ diff --git a/docs/src/images/flags/ms.png b/docs/src/images/flags/ms.png new file mode 100644 index 0000000..d4cbb43 Binary files /dev/null and b/docs/src/images/flags/ms.png differ diff --git a/docs/src/images/flags/mt.png b/docs/src/images/flags/mt.png new file mode 100644 index 0000000..00af948 Binary files /dev/null and b/docs/src/images/flags/mt.png differ diff --git a/docs/src/images/flags/mu.png b/docs/src/images/flags/mu.png new file mode 100644 index 0000000..b7fdce1 Binary files /dev/null and b/docs/src/images/flags/mu.png differ diff --git a/docs/src/images/flags/mv.png b/docs/src/images/flags/mv.png new file mode 100644 index 0000000..5073d9e Binary files /dev/null and b/docs/src/images/flags/mv.png differ diff --git a/docs/src/images/flags/mw.png b/docs/src/images/flags/mw.png new file mode 100644 index 0000000..13886e9 Binary files /dev/null and b/docs/src/images/flags/mw.png differ diff --git a/docs/src/images/flags/mx.png b/docs/src/images/flags/mx.png new file mode 100644 index 0000000..5bc58ab Binary files /dev/null and b/docs/src/images/flags/mx.png differ diff --git a/docs/src/images/flags/my.png b/docs/src/images/flags/my.png new file mode 100644 index 0000000..9034cba Binary files /dev/null and b/docs/src/images/flags/my.png differ diff --git a/docs/src/images/flags/mz.png b/docs/src/images/flags/mz.png new file mode 100644 index 0000000..76405e0 Binary files /dev/null and b/docs/src/images/flags/mz.png differ diff --git a/docs/src/images/flags/na.png b/docs/src/images/flags/na.png new file mode 100644 index 0000000..63358c6 Binary files /dev/null and b/docs/src/images/flags/na.png differ diff --git a/docs/src/images/flags/nc.png b/docs/src/images/flags/nc.png new file mode 100644 index 0000000..2cad283 Binary files /dev/null and b/docs/src/images/flags/nc.png differ diff --git a/docs/src/images/flags/ne.png b/docs/src/images/flags/ne.png new file mode 100644 index 0000000..d85f424 Binary files /dev/null and b/docs/src/images/flags/ne.png differ diff --git a/docs/src/images/flags/nf.png b/docs/src/images/flags/nf.png new file mode 100644 index 0000000..f9bcdda Binary files /dev/null and b/docs/src/images/flags/nf.png differ diff --git a/docs/src/images/flags/ng.png b/docs/src/images/flags/ng.png new file mode 100644 index 0000000..3eea2e0 Binary files /dev/null and b/docs/src/images/flags/ng.png differ diff --git a/docs/src/images/flags/ni.png b/docs/src/images/flags/ni.png new file mode 100644 index 0000000..3969aaa Binary files /dev/null and b/docs/src/images/flags/ni.png differ diff --git a/docs/src/images/flags/nl.png b/docs/src/images/flags/nl.png new file mode 100644 index 0000000..fe44791 Binary files /dev/null and b/docs/src/images/flags/nl.png differ diff --git a/docs/src/images/flags/no.png b/docs/src/images/flags/no.png new file mode 100644 index 0000000..160b6b5 Binary files /dev/null and b/docs/src/images/flags/no.png differ diff --git a/docs/src/images/flags/np.png b/docs/src/images/flags/np.png new file mode 100644 index 0000000..aeb058b Binary files /dev/null and b/docs/src/images/flags/np.png differ diff --git a/docs/src/images/flags/nr.png b/docs/src/images/flags/nr.png new file mode 100644 index 0000000..705fc33 Binary files /dev/null and b/docs/src/images/flags/nr.png differ diff --git a/docs/src/images/flags/nu.png b/docs/src/images/flags/nu.png new file mode 100644 index 0000000..c3ce4ae Binary files /dev/null and b/docs/src/images/flags/nu.png differ diff --git a/docs/src/images/flags/nz.png b/docs/src/images/flags/nz.png new file mode 100644 index 0000000..10d6306 Binary files /dev/null and b/docs/src/images/flags/nz.png differ diff --git a/docs/src/images/flags/om.png b/docs/src/images/flags/om.png new file mode 100644 index 0000000..2ffba7e Binary files /dev/null and b/docs/src/images/flags/om.png differ diff --git a/docs/src/images/flags/pa.png b/docs/src/images/flags/pa.png new file mode 100644 index 0000000..9b2ee9a Binary files /dev/null and b/docs/src/images/flags/pa.png differ diff --git a/docs/src/images/flags/pe.png b/docs/src/images/flags/pe.png new file mode 100644 index 0000000..62a0497 Binary files /dev/null and b/docs/src/images/flags/pe.png differ diff --git a/docs/src/images/flags/pf.png b/docs/src/images/flags/pf.png new file mode 100644 index 0000000..771a0f6 Binary files /dev/null and b/docs/src/images/flags/pf.png differ diff --git a/docs/src/images/flags/pg.png b/docs/src/images/flags/pg.png new file mode 100644 index 0000000..10d6233 Binary files /dev/null and b/docs/src/images/flags/pg.png differ diff --git a/docs/src/images/flags/ph.png b/docs/src/images/flags/ph.png new file mode 100644 index 0000000..b89e159 Binary files /dev/null and b/docs/src/images/flags/ph.png differ diff --git a/docs/src/images/flags/pk.png b/docs/src/images/flags/pk.png new file mode 100644 index 0000000..e9df70c Binary files /dev/null and b/docs/src/images/flags/pk.png differ diff --git a/docs/src/images/flags/pl.png b/docs/src/images/flags/pl.png new file mode 100644 index 0000000..d413d01 Binary files /dev/null and b/docs/src/images/flags/pl.png differ diff --git a/docs/src/images/flags/pm.png b/docs/src/images/flags/pm.png new file mode 100644 index 0000000..ba91d2c Binary files /dev/null and b/docs/src/images/flags/pm.png differ diff --git a/docs/src/images/flags/pn.png b/docs/src/images/flags/pn.png new file mode 100644 index 0000000..aa9344f Binary files /dev/null and b/docs/src/images/flags/pn.png differ diff --git a/docs/src/images/flags/pr.png b/docs/src/images/flags/pr.png new file mode 100644 index 0000000..82d9130 Binary files /dev/null and b/docs/src/images/flags/pr.png differ diff --git a/docs/src/images/flags/ps.png b/docs/src/images/flags/ps.png new file mode 100644 index 0000000..f5f5477 Binary files /dev/null and b/docs/src/images/flags/ps.png differ diff --git a/docs/src/images/flags/pt.png b/docs/src/images/flags/pt.png new file mode 100644 index 0000000..ece7980 Binary files /dev/null and b/docs/src/images/flags/pt.png differ diff --git a/docs/src/images/flags/pw.png b/docs/src/images/flags/pw.png new file mode 100644 index 0000000..6178b25 Binary files /dev/null and b/docs/src/images/flags/pw.png differ diff --git a/docs/src/images/flags/py.png b/docs/src/images/flags/py.png new file mode 100644 index 0000000..cb8723c Binary files /dev/null and b/docs/src/images/flags/py.png differ diff --git a/docs/src/images/flags/qa.png b/docs/src/images/flags/qa.png new file mode 100644 index 0000000..ed4c621 Binary files /dev/null and b/docs/src/images/flags/qa.png differ diff --git a/docs/src/images/flags/re.png b/docs/src/images/flags/re.png new file mode 100644 index 0000000..8332c4e Binary files /dev/null and b/docs/src/images/flags/re.png differ diff --git a/docs/src/images/flags/ro.png b/docs/src/images/flags/ro.png new file mode 100644 index 0000000..57e74a6 Binary files /dev/null and b/docs/src/images/flags/ro.png differ diff --git a/docs/src/images/flags/rs.png b/docs/src/images/flags/rs.png new file mode 100644 index 0000000..9439a5b Binary files /dev/null and b/docs/src/images/flags/rs.png differ diff --git a/docs/src/images/flags/ru.png b/docs/src/images/flags/ru.png new file mode 100644 index 0000000..47da421 Binary files /dev/null and b/docs/src/images/flags/ru.png differ diff --git a/docs/src/images/flags/rw.png b/docs/src/images/flags/rw.png new file mode 100644 index 0000000..5356491 Binary files /dev/null and b/docs/src/images/flags/rw.png differ diff --git a/docs/src/images/flags/sa.png b/docs/src/images/flags/sa.png new file mode 100644 index 0000000..b4641c7 Binary files /dev/null and b/docs/src/images/flags/sa.png differ diff --git a/docs/src/images/flags/sb.png b/docs/src/images/flags/sb.png new file mode 100644 index 0000000..a9937cc Binary files /dev/null and b/docs/src/images/flags/sb.png differ diff --git a/docs/src/images/flags/sc.png b/docs/src/images/flags/sc.png new file mode 100644 index 0000000..39ee371 Binary files /dev/null and b/docs/src/images/flags/sc.png differ diff --git a/docs/src/images/flags/scotland.png b/docs/src/images/flags/scotland.png new file mode 100644 index 0000000..a0e57b4 Binary files /dev/null and b/docs/src/images/flags/scotland.png differ diff --git a/docs/src/images/flags/sd.png b/docs/src/images/flags/sd.png new file mode 100644 index 0000000..eaab69e Binary files /dev/null and b/docs/src/images/flags/sd.png differ diff --git a/docs/src/images/flags/se.png b/docs/src/images/flags/se.png new file mode 100644 index 0000000..1994653 Binary files /dev/null and b/docs/src/images/flags/se.png differ diff --git a/docs/src/images/flags/sg.png b/docs/src/images/flags/sg.png new file mode 100644 index 0000000..dd34d61 Binary files /dev/null and b/docs/src/images/flags/sg.png differ diff --git a/docs/src/images/flags/sh.png b/docs/src/images/flags/sh.png new file mode 100644 index 0000000..4b1d2a2 Binary files /dev/null and b/docs/src/images/flags/sh.png differ diff --git a/docs/src/images/flags/si.png b/docs/src/images/flags/si.png new file mode 100644 index 0000000..bb1476f Binary files /dev/null and b/docs/src/images/flags/si.png differ diff --git a/docs/src/images/flags/sj.png b/docs/src/images/flags/sj.png new file mode 100644 index 0000000..160b6b5 Binary files /dev/null and b/docs/src/images/flags/sj.png differ diff --git a/docs/src/images/flags/sk.png b/docs/src/images/flags/sk.png new file mode 100644 index 0000000..7ccbc82 Binary files /dev/null and b/docs/src/images/flags/sk.png differ diff --git a/docs/src/images/flags/sl.png b/docs/src/images/flags/sl.png new file mode 100644 index 0000000..12d812d Binary files /dev/null and b/docs/src/images/flags/sl.png differ diff --git a/docs/src/images/flags/sm.png b/docs/src/images/flags/sm.png new file mode 100644 index 0000000..3df2fdc Binary files /dev/null and b/docs/src/images/flags/sm.png differ diff --git a/docs/src/images/flags/sn.png b/docs/src/images/flags/sn.png new file mode 100644 index 0000000..eabb71d Binary files /dev/null and b/docs/src/images/flags/sn.png differ diff --git a/docs/src/images/flags/so.png b/docs/src/images/flags/so.png new file mode 100644 index 0000000..4a1ea4b Binary files /dev/null and b/docs/src/images/flags/so.png differ diff --git a/docs/src/images/flags/sr.png b/docs/src/images/flags/sr.png new file mode 100644 index 0000000..5eff927 Binary files /dev/null and b/docs/src/images/flags/sr.png differ diff --git a/docs/src/images/flags/st.png b/docs/src/images/flags/st.png new file mode 100644 index 0000000..2978557 Binary files /dev/null and b/docs/src/images/flags/st.png differ diff --git a/docs/src/images/flags/sv.png b/docs/src/images/flags/sv.png new file mode 100644 index 0000000..2498799 Binary files /dev/null and b/docs/src/images/flags/sv.png differ diff --git a/docs/src/images/flags/sy.png b/docs/src/images/flags/sy.png new file mode 100644 index 0000000..f5ce30d Binary files /dev/null and b/docs/src/images/flags/sy.png differ diff --git a/docs/src/images/flags/sz.png b/docs/src/images/flags/sz.png new file mode 100644 index 0000000..914ee86 Binary files /dev/null and b/docs/src/images/flags/sz.png differ diff --git a/docs/src/images/flags/tc.png b/docs/src/images/flags/tc.png new file mode 100644 index 0000000..8fc1156 Binary files /dev/null and b/docs/src/images/flags/tc.png differ diff --git a/docs/src/images/flags/td.png b/docs/src/images/flags/td.png new file mode 100644 index 0000000..667f21f Binary files /dev/null and b/docs/src/images/flags/td.png differ diff --git a/docs/src/images/flags/tf.png b/docs/src/images/flags/tf.png new file mode 100644 index 0000000..80529a4 Binary files /dev/null and b/docs/src/images/flags/tf.png differ diff --git a/docs/src/images/flags/tg.png b/docs/src/images/flags/tg.png new file mode 100644 index 0000000..3aa00ad Binary files /dev/null and b/docs/src/images/flags/tg.png differ diff --git a/docs/src/images/flags/th.png b/docs/src/images/flags/th.png new file mode 100644 index 0000000..dd8ba91 Binary files /dev/null and b/docs/src/images/flags/th.png differ diff --git a/docs/src/images/flags/tj.png b/docs/src/images/flags/tj.png new file mode 100644 index 0000000..617bf64 Binary files /dev/null and b/docs/src/images/flags/tj.png differ diff --git a/docs/src/images/flags/tk.png b/docs/src/images/flags/tk.png new file mode 100644 index 0000000..67b8c8c Binary files /dev/null and b/docs/src/images/flags/tk.png differ diff --git a/docs/src/images/flags/tl.png b/docs/src/images/flags/tl.png new file mode 100644 index 0000000..77da181 Binary files /dev/null and b/docs/src/images/flags/tl.png differ diff --git a/docs/src/images/flags/tm.png b/docs/src/images/flags/tm.png new file mode 100644 index 0000000..828020e Binary files /dev/null and b/docs/src/images/flags/tm.png differ diff --git a/docs/src/images/flags/tn.png b/docs/src/images/flags/tn.png new file mode 100644 index 0000000..183cdd3 Binary files /dev/null and b/docs/src/images/flags/tn.png differ diff --git a/docs/src/images/flags/to.png b/docs/src/images/flags/to.png new file mode 100644 index 0000000..f89b8ba Binary files /dev/null and b/docs/src/images/flags/to.png differ diff --git a/docs/src/images/flags/tr.png b/docs/src/images/flags/tr.png new file mode 100644 index 0000000..be32f77 Binary files /dev/null and b/docs/src/images/flags/tr.png differ diff --git a/docs/src/images/flags/tt.png b/docs/src/images/flags/tt.png new file mode 100644 index 0000000..2a11c1e Binary files /dev/null and b/docs/src/images/flags/tt.png differ diff --git a/docs/src/images/flags/tv.png b/docs/src/images/flags/tv.png new file mode 100644 index 0000000..28274c5 Binary files /dev/null and b/docs/src/images/flags/tv.png differ diff --git a/docs/src/images/flags/tw.png b/docs/src/images/flags/tw.png new file mode 100644 index 0000000..f31c654 Binary files /dev/null and b/docs/src/images/flags/tw.png differ diff --git a/docs/src/images/flags/tz.png b/docs/src/images/flags/tz.png new file mode 100644 index 0000000..c00ff79 Binary files /dev/null and b/docs/src/images/flags/tz.png differ diff --git a/docs/src/images/flags/ua.png b/docs/src/images/flags/ua.png new file mode 100644 index 0000000..09563a2 Binary files /dev/null and b/docs/src/images/flags/ua.png differ diff --git a/docs/src/images/flags/ug.png b/docs/src/images/flags/ug.png new file mode 100644 index 0000000..33f4aff Binary files /dev/null and b/docs/src/images/flags/ug.png differ diff --git a/docs/src/images/flags/um.png b/docs/src/images/flags/um.png new file mode 100644 index 0000000..c1dd965 Binary files /dev/null and b/docs/src/images/flags/um.png differ diff --git a/docs/src/images/flags/us.png b/docs/src/images/flags/us.png new file mode 100644 index 0000000..10f451f Binary files /dev/null and b/docs/src/images/flags/us.png differ diff --git a/docs/src/images/flags/uy.png b/docs/src/images/flags/uy.png new file mode 100644 index 0000000..31d948a Binary files /dev/null and b/docs/src/images/flags/uy.png differ diff --git a/docs/src/images/flags/uz.png b/docs/src/images/flags/uz.png new file mode 100644 index 0000000..fef5dc1 Binary files /dev/null and b/docs/src/images/flags/uz.png differ diff --git a/docs/src/images/flags/va.png b/docs/src/images/flags/va.png new file mode 100644 index 0000000..b31eaf2 Binary files /dev/null and b/docs/src/images/flags/va.png differ diff --git a/docs/src/images/flags/vc.png b/docs/src/images/flags/vc.png new file mode 100644 index 0000000..8fa17b0 Binary files /dev/null and b/docs/src/images/flags/vc.png differ diff --git a/docs/src/images/flags/ve.png b/docs/src/images/flags/ve.png new file mode 100644 index 0000000..00c90f9 Binary files /dev/null and b/docs/src/images/flags/ve.png differ diff --git a/docs/src/images/flags/vg.png b/docs/src/images/flags/vg.png new file mode 100644 index 0000000..4156907 Binary files /dev/null and b/docs/src/images/flags/vg.png differ diff --git a/docs/src/images/flags/vi.png b/docs/src/images/flags/vi.png new file mode 100644 index 0000000..ed26915 Binary files /dev/null and b/docs/src/images/flags/vi.png differ diff --git a/docs/src/images/flags/vn.png b/docs/src/images/flags/vn.png new file mode 100644 index 0000000..ec7cd48 Binary files /dev/null and b/docs/src/images/flags/vn.png differ diff --git a/docs/src/images/flags/vu.png b/docs/src/images/flags/vu.png new file mode 100644 index 0000000..b3397bc Binary files /dev/null and b/docs/src/images/flags/vu.png differ diff --git a/docs/src/images/flags/wales.png b/docs/src/images/flags/wales.png new file mode 100644 index 0000000..e0d7cee Binary files /dev/null and b/docs/src/images/flags/wales.png differ diff --git a/docs/src/images/flags/wf.png b/docs/src/images/flags/wf.png new file mode 100644 index 0000000..9f95587 Binary files /dev/null and b/docs/src/images/flags/wf.png differ diff --git a/docs/src/images/flags/ws.png b/docs/src/images/flags/ws.png new file mode 100644 index 0000000..c169508 Binary files /dev/null and b/docs/src/images/flags/ws.png differ diff --git a/docs/src/images/flags/ye.png b/docs/src/images/flags/ye.png new file mode 100644 index 0000000..468dfad Binary files /dev/null and b/docs/src/images/flags/ye.png differ diff --git a/docs/src/images/flags/yt.png b/docs/src/images/flags/yt.png new file mode 100644 index 0000000..c298f37 Binary files /dev/null and b/docs/src/images/flags/yt.png differ diff --git a/docs/src/images/flags/za.png b/docs/src/images/flags/za.png new file mode 100644 index 0000000..57c58e2 Binary files /dev/null and b/docs/src/images/flags/za.png differ diff --git a/docs/src/images/flags/zm.png b/docs/src/images/flags/zm.png new file mode 100644 index 0000000..c25b07b Binary files /dev/null and b/docs/src/images/flags/zm.png differ diff --git a/docs/src/images/flags/zw.png b/docs/src/images/flags/zw.png new file mode 100644 index 0000000..53c9725 Binary files /dev/null and b/docs/src/images/flags/zw.png differ diff --git a/docs/src/index.html b/docs/src/index.html new file mode 100644 index 0000000..01eadce --- /dev/null +++ b/docs/src/index.html @@ -0,0 +1,21 @@ + + + + React ui docs + + + + + + +
    + loading... +
    + + + + + + + + diff --git a/docs/src/js/app-routes.jsx b/docs/src/js/app-routes.jsx new file mode 100644 index 0000000..1798e45 --- /dev/null +++ b/docs/src/js/app-routes.jsx @@ -0,0 +1,34 @@ +"use strict" + +import {Route, Router} from 'react-router' +import Master from './pages/master.jsx' +import Home from './pages/home.jsx' +import createHistory from 'history/lib/createHashHistory' + +const history = createHistory({ queryKey: false }) +let menulist = [] + +function addMenu(list) { + list.forEach(function (menu, index) { + if (menu.component) { + menulist.push( + + ) + } + }) +} +require('./menulist').forEach(function (list) { + addMenu(list) +}) + +const AppRoutes = ( + + + + {menulist} + + + +) + +export default AppRoutes diff --git a/docs/src/js/app.jsx b/docs/src/js/app.jsx new file mode 100644 index 0000000..1e1fc58 --- /dev/null +++ b/docs/src/js/app.jsx @@ -0,0 +1,24 @@ +"use strict" + +global.uiRequire = function (src) { + if (src) { + return require('../../../src/' + src) + } else { + return require('../../../src/') + } +} + +import ReactDOM from 'react-dom' +const AppRoutes = require('./app-routes.jsx') + +ReactDOM.render( + AppRoutes, + document.getElementById('body') +) + +// static files +require('file?name=index.html!../index.html') +require('../json/countries.json') +require('../json/form.json') +require('../json/text-value.json') +require('../json/tree.json') diff --git a/docs/src/js/data/array.js b/docs/src/js/data/array.js new file mode 100644 index 0000000..9660b73 --- /dev/null +++ b/docs/src/js/data/array.js @@ -0,0 +1 @@ +module.exports = ["南京", "北京", "上海", "广州", "深圳", "成都", "重庆", "西安"] diff --git a/docs/src/js/data/text-value.js b/docs/src/js/data/text-value.js new file mode 100644 index 0000000..ee9623d --- /dev/null +++ b/docs/src/js/data/text-value.js @@ -0,0 +1,10 @@ +module.exports = [ + { "id": "nanjing", "text": "南京" }, + { "id": "beijing", "text": "北京" }, + { "id": "guangzhou", "text": "广州" }, + { "id": "shenzhen", "text": "深圳" }, + { "id": "chengdu", "text": "成都" }, + { "id": "chongqing", "text": "重庆" }, + { "id": "shanghai", "text": "上海" } +] + diff --git a/docs/src/js/menulist.js b/docs/src/js/menulist.js new file mode 100644 index 0000000..0e94e8c --- /dev/null +++ b/docs/src/js/menulist.js @@ -0,0 +1,29 @@ +"use strict" + +module.exports = [ + [ + { path: '/form', text: 'Form', component: require('./pages/form.jsx') }, + { path: '/formControl', text: 'FormControl', component: require('./pages/formControl.jsx') }, + { path: '/formSubmit', text: 'FormSubmit', component: require('./pages/formSubmit.jsx') }, + { path: '/checkbox', text: 'Checkbox', component: require('./pages/checkbox.jsx') }, + { path: '/checkboxGroup', text: 'CheckboxGroup', component: require('./pages/checkboxGroup.jsx') }, + { path: '/datetime', text: 'Datetime', component: require('./pages/datetime.jsx') }, + { path: '/input', text: 'Input', component: require('./pages/input.jsx') }, + { path: '/radioGroup', text: 'RadioGroup', component: require('./pages/radioGroup.jsx') }, + { path: '/rating', text: 'Rating', component: require('./pages/rating.jsx') }, + { path: '/select', text: 'Select', component: require('./pages/select.jsx') }, + { path: '/tree', text: 'Tree', component: require('./pages/tree.jsx') }, + { path: '/upload', text: 'Upload', component: require('./pages/upload.jsx') } + ], + [ + { path: '/table', text: 'Table', component: require('./pages/table.jsx') }, + { path: '/filter', text: 'Filter', component: require('./pages/filter.jsx') }, + { path: '/button', text: 'Button', component: require('./pages/button.jsx') }, + { path: '/icon', text: 'Icon', component: require('./pages/icon.jsx') }, + { path: '/pagination', text: 'Pagination', component: require('./pages/pagination.jsx') }, + { path: '/message', text: 'Message', component: require('./pages/message.jsx') }, + { path: '/modal', text: 'Modal', component: require('./pages/modal.jsx') }, + { path: '/dataSource', text: 'DataSource', component: require('./pages/dataSource.jsx') }, + { path: '/lang', text: 'Lang', component: require('./pages/lang.jsx') } + ] +] diff --git a/docs/src/js/nav-list.jsx b/docs/src/js/nav-list.jsx new file mode 100644 index 0000000..b2a60a4 --- /dev/null +++ b/docs/src/js/nav-list.jsx @@ -0,0 +1,74 @@ +"use strict" + +import React from 'react' +import classnames from 'classnames' +import menulist from './menulist' +const { Icon } = global.uiRequire() + +export default class NavList extends React.Component { + static displayName = 'NavList' + + static propTypes = { + onToggle: React.PropTypes.func + } + + static contextTypes = { + history: React.PropTypes.object.isRequired + } + + state = { + active: true + } + + getClasses (name, path) { + return classnames(name, { + active: this.context.history.isActive(path) + }) + } + + pathChange (path) { + if (!this.context.history.isActive(path)) { + this.context.history.pushState(null, path) + } + } + + getRoutesList (paths, index) { + let list = paths.map(function (r, i) { + if (r.path) { + return ( +
  • + {r.text} +
  • + ) + } else if (r.hr) { + return (
    ) + } else if (r.text) { + return ( +
  • + {r.text} +
  • + ) + } + }, this) + + return
      {list}
    + } + + render () { + let list = menulist.map(function (paths, index) { + return this.getRoutesList(paths, index) + }, this) + + return ( +
    + React UI + +
    +
    + {list} +
    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/build.jsx b/docs/src/js/pages/build.jsx new file mode 100644 index 0000000..975aeb3 --- /dev/null +++ b/docs/src/js/pages/build.jsx @@ -0,0 +1,118 @@ +'use strict' + +import React from 'react' +import data from '../../../../server/data' +const {Button, Grid} = global.uiRequire() +const clone = global.uiRequire('utils/clone') + +export default class Page extends React.Component { + static displayName = 'Pages/Build' + + state = { + building: false, + components: clone(data) + } + + handleChange (key) { + let components = this.state.components + let target = components[key] + if (!target.$checked) { + target.$checked = true + let keys = target.dependencies || [] + keys.forEach(k => { + components[k].$checked = true + }) + } else { + target.$checked = false + let keys = Object.keys(components) + for (let i = 0, count = keys.length; i < count; i++) { + let c = components[keys[i]] + if (c.$checked && c.dependencies && c.dependencies.indexOf(key) >= 0) { + target.$checked = true + break + } + } + } + this.setState({ components }) + } + + selectAll (e) { + let checked = e.target.checked + let components = this.state.components + Object.keys(components).map((key) => { + components[key].$checked = checked + }) + this.setState({ components }) + } + + submit () { + this.setState({ building: true }) + } + + render () { + let components = this.state.components + let checkedNum = 0 + let list = Object.keys(components).map((key, i) => { + let component = components[key] + checkedNum += component.$checked ? 1 : 0 + return ( + + + + ) + }) + + return ( +
    +
    +

    Build

    +
    + +
    +
    + 选择需要的组件 + +
    +
    + +
    +
    + {list} +
    + + + + + + + + + +
    + + +
    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/button.jsx b/docs/src/js/pages/button.jsx new file mode 100644 index 0000000..ca2899c --- /dev/null +++ b/docs/src/js/pages/button.jsx @@ -0,0 +1,123 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Button, Icon} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName: 'Pages/Button' + + disableExample (event) { + let button = this.refs.button + if (event.target.checked) { + button.disable(我被禁用了) + } else { + button.enable('我又可以使用了') + } + } + + render () { + return ( +
    +
    +

    Button

    +

    按钮

    +
    + +
    +
    +{``}
    +          
    + +

    普通按钮

    +

    + {' '} + +

    + +
    +{`
    +`}
    +          
    + +

    带图标按钮

    +

    + {' '} + +

    +
    {'\r'}
    + +

    Status

    +

    + {' '} + {' '} + {' '} + {' '} + {' '} + +

    + +
    +{`
    +
    +
    +
    +
    +
    +`}
    +          
    +

    需要扩展可以添加className

    +

    + +

    +
    {''}
    + +

    once

    +

    + +

    +
    {''}
    + +

    enable(elem)/disabled(elem)

    +

    两个实例方法 enable(启用) 和 disable (禁用),可以传入一个参数(字符串或者element)替换按钮内容

    +

    + {' '} + +

    + +
    +{`
    +`}
    +          
    + +
    +{`disableExample: function (event) {
    +  var button = this.refs.button;
    +  if (event.target.checked) {
    +    button.disable(我被禁用了);
    +  } else {
    +    button.enable("我又可以使用了");
    +  }
    +}`}
    +          
    + +
    +
    + ) + } +} + diff --git a/docs/src/js/pages/checkbox.jsx b/docs/src/js/pages/checkbox.jsx new file mode 100644 index 0000000..36991e9 --- /dev/null +++ b/docs/src/js/pages/checkbox.jsx @@ -0,0 +1,54 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Checkbox} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Checkbox' + + render () { + return ( +
    +
    +

    Checkbox

    +

    复选框

    +
    + +
    + +
    +{``}
    +          
    + +

    Example

    +

    + +

    +
    {''}
    + +

    Readonly

    +

    + +

    +
    {''}
    + +

    getValue()

    +

    获取值,选中状态下如果有 value,返回 value ,否则返回 true ,未选中状态返回 false

    + +

    setValue(value)

    +

    如果 value 值与 props.value 相等,或者值为 true 或者 1 ,设置为选中状态

    + +
    +
    + ) + } +} diff --git a/docs/src/js/pages/checkboxGroup.jsx b/docs/src/js/pages/checkboxGroup.jsx new file mode 100644 index 0000000..50d0c4b --- /dev/null +++ b/docs/src/js/pages/checkboxGroup.jsx @@ -0,0 +1,92 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +import textValue from '../data/text-value' +const {CheckboxGroup, dataSource } = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Checkbox' + + render () { + return ( +
    +
    +

    Checkbox Group

    +

    一组复选框

    +
    + +
    + +
    +{``}
    +
    +          
    + + +

    数据结构

    +
    标准结构为 text, id key组成的数组
    +
    {'[{"text":"北京","id":"beijing"},{"text":"上海", "id":"shanghai"}]'}
    +
    可以使用自定义数组,指定 textTpl, valueTpl
    +
    {'[{"cn":"北京","py":"beijing"},{"cn":"上海", "py":"shanghai"}]'}
    +
    可以使用一维数组,这种情况下,显示文字与值相同
    +
    {'["北京","上海","广州"]'}
    + +

    Object Data

    +
    + +
    +
    {''}
    +
    +{`data = [
    +  { "id": "nanjing", "text": "南京" },
    +  { "id": "beijing", "text": "北京" },
    +  { "id": "guangzhou", "text": "广州" },
    +  { "id": "shenzhen", "text": "深圳" },
    +  { "id": "chengdu", "text": "成都" },
    +  { "id": "chongqing", "text": "重庆" },
    +  { "id": "shanghai", "text": "上海" }
    +]`}
    +          
    + +

    Array Data

    +
    + console.log(this.refs.array.getValue())} inline={true} value={["北京", "广州"]} data={["南京", "北京", "上海", "广州", "深圳", "成都", "重庆", "西安"]} /> +
    +
    {''}
    + +

    Readonly

    +
    + +
    +
    {''}
    + +

    Remote Data

    +
    + console.log(this.refs.remote.getValue())} inline={true} value="shanghai,chengdu" data={ dataSource("json/text-value.json", null, { cache: true }) } /> +
    +
    {''}
    + +

    Data Sep

    +
    + console.log(this.refs.sep.getValue())} inline={true} sep="|" value="shanghai|chengdu" data={ dataSource("json/text-value.json", null, { cache: true }) } /> +
    +
    {''}
    +
    + + +
    + ) + } +} diff --git a/docs/src/js/pages/dataSource.jsx b/docs/src/js/pages/dataSource.jsx new file mode 100644 index 0000000..78450c6 --- /dev/null +++ b/docs/src/js/pages/dataSource.jsx @@ -0,0 +1,58 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/DataSource' + + render () { + return ( +
    +
    +

    dataSource

    +

    数据接口

    +
    + +
    +

    Select, Tree 等控件需要从服务器远程获取数据的接口。

    +

    接口返回一个方法,then成功回调,catch失败回调,complete成功与失败都会调用

    +

    ReactUI内部提供了一个dataSource,使用Qwest实现的,可以用其他的Ajax框架自行实现。

    +
    +{`function (src, data, options) {
    +  let stacks = {
    +        'then': [],
    +        'catch': [],
    +        'complete': []
    +      },
    +      promises = ['then', 'catch', 'complete'],
    +      req = null,
    +
    +  qwest = function () {
    +    req = Qwest.get(src, data, options)
    +    promises.forEach(p => {
    +      req[p](res => {
    +        stacks[p].forEach(func => {
    +          func(res)
    +        })
    +      })
    +    })
    +    return qwest
    +  }
    +
    +  promises.forEach(p => {
    +    qwest[p] = func => {
    +      stacks[p].push(func)
    +      return qwest
    +    }
    +  })
    +
    +  return qwest
    +}`}
    +          
    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/datetime.jsx b/docs/src/js/pages/datetime.jsx new file mode 100644 index 0000000..5d99b35 --- /dev/null +++ b/docs/src/js/pages/datetime.jsx @@ -0,0 +1,65 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Datetime} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Datetime' + + handleChange (ref) { + var value = 'value:' + this.refs['d-' + ref].getValue() + React.findDOMNode(this.refs['p-' + ref]).innerHTML = value + } + + render () { + return ( +
    +
    +

    Datetime

    +

    日期 / 时间 选择器

    +
    + +
    +
    +{``}
    +          
    + +

    Example

    + +
    +
    {``}
    + +

    dateOnly

    + +
    +
    {``}
    + +

    timeOnly

    + +
    +
    {``}
    + +

    readOnly

    + +
    {``}
    + +

    unixtime

    + +
    +
    {``}
    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/filter.jsx b/docs/src/js/pages/filter.jsx new file mode 100644 index 0000000..0945a07 --- /dev/null +++ b/docs/src/js/pages/filter.jsx @@ -0,0 +1,119 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' +const { Filter, dataSource } = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Filter' + + state = { + filterText: '' + } + + render () { + let options = [{ + label: '姓名', + name: 'name', + ops: ['like', '=', 'startWidth'] + }, { + label: '年龄', + name: 'age', + ops: ['>=', '<'], + type: 'number' + }, { + label: '生日', + name: 'birthday', + ops: ['>=', '<'], + type: 'datetime' + }, { + label: '地区', + name: 'office', + ops: ['='], + type: 'select', + props: { data: ['Tokyo', 'Singapore', 'New York', 'London', 'San Francisco'] } + }, { + label: '国籍', + name: 'country', + ops: ['='], + type: 'select', + props: { data: dataSource('json/countries.json'), optionTpl: '{country}', valueTpl: '{en}' } + }] + + return ( +
    +
    +

    Filter

    +

    筛选器

    +
    + +
    +
    +{`
    +options = {
    +  label: 'string'  // 显示的文字,必填
    +  name: 'string'   // 对应的字段名称,必填
    +  ops: ['string']  // 可选方法,默认值为 ['=', 'like', '>', '>=', '<', '<=', 'in', 'not in']
    +  type: 'string'   // 选择值的类型,可选值为 'text', 'number', 'integer', 'datetime', 'select'
    +                   // 默认值为 'text'
    +  props: object    // type 为 Component 的参数
    +  'op': function   // 如果ops包含自定义方法,需要在前端做筛选,在此实现
    +}`}
    +          
    + +

    local

    +
    + 当local设置为 true 时,onFilter 返回的对象会包括当前选定 op 的方法,用来进行过滤。这个方法为返回值为 bool。
    +
    +{`startWidth: function (d, value) {
    +  return d.name.indexOf(value) === 0
    +}`}
    +            
    + 示例见 Table。 +
    + +

    Example

    + this.setState({ filterText: JSON.stringify(fs) })} options={options} /> +
    {this.state.filterText}
    +
    +{`let options = [{
    +  label: '姓名',
    +  name: 'name',
    +  ops: ['like', '=', 'startWidth']
    +}, {
    +  label: '年龄',
    +  name: 'age',
    +  ops: ['>=', '<'],
    +  type: 'number'
    +}, {
    +  label: '生日',
    +  name: 'birthday',
    +  ops: ['>=', '<'],
    +  type: 'datetime'
    +}, {
    +  label: '地区',
    +  name: 'office',
    +  ops: ['='],
    +  type: 'select',
    +  props: { data: ['Tokyo', 'Singapore', 'New York', 'London', 'San Francisco'] }
    +}, {
    +  label: '国籍',
    +  name: 'country',
    +  ops: ['='],
    +  type: 'select',
    +  props: { data: dataSource('json/countries.json'), optionTpl: '{country}', valueTpl: '{en}' }
    +}]
    + this.setState({ filterText: JSON.stringify(fs) })} options={options} />
    +`}
    +          
    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/form.jsx b/docs/src/js/pages/form.jsx new file mode 100644 index 0000000..6212d19 --- /dev/null +++ b/docs/src/js/pages/form.jsx @@ -0,0 +1,137 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' +const {Form, FormControl, Button, FormSubmit, Icon, Input, RadioGroup, dataSource} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Form' + + state = { + layout: 'inline' + } + + render () { + return ( +
    +
    +

    Form

    +

    表单

    +
    + +
    +
    +{`
    // 数据验证成功后回调事件 + {children} +
    `} +
    +

    dataSource 参见这里

    +

    0.3 版更新,From 不再提供内置 Ajax 提交功能,需要在onSubmit中进行提交

    + +

    layout

    +
    + layout: + this.setState({ layout })} /> +
    +
    +
    + + + + + 提交 + + + +

    获取 / 提交数据

    +

    注:本文档使用了一个 json 文件模拟服务端返回数据,提交会提示 500 错误

    + +
    console.log(data)} data={dataSource("json/form.json")}> + + + + + + + + + + + + + + + + + + + + + + + + 选择文件} /> + + + 提交 + 处理中 + + + +
    +{`
    console.log(data)} data={dataSource("json/form.json")}> + + + + + + + + + + + + + + + + + + + + + + 选择文件} /> + + + 提交 + 处理中 + + +`} +
    + +

    Methods

    +

    getValue()

    +

    获取当前所有注册FormControl的value,结果为json

    + +

    getReference(name)

    +

    Form 下不能使用 ref 获取引用,需要引用时使用 getReference 方法。name 为 FormControl 的 name

    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/formControl.jsx b/docs/src/js/pages/formControl.jsx new file mode 100644 index 0000000..c42e43c --- /dev/null +++ b/docs/src/js/pages/formControl.jsx @@ -0,0 +1,344 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' +let {FormControl, Button, Input, Icon, Grid, dataSource} = global.uiRequire() + +const gridProps = { + width: 12, + responsive: 'lg' +} + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/FormControl' + + renderExample (type, component) { + component = component || 'Input' + return ( +
    +

    {type} => {component}

    +
    + + + + + +
    +              {``}
    +            
    +
    +
    +
    + ) + } + + render () { + return ( +
    +
    +

    FormControl

    +

    表单元素

    +
    + +
    +

    一系列表单控件的马甲,统一封装用来实现表单数据验证,输入提示,动态创建表单等功能。可以通过 getReference() 这个方法获取被封装的控件。

    +
    +{``}
    +          
    + +

    数据验证属性

    +

    FormControl 会根据这些属性自动验证输入,自动生成提示文字和错误信息,文字在 Lang 中设置。

    +
    +{``}
    +          
    + +

    已注册控件

    + +
    +

    text => Input

    +
    + + + + + +
    +  {``}
    +                
    +
    +
    +
    + + {this.renderExample('email')} + {this.renderExample('alpha')} + {this.renderExample('alphanum')} + {this.renderExample('url')} + {this.renderExample('integer')} + {this.renderExample('number')} + {this.renderExample('password')} + + {this.renderExample('date', 'Datetime')} + {this.renderExample('time', 'Datetime')} + {this.renderExample('datetime', 'Datetime')} + +
    +

    textarea => Input

    +
    + + + + + +
    +                  {``}
    +                
    +
    +
    +
    + +
    +

    select => Select

    +
    + + + + + +
    +{``}
    +                
    +
    +
    +
    + +
    +

    tree => Tree

    +
    + + + + + +
    +{``}
    +                
    +
    +
    +
    + +
    +

    checkbox => Checkbox

    +
    + + + + + +
    +                  {``}
    +                
    +
    +
    +
    + +
    +

    checkbox-group => CheckboxGroup

    +
    + + + + + +
    +{``}
    +                
    +
    +
    +
    + +
    +

    radio-group => RadioGroup

    +
    + + + + + +
    +{``}
    +                
    +
    +
    +
    + +
    +

    rating => RadioGroup

    +
    + + , ]} + /> + + + +
    +{`, ]}
    + />`}
    +                
    +
    +
    +
    + +
    +

    upload => Upload

    +
    + + 选择文件} /> + + + +
    +{` 选择文件}
    +/>`}
    +                
    +
    +
    +
    + +

    Children

    +

    可以使用 children 来处理一些复杂结构。注意每个 FormControl 只能有一个表单组件,类型必须和 FormControl 的 type 相同。

    + + + + + + + +
    +{`
    +  
    +    
    +    
    +  
    +`}
    +          
    + +

    自定义 FormControl

    +

    + FormControl 提供一个静态方法 register,将一个 Component 注册为 FormControl 成员。
    + 每个注册为 FormControl 的控件必须实现 getValue() , setValue(data) 这两个接口。 +

    +
    +{`FormControl.register(
    +  type,       // string,控件类型,唯一。如果同名,后注册的将会覆盖先注册的控件
    +  render,     // function,匹配到类型时,调用render方法返回相应控件
    +  valueType,  // 'string|array|number',控件值类型,三选一,数据验证时调用
    +)`}
    +          
    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/formSubmit.jsx b/docs/src/js/pages/formSubmit.jsx new file mode 100644 index 0000000..8836ba9 --- /dev/null +++ b/docs/src/js/pages/formSubmit.jsx @@ -0,0 +1,35 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/FormSubmit' + + render () { + return ( +
    +
    +

    FormSubmit

    +

    表单提交按钮

    +
    + +
    +

    Button 的一个马甲,封装了一层响应 Form 状态

    +
    {`{children}`}
    +

    如果children为两个元素,只会显示第一个元素内容,当按钮锁定时,显示第二个元素内容。

    +
    +{`
    +  提交
    +  处理中...
    +
    +`}
    +          
    + +

    示例参见 Form

    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/home.jsx b/docs/src/js/pages/home.jsx new file mode 100644 index 0000000..9332376 --- /dev/null +++ b/docs/src/js/pages/home.jsx @@ -0,0 +1,25 @@ +"use strict" + +import React from 'react' +const {Icon} = global.uiRequire() + +export default class Home extends React.Component { + static displayName = 'Home' + + render () { + return ( +
    +
    +
    +

    React UI

    +

    React组件库,样式基于yahoo的purecss

    + +
    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/icon.jsx b/docs/src/js/pages/icon.jsx new file mode 100644 index 0000000..13af8dd --- /dev/null +++ b/docs/src/js/pages/icon.jsx @@ -0,0 +1,68 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Icon} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Icon' + + render () { + return ( +
    +
    +

    Icon

    +

    图标,使用

    +
    + +
    +

    + 支持 font-awesomematerial-design-iconic-font
    + 默认的前缀为 icon,如果使用less,生成这两个字体的css时,指定 prefixicon
    + 如果使用这两个字体原生的前缀 fa 或者 zmdi,调用 Icon.setPrefix(prefix) 这个全局方法设置 +

    + +
    +{``}
    +          
    + +

    Normal

    + home +
    {' camera-retro'}
    + +

    Spin

    + +     + +
    {'\r'}
    + +

    Size

    + normal
    + lg
    + 2x
    + 3x
    + 4x
    + 5x +
    +{`
    +
    +
    +
    +
    +`}
    +          
    + +

    Method

    +

    有两个实例方法控制旋转,spinunspin

    +
    {'icon.spin()\ricon.unspin()'}
    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/input.jsx b/docs/src/js/pages/input.jsx new file mode 100644 index 0000000..8cdbf79 --- /dev/null +++ b/docs/src/js/pages/input.jsx @@ -0,0 +1,36 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Input' + + render () { + return ( +
    +
    +

    Input

    +

    输入框

    +
    + +
    +
    +{``}
    +          
    + +

    示例见 FormControl

    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/lang.jsx b/docs/src/js/pages/lang.jsx new file mode 100644 index 0000000..af4621c --- /dev/null +++ b/docs/src/js/pages/lang.jsx @@ -0,0 +1,47 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Lang: {getLang}} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Lang' + + state = { + path: 'buttons.ok', + text: getLang('request.status.405') + } + + handleChange (event) { + let path = event.target.value + this.setState({ path }) + } + + render () { + return ( +
    +
    +

    Language

    +

    语言包

    +
    + +
    +
    所有提示文字信息都放在 lang 下。
    +

    setLang(map[,map2...])

    +
    更新或者增加信息。
    + +

    getLang(path)

    +
    获取信息,path. 分隔字符串。
    +
    + +
    {JSON.stringify(getLang(this.state.path), null, 4) || 'undefined'}
    +
    + +

    当前信息

    +
    {JSON.stringify(getLang(), null, 4)}
    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/master.jsx b/docs/src/js/pages/master.jsx new file mode 100644 index 0000000..9cb6b9e --- /dev/null +++ b/docs/src/js/pages/master.jsx @@ -0,0 +1,30 @@ +"use strict" + +import React from 'react' +import classnames from 'classnames' +import NavList from '../nav-list.jsx' + +export default class Page extends React.Component { + static displayName = 'Master' + + static propTypes = { + children: React.PropTypes.any + } + + state = { + navShow: false + } + + navToggle (show) { + this.setState({ navShow: show }) + } + + render () { + return ( +
    + +
    {this.props.children}
    +
    + ) + } +} diff --git a/docs/src/js/pages/message.jsx b/docs/src/js/pages/message.jsx new file mode 100644 index 0000000..9c5986b --- /dev/null +++ b/docs/src/js/pages/message.jsx @@ -0,0 +1,44 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Message, Icon} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Message' + + render () { + return ( +
    +
    +

    Message

    +

    通知 / 消息

    +
    + +
    +

    全局方法

    +
    {'Message.show(content, type)'}
    +

    content:内容,必填,值为 stringelement

    +

    type:样式,会增加一个class messsage-[type],默认值为 info

    + +

    Example

    +

    Message.show("Info message.")}>info message

    +
    {'Message.show("info message.")'}
    + +

    Message.show("error message.", "error")}>error message

    +
    {'Message.show("error message.", "error")'}
    + +

    Message.show(

    , "warning")}>element message

    +
    {'Message.show(

    title

    span message
    , "warning")'}
    + +

    Message.show( success and icon, "success")}>success message

    +
    {'Message.success( success and icon, "success")'}
    + +

    扩展

    +

    默认会添加 message-extend 类,可以通过这个类进行扩展。

    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/modal.jsx b/docs/src/js/pages/modal.jsx new file mode 100644 index 0000000..b8b2b39 --- /dev/null +++ b/docs/src/js/pages/modal.jsx @@ -0,0 +1,204 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' +const {Button, Modal, Form, FormControl} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Modal' + + state = { + index: 0 + } + + multOpen () { + let index = this.state.index + 1, + width = Math.ceil((Math.random() + 1) * 400), + ps = [] + + for (var i = 1; i <= index; i++) { + ps.push(

    {`第 ${i} 层Modal`}

    ) + } + + let options = { + header: `第 ${index} 层Modal`, + width: width, + content: ( + + ), + onClose: () => { + this.setState({ index: index - 1 }) + }, + buttons: { + '关闭': true + } + } + Modal.open(options) + this.setState({ index }) + } + + render () { + let openOptions = { + header: '一个弹出表单', + content: ( +
    +
    + + + + +
    + ), + width: 700, + buttons: { + '取消': true, + '重置': () => { + let form = this.refs.form + form.setData({}) + }, + '确定': () => { + let form = this.refs.form + let suc = form.validate() + if (suc) { + alert(JSON.stringify(form.getValue())) + return true + } + } + } + } + + return ( +
    +
    +

    Modal

    +

    对话框

    +
    + +
    +
    Modal 为全局对象,所有的方法都为静态方法。
    +

    Modal.open(options)

    +
    +{`options = {
    +  clickaway: {bool},         // 为 true 时,点击页面空白部分关闭Modal,默认值为 false
    +  header: {string|element},  // 标题,值为 string 或者 ReactElement,可为空
    +  content: {string|element}, // 内容,值为 string 或者 ReactElement,必填
    +  width: {int|string},       // 宽度,默认值为 500
    +  onClose: function,         // 当Modal关闭时触发
    +  buttons: {
    +    {text}: function         // text 为按钮文字,function 返回 true 或者值为 true,关闭 Modal
    +  }
    +}`}
    +          
    +
    + +
    +
    +{`Modal.open(
    +  header: '一个弹出表单',
    +  content: (
    +    
    +
    + + + + +
    + ), + width: 700, + buttons: { + '取消': true, + '重置': () => { + let form = this.refs.form + form.setData({}) + }, + '确定': () => { + let form = this.refs.form + let suc = form.validate() + if (suc) { + alert(JSON.stringify(form.getValue())) + return true + } + } + } +)`} +
    + +

    Modal.alert(content)

    +
    快捷方式, contentstring 或者 ReactElement
    +
    + +
    +
    {`Modal.alert('这是一个alert')`}
    + +

    Modal.confirm(content, onOk)

    +
    快捷方式, contentstring 或者 ReactElementonOkfunction ,点击确定后回调。
    +
    + +
    +
    +{`Modal.confirm(
    +  
    +

    如果你知道要做什么,请点确定。

    +

    如果你不知道,点取消吧。

    +
    , + () => { alert('点击了确定') } +)`} +
    + +

    Modal.close(data)

    +
    关闭最上层弹出的Modal
    + +

    多层弹出

    +
    + +
    +
    +{`multOpen () {
    +  let index = this.state.index + 1,
    +      width = Math.ceil((Math.random() + 1) * 400),
    +      ps = []
    +
    +  for (var i = 1; i <= index; i++) {
    +    ps.push(

    {'第 ' + i + ' 层Modal'}

    ) + } + + let options = { + header: '第 ' + index + ' 层Modal', + width: width, + content: ( + + ), + onClose: () => { + this.setState({ index: index - 1 }) + }, + buttons: { + '关闭': true + } + } + Modal.open(options) + this.setState({ index }) +} +mult open +`} +
    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/pagination.jsx b/docs/src/js/pages/pagination.jsx new file mode 100644 index 0000000..3214be4 --- /dev/null +++ b/docs/src/js/pages/pagination.jsx @@ -0,0 +1,61 @@ +'use strict' + +import React from 'react' +import prettify from '../prettify' +const {Pagination, Input, Checkbox} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Pagination' + + state = { + index: 2, + size: 20, + total: 1000, + pages: 10, + jumper: false + } + + onChange (index) { + this.setState({ index }) + } + + render () { + return ( +
    +
    +

    Pagination

    +

    分页

    +
    + +
    +
    +{``}
    +          
    + +

    Example

    + + +

    index: this.setState({index: parseInt(v)})} />

    +

    size: this.setState({size: parseInt(v)})} />

    +

    total: this.setState({total: parseInt(v)})} />

    +

    pages: this.setState({pages: parseInt(v)})} />

    +

    this.setState({jumper})} value={this.state.jumper} />

    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/radioGroup.jsx b/docs/src/js/pages/radioGroup.jsx new file mode 100644 index 0000000..4d65fc2 --- /dev/null +++ b/docs/src/js/pages/radioGroup.jsx @@ -0,0 +1,86 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {RadioGroup, dataSource} = global.uiRequire() +const textValue = require('../data/text-value') + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Checkbox' + + state = { + inline: false + } + + render () { + return ( +
    +
    +

    Radio Group

    +

    一组单选框

    +
    + +
    + +
    +{``}
    +          
    + + +

    数据结构

    +
    标准结构为 text, value key组成的数组
    +
    {'[{"text":"北京","id":"beijing"},{"text":"上海", "id":"shanghai"}]'}
    +
    可以使用自定义数组,指定 textTpl, valueTpl
    +
    {'[{"cn":"北京","en":"beijing"},{"cn":"上海", "en":"shanghai"}]'}
    +
    可以使用一维数组,这种情况下,显示文字与值相同
    +
    {'["北京","上海","广州"]'}
    + +

    Object Data

    +
    + +
    +
    {''}
    +
    +{`data = [
    +  { "id": "nanjing", "text": "南京" },
    +  { "id": "beijing", "text": "北京" },
    +  { "id": "guangzhou", "text": "广州" },
    +  { "id": "shenzhen", "text": "深圳" },
    +  { "id": "chengdu", "text": "成都" },
    +  { "id": "chongqing", "text": "重庆" },
    +  { "id": "shanghai", "text": "上海" }
    +]`}
    +          
    + +

    Array Data

    +
    + +
    +
    {''}
    + +

    Readonly

    +
    + +
    +
    {''}
    + +

    Remote Data

    +
    + +
    +
    {''}
    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/rating.jsx b/docs/src/js/pages/rating.jsx new file mode 100644 index 0000000..61e5049 --- /dev/null +++ b/docs/src/js/pages/rating.jsx @@ -0,0 +1,136 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Rating, Icon, RadioGroup, Checkbox} = global.uiRequire() + +Rating.register('star', [ + , + +]) + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Rating' + + state = { + readOnly: false, + maxValue: 5, + value: 3, + theme: 'star' + } + + render () { + return ( +
    +
    +

    Rating

    +

    评分

    +
    + +
    +
    +{`
    +
    +Rating.register( // 注册一个主题,供重复调用
    +  string,        // 主题名称
    +  array          // 等同与 icons
    +)
    +`}
    +          
    + +

    Example

    +
    + this.setState({ value })} + /> +
    + +
    + maxValue: + this.setState({ maxValue })} value={this.state.maxValue} data={[5, 10, 12, 20]} /> +
    + +
    + this.setState({ + icons: checked ? + [, ] : + null + })} + text={'设置icons为heart'} /> +
    + +
    + this.setState({ readOnly })} text={'readOnly'} /> +
    + +
    + value: + this.setState({ value: event.target.value })} type="text" value={this.state.value} /> +
    + +
    + +
    +{`// 注册主题
    +Rating.register('star', [
    +  ,
    +  
    +])
    +
    +// state
    +getInitialState: function () {
    +  return {
    +    readOnly: false,
    +    maxValue: 5,
    +    value: 3,
    +    theme: 'star'
    +  }
    +}
    +
    +this.setState({ value })}
    +/>
    +
    +maxValue: this.setState({ maxValue })}
    +  value={this.state.maxValue} data={[5, 10, 12, 20]} />
    +
    +this.setState({
    +    icons: checked ?
    +      [,
    +       ] :
    +      null
    +  })}
    +  text={'设置icons为heart'} />
    +
    +this.setState({ readOnly })}
    +  text={'readOnly'} />
    +
    +value: this.setState({ value: event.target.value })}
    +  type="text" value={this.state.value} />
    +`}
    +          
    +
    +
    + ) + } +} diff --git a/docs/src/js/pages/select.jsx b/docs/src/js/pages/select.jsx new file mode 100644 index 0000000..f33212c --- /dev/null +++ b/docs/src/js/pages/select.jsx @@ -0,0 +1,119 @@ +"use strict" + +import React from 'react' +import prettify from '../prettify' +const {Select, dataSource, Button} = global.uiRequire() + +@prettify +export default class Page extends React.Component { + static displayName = 'Pages/Select' + + state = { + country: '' + } + + render () { + return ( +
    +
    +

    Select

    +

    下拉列表

    +
    + +
    +
    +{`
    +            {' '}
    +            
    + this.setState({ country }) }
    +            value={this.state.country}
    +            data={dataSource("json/countries.json")} />
    +          
    +          
    +{`
    +          
    +{`
    +          
    +{`
    +        {this.props.text}
    +        {this.props.children}
    +      
    +    )
    +  }
    +}
    +
    +require('./FormControl').register(
    +
    +  'checkbox',
    +
    +  function (props) {
    +    return 
    +  },
    +
    +  Checkbox
    +)
    +
    +export default Checkbox
    diff --git a/src/CheckboxGroup.js b/src/CheckboxGroup.js
    new file mode 100644
    index 0000000..92df258
    --- /dev/null
    +++ b/src/CheckboxGroup.js
    @@ -0,0 +1,142 @@
    +"use strict"
    +
    +import React from 'react'
    +import classnames from 'classnames'
    +import Checkbox from './Checkbox'
    +import { toArray } from './utils/strings'
    +import { toTextValue } from './utils/objects'
    +
    +class CheckboxGroup extends React.Component {
    +  static displayName = "CheckboxGroup"
    +
    +  static propTypes = {
    +    className: React.PropTypes.string,
    +    data: React.PropTypes.oneOfType([
    +      React.PropTypes.array,
    +      React.PropTypes.func
    +    ]).isRequired,
    +    inline: React.PropTypes.bool,
    +    onChange: React.PropTypes.func,
    +    readOnly: React.PropTypes.bool,
    +    sep: React.PropTypes.string,
    +    style: React.PropTypes.object,
    +    textTpl: React.PropTypes.string,
    +    value: React.PropTypes.any,
    +    valueTpl: React.PropTypes.string
    +  }
    +
    +  static defaultProps = {
    +    sep: ',',
    +    textTpl: '{text}',
    +    valueTpl: '{id}'
    +  }
    +
    +  componentWillReceiveProps (nextProps) {
    +    if (nextProps.value !== this.props.value) {
    +      this.setValue(nextProps.value)
    +    }
    +    if (nextProps.data !== this.props.data) {
    +      this.setState({ data: this.formatData(nextProps.data) })
    +    }
    +  }
    +
    +  state = {
    +    value: this.formatValue(this.props.value),
    +    data: this.formatData(this.props.data)
    +  }
    +
    +  formatValue (value) {
    +    return toArray(value, this.props.sep)
    +  }
    +
    +  getValue (sep) {
    +    let value = this.state.value
    +    if (sep === undefined) {
    +      sep = this.props.sep
    +    }
    +    if (sep) {
    +      value = value.join(sep)
    +    }
    +    return value
    +  }
    +
    +  setValue (value) {
    +    this.setState({ value: this.formatValue(value) })
    +  }
    +
    +  formatData (data) {
    +    if (typeof data === 'function') {
    +      data.then(res => {
    +        this.setState({ data: this.formatData(res) })
    +      })()
    +      return []
    +    } else {
    +      return toTextValue(data, this.props.textTpl, this.props.valueTpl)
    +    }
    +  }
    +
    +  handleChange (checked, value) {
    +    if (typeof value !== 'string') {
    +      value = value.toString()
    +    }
    +
    +    let values = this.state.value
    +    if (checked) {
    +      values.push(value)
    +    } else {
    +      let i = values.indexOf(value)
    +      if (i >= 0) {
    +        values.splice(i, 1)
    +      }
    +    }
    +
    +    if (this.props.onChange) {
    +      this.props.onChange(this.props.sep ? values.join(this.props.sep) : values)
    +    }
    +
    +    this.setState({ value: values })
    +  }
    +
    +  render () {
    +    let className = classnames(
    +      this.props.className,
    +      'rct-checkbox-group',
    +      { 'rct-inline': this.props.inline }
    +    )
    +    let values = this.state.value
    +
    +    let items = this.state.data.map((item, i) => {
    +      let value = this.props.sep ? item.$value.toString() : item.$value
    +      let checked = values.indexOf(value) >= 0
    +      return (
    +        
    +      )
    +    })
    +
    +    return (
    +      
    {this.state.msg || items}
    + ) + } +} + +export default CheckboxGroup + +require('./FormControl').register( + + 'checkbox-group', + + function (props) { + return + }, + + CheckboxGroup, + + 'array' +) diff --git a/src/Datetime.js b/src/Datetime.js new file mode 100644 index 0000000..a9e0a67 --- /dev/null +++ b/src/Datetime.js @@ -0,0 +1,594 @@ +"use strict" + +import React from 'react' +import classnames from 'classnames' +import { overView, getOuterHeight } from './utils/dom' +import * as datetime from './utils/datetime' +import clickAway from './higherorder/clickaway' + +import { requireCss } from './themes' +requireCss('datetime') + +import { getLang, setLang } from './lang' +setLang('datetime') + +const poslist = require('./utils/circle').getPostions(12, 50, -90) + +@clickAway +class Datetime extends React.Component { + static displayName = 'Datetime' + + static propTypes = { + bindClickAway: React.PropTypes.func, + className: React.PropTypes.string, + dateOnly: React.PropTypes.bool, + format: React.PropTypes.string, + onChange: React.PropTypes.func, + placeholder: React.PropTypes.string, + readOnly: React.PropTypes.bool, + style: React.PropTypes.object, + timeOnly: React.PropTypes.bool, + unbindClickAway: React.PropTypes.func, + unixtime: React.PropTypes.bool, + value: React.PropTypes.any + } + + componentWillReceiveProps (nextProps) { + if (nextProps.value !== this.props.value) { + this.setState({ value: datetime.convert(nextProps.value) }) + } + } + + state = { + active: false, + popup: false, + //format: this.props.format, + stage: this.props.timeOnly ? 'clock' : 'day', + current: datetime.convert(this.props.value, new Date()), + value: datetime.convert(this.props.value, null) + } + + componentClickAway () { + this.close() + } + + getValue () { + let value = this.value || this.state.value + if (!value) { + return null + } + + // if dateOnly, remove time + if (this.props.dateOnly) { + value = new Date(value.getFullYear(), value.getMonth(), value.getDate()) + } + + if (this.props.unixtime) { + // cut milliseconds + return Math.ceil(value.getTime() / 1000) + } else { + return this.formatValue(value) + } + } + + setValue (value) { + value = datetime.convert(value, null) + this.setState({ value: value }) + } + + formatValue (value) { + if (this.props.format) { + return datetime.format(value, this.props.format) + } + + let format = datetime.getDatetime + if (this.props.dateOnly) { + format = datetime.getDate + } else if (this.props.timeOnly) { + format = datetime.getTime + } + return format(value) + } + + open () { + if (this.props.readOnly) { + return + } + + let today = new Date() + // remove time + today = new Date(today.getFullYear(), today.getMonth(), today.getDate()) + + if (!this.state.active) { + let picker = this.refs.datepicker + picker.style.display = 'block' + let height = getOuterHeight(picker) + + setTimeout(() => { + this.setState({ + active: true, + popup: overView(this.refs.datetime, height), + current: this.state.value || today, + stage: this.props.timeOnly ? 'clock' : 'day' + }) + + this.bindClickAway() + + if (this.props.timeOnly) { + this.refs.clock.changeTimeStage('hour') + } + }, 0) + } + } + + close () { + this.setState({ active: false }) + this.unbindClickAway() + if (this.refs.clock) { + this.refs.clock.close() + } + setTimeout(() => { + if (this.state.active === false) { + this.refs.datepicker.style.display = 'none' + } + }, 500) + } + + changeDate (obj) { + let c = this.state.current, + year = obj.year === undefined ? c.getFullYear() : obj.year, + month = obj.month === undefined ? c.getMonth() : obj.month, + day = obj.day === undefined ? c.getDate() : obj.day, + hour = obj.hour === undefined ? c.getHours() : obj.hour, + minute = obj.minute === undefined ? c.getMinutes() : obj.minute, + second = obj.second === undefined ? c.getSeconds() : obj.second + + let d = new Date(year, month, day, hour, minute, second) + return d + } + + stateChange (state) { + // setTimeout wait checkClickAway completed + setTimeout(() => { + this.setState(state) + if (this.props.onChange) { + this.props.onChange(this.getValue()) + } + }, 0) + } + + stageChange (stage) { + this.stateChange({ stage: stage }) + } + + yearChange (year) { + let d = this.changeDate({ year: year, day: 1 }) + this.stateChange({ stage: 'month', current: d }) + } + + monthChange (month) { + let d = this.changeDate({ month: month, day: 1 }) + this.stateChange({ stage: 'day', current: d }) + } + + dayChange (day) { + let d = this.changeDate({ + year: day.getFullYear(), + month: day.getMonth(), + day: day.getDate() + }) + this.stateChange({ value: d, current: d }) + } + + timeChange (time) { + let d = this.changeDate(time) + this.stateChange({ value: d, current: d }) + } + + renderYears () { + let year = this.state.current.getFullYear(), + years = [] + for (let i = year - 12, j = year + 12; i <= j; i++) { + years.push(i) + } + + return years.map(function (y, i) { + return + }, this) + } + + renderMonths () { + return getLang('datetime.fullMonth').map(function (m, i) { + return + }, this) + } + + renderDays () { + let value = this.state.value, + current = this.state.current, + year = current.getFullYear(), + month = current.getMonth(), + first = new Date(year, month, 1), + end = new Date(year, month + 1, 0), + min = 1 - first.getDay(), + max = (Math.ceil((end.getDate() - min + 1) / 7) * 7), + days = [] + + for (let date, i = 0; i < max; i++) { + date = new Date(year, month, i + min) + days.push(date) + } + + let isToday = value ? + (year === value.getFullYear() && month === value.getMonth()) : + false + + return days.map(function (d, i) { + let className = classnames( + 'day', + { + gray: d.getMonth() !== month, + today: isToday && value.getDate() === d.getDate() && value.getMonth() === d.getMonth() + } + ) + return + }, this) + } + + timeStageChange (type) { + this.refs.clock.changeTimeStage(type) + } + + getTime () { + let current = this.state.current + + return ( +
    + + + + +
    + ) + } + + next () { + let d = this.state.current + switch (this.state.stage) { + case 'year': + d = this.changeDate({ year: d.getFullYear() + 25, day: 1 }) + break + case 'month': + d = this.changeDate({ year: d.getFullYear() + 1, day: 1 }) + break + case 'day': + d = this.changeDate({ month: d.getMonth() + 1, day: 1 }) + break + } + this.stateChange({ current: d }) + } + + pre () { + let d = this.state.current + switch (this.state.stage) { + case 'year': + d = this.changeDate({ year: d.getFullYear() - 25, day: 1 }) + break + case 'month': + d = this.changeDate({ year: d.getFullYear() - 1, day: 1 }) + break + case 'day': + d = this.changeDate({ month: d.getMonth() - 1, day: 1 }) + break + } + this.stateChange({ current: d }) + } + + render () { + let className = classnames( + this.props.className, + 'rct-datetime', + 'rct-form-control', + { + 'active': this.state.active && !this.props.readOnly, + 'popup': this.state.popup, + 'readonly': this.props.readOnly, + 'short': this.props.dateOnly || this.props.timeOnly + } + ) + + let current = this.state.current, + stage = this.state.stage, + header, + inner, + text = this.state.value ? this.formatValue(this.state.value) : "" + + let weeks = getLang('datetime.weekday').map(function (w, i) { + return
    {w}
    + }) + + text = text ? + {text} : + {this.props.placeholder}  + + switch (stage) { + case 'day': + inner =
    {weeks}{this.renderDays()}
    + break + case 'month': + inner =
    {this.renderMonths()}
    + break + case 'year': + inner =
    {this.renderYears()}
    + break + case 'clock': + inner =
    + break + } + + if (!this.props.timeOnly) { + header = ( + + ) + } + + return ( +
    + {text} + +
    + {header} + {inner} + {(stage === 'day' || stage === 'clock') && (!this.props.dateOnly) && this.getTime()} +
    +
    +
    + ) + } +} + +class Clock extends React.Component { + static displayName = 'Datetime.Clock' + + static propTypes = { + active: React.PropTypes.bool, + current: React.PropTypes.instanceOf(Date), + onTimeChange: React.PropTypes.func, + stage: React.PropTypes.string, + timeOnly: React.PropTypes.bool + } + + componentWillReceiveProps (nextProps) { + if (nextProps.current !== this.props.current) { + this.setState({ current: nextProps.current, am: nextProps.current.getHours() < 12 }) + } + } + + state = { + current: this.props.current, + stage: this.props.stage || 'clock', + active: this.props.active, + am: this.props.current.getHours() < 12 + } + + changeTimeStage (stage) { + this.setState({ stage: stage, active: true }) + } + + setValue (value) { + let d = {} + d[this.state.stage] = value + this.props.onTimeChange(d) + } + + close () { + if (!this.props.timeOnly) { + this.setState({ active: false }) + } + } + + getRotate (type) { + let current = this.state.current, + value, + max = type === 'hour' ? 12 : 60 + + switch (type) { + case 'hour': + value = current.getHours() + current.getMinutes() / 60 + break + case 'minute': + value = current.getMinutes() + current.getSeconds() / 60 + break + case 'second': + value = current.getSeconds() + break + } + + value = value * 360 / max - 90 + return 'rotate(' + value + 'deg)' + } + + renderPointer () { + let stage = this.state.stage + + let pointer = function (type, context) { + let rotate = context.getRotate(type) + return ( +
    + ) + } + + return ( +
    + {pointer('hour', this)} + {pointer('minute', this)} + {pointer('second', this)} +
    + ) + } + + render () { + let steps = [], + //current = this.state.current, + stage = this.state.stage, + step = (stage === 'hour' || stage === 'clock') ? 1 : 5 + + for (let i = 0, s; i < 12; i++) { + s = i * step + if (!this.state.am && stage === 'hour') { + s += 12 + } + steps.push(s) + } + + let sets = steps.map(function (s, i) { + let pos = poslist[i], + left = pos[0] + '%', + top = pos[1] + '%' + return ( +
    { this.setValue(s) }} className={classnames('clock-set')} key={i} style={{left: left, top: top}}>{s}
    + ) + }, this) + + let className = classnames('clock-wrapper', { active: this.state.active }) + + return ( +
    +
    + {!this.props.timeOnly &&
    } +
    +
    + {sets} +
    + {this.renderPointer()} + {stage === 'hour' &&
    +
    {this.setState({ am: true })}} className={classnames("time-am", { active: this.state.am })}>AM
    +
    {this.setState({ am: false })}} className={classnames("time-pm", { active: !this.state.am })}>PM
    +
    } +
    +
    + ) + } +} + +class TimeSet extends React.Component { + static displayName = 'Datetime/TimeSet' + + static propTypes = { + onStageChange: React.PropTypes.func, + onTimeChange: React.PropTypes.func, + type: React.PropTypes.string, + value: React.PropTypes.number + } + + componentWillReceiveProps (nextProps) { + if (nextProps.value !== this.props.value) { + this.setState({ value: nextProps.value }) + } + } + + state = { + value: this.props.value || 0, + type: this.props.type + } + + add () { + let value = this.state.value, + max = this.props.type === 'hour' ? 24 : 60 + value += 1 + if (value >= max) { + value = 0 + } + this.changeTime(value) + } + + sub () { + let value = this.state.value, + max = this.props.type === 'hour' ? 23 : 59 + value -= 1 + if (value < 0) { + value = max + } + this.changeTime(value) + } + + changeTime (value) { + this.setState({ value: value }) + let d = {} + d[this.props.type] = value + this.props.onTimeChange(d) + } + + setValue (value) { + this.setState({ value: value }) + } + + changeStage () { + this.props.onStageChange(this.props.type) + } + + render () { + return ( +
    +
    + {this.state.value} + + +
    +
    + ) + } +} + +export default Datetime + +import FormControl from './FormControl' + +FormControl.register( + + 'datetime', + + function (props) { + return + }, + + Datetime + +) + +FormControl.register( + + 'date', + + function (props) { + return + }, + + Datetime + +) + +FormControl.register( + + 'time', + + function (props) { + return + }, + + Datetime + +) diff --git a/src/Filter.js b/src/Filter.js new file mode 100644 index 0000000..cabd9c7 --- /dev/null +++ b/src/Filter.js @@ -0,0 +1,181 @@ +'use strict' + +import React from 'react' +import classnames from 'classnames' +//import { forEach } from '../utils/objects' +import Button from './Button' +import FilterItem from './FilterItem' +import clickAway from './higherorder/clickaway' + +import { requireCss } from './themes' +requireCss('filter') + +import {getLang, setLang} from './lang' +setLang('buttons') + +@clickAway +export default class Filter extends React.Component { + static displayName = 'Filter' + + static propTypes = { + className: React.PropTypes.string, + local: React.PropTypes.bool, + onFilter: React.PropTypes.func, + onSearch: React.PropTypes.func, + options: React.PropTypes.array, + style: React.PropTypes.object, + type: React.PropTypes.string + } + + static defaultProps = { + options: [] + } + + componentWillMount () { + this.initData(this.props.options) + } + + componentClickAway () { + this.close() + } + + state = { + active: false, + filters: [] + } + + initData (options) { + options = options.map((d, i) => { + d.optionsIndex = i + return d + }) + this.setState({ options }) + } + + onSearch () { + if (this.props.onSearch) { + this.props.onSearch() + } + } + + open () { + this.bindClickAway() + let options = this.refs.options + options.style.display = 'block' + setTimeout(() => { + this.setState({ active: true }) + }, 0) + setTimeout(() => { + options.parentNode.style.overflow = 'visible' + }, 450) + } + + close () { + let options = this.refs.options + options.parentNode.style.overflow = 'hidden' + this.setState({ active: false }) + this.unbindClickAway() + setTimeout(() => { + options.style.display = 'none' + }, 450) + } + + addFilter () { + let filters = this.state.filters + filters.push({}) + this.setState({ filters }) + } + + removeFilter (index) { + let filters = this.state.filters + filters.splice(index, 1) + this.setState({ filters }) + } + + clearFilter () { + this.setState({ filters: [], resultText: '' }) + this.close() + if (this.props.onFilter) { + this.props.onFilter([]) + } + } + + onChange (index, filter) { + let filters = this.state.filters, + f = filters[index] + Object.keys(filter).forEach(k => { + f[k] = filter[k] + }) + this.setState({ filters }) + } + + onFilter () { + this.close() + let filters = this.state.filters, + local = this.props.local + this.setState({ resultText: this.formatText(filters) }) + if (this.props.onFilter) { + let novs = [] + filters.forEach((f, i) => { + if (f.op && f.value) { + let nov = { name: f.name, op: f.op, value: f.value } + if (local) { + nov.func = this.refs[`fi${i}`].getFunc() + } + novs.push(nov) + } + }) + this.props.onFilter(novs) + } + } + + formatText (filters) { + let text = [] + filters.forEach(f => { + if (f.op && f.value) { + text.push(`${f.label} ${f.op} '${f.value}'`) + } + }) + return text.join(', ') + } + + renderFilters () { + let filters = this.state.filters.map((f, i) => { + return ( + + ) + }) + return filters + } + + render () { + let className = classnames( + this.props.className, + 'rct-filter', + 'rct-form-control', + this.state.active ? 'active' : '' + ) + return ( +
    +
    + {this.state.resultText} + +
    + +
    +
    + + {this.renderFilters()} + +
    + + + +
    + +
    +
    +
    + ) + } +} diff --git a/src/FilterItem.js b/src/FilterItem.js new file mode 100644 index 0000000..b4b60a6 --- /dev/null +++ b/src/FilterItem.js @@ -0,0 +1,162 @@ +'use strict' + +import React from 'react' +import Datetime from './Datetime' +import Input from './Input' +import Select from './Select' + +const DEFAULT_OPS = ['=', 'like', '>', '>=', '<', '<=', 'in', 'not in'] + +export default class FilterItem extends React.Component { + static displayName = 'FilterItem' + + static propTypes = { + index: React.PropTypes.number, // for onChange update filters + label: React.PropTypes.string, + name: React.PropTypes.string, + onChange: React.PropTypes.func, + op: React.PropTypes.string, + ops: React.PropTypes.array, + options: React.PropTypes.array, + optionsIndex: React.PropTypes.number, + removeFilter: React.PropTypes.func, + type: React.PropTypes.string, + value: React.PropTypes.any + } + + onLabelChange (optionsIndex) { + optionsIndex = parseInt(optionsIndex) + let options = this.props.options[optionsIndex] + let filter = { + optionsIndex: optionsIndex, + label: options.label, + name: options.name, + op: null, + value: null, + ops: options.ops || DEFAULT_OPS + } + // only one op, use it + if (filter.ops.length === 1) { + filter.op = filter.ops[0] + } + this.props.onChange(this.props.index, filter) + } + + onOpChange (op) { + this.props.onChange(this.props.index, { op }) + } + + onValueChange (value) { + this.props.onChange(this.props.index, { value }) + } + + getFunc () { + let options = this.props.options, + name = this.props.name, + value = this.props.value, + op = this.props.op, + func = function () {}, + filter = options[this.props.index] + + if (options.type === 'integer' || options.type === 'number') { + value = parseFloat(value) + } + + if (filter[op]) { + return function (d) { + return filter[op](d, value) + } + } + + switch (op) { + case '=': + func = d => { return d[name].toString() === value.toString() } + break + case 'like': + func = d => { return d[name].indexOf(value) >= 0 } + break + case '>': + func = d => { return d[name] > value } + break + case '>=': + func = d => { return d[name] >= value } + break + case '<': + func = d => { return d[name] < value } + break + case '<=': + func = d => { return d[name] <= value } + break + case 'in': + func = d => { return value.split(',').indexOf(d[name].toString()) >= 0 } + break + case 'not in': + func = d => { return value.split(',').indexOf(d[name].toString()) < 0 } + break + } + + return func + } + + remove () { + // setTimeout wait parent clickaway completed + setTimeout(() => { + this.props.removeFilter(this.props.index) + }, 0) + } + + renderOp () { + if (this.props.ops) { + return + break + case 'datetime': + control = + break + default: + control = + break + } + return control + } + + render () { + let optionsIndex = this.props.optionsIndex + if (optionsIndex !== undefined) { + optionsIndex = optionsIndex.toString() + } + return ( +
    +