├── .gitignore
├── .jshintrc
├── .travis.yml
├── CHANGELOG.md
├── README.md
├── bower.json
├── demo
├── bootstrap.min.css
├── components
│ ├── build-badge.js
│ └── field-types
│ │ ├── Checkbox.js
│ │ ├── NumberField.js
│ │ ├── Radio.js
│ │ ├── Select.js
│ │ ├── SimpleRender.js
│ │ └── TextField.js
├── demo-built.js
├── demo.js
├── index.html
└── styles.css
├── dist
├── react-formly.js
├── react-formly.min.js
└── react-formly.min.js.map
├── gulpfile.js
├── index.js
├── package.json
├── server.js
├── src
├── components
│ ├── Formly.js
│ └── Formly.spec.js
├── mixins
│ ├── FieldMixin.js
│ └── FieldMixin.spec.js
└── modules
│ ├── FormlyConfig.js
│ └── FormlyConfig.spec.js
└── test
├── TestFields.js
├── index-built.js
├── index.js
└── karma.conf.js
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | npm-debug.log
--------------------------------------------------------------------------------
/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "unused": "vars",
3 | "undef": true,
4 | "curly": true,
5 | "forin": true,
6 | "eqeqeq": true,
7 | "immed": true,
8 | "freeze": true,
9 | "latedef": "nofunc",
10 | "newcap": false,
11 | "noarg": true,
12 | "noempty": true,
13 | "nonew": true,
14 | "maxcomplexity": 5,
15 | "strict": true,
16 | "indent": 2,
17 | "maxdepth": 3,
18 | "trailing": true,
19 |
20 | "browser": true,
21 | "node": true,
22 | "globals": {
23 | "genie": true,
24 |
25 | /* MOCHA */
26 | "describe": false,
27 | "it": false,
28 | "before": false,
29 | "beforeEach": false,
30 | "after": false,
31 | "afterEach": false
32 | }
33 | }
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "0.10"
4 | before_script:
5 | - export DISPLAY=:99.0
6 | - sh -e /etc/init.d/xvfb start
7 | email:
8 | on_failure: change
9 | on_success: never
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # 0.0.2
2 |
3 | ## Bug Fixes
4 |
5 | - Removing React from `dist`.
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # React Formly
2 |
3 | [](https://travis-ci.org/formly-js/react-formly)
4 |
5 | **JSON powered forms for react.**
6 |
7 | [Demo](http://formly-js.github.io/react-formly)
8 |
9 | ## Example Usage
10 |
11 | ```javascript
12 | // add custom field types
13 | FormlyConfig.fields.addType([
14 | { name: 'text', field: require('./components/field-types/TextField') },
15 | { name: 'number', field: require('./components/field-types/NumberField') },
16 | { name: 'checkbox', field: require('./components/field-types/Checkbox') }
17 | ]);
18 |
19 | var App = React.createClass({
20 | getInitialState: function() {
21 | return { model: {} };
22 | },
23 | onFormlyUpdate: function(model) {
24 | this.setState({model: model});
25 | },
26 | componentWillMount: function() {
27 | this.formlyConfig = {
28 | name: 'myFormly',
29 | fields: [
30 | {
31 | key: 'name',
32 | type: 'text',
33 | label: 'Name',
34 | placeholder: 'If you would be so kind...',
35 | hidden: function(model) {
36 | return !!model.secretName;
37 | }
38 | },
39 | {
40 | key: 'age',
41 | type: 'number',
42 | label: 'Age'
43 | },
44 | {
45 | key: 'secretName',
46 | type: 'text',
47 | label: 'Secret name...?',
48 | placeholder: 'If you have no name...',
49 | hidden: function(model) {
50 | return !!model.name;
51 | }
52 | },
53 | {
54 | key: 'awesome',
55 | type: 'checkbox',
56 | label: 'Are you awesome?'
57 | }
58 | ]
59 | };
60 | },
61 | render: function() {
62 | return (
63 |
64 |
Form
65 |
66 |
67 |
Model:
68 |
{JSON.stringify(this.state.model, null, 2)}
69 |
70 | );
71 | }
72 | });
73 |
74 | React.renderComponent( , document.body);
75 | ```
76 |
77 | ## Formly
78 |
79 | ### API
80 |
81 | #### onFormlyUpdate
82 |
83 | Called with the `model` anytime there's an update.
84 |
85 | #### model
86 |
87 | The model to represent with the form.
88 |
89 | #### config
90 |
91 | An object to configure formly. It is expected to have a `name` (string, optional) and `fields` (array of `field`). `fields` are expected to have a `key`, `type` / `component`, `hidden` (bool/func), `data`, (object), and `props` (object/func)
92 |
93 | ## FormlyConfig
94 |
95 | ### addType
96 |
97 | ```javascript
98 | FormlyConfig.addType('name', require('./FieldType'));
99 | FormlyConfig.addType({
100 | name: 'name',
101 | field: require('./FieldType')
102 | });
103 | FormlyConfig.addType([
104 | {
105 | name: 'name',
106 | field: require('./FieldType')
107 | },
108 | {
109 | name: 'secondName',
110 | field: require('./FieldType2')
111 | }
112 | ]);
113 | ```
114 |
115 | ### getTypes
116 |
117 | ```javascript
118 | var FieldType = require('./FieldType');
119 | FormlyConfig.addType('field1', FieldType);
120 | FormlyConfig.getTypes().field1 === FieldType; // <-- true
121 | ```
122 |
123 | ### clearTypes
124 |
125 | ```javascript
126 | var FieldType = require('./FieldType');
127 | FormlyConfig.addType('field1', FieldType);
128 | var oldTypes = FormlyConfig.clearTypes();
129 | oldTypes.field1 === FieldType; // <-- true
130 | FormlyConfig.getTypes().field1 === undefined; // <-- true
131 | FormlyConfig.getTypes(); // <-- {}
132 | ```
133 |
134 | ## FieldMixin
135 |
136 | Gives you 2 methods `onChange` and `updateValue`. `onChange` invokes `updateValue` with the current value. Handles special cases for `checkbox`, `radio`, and `select`. Defaults to `node.value` (input default). If your component has a `transformUpdate`, then it will be called with the value and the value will be reset to whatever is returned before it calls up to its parent (presumably the Formly component) with the new value.
137 |
138 | # Contributing
139 |
140 | Yes, please...
141 |
142 | Just run `npm install` then run `gulp` to see a list of available tasks.
143 |
144 | # Credits
145 |
146 | Based on the simple api from [angular-formly](https://github.com/formly-js/angular-formly)
147 |
148 | # License
149 |
150 | MIT
151 |
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-formly",
3 | "main": "dist/react-formly.min.js",
4 | "homepage": "https://github.com/kentcdodds/react-formly",
5 | "authors": [
6 | "Kent C. Dodds (http://kent.doddsfamily.us)"
7 | ],
8 | "description": "JSON powered forms for react - Currently in alpha state, API subject to change...",
9 | "moduleType": [
10 | "amd",
11 | "globals",
12 | "node"
13 | ],
14 | "keywords": [
15 | "react",
16 | "react components",
17 | "library",
18 | "forms",
19 | "react-component",
20 | "reactjs",
21 | "html forms"
22 | ],
23 | "license": "MIT",
24 | "ignore": [
25 | "script",
26 | "node_modules",
27 | "test",
28 | "demo"
29 | ],
30 | "dependencies": {
31 | "react": "~0.11.1"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/demo/bootstrap.min.css:
--------------------------------------------------------------------------------
1 | @import url("//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700");/*!
2 | * bootswatch v3.2.0
3 | * Homepage: http://bootswatch.com
4 | * Copyright 2012-2014 Thomas Park
5 | * Licensed under MIT
6 | * Based on Bootstrap
7 | *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Source Sans Pro",Calibri,Candara,Arial,sans-serif;font-size:15px;line-height:1.42857143;color:#333333;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#2780e3;text-decoration:none}a:hover,a:focus{color:#165ba8;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:0}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100% \9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #e6e6e6}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Source Sans Pro",Calibri,Candara,Arial,sans-serif;font-weight:300;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:86%}cite{font-style:normal}mark,.mark{background-color:#ff7518;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#2780e3}a.text-primary:hover{color:#1967be}.text-success{color:#ffffff}a.text-success:hover{color:#e6e6e6}.text-info{color:#ffffff}a.text-info:hover{color:#e6e6e6}.text-warning{color:#ffffff}a.text-warning:hover{color:#e6e6e6}.text-danger{color:#ffffff}a.text-danger:hover{color:#e6e6e6}.bg-primary{color:#fff;background-color:#2780e3}a.bg-primary:hover{background-color:#1967be}.bg-success{background-color:#3fb618}a.bg-success:hover{background-color:#2f8912}.bg-info{background-color:#9954bb}a.bg-info:hover{background-color:#7e3f9d}.bg-warning{background-color:#ff7518}a.bg-warning:hover{background-color:#e45c00}.bg-danger{background-color:#ff0039}a.bg-danger:hover{background-color:#cc002e}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid #e6e6e6}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #e6e6e6}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #e6e6e6;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:21px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:0}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:0;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #dddddd}.table .table{background-color:#ffffff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#3fb618}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#379f15}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#9954bb}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#8d46b0}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#ff7518}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#fe6600}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#ff0039}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#e60033}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#333333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:11px;font-size:15px;line-height:1.42857143;color:#333333}.form-control{display:block;width:100%;height:43px;padding:10px 18px;font-size:15px;line-height:1.42857143;color:#333333;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#e6e6e6;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:43px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:31px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:64px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:21px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:11px;padding-bottom:11px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}select.input-sm{height:31px;line-height:31px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:64px;padding:18px 30px;font-size:19px;line-height:1.33;border-radius:0}select.input-lg{height:64px;line-height:64px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:53.75px}.form-control-feedback{position:absolute;top:26px;right:0;z-index:2;display:block;width:43px;height:43px;line-height:43px;text-align:center}.input-lg+.form-control-feedback{width:64px;height:64px;line-height:64px}.input-sm+.form-control-feedback{width:31px;height:31px;line-height:31px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#ffffff}.has-success .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#3fb618}.has-success .form-control-feedback{color:#ffffff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#ffffff}.has-warning .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#ff7518}.has-warning .form-control-feedback{color:#ffffff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#ffffff}.has-error .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#ff0039}.has-error .form-control-feedback{color:#ffffff}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:11px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:32px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:11px}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:24.94px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:10px 18px;font-size:15px;line-height:1.42857143;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#ffffff;background-color:#222222;border-color:#222222}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#090909;border-color:#040404}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#222222;border-color:#222222}.btn-default .badge{color:#222222;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#2780e3;border-color:#2780e3}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#1967be;border-color:#1862b5}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#2780e3;border-color:#2780e3}.btn-primary .badge{color:#2780e3;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#3fb618;border-color:#3fb618}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#2f8912;border-color:#2c8011}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#3fb618;border-color:#3fb618}.btn-success .badge{color:#3fb618;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#9954bb;border-color:#9954bb}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#7e3f9d;border-color:#783c96}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#9954bb;border-color:#9954bb}.btn-info .badge{color:#9954bb;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#ff7518;border-color:#ff7518}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#e45c00;border-color:#da5800}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#ff7518;border-color:#ff7518}.btn-warning .badge{color:#ff7518;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#ff0039;border-color:#ff0039}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#cc002e;border-color:#c2002b}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#ff0039;border-color:#ff0039}.btn-danger .badge{color:#ff0039;background-color:#ffffff}.btn-link{color:#2780e3;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#165ba8;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:18px 30px;font-size:19px;line-height:1.33;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#2780e3}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#2780e3}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.42857143;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{position:absolute;z-index:-1;opacity:0;filter:alpha(opacity=0)}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:64px;padding:18px 30px;font-size:19px;line-height:1.33;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:64px;line-height:64px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:31px;line-height:31px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:10px 18px;font-size:15px;font-weight:normal;line-height:1;color:#333333;text-align:center;background-color:#e6e6e6;border:1px solid #cccccc;border-radius:0}.input-group-addon.input-sm{padding:5px 10px;font-size:13px;border-radius:0}.input-group-addon.input-lg{padding:18px 30px;font-size:19px;border-radius:0}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#e6e6e6}.nav>li.disabled>a{color:#999999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#e6e6e6;border-color:#2780e3}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:0 0 0 0}.nav-tabs>li>a:hover{border-color:#e6e6e6 #e6e6e6 #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555555;background-color:#ffffff;border:1px solid #dddddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;border-radius:0 0 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#2780e3}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;border-radius:0 0 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:0}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:14.5px 15px;font-size:19px;line-height:21px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.25px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:14.5px;padding-bottom:14.5px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:3.5px;margin-bottom:3.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:3.5px;margin-bottom:3.5px}.navbar-btn.btn-sm{margin-top:9.5px;margin-bottom:9.5px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:14.5px;margin-bottom:14.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#222222;border-color:#121212}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-default .navbar-text{color:#ffffff}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:#090909}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#090909}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#090909}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#121212}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#090909;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#090909}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#090909}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#2780e3;border-color:#1967be}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#1967be}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#1967be}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#1967be}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#1a6ecc}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#1967be;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#1967be}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#1967be}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#1967be}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#1967be}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ffffff;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#ffffff}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#f5f5f5;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#999999}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:10px 18px;line-height:1.42857143;text-decoration:none;color:#2780e3;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#165ba8;background-color:#e6e6e6;border-color:#dddddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#999999;background-color:#f5f5f5;border-color:#dddddd;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999999;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:18px 30px;font-size:19px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:13px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#ffffff;border:1px solid #dddddd;border-radius:0}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#e6e6e6}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#222222}.label-default[href]:hover,.label-default[href]:focus{background-color:#090909}.label-primary{background-color:#2780e3}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#1967be}.label-success{background-color:#3fb618}.label-success[href]:hover,.label-success[href]:focus{background-color:#2f8912}.label-info{background-color:#9954bb}.label-info[href]:hover,.label-info[href]:focus{background-color:#7e3f9d}.label-warning{background-color:#ff7518}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#e45c00}.label-danger{background-color:#ff0039}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#cc002e}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#2780e3;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2780e3;background-color:#ffffff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#e6e6e6}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#cccccc}.container .jumbotron{border-radius:0}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:67.5px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#2780e3}.thumbnail .caption{padding:9px;color:#333333}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:0}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#3fb618;border-color:#4e9f15;color:#ffffff}.alert-success hr{border-top-color:#438912}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#9954bb;border-color:#7643a8;color:#ffffff}.alert-info hr{border-top-color:#693c96}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#ff7518;border-color:#ff4309;color:#ffffff}.alert-warning hr{border-top-color:#ee3800}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#ff0039;border-color:#f0005e;color:#ffffff}.alert-danger hr{border-top-color:#d60054}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#cccccc;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:13px;line-height:21px;color:#ffffff;text-align:center;background-color:#2780e3;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{color:#999999;min-width:30px;background-color:transparent;background-image:none;box-shadow:none}.progress-bar-success{background-color:#3fb618}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#9954bb}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#ff7518}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#ff0039}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555555}a.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#e6e6e6;color:#999999}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#2780e3;border-color:#2780e3}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#dceafa}.list-group-item-success{color:#ffffff;background-color:#3fb618}a.list-group-item-success{color:#ffffff}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#ffffff;background-color:#379f15}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-info{color:#ffffff;background-color:#9954bb}a.list-group-item-info{color:#ffffff}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#ffffff;background-color:#8d46b0}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-warning{color:#ffffff;background-color:#ff7518}a.list-group-item-warning{color:#ffffff}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#ffffff;background-color:#fe6600}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-danger{color:#ffffff;background-color:#ff0039}a.list-group-item-danger{color:#ffffff}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#ffffff;background-color:#e60033}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#ffffff;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1;border-top-left-radius:-1}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:-1;border-top-left-radius:-1}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1;border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:-1}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:-1}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#2780e3}.panel-primary>.panel-heading{color:#ffffff;background-color:#2780e3;border-color:#2780e3}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2780e3}.panel-primary>.panel-heading .badge{color:#2780e3;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2780e3}.panel-success{border-color:#4e9f15}.panel-success>.panel-heading{color:#ffffff;background-color:#3fb618;border-color:#4e9f15}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#4e9f15}.panel-success>.panel-heading .badge{color:#3fb618;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#4e9f15}.panel-info{border-color:#7643a8}.panel-info>.panel-heading{color:#ffffff;background-color:#9954bb;border-color:#7643a8}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#7643a8}.panel-info>.panel-heading .badge{color:#9954bb;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#7643a8}.panel-warning{border-color:#ff4309}.panel-warning>.panel-heading{color:#ffffff;background-color:#ff7518;border-color:#ff4309}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ff4309}.panel-warning>.panel-heading .badge{color:#ff7518;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ff4309}.panel-danger{border-color:#f0005e}.panel-danger>.panel-heading{color:#ffffff;background-color:#ff0039;border-color:#f0005e}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f0005e}.panel-danger>.panel-heading .badge{color:#ff0039;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f0005e}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:0}.well-sm{padding:9px;border-radius:0}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#ffffff;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ffffff;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate3d(0, -25%, 0);transform:translate3d(0, -25%, 0);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-size:13px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:rgba(0,0,0,0.9);border-radius:0}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,0.9)}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,0.9)}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,0.9)}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:rgba(0,0,0,0.9)}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:rgba(0,0,0,0.9)}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,0.9)}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,0.9)}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,0.9)}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;background-color:#ffffff;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:0;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:-1 -1 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar-inverse .badge{background-color:#fff;color:#2780e3}body{-webkit-font-smoothing:antialiased}.text-primary,.text-primary:hover{color:#2780e3}.text-success,.text-success:hover{color:#3fb618}.text-danger,.text-danger:hover{color:#ff0039}.text-warning,.text-warning:hover{color:#ff7518}.text-info,.text-info:hover{color:#9954bb}table a:not(.btn),.table a:not(.btn){text-decoration:underline}table .success,.table .success,table .warning,.table .warning,table .danger,.table .danger,table .info,.table .info{color:#fff}table .success a,.table .success a,table .warning a,.table .warning a,table .danger a,.table .danger a,table .info a,.table .info a{color:#fff}.has-warning .help-block,.has-warning .control-label,.has-warning .form-control-feedback{color:#ff7518}.has-warning .form-control,.has-warning .form-control:focus,.has-warning .input-group-addon{border:1px solid #ff7518}.has-error .help-block,.has-error .control-label,.has-error .form-control-feedback{color:#ff0039}.has-error .form-control,.has-error .form-control:focus,.has-error .input-group-addon{border:1px solid #ff0039}.has-success .help-block,.has-success .control-label,.has-success .form-control-feedback{color:#3fb618}.has-success .form-control,.has-success .form-control:focus,.has-success .input-group-addon{border:1px solid #3fb618}.nav-pills>li>a{border-radius:0}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:none}.close{text-decoration:none;text-shadow:none;opacity:0.4}.close:hover,.close:focus{opacity:1}.alert{border:none}.alert .alert-link{text-decoration:underline;color:#fff}.label{border-radius:0}.progress{height:8px;-webkit-box-shadow:none;box-shadow:none}.progress .progress-bar{font-size:8px;line-height:8px}.panel-heading,.panel-footer{border-top-right-radius:0;border-top-left-radius:0}.panel-default .close{color:#333333}.modal .close{color:#333333}.popover{color:#333333}
--------------------------------------------------------------------------------
/demo/components/build-badge.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 | 'use strict';
3 |
4 | var React = require('react');
5 |
6 | var BuildBadge = React.createClass({
7 | propTypes: {
8 | owner: React.PropTypes.string.isRequired,
9 | repo: React.PropTypes.string.isRequired,
10 | branch: React.PropTypes.string
11 | },
12 | getDefaultProps: function() {
13 | return {
14 | branch: 'master'
15 | };
16 | },
17 | render: function() {
18 | var owner = this.props.owner;
19 | var repo = this.props.repo;
20 | var link = 'https://travis-ci.org/' + owner + '/' + repo;
21 |
22 | var branch = encodeURIComponent(this.props.branch);
23 | var url = link + '.svg?branch=' + branch;
24 | return ;
25 | }
26 | });
27 |
28 | module.exports = BuildBadge;
--------------------------------------------------------------------------------
/demo/components/field-types/Checkbox.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 |
3 | var React = require('react');
4 | var FieldMixin = require('../../../index').FieldMixin;
5 |
6 | var Checkbox = React.createClass({
7 | mixins: [FieldMixin],
8 | render: function() {
9 | var model = this.props.model;
10 | var config = this.props.config;
11 | return (
12 |
13 |
14 |
15 | {config.data.label}
16 |
17 |
18 | );
19 | }
20 | });
21 |
22 | module.exports = Checkbox;
--------------------------------------------------------------------------------
/demo/components/field-types/NumberField.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 |
3 | var React = require('react');
4 | var FieldMixin = require('../../../index').FieldMixin;
5 |
6 | var NumberField = React.createClass({
7 | mixins: [FieldMixin],
8 | transformUpdate: function(value) {
9 | var newVal = value.replace(/\D/g,'');
10 | if (newVal.length) {
11 | return ~~newVal;
12 | } else {
13 | return '';
14 | }
15 | },
16 | render: function() {
17 | var model = this.props.model;
18 | var config = this.props.config;
19 | return (
20 |
21 |
22 | {config.data.label}
23 |
24 |
25 |
26 | );
27 | }
28 | });
29 |
30 | module.exports = NumberField;
--------------------------------------------------------------------------------
/demo/components/field-types/Radio.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 |
3 | var React = require('react');
4 | var FieldMixin = require('../../../index').FieldMixin;
5 |
6 | var Radio = React.createClass({
7 | mixins: [FieldMixin],
8 | render: function() {
9 | var model = this.props.model;
10 | var config = this.props.config;
11 | var key = config.key;
12 | // var options = config.options.map(function(option) {
13 | // return (
14 | //
15 | //
16 | //
17 | // {option.label}
18 | //
19 | //
20 | // );
21 | // });
22 | // return (
23 | //
24 | // {config.data.label}
25 | // {options}
26 | //
27 | // );
28 | }
29 | });
30 |
31 | module.exports = Radio;
--------------------------------------------------------------------------------
/demo/components/field-types/Select.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 |
3 | var React = require('react');
4 | var FieldMixin = require('../../../index').FieldMixin;
5 |
6 | var Select = React.createClass({
7 | mixins: [FieldMixin],
8 | render: function() {
9 | var model = this.props.model;
10 | var config = this.props.config;
11 | var options = config.data.options.map(function(option) {
12 | return {option.name} ;
13 | });
14 | return (
15 |
16 |
17 | {config.data.label}
18 |
19 | {options}
20 |
21 |
22 |
23 | );
24 | }
25 | });
26 |
27 | module.exports = Select;
--------------------------------------------------------------------------------
/demo/components/field-types/SimpleRender.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 |
3 | var React = require('react');
4 | var FieldMixin = require('../../../index').FieldMixin;
5 |
6 | var SimpleRender = React.createClass({
7 | render: function() {
8 | return ({this.props.contents}
);
9 | }
10 | });
11 |
12 | module.exports = SimpleRender;
--------------------------------------------------------------------------------
/demo/components/field-types/TextField.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 |
3 | var React = require('react');
4 | var FieldMixin = require('../../../index').FieldMixin;
5 |
6 | var TextField = React.createClass({
7 | mixins: [FieldMixin],
8 | render: function() {
9 | var model = this.props.model;
10 | var config = this.props.config;
11 | return (
12 |
13 |
14 | {config.data.label}
15 |
16 |
17 |
18 | );
19 | }
20 | });
21 |
22 | module.exports = TextField;
--------------------------------------------------------------------------------
/demo/demo.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 |
3 | var React = require('react');
4 | var ReactFormly = require('../index');
5 | var Formly = ReactFormly.Formly;
6 | var FormlyConfig = ReactFormly.FormlyConfig;
7 |
8 | var BuildBadge = require('./components/build-badge');
9 |
10 | FormlyConfig.fields.addType([
11 | { name: 'text', field: require('./components/field-types/TextField') },
12 | { name: 'number', field: require('./components/field-types/NumberField') },
13 | { name: 'checkbox', field: require('./components/field-types/Checkbox') },
14 | { name: 'select', field: require('./components/field-types/Select') },
15 | { name: 'simplerender', field: require('./components/field-types/SimpleRender') }
16 | ]);
17 |
18 | var App = React.createClass({
19 | getInitialState: function() {
20 | return {
21 | model: {
22 | buildingWithReact: true
23 | }
24 | };
25 | },
26 | onFormlyUpdate: function(model) {
27 | this.setState({model: model});
28 | },
29 | componentWillMount: function() {
30 | this.formlyConfig = {
31 | name: 'myFormly',
32 | fields: [
33 | {
34 | key: 'initialInstructions',
35 | type: 'simplerender',
36 | props: {
37 | contents: (
38 |
39 | Discover React Formly by going through this form...
40 |
41 | Guess what... This text is a non-value "field"
42 |
43 | )
44 | }
45 | },
46 | {
47 | key: 'buildingWithReact',
48 | type: 'checkbox',
49 | data: {
50 | label: 'Are you building something with React?'
51 | }
52 | },
53 | {
54 | key: 'otherFrameworkOrLibrary',
55 | type: 'select',
56 | data: {
57 | label: 'What are you building with?',
58 | options: [
59 | { name: 'VanillaJS', value: 'vanilla' },
60 | { name: 'jQuery', value: 'jquery' },
61 | { name: 'Ember', value: 'ember' },
62 | { name: 'Angular', value: 'angular' },
63 | { name: 'Backbone', value: 'backbone' },
64 | { name: 'Other', value: 'other' }
65 | ]
66 | },
67 | hidden: function(model) {
68 | return !!model.buildingWithReact;
69 | }
70 | },
71 | {
72 | key: 'buildingWithAnotherFrameworkOrLibrary',
73 | type: 'simplerender',
74 | props: getPropsForOtherFramework,
75 | hidden: function(model) {
76 | return !!model.buildingWithReact;
77 | }
78 | }
79 | ]
80 | };
81 | },
82 | render: function() {
83 | return (
84 |
85 |
86 | React-Formly
87 | JSON powered forms for React
88 |
89 |
90 |
91 |
Form
92 |
93 |
Model:
94 |
{JSON.stringify(this.state.model, null, 2)}
95 |
96 | );
97 | }
98 | });
99 |
100 | React.render( , document.body);
101 |
102 | // UTILS
103 |
104 | function getPropsForOtherFramework(model, field) {
105 | switch (model.otherFrameworkOrLibrary) {
106 | case 'angular':
107 | return {
108 | contents: (
109 |
110 | This project was created by a core contributor to
111 | the
angular-formly project.
112 | If you're building things with angular, definitely check that one out.
113 |
114 | )
115 | };
116 | case 'ember':
117 | return {
118 | contents: (
119 |
124 | )
125 | };
126 | case 'backbone':
127 | return {
128 | contents: (
129 |
132 | )
133 | };
134 | case 'other':
135 | return {
136 | contents: (
137 | Best of luck to you...
138 | )
139 | };
140 | case 'jquery':
141 | return {
142 | contents: (
143 |
146 | )
147 | };
148 | case 'vanilla':
149 | return {
150 | contents: (
151 |
152 | Not sure whether there's something quite like this for you,
153 | but
Parsley looks like a promising
154 | dependency free form validation library
155 |
156 | )
157 | };
158 | }
159 | }
160 |
--------------------------------------------------------------------------------
/demo/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | React Formly
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
18 |
19 |
20 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/demo/styles.css:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: #EEEEEE;
3 | }
--------------------------------------------------------------------------------
/dist/react-formly.js:
--------------------------------------------------------------------------------
1 | (function webpackUniversalModuleDefinition(root, factory) {
2 | if(typeof exports === 'object' && typeof module === 'object')
3 | module.exports = factory(require("react"));
4 | else if(typeof define === 'function' && define.amd)
5 | define(["react"], factory);
6 | else if(typeof exports === 'object')
7 | exports["ReactFormly"] = factory(require("react"));
8 | else
9 | root["ReactFormly"] = factory(root["react"]);
10 | })(this, function(__WEBPACK_EXTERNAL_MODULE_4__) {
11 | return /******/ (function(modules) { // webpackBootstrap
12 | /******/ // The module cache
13 | /******/ var installedModules = {};
14 | /******/
15 | /******/ // The require function
16 | /******/ function __webpack_require__(moduleId) {
17 | /******/
18 | /******/ // Check if module is in cache
19 | /******/ if(installedModules[moduleId])
20 | /******/ return installedModules[moduleId].exports;
21 | /******/
22 | /******/ // Create a new module (and put it into the cache)
23 | /******/ var module = installedModules[moduleId] = {
24 | /******/ exports: {},
25 | /******/ id: moduleId,
26 | /******/ loaded: false
27 | /******/ };
28 | /******/
29 | /******/ // Execute the module function
30 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
31 | /******/
32 | /******/ // Flag the module as loaded
33 | /******/ module.loaded = true;
34 | /******/
35 | /******/ // Return the exports of the module
36 | /******/ return module.exports;
37 | /******/ }
38 | /******/
39 | /******/
40 | /******/ // expose the modules object (__webpack_modules__)
41 | /******/ __webpack_require__.m = modules;
42 | /******/
43 | /******/ // expose the module cache
44 | /******/ __webpack_require__.c = installedModules;
45 | /******/
46 | /******/ // __webpack_public_path__
47 | /******/ __webpack_require__.p = "";
48 | /******/
49 | /******/ // Load entry module and return exports
50 | /******/ return __webpack_require__(0);
51 | /******/ })
52 | /************************************************************************/
53 | /******/ ([
54 | /* 0 */
55 | /***/ function(module, exports, __webpack_require__) {
56 |
57 | module.exports.Formly = __webpack_require__(2);
58 | module.exports.FieldMixin = __webpack_require__(3);
59 | module.exports.FormlyConfig = __webpack_require__(1);
60 |
61 |
62 |
63 | /***/ },
64 | /* 1 */
65 | /***/ function(module, exports) {
66 |
67 | 'use strict';
68 |
69 | var fieldTypeMap = {};
70 |
71 | module.exports = {
72 | fields: {
73 | addType: addFieldType,
74 | getTypes: getFieldTypes,
75 | clearTypes: clearTypes
76 | }
77 | };
78 |
79 | function addFieldType(name, field) {
80 | if (Array.isArray(name)) {
81 | name.forEach(function(fieldType) {
82 | addFieldType(fieldType);
83 | });
84 | } else if (typeof name === 'object') {
85 | field = name.field;
86 | name = name.name;
87 | }
88 | fieldTypeMap[name] = field;
89 | }
90 |
91 | function getFieldTypes() {
92 | return fieldTypeMap;
93 | }
94 |
95 | function clearTypes() {
96 | var oldTypes = fieldTypeMap;
97 | fieldTypeMap = {};
98 | return oldTypes;
99 | }
100 |
101 | /***/ },
102 | /* 2 */
103 | /***/ function(module, exports, __webpack_require__) {
104 |
105 | /** @jsx React.DOM */
106 | 'use strict';
107 |
108 | var React = __webpack_require__(4);
109 | var FormlyConfig = __webpack_require__(1);
110 |
111 | function typeOrComponent(props, propName, componentName) {
112 | var errorPrefix = componentName + ' config.fields field with key ' + props.key;
113 | if (props.type && props.component) {
114 | return new Error(errorPrefix + ' should only have either a type or a component, not both.');
115 | } else if (!props.type && !props.component) {
116 | return new Error(errorPrefix + ' should have either a type (string) or a component (React component)');
117 | }
118 | }
119 |
120 | var Formly = React.createClass({displayName: "Formly",
121 | propTypes: {
122 | onFormlyUpdate: React.PropTypes.func.isRequired,
123 | config: React.PropTypes.shape({
124 | name: React.PropTypes.string,
125 | fields: React.PropTypes.arrayOf(React.PropTypes.shape({
126 | key: React.PropTypes.string.isRequired,
127 | type: typeOrComponent,
128 | component: typeOrComponent,
129 | hidden: React.PropTypes.oneOfType([
130 | React.PropTypes.bool,
131 | React.PropTypes.func
132 | ]),
133 | props: React.PropTypes.oneOfType([
134 | React.PropTypes.object,
135 | React.PropTypes.func
136 | ]),
137 | data: React.PropTypes.object
138 | }))
139 | }),
140 | model: React.PropTypes.object
141 | },
142 |
143 | getDefaultProps: function() {
144 | return { model: {} };
145 | },
146 |
147 | onValueUpdate: function(fieldKey, value) {
148 | this.props.model[fieldKey] = value;
149 | this.props.onFormlyUpdate(this.props.model);
150 | },
151 |
152 | render: function() {
153 | var model = this.props.model;
154 | var onValueUpdate = this.onValueUpdate;
155 | var fields = this.props.config.fields.map(function(field) {
156 | return generateFieldTag(field, model, onValueUpdate);
157 | });
158 | return React.createElement("form", {className: "formly", role: "form", name: this.props.config.name}, fields);
159 | }
160 | });
161 |
162 | function generateFieldTag(field, model, onValueUpdate) {
163 | var fieldComponent = field.component ? field.component : FormlyConfig.fields.getTypes()[field.type];
164 | if (!fieldComponent) {
165 | throw new Error('Formly: "' + field.type + '" has not been added to FormlyConfig\'s field types.');
166 | }
167 |
168 | if (shouldHide(field, model)) {
169 | return null;
170 | }
171 |
172 | return getComponent(fieldComponent, field, model, onValueUpdate);
173 | }
174 |
175 | function getComponent(fieldComponent, field, model, onValueUpdate) {
176 |
177 | var componentProps;
178 | if (field.props) {
179 | componentProps = typeof field.props === 'function' ? field.props(model, field) : field.props;
180 | }
181 |
182 | //assign to variable to allow JSX compiler to pick up as a prop instead of string
183 | var FieldComponent = fieldComponent;
184 | var component = React.createElement(FieldComponent, React.__spread({}, componentProps, {model: model, config: field, onValueUpdate: onValueUpdate, key: field.key}));
185 |
186 | return component;
187 | }
188 |
189 | function shouldHide(field, model) {
190 | var hide = isOrInvoke(field, 'hidden', model);
191 | return hide && hide !== null;
192 | }
193 |
194 | function isOrInvoke(field, property, model) {
195 | if (!field.hasOwnProperty(property)) {
196 | return null;
197 | }
198 | if (typeof field[property] === 'function') {
199 | return field[property](model, field);
200 | } else {
201 | return !!field[property];
202 | }
203 | }
204 |
205 | module.exports = Formly;
206 |
207 | /***/ },
208 | /* 3 */
209 | /***/ function(module, exports) {
210 |
211 | 'use strict';
212 |
213 | var FieldMixin = {
214 | onChange: function(event) {
215 | var value = getValue(event.target);
216 | this.updateValue(value);
217 | },
218 | updateValue: function(value) {
219 | if (this.transformUpdate) {
220 | value = this.transformUpdate(value);
221 | }
222 | this.props.onValueUpdate(this.props.config.key, value);
223 | }
224 | };
225 |
226 | function getValue(node) {
227 | switch(node.type) {
228 | case 'checkbox':
229 | case 'radio':
230 | return node.checked;
231 | case 'select':
232 | return node.selected;
233 | default:
234 | return node.value;
235 | }
236 | }
237 |
238 | module.exports = FieldMixin;
239 |
240 | /***/ },
241 | /* 4 */
242 | /***/ function(module, exports) {
243 |
244 | module.exports = __WEBPACK_EXTERNAL_MODULE_4__;
245 |
246 | /***/ }
247 | /******/ ])
248 | });
249 | ;
250 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAwNmJiYWYyYjg5MjYwNjhkNDRkMSIsIndlYnBhY2s6Ly8vLi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbW9kdWxlcy9Gb3JtbHlDb25maWcuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvRm9ybWx5LmpzIiwid2VicGFjazovLy8uL3NyYy9taXhpbnMvRmllbGRNaXhpbi5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWFjdFwiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7OztBQ3RDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDRkEsYUFBWSxDQUFDOztBQUViLEtBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQzs7QUFFdEIsT0FBTSxDQUFDLE9BQU8sR0FBRztHQUNmLE1BQU0sRUFBRTtLQUNOLE9BQU8sRUFBRSxZQUFZO0tBQ3JCLFFBQVEsRUFBRSxhQUFhO0tBQ3ZCLFVBQVUsRUFBRSxVQUFVO0lBQ3ZCO0FBQ0gsRUFBQyxDQUFDOztBQUVGLFVBQVMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7R0FDakMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO0tBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxTQUFTLEVBQUU7T0FDL0IsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO01BQ3pCLENBQUMsQ0FBQztJQUNKLE1BQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7S0FDbkMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDbkIsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbEI7R0FDRCxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQzdCLEVBQUM7O0FBRUQsVUFBUyxhQUFhLEdBQUc7R0FDdkIsT0FBTyxZQUFZLENBQUM7QUFDdEIsRUFBQzs7QUFFRCxVQUFTLFVBQVUsR0FBRztHQUNwQixJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUM7R0FDNUIsWUFBWSxHQUFHLEVBQUUsQ0FBQztHQUNsQixPQUFPLFFBQVEsQ0FBQzs7Ozs7OztBQy9CbEIsc0JBQXFCO0FBQ3JCLGFBQVksQ0FBQzs7QUFFYixLQUFJLEtBQUssR0FBRyxtQkFBTyxDQUFDLENBQU8sQ0FBQyxDQUFDO0FBQzdCLEtBQUksWUFBWSxHQUFHLG1CQUFPLENBQUMsQ0FBMkIsQ0FBQyxDQUFDOztBQUV4RCxVQUFTLGVBQWUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRTtHQUN2RCxJQUFJLFdBQVcsR0FBRyxhQUFhLEdBQUcsZ0NBQWdDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztHQUMvRSxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRTtLQUNqQyxPQUFPLElBQUksS0FBSyxDQUFDLFdBQVcsR0FBRywyREFBMkQsQ0FBQyxDQUFDO0lBQzdGLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO0tBQzFDLE9BQU8sSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLHNFQUFzRSxDQUFDLENBQUM7SUFDeEc7QUFDSCxFQUFDOztBQUVELEtBQUksNEJBQTRCO0dBQzlCLFNBQVMsRUFBRTtLQUNULGNBQWMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVO0tBQy9DLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztPQUM1QixJQUFJLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNO09BQzVCLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztTQUNwRCxHQUFHLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVTtTQUN0QyxJQUFJLEVBQUUsZUFBZTtTQUNyQixTQUFTLEVBQUUsZUFBZTtTQUMxQixNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7V0FDaEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJO1dBQ3BCLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSTtVQUNyQixDQUFDO1NBQ0YsS0FBSyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO1dBQy9CLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTTtXQUN0QixLQUFLLENBQUMsU0FBUyxDQUFDLElBQUk7VUFDckIsQ0FBQztTQUNGLElBQUksRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU07UUFDN0IsQ0FBQyxDQUFDO01BQ0osQ0FBQztLQUNGLEtBQUssRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU07QUFDakMsSUFBRzs7R0FFRCxlQUFlLEVBQUUsV0FBVztLQUMxQixPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ3pCLElBQUc7O0dBRUQsYUFBYSxFQUFFLFNBQVMsUUFBUSxFQUFFLEtBQUssRUFBRTtLQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7S0FDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRCxJQUFHOztHQUVELE1BQU0sRUFBRSxXQUFXO0tBQ2pCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0tBQzdCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7S0FDdkMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssRUFBRTtPQUN4RCxPQUFPLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7TUFDdEQsQ0FBQyxDQUFDO0tBQ0gsT0FBTywwQkFBSyxJQUFDLFdBQVMsQ0FBQyxVQUFRLENBQUMsTUFBSSxDQUFDLFFBQU0sQ0FBQyxNQUFJLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBTSxHQUFDLEVBQWU7SUFDM0Y7QUFDSCxFQUFDLENBQUMsQ0FBQzs7QUFFSCxVQUFTLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO0dBQ3JELElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUNwRyxJQUFJLENBQUMsY0FBYyxFQUFFO0tBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsc0RBQXNELENBQUMsQ0FBQztBQUN2RyxJQUFHOztHQUVELElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtLQUM1QixPQUFPLElBQUksQ0FBQztBQUNoQixJQUFHOztHQUVELE9BQU8sWUFBWSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ25FLEVBQUM7O0FBRUQsVUFBUyxZQUFZLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFOztHQUVqRSxJQUFJLGNBQWMsQ0FBQztHQUNuQixJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7S0FDZixjQUFjLEdBQUcsT0FBTyxLQUFLLENBQUMsS0FBSyxLQUFLLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0FBQ2pHLElBQUc7QUFDSDs7R0FFRSxJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUM7QUFDdEMsR0FBRSxJQUFJLFNBQVMsR0FBRyxvQkFBQyxjQUFjLHNCQUFFLEdBQUcsY0FBYyxFQUFDLENBQUMsUUFBSyxDQUFFLEtBQU0sQ0FBQyxRQUFNLENBQUUsS0FBTSxDQUFDLGVBQWEsQ0FBRSxhQUFjLENBQUMsS0FBRyxDQUFFLEtBQUssQ0FBQyxFQUFROztHQUVsSSxPQUFPLFNBQVMsQ0FBQztBQUNuQixFQUFDOztBQUVELFVBQVMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7R0FDaEMsSUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7R0FDOUMsT0FBTyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQztBQUMvQixFQUFDOztBQUVELFVBQVMsVUFBVSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO0dBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFO0tBQ25DLE9BQU8sSUFBSSxDQUFDO0lBQ2I7R0FDRCxJQUFJLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFVBQVUsRUFBRTtLQUN6QyxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEMsTUFBTTtLQUNMLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQjtBQUNILEVBQUM7O0FBRUQsT0FBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLEM7Ozs7OztBQ3BHdkIsYUFBWSxDQUFDOztBQUViLEtBQUksVUFBVSxHQUFHO0dBQ2YsUUFBUSxFQUFFLFNBQVMsS0FBSyxFQUFFO0tBQ3hCLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QjtHQUNELFdBQVcsRUFBRSxTQUFTLEtBQUssRUFBRTtLQUMzQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7T0FDeEIsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7TUFDckM7S0FDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEQ7QUFDSCxFQUFDLENBQUM7O0FBRUYsVUFBUyxRQUFRLENBQUMsSUFBSSxFQUFFO0dBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUk7S0FDZCxLQUFLLFVBQVUsQ0FBQztLQUNoQixLQUFLLE9BQU87T0FDVixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7S0FDdEIsS0FBSyxRQUFRO09BQ1gsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0tBQ3ZCO09BQ0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3JCO0FBQ0gsRUFBQzs7QUFFRCxPQUFNLENBQUMsT0FBTyxHQUFHLFVBQVUsQzs7Ozs7O0FDM0IzQixnRCIsImZpbGUiOiJyZWFjdC1mb3JtbHkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJyZWFjdFwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJSZWFjdEZvcm1seVwiXSA9IGZhY3RvcnkocmVxdWlyZShcInJlYWN0XCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJSZWFjdEZvcm1seVwiXSA9IGZhY3Rvcnkocm9vdFtcInJlYWN0XCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNF9fKSB7XG5yZXR1cm4gXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uXG4gKiovIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGlkOiBtb2R1bGVJZCxcbiBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiB3ZWJwYWNrL2Jvb3RzdHJhcCAwNmJiYWYyYjg5MjYwNjhkNDRkMVxuICoqLyIsIm1vZHVsZS5leHBvcnRzLkZvcm1seSA9IHJlcXVpcmUoJy4vc3JjL2NvbXBvbmVudHMvRm9ybWx5Jyk7XG5tb2R1bGUuZXhwb3J0cy5GaWVsZE1peGluID0gcmVxdWlyZSgnLi9zcmMvbWl4aW5zL0ZpZWxkTWl4aW4nKTtcbm1vZHVsZS5leHBvcnRzLkZvcm1seUNvbmZpZyA9IHJlcXVpcmUoJy4vc3JjL21vZHVsZXMvRm9ybWx5Q29uZmlnJyk7XG5cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZpZWxkVHlwZU1hcCA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZmllbGRzOiB7XG4gICAgYWRkVHlwZTogYWRkRmllbGRUeXBlLFxuICAgIGdldFR5cGVzOiBnZXRGaWVsZFR5cGVzLFxuICAgIGNsZWFyVHlwZXM6IGNsZWFyVHlwZXNcbiAgfVxufTtcblxuZnVuY3Rpb24gYWRkRmllbGRUeXBlKG5hbWUsIGZpZWxkKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSB7XG4gICAgbmFtZS5mb3JFYWNoKGZ1bmN0aW9uKGZpZWxkVHlwZSkge1xuICAgICAgYWRkRmllbGRUeXBlKGZpZWxkVHlwZSk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgZmllbGQgPSBuYW1lLmZpZWxkO1xuICAgIG5hbWUgPSBuYW1lLm5hbWU7XG4gIH1cbiAgZmllbGRUeXBlTWFwW25hbWVdID0gZmllbGQ7XG59XG5cbmZ1bmN0aW9uIGdldEZpZWxkVHlwZXMoKSB7XG4gIHJldHVybiBmaWVsZFR5cGVNYXA7XG59XG5cbmZ1bmN0aW9uIGNsZWFyVHlwZXMoKSB7XG4gIHZhciBvbGRUeXBlcyA9IGZpZWxkVHlwZU1hcDtcbiAgZmllbGRUeXBlTWFwID0ge307XG4gIHJldHVybiBvbGRUeXBlcztcbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9tb2R1bGVzL0Zvcm1seUNvbmZpZy5qc1xuICoqLyIsIi8qKiBAanN4IFJlYWN0LkRPTSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIEZvcm1seUNvbmZpZyA9IHJlcXVpcmUoJy4vLi4vbW9kdWxlcy9Gb3JtbHlDb25maWcnKTtcblxuZnVuY3Rpb24gdHlwZU9yQ29tcG9uZW50KHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICB2YXIgZXJyb3JQcmVmaXggPSBjb21wb25lbnROYW1lICsgJyBjb25maWcuZmllbGRzIGZpZWxkIHdpdGgga2V5ICcgKyBwcm9wcy5rZXk7XG4gIGlmIChwcm9wcy50eXBlICYmIHByb3BzLmNvbXBvbmVudCkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoZXJyb3JQcmVmaXggKyAnIHNob3VsZCBvbmx5IGhhdmUgZWl0aGVyIGEgdHlwZSBvciBhIGNvbXBvbmVudCwgbm90IGJvdGguJyk7XG4gIH0gZWxzZSBpZiAoIXByb3BzLnR5cGUgJiYgIXByb3BzLmNvbXBvbmVudCkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoZXJyb3JQcmVmaXggKyAnIHNob3VsZCBoYXZlIGVpdGhlciBhIHR5cGUgKHN0cmluZykgb3IgYSBjb21wb25lbnQgKFJlYWN0IGNvbXBvbmVudCknKTtcbiAgfVxufVxuXG52YXIgRm9ybWx5ID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICBwcm9wVHlwZXM6IHtcbiAgICBvbkZvcm1seVVwZGF0ZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBjb25maWc6IFJlYWN0LlByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBuYW1lOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgZmllbGRzOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXlPZihSZWFjdC5Qcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICBrZXk6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgICAgdHlwZTogdHlwZU9yQ29tcG9uZW50LFxuICAgICAgICBjb21wb25lbnQ6IHR5cGVPckNvbXBvbmVudCxcbiAgICAgICAgaGlkZGVuOiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgICBSZWFjdC5Qcm9wVHlwZXMuZnVuY1xuICAgICAgICBdKSxcbiAgICAgICAgcHJvcHM6IFJlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgIFJlYWN0LlByb3BUeXBlcy5vYmplY3QsXG4gICAgICAgICAgUmVhY3QuUHJvcFR5cGVzLmZ1bmNcbiAgICAgICAgXSksXG4gICAgICAgIGRhdGE6IFJlYWN0LlByb3BUeXBlcy5vYmplY3RcbiAgICAgIH0pKVxuICAgIH0pLFxuICAgIG1vZGVsOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdFByb3BzOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geyBtb2RlbDoge30gfTtcbiAgfSxcblxuICBvblZhbHVlVXBkYXRlOiBmdW5jdGlvbihmaWVsZEtleSwgdmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLm1vZGVsW2ZpZWxkS2V5XSA9IHZhbHVlO1xuICAgIHRoaXMucHJvcHMub25Gb3JtbHlVcGRhdGUodGhpcy5wcm9wcy5tb2RlbCk7XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbW9kZWwgPSB0aGlzLnByb3BzLm1vZGVsO1xuICAgIHZhciBvblZhbHVlVXBkYXRlID0gdGhpcy5vblZhbHVlVXBkYXRlO1xuICAgIHZhciBmaWVsZHMgPSB0aGlzLnByb3BzLmNvbmZpZy5maWVsZHMubWFwKGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVGaWVsZFRhZyhmaWVsZCwgbW9kZWwsIG9uVmFsdWVVcGRhdGUpO1xuICAgIH0pO1xuICAgIHJldHVybiA8Zm9ybSBjbGFzc05hbWU9XCJmb3JtbHlcIiByb2xlPVwiZm9ybVwiIG5hbWU9e3RoaXMucHJvcHMuY29uZmlnLm5hbWV9PntmaWVsZHN9PC9mb3JtPjtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRmllbGRUYWcoZmllbGQsIG1vZGVsLCBvblZhbHVlVXBkYXRlKSB7XG4gIHZhciBmaWVsZENvbXBvbmVudCA9IGZpZWxkLmNvbXBvbmVudCA/IGZpZWxkLmNvbXBvbmVudCA6IEZvcm1seUNvbmZpZy5maWVsZHMuZ2V0VHlwZXMoKVtmaWVsZC50eXBlXTtcbiAgaWYgKCFmaWVsZENvbXBvbmVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRm9ybWx5OiBcIicgKyBmaWVsZC50eXBlICsgJ1wiIGhhcyBub3QgYmVlbiBhZGRlZCB0byBGb3JtbHlDb25maWdcXCdzIGZpZWxkIHR5cGVzLicpO1xuICB9XG5cbiAgaWYgKHNob3VsZEhpZGUoZmllbGQsIG1vZGVsKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldENvbXBvbmVudChmaWVsZENvbXBvbmVudCwgZmllbGQsIG1vZGVsLCBvblZhbHVlVXBkYXRlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50KGZpZWxkQ29tcG9uZW50LCBmaWVsZCwgbW9kZWwsIG9uVmFsdWVVcGRhdGUpIHtcblxuICB2YXIgY29tcG9uZW50UHJvcHM7XG4gIGlmIChmaWVsZC5wcm9wcykge1xuICAgIGNvbXBvbmVudFByb3BzID0gdHlwZW9mIGZpZWxkLnByb3BzID09PSAnZnVuY3Rpb24nID8gZmllbGQucHJvcHMobW9kZWwsIGZpZWxkKSA6IGZpZWxkLnByb3BzO1xuICB9XG5cbiAgLy9hc3NpZ24gdG8gdmFyaWFibGUgdG8gYWxsb3cgSlNYIGNvbXBpbGVyIHRvIHBpY2sgdXAgYXMgYSBwcm9wIGluc3RlYWQgb2Ygc3RyaW5nXG4gIHZhciBGaWVsZENvbXBvbmVudCA9IGZpZWxkQ29tcG9uZW50O1xuICB2YXIgY29tcG9uZW50ID0gPEZpZWxkQ29tcG9uZW50IHsuLi5jb21wb25lbnRQcm9wc30gbW9kZWw9e21vZGVsfSBjb25maWc9e2ZpZWxkfSBvblZhbHVlVXBkYXRlPXtvblZhbHVlVXBkYXRlfSBrZXk9e2ZpZWxkLmtleX0gLz47XG5cbiAgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuZnVuY3Rpb24gc2hvdWxkSGlkZShmaWVsZCwgbW9kZWwpIHtcbiAgdmFyIGhpZGUgPSBpc09ySW52b2tlKGZpZWxkLCAnaGlkZGVuJywgbW9kZWwpO1xuICByZXR1cm4gaGlkZSAmJiBoaWRlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc09ySW52b2tlKGZpZWxkLCBwcm9wZXJ0eSwgbW9kZWwpIHtcbiAgaWYgKCFmaWVsZC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAodHlwZW9mIGZpZWxkW3Byb3BlcnR5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmaWVsZFtwcm9wZXJ0eV0obW9kZWwsIGZpZWxkKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gISFmaWVsZFtwcm9wZXJ0eV07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGb3JtbHk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvY29tcG9uZW50cy9Gb3JtbHkuanNcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbnZhciBGaWVsZE1peGluID0ge1xuICBvbkNoYW5nZTogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShldmVudC50YXJnZXQpO1xuICAgIHRoaXMudXBkYXRlVmFsdWUodmFsdWUpO1xuICB9LFxuICB1cGRhdGVWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAodGhpcy50cmFuc2Zvcm1VcGRhdGUpIHtcbiAgICAgIHZhbHVlID0gdGhpcy50cmFuc2Zvcm1VcGRhdGUodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnByb3BzLm9uVmFsdWVVcGRhdGUodGhpcy5wcm9wcy5jb25maWcua2V5LCB2YWx1ZSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldFZhbHVlKG5vZGUpIHtcbiAgc3dpdGNoKG5vZGUudHlwZSkge1xuICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICBjYXNlICdyYWRpbyc6XG4gICAgICByZXR1cm4gbm9kZS5jaGVja2VkO1xuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICByZXR1cm4gbm9kZS5zZWxlY3RlZDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGaWVsZE1peGluO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL21peGlucy9GaWVsZE1peGluLmpzXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzRfXztcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIGV4dGVybmFsIFwicmVhY3RcIlxuICoqIG1vZHVsZSBpZCA9IDRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=
--------------------------------------------------------------------------------
/dist/react-formly.min.js:
--------------------------------------------------------------------------------
1 | !function(e,o){"object"==typeof exports&&"object"==typeof module?module.exports=o(require("react")):"function"==typeof define&&define.amd?define(["react"],o):"object"==typeof exports?exports.ReactFormly=o(require("react")):e.ReactFormly=o(e.react)}(this,function(e){return function(e){function o(r){if(t[r])return t[r].exports;var n=t[r]={exports:{},id:r,loaded:!1};return e[r].call(n.exports,n,n.exports,o),n.loaded=!0,n.exports}var t={};return o.m=e,o.c=t,o.p="",o(0)}([function(e,o,t){e.exports.Formly=t(2),e.exports.FieldMixin=t(3),e.exports.FormlyConfig=t(1)},function(e,o){"use strict";function t(e,o){Array.isArray(e)?e.forEach(function(e){t(e)}):"object"==typeof e&&(o=e.field,e=e.name),p[e]=o}function r(){return p}function n(){var e=p;return p={},e}var p={};e.exports={fields:{addType:t,getTypes:r,clearTypes:n}}},function(e,o,t){"use strict";function r(e,o,t){var r=t+" config.fields field with key "+e.key;return e.type&&e.component?new Error(r+" should only have either a type or a component, not both."):e.type||e.component?void 0:new Error(r+" should have either a type (string) or a component (React component)")}function n(e,o,t){var r=e.component?e.component:c.fields.getTypes()[e.type];if(!r)throw new Error('Formly: "'+e.type+"\" has not been added to FormlyConfig's field types.");return s(e,o)?null:p(r,e,o,t)}function p(e,o,t,r){var n;o.props&&(n="function"==typeof o.props?o.props(t,o):o.props);var p=e,s=a.createElement(p,a.__spread({},n,{model:t,config:o,onValueUpdate:r,key:o.key}));return s}function s(e,o){var t=i(e,"hidden",o);return t&&null!==t}function i(e,o,t){return e.hasOwnProperty(o)?"function"==typeof e[o]?e[o](t,e):!!e[o]:null}var a=t(4),c=t(1),u=a.createClass({displayName:"Formly",propTypes:{onFormlyUpdate:a.PropTypes.func.isRequired,config:a.PropTypes.shape({name:a.PropTypes.string,fields:a.PropTypes.arrayOf(a.PropTypes.shape({key:a.PropTypes.string.isRequired,type:r,component:r,hidden:a.PropTypes.oneOfType([a.PropTypes.bool,a.PropTypes.func]),props:a.PropTypes.oneOfType([a.PropTypes.object,a.PropTypes.func]),data:a.PropTypes.object}))}),model:a.PropTypes.object},getDefaultProps:function(){return{model:{}}},onValueUpdate:function(e,o){this.props.model[e]=o,this.props.onFormlyUpdate(this.props.model)},render:function(){var e=this.props.model,o=this.onValueUpdate,t=this.props.config.fields.map(function(t){return n(t,e,o)});return a.createElement("form",{className:"formly",role:"form",name:this.props.config.name},t)}});e.exports=u},function(e,o){"use strict";function t(e){switch(e.type){case"checkbox":case"radio":return e.checked;case"select":return e.selected;default:return e.value}}var r={onChange:function(e){var o=t(e.target);this.updateValue(o)},updateValue:function(e){this.transformUpdate&&(e=this.transformUpdate(e)),this.props.onValueUpdate(this.props.config.key,e)}};e.exports=r},function(o,t){o.exports=e}])});
2 | //# sourceMappingURL=react-formly.min.js.map
--------------------------------------------------------------------------------
/dist/react-formly.min.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///react-formly.min.js","webpack:///webpack/bootstrap 48ff59878ea0a6849000","webpack:///./index.js","webpack:///./src/modules/FormlyConfig.js","webpack:///./src/components/Formly.js","webpack:///./src/mixins/FieldMixin.js","webpack:///external \"react\""],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE_4__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","Formly","FieldMixin","FormlyConfig","addFieldType","name","field","Array","isArray","forEach","fieldType","fieldTypeMap","getFieldTypes","clearTypes","oldTypes","fields","addType","getTypes","typeOrComponent","props","propName","componentName","errorPrefix","key","type","component","Error","generateFieldTag","model","onValueUpdate","fieldComponent","shouldHide","getComponent","componentProps","FieldComponent","React","createElement","__spread","config","hide","isOrInvoke","property","hasOwnProperty","createClass","displayName","propTypes","onFormlyUpdate","PropTypes","func","isRequired","shape","string","arrayOf","hidden","oneOfType","bool","object","data","getDefaultProps","fieldKey","value","render","map","className","role","getValue","node","checked","selected","onChange","event","target","updateValue","transformUpdate"],"mappings":"CAAA,SAAAA,EAAAC,GACA,gBAAAC,UAAA,gBAAAC,QACAA,OAAAD,QAAAD,EAAAG,QAAA,UACA,kBAAAC,gBAAAC,IACAD,QAAA,SAAAJ,GACA,gBAAAC,SACAA,QAAA,YAAAD,EAAAG,QAAA,UAEAJ,EAAA,YAAAC,EAAAD,EAAA,QACCO,KAAA,SAAAC,GACD,MCAgB,UAAUC,GCN1B,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAT,OAGA,IAAAC,GAAAS,EAAAD,IACAT,WACAW,GAAAF,EACAG,QAAA,EAUA,OANAL,GAAAE,GAAAI,KAAAZ,EAAAD,QAAAC,IAAAD,QAAAQ,GAGAP,EAAAW,QAAA,EAGAX,EAAAD,QAvBA,GAAAU,KAqCA,OATAF,GAAAM,EAAAP,EAGAC,EAAAO,EAAAL,EAGAF,EAAAQ,EAAA,GAGAR,EAAA,KDgBM,SAASP,EAAQD,EAASQ,GEtDhCP,EAAAD,QAAAiB,OAAAT,EAAA,GACAP,EAAAD,QAAAkB,WAAAV,EAAA,GACAP,EAAAD,QAAAmB,aAAAX,EAAA,IF8DM,SAASP,EAAQD,GGhEvB,YAYA,SAASoB,GAAaC,EAAMC,GACtBC,MAAMC,QAAQH,GAChBA,EAAKI,QAAQ,SAASC,GACpBN,EAAaM,KAEU,gBAATL,KAChBC,EAAQD,EAAKC,MACbD,EAAOA,EAAKA,MAEdM,EAAaN,GAAQC,EAGvB,QAASM,KACP,MAAOD,GAGT,QAASE,KACP,GAAIC,GAAWH,CAEf,OADAA,MACOG,EA7BT,GAAIH,KAEJ1B,GAAOD,SACL+B,QACEC,QAASZ,EACTa,SAAUL,EACVC,WAAYA,KH8FV,SAAS5B,EAAQD,EAASQ,GIrGhC,YAKA,SAAS0B,GAAgBC,EAAOC,EAAUC,GACxC,GAAIC,GAAcD,EAAgB,iCAAmCF,EAAMI,GAC3E,OAAIJ,GAAMK,MAAQL,EAAMM,UACf,GAAIC,OAAMJ,EAAc,6DACrBH,EAAMK,MAASL,EAAMM,UAA1B,OACE,GAAIC,OAAMJ,EAAc,wEA8CnC,QAASK,GAAiBrB,EAAOsB,EAAOC,GACtC,GAAIC,GAAiBxB,EAAMmB,UAAYnB,EAAMmB,UAAYtB,EAAaY,OAAOE,WAAWX,EAAMkB,KAC9F,KAAKM,EACH,KAAM,IAAIJ,OAAM,YAAcpB,EAAMkB,KAAO,uDAG7C,OAAIO,GAAWzB,EAAOsB,GACb,KAGFI,EAAaF,EAAgBxB,EAAOsB,EAAOC,GAGpD,QAASG,GAAaF,EAAgBxB,EAAOsB,EAAOC,GAElD,GAAII,EACA3B,GAAMa,QACRc,EAAwC,kBAAhB3B,GAAMa,MAAuBb,EAAMa,MAAMS,EAAOtB,GAASA,EAAMa,MAIzF,IAAIe,GAAiBJ,EACjBL,EAAYU,EAAAC,cAACF,EAAcC,EAAAE,YAAEJ,GAAiBL,MAAEA,EAAOU,OAAOhC,EAAQuB,cAAOA,EAAeN,IAAejB,EAAKiB,MAEpH,OAAOE,GAGT,QAASM,GAAWzB,EAAOsB,GACzB,GAAIW,GAAOC,EAAWlC,EAAO,SAAUsB,EACvC,OAAOW,IAAiB,OAATA,EAGjB,QAASC,GAAWlC,EAAOmC,EAAUb,GACnC,MAAKtB,GAAMoC,eAAeD,GAGK,kBAApBnC,GAAMmC,GACRnC,EAAMmC,GAAUb,EAAOtB,KAErBA,EAAMmC,GALR,KAxFX,GAAIN,GAAQ3C,EAAQ,GAChBW,EAAeX,EAAQ,GAWvBS,EAAAkC,EAAAQ,aAA4BC,YAAA,SAC9BC,WACEC,eAAgBX,EAAMY,UAAUC,KAAKC,WACrCX,OAAQH,EAAMY,UAAUG,OACtB7C,KAAM8B,EAAMY,UAAUI,OACtBpC,OAAQoB,EAAMY,UAAUK,QAAQjB,EAAMY,UAAUG,OAC9C3B,IAAKY,EAAMY,UAAUI,OAAOF,WAC5BzB,KAAMN,EACNO,UAAWP,EACXmC,OAAQlB,EAAMY,UAAUO,WACtBnB,EAAMY,UAAUQ,KAChBpB,EAAMY,UAAUC,OAElB7B,MAAOgB,EAAMY,UAAUO,WACrBnB,EAAMY,UAAUS,OAChBrB,EAAMY,UAAUC,OAElBS,KAAMtB,EAAMY,UAAUS,YAG1B5B,MAAOO,EAAMY,UAAUS,QAGzBE,gBAAiB,WACf,OAAS9B,WAGXC,cAAe,SAAS8B,EAAUC,GAChCvE,KAAK8B,MAAMS,MAAM+B,GAAYC,EAC7BvE,KAAK8B,MAAM2B,eAAezD,KAAK8B,MAAMS,QAGvCiC,OAAQ,WACN,GAAIjC,GAAQvC,KAAK8B,MAAMS,MACnBC,EAAgBxC,KAAKwC,cACrBd,EAAS1B,KAAK8B,MAAMmB,OAAOvB,OAAO+C,IAAI,SAASxD,GACjD,MAAOqB,GAAiBrB,EAAOsB,EAAOC,IAExC,OAAOM,GAAAC,cAAA,QAAK2B,UAAC,SAAUC,KAAS,OAAK3D,KAAOhB,KAAI8B,MAAOmB,OAAMjC,MAAOU,KA+CxE9B,GAAOD,QAAUiB,GJ4GX,SAAShB,EAAQD,GKhNvB,YAeA,SAASiF,GAASC,GAChB,OAAOA,EAAK1C,MACV,IAAK,WACL,IAAK,QACH,MAAO0C,GAAKC,OACd,KAAK,SACH,MAAOD,GAAKE,QACd,SACE,MAAOF,GAAKN,OArBlB,GAAI1D,IACFmE,SAAU,SAASC,GACjB,GAAIV,GAAQK,EAASK,EAAMC,OAC3BlF,MAAKmF,YAAYZ,IAEnBY,YAAa,SAASZ,GAChBvE,KAAKoF,kBACPb,EAAQvE,KAAKoF,gBAAgBb,IAE/BvE,KAAK8B,MAAMU,cAAcxC,KAAK8B,MAAMmB,OAAOf,IAAKqC,IAgBpD3E,GAAOD,QAAUkB,GLsNX,SAASjB,EAAQD,GMjPvBC,EAAAD,QAAAM","file":"react-formly.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ReactFormly\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"ReactFormly\"] = factory(root[\"react\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_4__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ReactFormly\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"ReactFormly\"] = factory(root[\"react\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_4__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports.Formly = __webpack_require__(2);\n\tmodule.exports.FieldMixin = __webpack_require__(3);\n\tmodule.exports.FormlyConfig = __webpack_require__(1);\n\t\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tvar fieldTypeMap = {};\n\t\n\tmodule.exports = {\n\t fields: {\n\t addType: addFieldType,\n\t getTypes: getFieldTypes,\n\t clearTypes: clearTypes\n\t }\n\t};\n\t\n\tfunction addFieldType(name, field) {\n\t if (Array.isArray(name)) {\n\t name.forEach(function(fieldType) {\n\t addFieldType(fieldType);\n\t });\n\t } else if (typeof name === 'object') {\n\t field = name.field;\n\t name = name.name;\n\t }\n\t fieldTypeMap[name] = field;\n\t}\n\t\n\tfunction getFieldTypes() {\n\t return fieldTypeMap;\n\t}\n\t\n\tfunction clearTypes() {\n\t var oldTypes = fieldTypeMap;\n\t fieldTypeMap = {};\n\t return oldTypes;\n\t}\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/** @jsx React.DOM */\n\t'use strict';\n\t\n\tvar React = __webpack_require__(4);\n\tvar FormlyConfig = __webpack_require__(1);\n\t\n\tfunction typeOrComponent(props, propName, componentName) {\n\t var errorPrefix = componentName + ' config.fields field with key ' + props.key;\n\t if (props.type && props.component) {\n\t return new Error(errorPrefix + ' should only have either a type or a component, not both.');\n\t } else if (!props.type && !props.component) {\n\t return new Error(errorPrefix + ' should have either a type (string) or a component (React component)');\n\t }\n\t}\n\t\n\tvar Formly = React.createClass({displayName: \"Formly\",\n\t propTypes: {\n\t onFormlyUpdate: React.PropTypes.func.isRequired,\n\t config: React.PropTypes.shape({\n\t name: React.PropTypes.string,\n\t fields: React.PropTypes.arrayOf(React.PropTypes.shape({\n\t key: React.PropTypes.string.isRequired,\n\t type: typeOrComponent,\n\t component: typeOrComponent,\n\t hidden: React.PropTypes.oneOfType([\n\t React.PropTypes.bool,\n\t React.PropTypes.func\n\t ]),\n\t props: React.PropTypes.oneOfType([\n\t React.PropTypes.object,\n\t React.PropTypes.func\n\t ]),\n\t data: React.PropTypes.object\n\t }))\n\t }),\n\t model: React.PropTypes.object\n\t },\n\t\n\t getDefaultProps: function() {\n\t return { model: {} };\n\t },\n\t\n\t onValueUpdate: function(fieldKey, value) {\n\t this.props.model[fieldKey] = value;\n\t this.props.onFormlyUpdate(this.props.model);\n\t },\n\t\n\t render: function() {\n\t var model = this.props.model;\n\t var onValueUpdate = this.onValueUpdate;\n\t var fields = this.props.config.fields.map(function(field) {\n\t return generateFieldTag(field, model, onValueUpdate);\n\t });\n\t return React.createElement(\"form\", {className: \"formly\", role: \"form\", name: this.props.config.name}, fields);\n\t }\n\t});\n\t\n\tfunction generateFieldTag(field, model, onValueUpdate) {\n\t var fieldComponent = field.component ? field.component : FormlyConfig.fields.getTypes()[field.type];\n\t if (!fieldComponent) {\n\t throw new Error('Formly: \"' + field.type + '\" has not been added to FormlyConfig\\'s field types.');\n\t }\n\t\n\t if (shouldHide(field, model)) {\n\t return null;\n\t }\n\t\n\t return getComponent(fieldComponent, field, model, onValueUpdate);\n\t}\n\t\n\tfunction getComponent(fieldComponent, field, model, onValueUpdate) {\n\t\n\t var componentProps;\n\t if (field.props) {\n\t componentProps = typeof field.props === 'function' ? field.props(model, field) : field.props;\n\t }\n\t\n\t //assign to variable to allow JSX compiler to pick up as a prop instead of string\n\t var FieldComponent = fieldComponent;\n\t var component = React.createElement(FieldComponent, React.__spread({}, componentProps, {model: model, config: field, onValueUpdate: onValueUpdate, key: field.key}));\n\t\n\t return component;\n\t}\n\t\n\tfunction shouldHide(field, model) {\n\t var hide = isOrInvoke(field, 'hidden', model);\n\t return hide && hide !== null;\n\t}\n\t\n\tfunction isOrInvoke(field, property, model) {\n\t if (!field.hasOwnProperty(property)) {\n\t return null;\n\t }\n\t if (typeof field[property] === 'function') {\n\t return field[property](model, field);\n\t } else {\n\t return !!field[property];\n\t }\n\t}\n\t\n\tmodule.exports = Formly;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tvar FieldMixin = {\n\t onChange: function(event) {\n\t var value = getValue(event.target);\n\t this.updateValue(value);\n\t },\n\t updateValue: function(value) {\n\t if (this.transformUpdate) {\n\t value = this.transformUpdate(value);\n\t }\n\t this.props.onValueUpdate(this.props.config.key, value);\n\t }\n\t};\n\t\n\tfunction getValue(node) {\n\t switch(node.type) {\n\t case 'checkbox':\n\t case 'radio':\n\t return node.checked;\n\t case 'select':\n\t return node.selected;\n\t default:\n\t return node.value;\n\t }\n\t}\n\t\n\tmodule.exports = FieldMixin;\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** react-formly.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 48ff59878ea0a6849000\n **/","module.exports.Formly = require('./src/components/Formly');\nmodule.exports.FieldMixin = require('./src/mixins/FieldMixin');\nmodule.exports.FormlyConfig = require('./src/modules/FormlyConfig');\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./index.js\n ** module id = 0\n ** module chunks = 0\n **/","'use strict';\n\nvar fieldTypeMap = {};\n\nmodule.exports = {\n fields: {\n addType: addFieldType,\n getTypes: getFieldTypes,\n clearTypes: clearTypes\n }\n};\n\nfunction addFieldType(name, field) {\n if (Array.isArray(name)) {\n name.forEach(function(fieldType) {\n addFieldType(fieldType);\n });\n } else if (typeof name === 'object') {\n field = name.field;\n name = name.name;\n }\n fieldTypeMap[name] = field;\n}\n\nfunction getFieldTypes() {\n return fieldTypeMap;\n}\n\nfunction clearTypes() {\n var oldTypes = fieldTypeMap;\n fieldTypeMap = {};\n return oldTypes;\n}\n\n\n/** WEBPACK FOOTER **\n ** ./src/modules/FormlyConfig.js\n **/","/** @jsx React.DOM */\n'use strict';\n\nvar React = require('react');\nvar FormlyConfig = require('./../modules/FormlyConfig');\n\nfunction typeOrComponent(props, propName, componentName) {\n var errorPrefix = componentName + ' config.fields field with key ' + props.key;\n if (props.type && props.component) {\n return new Error(errorPrefix + ' should only have either a type or a component, not both.');\n } else if (!props.type && !props.component) {\n return new Error(errorPrefix + ' should have either a type (string) or a component (React component)');\n }\n}\n\nvar Formly = React.createClass({\n propTypes: {\n onFormlyUpdate: React.PropTypes.func.isRequired,\n config: React.PropTypes.shape({\n name: React.PropTypes.string,\n fields: React.PropTypes.arrayOf(React.PropTypes.shape({\n key: React.PropTypes.string.isRequired,\n type: typeOrComponent,\n component: typeOrComponent,\n hidden: React.PropTypes.oneOfType([\n React.PropTypes.bool,\n React.PropTypes.func\n ]),\n props: React.PropTypes.oneOfType([\n React.PropTypes.object,\n React.PropTypes.func\n ]),\n data: React.PropTypes.object\n }))\n }),\n model: React.PropTypes.object\n },\n\n getDefaultProps: function() {\n return { model: {} };\n },\n\n onValueUpdate: function(fieldKey, value) {\n this.props.model[fieldKey] = value;\n this.props.onFormlyUpdate(this.props.model);\n },\n\n render: function() {\n var model = this.props.model;\n var onValueUpdate = this.onValueUpdate;\n var fields = this.props.config.fields.map(function(field) {\n return generateFieldTag(field, model, onValueUpdate);\n });\n return ;\n }\n});\n\nfunction generateFieldTag(field, model, onValueUpdate) {\n var fieldComponent = field.component ? field.component : FormlyConfig.fields.getTypes()[field.type];\n if (!fieldComponent) {\n throw new Error('Formly: \"' + field.type + '\" has not been added to FormlyConfig\\'s field types.');\n }\n\n if (shouldHide(field, model)) {\n return null;\n }\n\n return getComponent(fieldComponent, field, model, onValueUpdate);\n}\n\nfunction getComponent(fieldComponent, field, model, onValueUpdate) {\n\n var componentProps;\n if (field.props) {\n componentProps = typeof field.props === 'function' ? field.props(model, field) : field.props;\n }\n\n //assign to variable to allow JSX compiler to pick up as a prop instead of string\n var FieldComponent = fieldComponent;\n var component = ;\n\n return component;\n}\n\nfunction shouldHide(field, model) {\n var hide = isOrInvoke(field, 'hidden', model);\n return hide && hide !== null;\n}\n\nfunction isOrInvoke(field, property, model) {\n if (!field.hasOwnProperty(property)) {\n return null;\n }\n if (typeof field[property] === 'function') {\n return field[property](model, field);\n } else {\n return !!field[property];\n }\n}\n\nmodule.exports = Formly;\n\n\n/** WEBPACK FOOTER **\n ** ./src/components/Formly.js\n **/","'use strict';\n\nvar FieldMixin = {\n onChange: function(event) {\n var value = getValue(event.target);\n this.updateValue(value);\n },\n updateValue: function(value) {\n if (this.transformUpdate) {\n value = this.transformUpdate(value);\n }\n this.props.onValueUpdate(this.props.config.key, value);\n }\n};\n\nfunction getValue(node) {\n switch(node.type) {\n case 'checkbox':\n case 'radio':\n return node.checked;\n case 'select':\n return node.selected;\n default:\n return node.value;\n }\n}\n\nmodule.exports = FieldMixin;\n\n\n/** WEBPACK FOOTER **\n ** ./src/mixins/FieldMixin.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"react\"\n ** module id = 4\n ** module chunks = 0\n **/"],"sourceRoot":""}
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | var gulp = require('gulp');
2 | var deploy = require('gulp-gh-pages');
3 | var gulpWebpack = require('gulp-webpack');
4 | var react = require('gulp-react');
5 | var jshint = require('gulp-jshint');
6 |
7 | // hijack task fn and add help
8 | require('gulp-help')(gulp);
9 |
10 |
11 | var connect = require('connect');
12 | var serveStatic = require('serve-static');
13 | var livereload = require('livereload');
14 | var rimraf = require('rimraf');
15 | var webpack = require('webpack');
16 | var karma = require('karma').server;
17 | var argv = require('yargs').argv;
18 | var stylish = require('jshint-stylish');
19 |
20 | gulp.task('deploy', 'Deploy demo to gh-pages', function () {
21 | gulp.src([
22 | './demo/demo-built.js',
23 | './demo/index.html',
24 | './demo/styles.css',
25 | './demo/bootstrap.min.css'
26 | ])
27 | .pipe(deploy());
28 | });
29 |
30 | gulp.task('lint', 'lint project code (post jsx transformation', function() {
31 | gulp.src('src/**/*')
32 | .pipe(react())
33 | .pipe(jshint())
34 | .pipe(jshint.reporter(stylish));
35 | });
36 |
37 | gulp.task('watch:lint', false, function() {
38 | gulp.watch('./src/**/*', ['lint']);
39 | });
40 |
41 | gulp.task('build:clean', false, function(done) {
42 | rimraf('./dist', done);
43 | });
44 |
45 | function buildTest(once) {
46 | return gulp.src('test/index.js')
47 | .pipe(gulpWebpack({
48 | output: {
49 | filename: './index-built.js'
50 | },
51 | watch: !once,
52 | module: {
53 | loaders: [
54 | { test: /\.js$/, loader: 'jsx-loader' }
55 | ]
56 | }
57 | }))
58 | .pipe(gulp.dest('test/'));
59 | }
60 |
61 | gulp.task('test:buildTest', false, function() {
62 | buildTest(true);
63 | });
64 |
65 | gulp.task('watch:buildTest', false, function() {
66 | buildTest(false);
67 | });
68 |
69 | function test(once, done) {
70 | karma.start({
71 | configFile: __dirname + '/test/karma.conf.js',
72 | browsers: argv.travis ? ['Firefox'] : ['Chrome'],
73 | singleRun: !!once
74 | }, done);
75 | }
76 |
77 | gulp.task('test', 'Run tests once', ['test:buildTest'], function(done) {
78 | test(true, done);
79 | });
80 |
81 | gulp.task('watch:test', false, ['watch:buildTest'], function(done) {
82 | test(false, done);
83 | });
84 |
85 | function buildLib(once, uglify) {
86 | var buildLibConfig = getBuildWebpack(once);
87 | if (uglify) {
88 | buildLibConfig.plugins.push(new webpack.optimize.UglifyJsPlugin());
89 | buildLibConfig.output.filename = 'react-formly.min.js';
90 | buildLibConfig.devtool = 'source-map';
91 | }
92 | return gulp.src('index.js')
93 | .pipe(gulpWebpack(buildLibConfig))
94 | .pipe(gulp.dest('dist/'));
95 | }
96 |
97 | gulp.task('build:lib', false, function() {
98 | buildLib(true, false);
99 | });
100 |
101 | gulp.task('watch:build:lib', false, function() {
102 | buildLib(false, false);
103 | });
104 |
105 | gulp.task('build:uglify', false, function() {
106 | buildLib(true, true);
107 | });
108 |
109 | gulp.task('watch:build:uglify', false, function() {
110 | buildLib(false, true);
111 | });
112 |
113 | gulp.task('watch:demo', false, function() {
114 | return gulp.src('demo/demo.js')
115 | .pipe(gulpWebpack({
116 | output: {
117 | path: __dirname + 'demo',
118 | filename: 'demo-built.js'
119 | },
120 | watch: true,
121 | devtool: 'inline-source-map',
122 | module: {
123 | loaders: [
124 | {test: /\.js$/, loader: 'jsx-loader'}
125 | ]
126 | }
127 | }))
128 | .pipe(gulp.dest('demo/'));
129 | });
130 |
131 | gulp.task('watch:serve:server', false, function(next) {
132 | var server = connect();
133 | server.use(serveStatic('demo'));
134 | server.listen(process.env.PORT || 3000, next);
135 | });
136 |
137 | gulp.task('watch:serve', false, ['watch:serve:server'], function() {
138 | var server = livereload.createServer({
139 | interval: 300
140 | });
141 | server.watch(__dirname + '/demo');
142 | });
143 |
144 | gulp.task('watch', 'Use this for development. Will build, test, and serve the demo automgagically', [
145 | 'watch:build:lib',
146 | 'watch:build:uglify',
147 | 'watch:lint',
148 | 'watch:buildTest',
149 | 'watch:test',
150 | 'watch:demo',
151 | 'watch:serve'
152 | ]);
153 |
154 | gulp.task('build', 'Build the library', ['build:clean', 'build:lib', 'build:uglify']);
155 |
156 | gulp.task('default', false, ['help']);
157 |
158 | gulp.task('ci', 'Run the tests and build. Use --travis for the travis version of the build.', [
159 | 'test',
160 | 'build'
161 | ]);
162 |
163 |
164 |
165 | // UTILS
166 |
167 |
168 | function getBuildWebpack(once) {
169 | return {
170 | entry: './index.js',
171 | output: {
172 | filename: 'react-formly.js',
173 | library: 'ReactFormly',
174 | libraryTarget: 'umd'
175 | },
176 |
177 | externals: {
178 | 'react': 'react'
179 | },
180 |
181 | debug: false,
182 | devtool: 'inline-source-map',
183 | watch: !once,
184 |
185 | stats: {
186 | colors: true,
187 | reasons: false
188 | },
189 |
190 | plugins: [
191 | new webpack.optimize.DedupePlugin(),
192 | new webpack.optimize.OccurenceOrderPlugin(),
193 | new webpack.optimize.AggressiveMergingPlugin()
194 | ],
195 |
196 | resolve: {
197 | extensions: ['', '.js']
198 | },
199 |
200 | module: {
201 | loaders: [
202 | { test: /src\/.*\.js$/, loader: 'jsx-loader' }
203 | ]
204 | }
205 | }
206 | }
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | module.exports.Formly = require('./src/components/Formly');
2 | module.exports.FieldMixin = require('./src/mixins/FieldMixin');
3 | module.exports.FormlyConfig = require('./src/modules/FormlyConfig');
4 |
5 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-formly",
3 | "version": "0.0.5",
4 | "description": "JSON powered forms for react - Currently in alpha state, API subject to change...",
5 | "scripts": {
6 | "test": "gulp ci --travis",
7 | "dev": "gulp dev",
8 | "build": "gulp build",
9 | "deploy": "gulp deploy",
10 | "release": "npm run build && with-package git commit -am pkg.version && with-package git tag pkg.version && git push && npm publish && git push --tags",
11 | "release:beta": "npm run release && npm run tag:beta",
12 | "tag:beta": "with-package npm dist-tag add pkg.name@pkg.version beta"
13 | },
14 | "repository": {
15 | "type": "git",
16 | "url": "https://github.com/kentcdodds/react-formly.git"
17 | },
18 | "main": "dist/react-formly.min.js",
19 | "keywords": [
20 | "react",
21 | "react components",
22 | "library",
23 | "forms",
24 | "react-component",
25 | "reactjs",
26 | "html forms"
27 | ],
28 | "author": "Kent C. Dodds (http://kent.doddsfamily.us)",
29 | "license": "MIT",
30 | "bugs": {
31 | "url": "https://github.com/kentcdodds/react-formly/issues"
32 | },
33 | "homepage": "https://github.com/kentcdodds/react-formly",
34 | "devDependencies": {
35 | "chai": "^1.9.1",
36 | "connect": "^3.2.0",
37 | "gulp": "^3.8.8",
38 | "gulp-gh-pages": "^0.3.4",
39 | "gulp-help": "^1.1.0",
40 | "gulp-jshint": "^1.8.4",
41 | "gulp-react": "^3.0.1",
42 | "gulp-webpack": "^0.3.0",
43 | "jshint-stylish": "^0.4.0",
44 | "jsx-loader": "^0.13.2",
45 | "karma": "^0.12.19",
46 | "karma-chai": "^0.1.0",
47 | "karma-chrome-launcher": "^0.1.4",
48 | "karma-cli": "0.0.4",
49 | "karma-firefox-launcher": "^0.1.3",
50 | "karma-mocha": "^0.1.6",
51 | "livereload": "^0.3.4",
52 | "mocha": "^1.21.3",
53 | "react-addons": "^0.9.0",
54 | "rimraf": "^2.2.8",
55 | "serve-static": "^1.6.1",
56 | "webpack": "^1.3.2-beta9",
57 | "with-package": "^0.2.0",
58 | "yargs": "^1.3.1"
59 | },
60 | "dependencies": {
61 | "react": "^0.14.8"
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/server.js:
--------------------------------------------------------------------------------
1 | var server = require('pushstate-server');
2 |
3 | server.start({
4 | port: process.env.PORT || 3000,
5 | directory: './demo'
6 | });
--------------------------------------------------------------------------------
/src/components/Formly.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 | 'use strict';
3 |
4 | var React = require('react');
5 | var FormlyConfig = require('./../modules/FormlyConfig');
6 |
7 | function typeOrComponent(props, propName, componentName) {
8 | var errorPrefix = componentName + ' config.fields field with key ' + props.key;
9 | if (props.type && props.component) {
10 | return new Error(errorPrefix + ' should only have either a type or a component, not both.');
11 | } else if (!props.type && !props.component) {
12 | return new Error(errorPrefix + ' should have either a type (string) or a component (React component)');
13 | }
14 | }
15 |
16 | var Formly = React.createClass({
17 | propTypes: {
18 | onFormlyUpdate: React.PropTypes.func.isRequired,
19 | config: React.PropTypes.shape({
20 | name: React.PropTypes.string,
21 | fields: React.PropTypes.arrayOf(React.PropTypes.shape({
22 | key: React.PropTypes.string.isRequired,
23 | type: typeOrComponent,
24 | component: typeOrComponent,
25 | hidden: React.PropTypes.oneOfType([
26 | React.PropTypes.bool,
27 | React.PropTypes.func
28 | ]),
29 | props: React.PropTypes.oneOfType([
30 | React.PropTypes.object,
31 | React.PropTypes.func
32 | ]),
33 | data: React.PropTypes.object
34 | }))
35 | }),
36 | model: React.PropTypes.object
37 | },
38 |
39 | getDefaultProps: function() {
40 | return { model: {} };
41 | },
42 |
43 | onValueUpdate: function(fieldKey, value) {
44 | this.props.model[fieldKey] = value;
45 | this.props.onFormlyUpdate(this.props.model);
46 | },
47 |
48 | render: function() {
49 | var model = this.props.model;
50 | var onValueUpdate = this.onValueUpdate;
51 | var fields = this.props.config.fields.map(function(field) {
52 | return generateFieldTag(field, model, onValueUpdate);
53 | });
54 | return ;
55 | }
56 | });
57 |
58 | function generateFieldTag(field, model, onValueUpdate) {
59 | var fieldComponent = field.component ? field.component : FormlyConfig.fields.getTypes()[field.type];
60 | if (!fieldComponent) {
61 | throw new Error('Formly: "' + field.type + '" has not been added to FormlyConfig\'s field types.');
62 | }
63 |
64 | if (shouldHide(field, model)) {
65 | return null;
66 | }
67 |
68 | return getComponent(fieldComponent, field, model, onValueUpdate);
69 | }
70 |
71 | function getComponent(fieldComponent, field, model, onValueUpdate) {
72 |
73 | var componentProps;
74 | if (field.props) {
75 | componentProps = typeof field.props === 'function' ? field.props(model, field) : field.props;
76 | }
77 |
78 | //assign to variable to allow JSX compiler to pick up as a prop instead of string
79 | var FieldComponent = fieldComponent;
80 | var component = ;
81 |
82 | return component;
83 | }
84 |
85 | function shouldHide(field, model) {
86 | var hide = isOrInvoke(field, 'hidden', model);
87 | return hide && hide !== null;
88 | }
89 |
90 | function isOrInvoke(field, property, model) {
91 | if (!field.hasOwnProperty(property)) {
92 | return null;
93 | }
94 | if (typeof field[property] === 'function') {
95 | return field[property](model, field);
96 | } else {
97 | return !!field[property];
98 | }
99 | }
100 |
101 | module.exports = Formly;
--------------------------------------------------------------------------------
/src/components/Formly.spec.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 | 'use strict';
3 |
4 | var expect = require('chai').expect;
5 | var React = require('react/addons');
6 | var TestUtils = React.addons.TestUtils;
7 | var TestField = require('../../test/TestFields').text;
8 | var Formly = require('./Formly');
9 | var FormlyConfig = require('./../modules/FormlyConfig');
10 |
11 | describe('Formly', function FormlySpec() {
12 | var renderedFieldComponents;
13 | var app;
14 |
15 |
16 | beforeEach(function() {
17 | FormlyConfig.fields.clearTypes();
18 | FormlyConfig.fields.addType('text', TestField);
19 | var config = {
20 | name: 'myFormly',
21 | fields: [
22 | { key: 'name', type: 'text' },
23 | { key: 'favoriteCandy', type: 'text' },
24 | { key: 'dogsName', type: 'text' },
25 | { key: 'catsName', type: 'text', hidden: true },
26 | { key: 'caterpillersName', type: 'text', hidden: function(model) {
27 | return model.name === 'George Foreman';
28 | } }
29 | ]
30 | };
31 |
32 | var App = React.createClass({
33 | getInitialState: function() {
34 | return { model: {} };
35 | },
36 | onFormlyUpdateCalled: 0,
37 | onFormlyUpdate: function(model) {
38 | this.setState({model: model});
39 | this.onFormlyUpdateCalled++;
40 | },
41 | render: function() {
42 | return ;
43 | }
44 | });
45 |
46 | app = TestUtils.renderIntoDocument( );
47 | renderedFieldComponents = TestUtils.scryRenderedComponentsWithType(app, TestField);
48 | });
49 |
50 | it('should render the non-hidden fields given in config', function() {
51 | expect(renderedFieldComponents).to.have.length(4);
52 | });
53 |
54 | it('should invoke onFormlyUpdate when a field is changed', function() {
55 | var renderedFieldInputs = TestUtils.scryRenderedDOMComponentsWithTag(app, 'input');
56 | var nameInput = renderedFieldInputs[0];
57 | nameInput.getDOMNode().value = 'Bing Crosby';
58 | TestUtils.Simulate.change(nameInput);
59 | expect(app.onFormlyUpdateCalled).to.equal(1);
60 |
61 | });
62 |
63 | it('should have a className of formly', function() {
64 | expect(app.getDOMNode().className).to.include('formly');
65 | });
66 |
67 | it('should hide fields whose hidden functions return true', function() {
68 | var renderedFieldInputs = TestUtils.scryRenderedDOMComponentsWithTag(app, 'input');
69 | var nameInput = renderedFieldInputs[0];
70 | nameInput.getDOMNode().value = 'George Foreman';
71 | TestUtils.Simulate.change(nameInput);
72 | var newRenderedComponents = TestUtils.scryRenderedDOMComponentsWithTag(app, 'input');
73 | expect(newRenderedComponents).to.have.length(3);
74 | });
75 | });
76 |
--------------------------------------------------------------------------------
/src/mixins/FieldMixin.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var FieldMixin = {
4 | onChange: function(event) {
5 | var value = getValue(event.target);
6 | this.updateValue(value);
7 | },
8 | updateValue: function(value) {
9 | if (this.transformUpdate) {
10 | value = this.transformUpdate(value);
11 | }
12 | this.props.onValueUpdate(this.props.config.key, value);
13 | }
14 | };
15 |
16 | function getValue(node) {
17 | switch(node.type) {
18 | case 'checkbox':
19 | case 'radio':
20 | return node.checked;
21 | case 'select':
22 | return node.selected;
23 | default:
24 | return node.value;
25 | }
26 | }
27 |
28 | module.exports = FieldMixin;
--------------------------------------------------------------------------------
/src/mixins/FieldMixin.spec.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 | 'use strict';
3 |
4 | var expect = require('chai').expect;
5 | var React = require('react/addons');
6 | var TestUtils = React.addons.TestUtils;
7 | var TestFields = require('../../test/TestFields');
8 | var TextField = TestFields.text;
9 | var NumberField = TestFields.number;
10 | var FormlyConfig = require('../modules/FormlyConfig');
11 | var Formly = require('../components/Formly');
12 |
13 | describe('FieldMixin', function FieldMixinSpec() {
14 | describe('on its own', function() {
15 | var field;
16 | var input;
17 | var calls;
18 |
19 | beforeEach(function() {
20 | calls = {
21 | onValueUpdate: 0
22 | };
23 |
24 | function onValueUpdate() {
25 | calls.onValueUpdate++;
26 | }
27 |
28 | var config = {
29 | key: 'myKey'
30 | };
31 |
32 | field = TestUtils.renderIntoDocument( );
33 | input = field.refs.input.getDOMNode();
34 | });
35 |
36 | it('should add onChange handler', function() {
37 | expect(field).to.have.property('onChange');
38 | });
39 |
40 | it('should call onValueUpdate when the onChange is called', function() {
41 | TestUtils.Simulate.change(input);
42 | expect(calls.onValueUpdate).to.equal(1);
43 | });
44 | });
45 |
46 | describe('with Formly', function() {
47 | var input;
48 |
49 | beforeEach(function() {
50 | FormlyConfig.fields.clearTypes();
51 | FormlyConfig.fields.addType('text', TextField);
52 | var config = {
53 | name: 'myFormly',
54 | fields: [
55 | { key: 'name', type: 'text' }
56 | ]
57 | };
58 |
59 | var App = React.createClass({
60 | getInitialState: function() {
61 | return { model: {} };
62 | },
63 | onFormlyUpdate: function(model) {
64 | this.setState({model: model});
65 | },
66 | render: function() {
67 | return ;
68 | }
69 | });
70 |
71 | var form = TestUtils.renderIntoDocument( );
72 | input = TestUtils.findRenderedDOMComponentWithTag(form, 'input').getDOMNode();
73 | });
74 |
75 | it('should transform the input value based on the components transformUpdate method', function() {
76 | input.value = 'foobar';
77 | TestUtils.Simulate.change(input);
78 | expect(input.value).to.equal('barbar');
79 | });
80 |
81 | });
82 |
83 | describe('special cases', function() {
84 | var field;
85 | var input;
86 | beforeEach(function() {
87 | var config = {
88 | key: 'myKey'
89 | };
90 |
91 | function noop() {}
92 |
93 | field = TestUtils.renderIntoDocument( );
94 | input = field.refs.input.getDOMNode();
95 | });
96 |
97 | it('should always set the value to the post-transformUpdate value', function() {
98 | input.value = 'hello world';
99 | TestUtils.Simulate.change(input);
100 | expect(input.value).to.equal('');
101 | });
102 | });
103 |
104 | });
--------------------------------------------------------------------------------
/src/modules/FormlyConfig.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var fieldTypeMap = {};
4 |
5 | module.exports = {
6 | fields: {
7 | addType: addFieldType,
8 | getTypes: getFieldTypes,
9 | clearTypes: clearTypes
10 | }
11 | };
12 |
13 | function addFieldType(name, field) {
14 | if (Array.isArray(name)) {
15 | name.forEach(function(fieldType) {
16 | addFieldType(fieldType);
17 | });
18 | } else if (typeof name === 'object') {
19 | field = name.field;
20 | name = name.name;
21 | }
22 | fieldTypeMap[name] = field;
23 | }
24 |
25 | function getFieldTypes() {
26 | return fieldTypeMap;
27 | }
28 |
29 | function clearTypes() {
30 | var oldTypes = fieldTypeMap;
31 | fieldTypeMap = {};
32 | return oldTypes;
33 | }
--------------------------------------------------------------------------------
/src/modules/FormlyConfig.spec.js:
--------------------------------------------------------------------------------
1 | /* jshint -W030 */
2 | 'use strict';
3 |
4 | var expect = require('chai').expect;
5 | var FormlyConfig = require('./FormlyConfig');
6 |
7 | describe('FormlyConfig', function FormlyConfigSpec() {
8 |
9 | describe('fields', function() {
10 |
11 | beforeEach(function() {
12 | FormlyConfig.fields.clearTypes();
13 | });
14 |
15 | describe('#clearTypes', function() {
16 | it('should clear all the types', function() {
17 | FormlyConfig.fields.addType('text', {});
18 | FormlyConfig.fields.clearTypes();
19 | var types = FormlyConfig.fields.getTypes();
20 | expect(types).to.be.empty;
21 | });
22 | });
23 |
24 | describe('#addType', function() {
25 | var fakeField;
26 | var fieldName;
27 |
28 | beforeEach(function() {
29 | fakeField = {};
30 | fieldName = 'text';
31 | });
32 |
33 | it('should accept two arguments where the first is name and second is the field', function() {
34 | FormlyConfig.fields.addType(fieldName, fakeField);
35 | var types = FormlyConfig.fields.getTypes();
36 | expect(types).to.have.property(fieldName);
37 | expect(types[fieldName]).to.equal(fakeField);
38 | });
39 |
40 | it('should accept a single argument that is an object with a name and a field', function() {
41 | FormlyConfig.fields.addType({
42 | name: fieldName,
43 | field: fakeField
44 | });
45 | var types = FormlyConfig.fields.getTypes();
46 | expect(types).to.have.property(fieldName);
47 | expect(types[fieldName]).to.equal(fakeField);
48 | });
49 |
50 | it('should accept a single argument that is an array of objects with a name and a field', function() {
51 | var fieldName2 = 'number';
52 | var fakeField2 = {};
53 | FormlyConfig.fields.addType([
54 | { name: fieldName, field: fakeField },
55 | { name: fieldName2, field: fakeField2 }
56 | ]);
57 | var types = FormlyConfig.fields.getTypes();
58 | expect(types).to.have.property(fieldName);
59 | expect(types).to.have.property(fieldName2);
60 | expect(types[fieldName]).to.equal(fakeField);
61 | expect(types[fieldName2]).to.equal(fakeField2);
62 | });
63 |
64 | it('should allow the overriding of field types with the same name', function() {
65 | FormlyConfig.fields.addType(fieldName, fakeField);
66 | FormlyConfig.fields.addType(fieldName, {}); // override
67 | var types = FormlyConfig.fields.getTypes();
68 | expect(types).to.have.property(fieldName);
69 | expect(types[fieldName]).to.not.equal(fakeField);
70 | });
71 | });
72 |
73 | describe('#getTypes', function() {
74 | it('should return an object with all the types keyed by name', function() {
75 | var fieldName = 'text';
76 | var fakeField = {};
77 | FormlyConfig.fields.addType(fieldName, fakeField);
78 | var types = FormlyConfig.fields.getTypes();
79 | expect(types).to.have.property(fieldName);
80 | expect(types[fieldName]).to.equal(fakeField);
81 | });
82 | });
83 | });
84 | });
--------------------------------------------------------------------------------
/test/TestFields.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 | 'use strict';
3 |
4 | var React = require('react');
5 | var FieldMixin = require('../src/mixins/FieldMixin');
6 |
7 | var TextField = React.createClass({
8 | mixins: [FieldMixin],
9 | transformUpdate: function(value) {
10 | return value.replace(/foo/g, 'bar');
11 | },
12 | render: function() {
13 | var model = this.props.model || {};
14 | var key = this.props.config.key || '';
15 | var value = '';
16 | if (key) {
17 | value = model[key];
18 | }
19 | return (
20 |
21 |
22 |
23 | );
24 | }
25 | });
26 |
27 | var NumberField = React.createClass({
28 | mixins: [FieldMixin],
29 | transformUpdate: function(value) {
30 | return value.replace(/\D/g,'');
31 | },
32 | render: function() {
33 | var model = this.props.model || {};
34 | var config = this.props.config;
35 | var key = this.props.config.key || '';
36 | var value = '';
37 | if (key) {
38 | value = model[key];
39 | }
40 | return (
41 |
42 |
43 | {config.label}
44 |
45 |
46 |
47 | );
48 | }
49 | });
50 |
51 | module.exports = {
52 | text: TextField,
53 | number: NumberField
54 | };
--------------------------------------------------------------------------------
/test/index.js:
--------------------------------------------------------------------------------
1 | require('../src/components/Formly.spec');
2 | require('../src/mixins/FieldMixin.spec');
3 | require('../src/modules/FormlyConfig.spec.js');
4 |
--------------------------------------------------------------------------------
/test/karma.conf.js:
--------------------------------------------------------------------------------
1 | module.exports = function(config) {
2 | config.set({
3 |
4 | // base path that will be used to resolve all patterns (eg. files, exclude)
5 | basePath: '../',
6 |
7 |
8 | // frameworks to use
9 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
10 | frameworks: ['mocha', 'chai'],
11 |
12 |
13 | // list of files / patterns to load in the browser
14 | files: [
15 | 'test/index-built.js'
16 | ],
17 |
18 | // list of files to exclude
19 | exclude: [],
20 |
21 | // test results reporter to use
22 | // possible values: 'dots', 'progress'
23 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter
24 | reporters: ['progress'],
25 |
26 | plugins: [
27 | 'karma-mocha',
28 | 'karma-chai',
29 | 'karma-chrome-launcher',
30 | 'karma-firefox-launcher'
31 | ],
32 |
33 | // web server port
34 | port: 9876,
35 |
36 |
37 | // enable / disable colors in the output (reporters and logs)
38 | colors: true,
39 |
40 |
41 | // level of logging
42 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
43 | logLevel: config.LOG_INFO,
44 |
45 |
46 | // enable / disable watching file and executing tests whenever any file changes
47 | autoWatch: true,
48 |
49 |
50 | // start these browsers
51 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
52 | browsers: ['Firefox', 'Chrome'],
53 |
54 |
55 | // Continuous Integration mode
56 | // if true, Karma captures browsers, runs the tests and exits
57 | singleRun: false
58 | });
59 | };
60 |
--------------------------------------------------------------------------------