├── .gitignore ├── README.md ├── app ├── package-lock.json ├── package.json ├── public │ ├── css │ │ └── styles.css │ ├── img │ │ ├── favicon.png │ │ └── logo.svg │ └── index.html ├── readme.md ├── src │ ├── App.css │ ├── App.js │ ├── actions │ │ ├── ActionTypes.js │ │ └── actions.js │ ├── components │ │ ├── block │ │ │ ├── Block.css │ │ │ └── Block.js │ │ ├── footer │ │ │ ├── AppFooter.css │ │ │ └── AppFooter.js │ │ ├── header │ │ │ ├── AppHeader.css │ │ │ └── AppHeader.js │ │ ├── modal │ │ │ ├── AppModal.css │ │ │ └── AppModal.js │ │ ├── stats │ │ │ ├── Stats.css │ │ │ └── Stats.js │ │ ├── timeline │ │ │ ├── Timeline.css │ │ │ └── Timeline.js │ │ └── transaction │ │ │ ├── Transaction.css │ │ │ └── Transaction.js │ ├── configs │ │ ├── bigchaindb.config.json │ │ └── ui-mapper.config.json │ ├── containers │ │ ├── AppModal.js │ │ ├── Block.js │ │ ├── Stats.js │ │ ├── Timeline.js │ │ └── Transaction.js │ ├── index.css │ ├── index.js │ ├── reducers │ │ ├── Blocks.js │ │ ├── Modal.js │ │ ├── Stats.js │ │ ├── Transaction.js │ │ └── index.js │ ├── registerServiceWorker.js │ └── services │ │ ├── bdb.js │ │ ├── sockets.js │ │ └── utils.js └── test │ ├── integrationTest.js │ └── testScript.sh ├── specs ├── bdbdashboard.png ├── readme.md └── tasks.md └── ux ├── IMG_1767.JPG ├── bigchaindb-dashboard-transaction-details-v0-4.png ├── bigchaindb-dashboard-v0-2-commented.png ├── bigchaindb-dashboard-v0-2.png ├── bigchaindb-dashboard-v0-3.png ├── bigchaindb-dashboard-v0-4.png └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BigchainDB Dashboard/Explorer 2 | 3 | This is a react/redux single page application showing BigchainDB transactions as a dynamic timeline view using the valid transaction broadcast from the BigchainDB websocket. 4 | This application can be used to visualize the transactions and blocks on any BigchainDB deployment. 5 | 6 | More details about the concept and implementation are in the `/specs` directory. 7 | 8 | UX/UI assets and artifacts are in the `/ux` directory 9 | 10 | The application code is in the `/app` directory 11 | 12 | ## Live Demo 13 | 14 | A demo version of this app connected to a local BigchainDB node is deployed [here](http://explorer-demo.bigchaindb.com/). The transaction data is being posted by an automated job at regular time intervals. 15 | 16 | The BigchainDB Dashboard app is also deployed for BigchainDB Testnet, [here](https://bigchaindb-dashboard.azurewebsites.net/). For a quick demo, go to the [BigchainDB Getting Started page](https://www.bigchaindb.com/developers/getstarted/) and post a transaction. Come back to the [dashboard](https://bigchaindb-dashboard.azurewebsites.net/) to see this transaction in real time. 17 | 18 | ## Structure 19 | 20 | The app is structured as a react app created using create-react-app with added redux support. 21 | 22 | 1. `src/actions` directory contains the react actions 23 | 2. `src/components` directory contains the react components 24 | 3. `src/configs` directory has 2 json-config files to configure UI and BigchainDB connection 25 | 4. `src/containers` directory has the container components 26 | 5. `src/reducers` directory has the redux reducers 27 | 6. `src/services` directory has the services and utils to connect and listen to BigchainDB 28 | 7. `src/App.js` This is the react application the wraps and combines all the components together 29 | 8. `src/index.js` This mounts the react app from App.js 30 | 9. `test/integrationTest.js` Integration test file that produces different creates/transfer transactions on BigchainDB 31 | 10. `test/testScript.sh` a bash script to run `integrationTest.js` every 2 seconds 32 | 11. `public/` contains static files i.e. html, css, images 33 | 34 | ## Configurations 35 | 36 | The project can be configured using 2 JSON configuration files located at `src/configs`. 37 | 38 | 1. `bigchaindb.config.json` This file can be used to configure the connection parameters for connecting to the BigchainDB network. 39 | 1. `ui-mapper.config.json` This file can be used to configure to modify what user sees in the description for transfer & create transaction card, application context name and the maximum number of blocks a user can see on the UI. 40 | 41 | The fields `create.description` & `transfer.description` are used to parse the data from the raw transaction of create and transfer types respectively. 42 | 43 | ## How to deploy 44 | 45 | 1. Clone this repository 46 | 2. Navigate to app folder with: `cd dashboard/app/` 47 | 3. Install node modules: `npm install` 48 | 4. Modify the `bigchaindb.config.json` & `ui-mapper.config.json` as per the requirement 49 | 5. Run the dev server using `npm start` and open the browser on `localhost:3000` 50 | 6. To create a production build you can use `npm run build` 51 | 52 | ## UX Credits 53 | 54 | Big thanks to @mariusgoebel for help with UX design and mockups. 55 | -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bdb-dashboard", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "bigchaindb-driver": "4.1.0", 7 | "react": "16.4.2", 8 | "react-dom": "16.4.2", 9 | "react-redux": "5.0.7", 10 | "redux": "4.0.0", 11 | "redux-devtools-extension": "2.13.5", 12 | "redux-thunk": "2.3.0", 13 | "semantic-ui-css": "2.3.3", 14 | "semantic-ui-react": "0.82.1" 15 | }, 16 | "devDependencies": { 17 | "babel-preset-env": "1.7.0", 18 | "react-scripts": "2.0.0-next.3e165448", 19 | "redux-devtools": "3.4.1" 20 | }, 21 | "scripts": { 22 | "start": "react-scripts start", 23 | "build": "react-scripts build", 24 | "test": "react-scripts test --env=jsdom", 25 | "eject": "react-scripts eject" 26 | }, 27 | "browserslist": { 28 | "development": [ 29 | "last 2 chrome versions", 30 | "last 2 firefox versions", 31 | "last 2 edge versions" 32 | ], 33 | "production": [ 34 | ">0.25%", 35 | "not op_mini all", 36 | "ie 11" 37 | ] 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/public/css/styles.css: -------------------------------------------------------------------------------- 1 | /** 2 | ** bigchaindb-site 3 | ** Landing page for BigchainDB 4 | ** https://www.bigchaindb.com 5 | ** 6 | ** Matthias Kretschmann 7 | **/ 8 | @charset "UTF-8";/*! normalize-opentype.css v0.2.4 | MIT License | kennethormandy.com/journal/normalize-opentype-css */::-moz-selection{color:inherit;text-shadow:inherit;background-color:#accef7}::selection{color:inherit;text-shadow:inherit;background-color:#accef7}body,html,table{-webkit-font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 1,"lnum" 0,"dlig" 0;font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 1,"lnum" 0,"dlig" 0}h1,h2,h3{-webkit-font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 1,"lnum" 0,"dlig" 1;font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 1,"lnum" 0,"dlig" 1}abbr{text-transform:uppercase;-webkit-font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 1,"lnum" 0,"smcp" 1,"c2sc" 1;font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 1,"lnum" 0,"smcp" 1,"c2sc" 1}time{-webkit-font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 1,"lnum" 0;font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 1,"lnum" 0}code,kbd,pre,samp{-webkit-font-feature-settings:"kern" 0,"liga" 0,"calt" 1,"dlig" 0,"pnum" 0,"tnum" 1,"onum" 0,"lnum" 1,"zero" 1;font-feature-settings:"kern" 0,"liga" 0,"calt" 1,"dlig" 0,"pnum" 0,"tnum" 1,"onum" 0,"lnum" 1,"zero" 1}sup{-webkit-font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 1,"lnum" 0,"dlig" 0,"sups" 1;font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 1,"lnum" 0,"dlig" 0,"sups" 1}sub{-webkit-font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 1,"lnum" 0,"dlig" 0,"subs" 1;font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 1,"lnum" 0,"dlig" 0,"subs" 1}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=number],input[type=range],input[type=tel],input[type=week]{-webkit-font-feature-settings:"kern" 0,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 0,"lnum" 1,"zero" 0;font-feature-settings:"kern" 0,"liga" 1,"calt" 1,"pnum" 1,"tnum" 0,"onum" 0,"lnum" 1,"zero" 0}caption,tbody{-webkit-font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 0,"tnum" 1,"onum" 0,"lnum" 1,"zero" 1;font-feature-settings:"kern" 1,"liga" 1,"calt" 1,"pnum" 0,"tnum" 1,"onum" 0,"lnum" 1,"zero" 1}.team__position,.text-dimmed,blockquote{color:#9dabba}.color-overlay{position:relative}.color-overlay:before{content:'';width:100%;height:100%;position:absolute;left:0;top:0;bottom:0;right:0;background:-webkit-gradient(linear,left top,right bottom,from(#074354),to(#101a25));background:linear-gradient(to bottom right,#074354 0,#101a25 100%);opacity:.7;z-index:0}.color-overlay .row{z-index:1}.background--blue{background:#074354}.background--darker,.footer,.page-front .section--blog,.page-front .section--guides,.page-front .section-testimonials{background:#394552}.background--light{background:#cad2da}.background--light .section-title,.background--light h1,.background--light h2,.background--light h3,.background--light p{color:#445261}.background--light a{color:#2f3943}.background--blue--light{background:#bfe6ec}.background--blue--light .section-title,.background--blue--light h1,.background--blue--light h2,.background--blue--light h3,.background--blue--light p{color:#074354}.background--gray{background:#445261}.background--green{background:#39ba91}.background--green,.background--green .section-description,.background--green .section-title,.background--green p{color:#074354}.background--green .section-title:after{background:#2d9373}.background--green .feature__icon{stroke:#074354;color:#b581cf}.background--green .feature__title{color:#074354}.background--green .feature__title:after{background:#33a682}.background--green .feature__text{opacity:.75}.background--violet{background:#b581cf}.background--violet,.background--violet .section-description,.background--violet p{color:#5b2b72}.background--violet .feature__title,.background--violet .section-title{color:#2f163b}.background--violet .feature__title:after,.background--violet .section-title:after{background:#bfe6ec}.background--photo,.header{position:relative;background:url(../img/hero-berlin-8f1441b4f1.jpg) no-repeat top center;background-size:cover}.background--photo:before,.header:before{content:'';width:100%;height:100%;position:absolute;left:0;top:0;bottom:0;right:0;background:-webkit-gradient(linear,left top,right bottom,from(#074354),to(#101a25));background:linear-gradient(to bottom right,#074354 0,#101a25 100%);opacity:.7;z-index:0}.background--photo .row,.header .row{z-index:1}.background--photo .row *,.header .row *{position:relative;z-index:5}.background--photo .section-title:after,.header .section-title:after{background:rgba(191,230,236,.5)}.background--photo .header__title,.background--photo .section-description,.background--photo .section-title,.header .header__title,.header .section-description,.header .section-title{color:#fff}.form-control,.icon--social,.logo-erdf,.menu__hiring .icon,.menu__logo svg,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field,.select2-container--bigchaindb .select2-selection--multiple,.select2-container--bigchaindb .select2-selection--single,.transition{-webkit-transition:all .2s ease-out;transition:all .2s ease-out}.fade{-webkit-transition:all .2s ease-out;transition:all .2s ease-out;opacity:0}.fade.in{opacity:1}.animation-fade-in{-webkit-animation:fade-in .2s ease-out;animation:fade-in .2s ease-out}.animation-fade-in.paused{-webkit-animation-play-state:paused;animation-play-state:paused}@-webkit-keyframes fade-in{0%{opacity:0}100%{opacity:1}}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.animation-slide-in-from-bottom,.is-ready .testimonial,.wf-active .header__label,.wf-active .header__logo,.wf-active .header__tagline,.wf-active .header__title,.wf-inactive .header__label,.wf-inactive .header__logo,.wf-inactive .header__tagline,.wf-inactive .header__title{-webkit-animation:slide-in-from-bottom .7s cubic-bezier(0,1.02,.32,1.34);animation:slide-in-from-bottom .7s cubic-bezier(0,1.02,.32,1.34)}.animation-slide-in-from-bottom.paused,.is-ready .paused.testimonial,.wf-active .paused.header__label,.wf-active .paused.header__logo,.wf-active .paused.header__tagline,.wf-active .paused.header__title,.wf-inactive .paused.header__label,.wf-inactive .paused.header__logo,.wf-inactive .paused.header__tagline,.wf-inactive .paused.header__title{-webkit-animation-play-state:paused;animation-play-state:paused}@-webkit-keyframes slide-in-from-bottom{0%{opacity:0;-webkit-transform:translateY(50px);transform:translateY(50px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slide-in-from-bottom{0%{opacity:0;-webkit-transform:translateY(50px);transform:translateY(50px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}html{font-size:18px;-webkit-tap-highlight-color:rgba(16,26,37,0)}@media (min-width:85em){html{font-size:20px}}body{margin:0;font-family:europa,"Avenir Next",Avenir,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#cad2da;background-color:#445261;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-font-feature-settings:'kern' 1,'liga' 1,'calt' 1,'pnum' 1,'tnum' 0,'onum' 0,'lnum' 0,'dlig' 1;font-feature-settings:'kern' 1,'liga' 1,'calt' 1,'pnum' 1,'tnum' 0,'onum' 0,'lnum' 0,'dlig' 1}.content .row,.header .row,.hero .row,.section .row{-webkit-transition:all .2s ease-out;transition:all .2s ease-out}.wf-loading .content .row,.wf-loading .header .row,.wf-loading .hero .row,.wf-loading .section .row{opacity:0}.wf-active .content .row,.wf-active .header .row,.wf-active .hero .row,.wf-active .section .row,.wf-inactive .content .row,.wf-inactive .header .row,.wf-inactive .hero .row,.wf-inactive .section .row{opacity:1}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{-webkit-transition:all .2s ease-out;transition:all .2s ease-out;color:inherit;text-decoration:none;-webkit-box-shadow:inset 0 -2px 0 #39ba91;box-shadow:inset 0 -2px 0 #39ba91}a:focus,a:hover{color:#fff;background:rgba(57,186,145,.8);outline:0}.content--page [rel=external]:not(.btn):not(.driver):not(.social-link):not(.team__social__link):after,.content--page [target='_blank']:not(.btn):not(.driver):not(.social-link):not(.team__social__link):after,.dropdown [rel=external]:not(.btn):not(.driver):not(.social-link):not(.team__social__link):after,.dropdown [target='_blank']:not(.btn):not(.driver):not(.social-link):not(.team__social__link):after{content:'';display:inline-block;width:9px;height:8px;background:url(../img/icon-arrowout-11a56f4697.svg) no-repeat center center;background-size:contain;-webkit-transition:.15s ease-out;transition:.15s ease-out;margin-left:.125rem}#markdown-toc:before,.content--usecase>.row>h2,.content__about__title,.docs__title,.driver__title,.feature__title,.featuredusecase__title,.h1,.h2,.h3,.h4,.h5,.h6,.newsletter__title,.pretitle,.section--industry .section-title,.section--servicesintro h2,.section-header--guide .section-description h2,.section-intro__main h3,.section-nav:before,.section-title,.team__name,.timeline__entry__title,.toc:before,h1,h2,h3,h4,h5,h6{font-family:inherit;line-height:1.2;color:#bfe6ec;-webkit-font-feature-settings:'kern' 1,'liga' 1,'calt' 1,'pnum' 1,'tnum' 0,'onum' 0,'lnum' 0,'dlig' 1;font-feature-settings:'kern' 1,'liga' 1,'calt' 1,'pnum' 1,'tnum' 0,'onum' 0,'lnum' 0,'dlig' 1}.section--servicesintro .wf-loading h2,.section-header--guide .section-description .wf-loading h2,.section-intro__main .wf-loading h3,.wf-loading #markdown-toc:before,.wf-loading .content--usecase>.row>h2,.wf-loading .content__about__title,.wf-loading .docs__title,.wf-loading .driver__title,.wf-loading .feature__title,.wf-loading .featuredusecase__title,.wf-loading .h1,.wf-loading .h2,.wf-loading .h3,.wf-loading .h4,.wf-loading .h5,.wf-loading .h6,.wf-loading .newsletter__title,.wf-loading .pretitle,.wf-loading .section--servicesintro h2,.wf-loading .section-header--guide .section-description h2,.wf-loading .section-intro__main h3,.wf-loading .section-nav:before,.wf-loading .section-title,.wf-loading .team__name,.wf-loading .timeline__entry__title,.wf-loading .toc:before,.wf-loading h1,.wf-loading h2,.wf-loading h3,.wf-loading h4,.wf-loading h5,.wf-loading h6{font-weight:400}#markdown-toc:before,.content--usecase>.row>h2,.content__about__title,.docs__title,.driver__title,.feature__title,.featuredusecase__title,.h1,.h2,.h3,.h4,.h5,.h6,.newsletter__title,.pretitle,.section--industry .section-title,.section--servicesintro .wf-active h2,.section--servicesintro .wf-inactive h2,.section--servicesintro h2,.section-header--guide .section-description .wf-active h2,.section-header--guide .section-description .wf-inactive h2,.section-header--guide .section-description h2,.section-intro__main .wf-active h3,.section-intro__main .wf-inactive h3,.section-intro__main h3,.section-nav:before,.section-title,.team__name,.timeline__entry__title,.toc:before,.wf-active #markdown-toc:before,.wf-active .content--usecase>.row>h2,.wf-active .content__about__title,.wf-active .docs__title,.wf-active .driver__title,.wf-active .feature__title,.wf-active .featuredusecase__title,.wf-active .h1,.wf-active .h2,.wf-active .h3,.wf-active .h4,.wf-active .h5,.wf-active .h6,.wf-active .newsletter__title,.wf-active .pretitle,.wf-active .section--servicesintro h2,.wf-active .section-header--guide .section-description h2,.wf-active .section-intro__main h3,.wf-active .section-nav:before,.wf-active .section-title,.wf-active .team__name,.wf-active .timeline__entry__title,.wf-active .toc:before,.wf-active h1,.wf-active h2,.wf-active h3,.wf-active h4,.wf-active h5,.wf-active h6,.wf-inactive #markdown-toc:before,.wf-inactive .content--usecase>.row>h2,.wf-inactive .content__about__title,.wf-inactive .docs__title,.wf-inactive .driver__title,.wf-inactive .feature__title,.wf-inactive .featuredusecase__title,.wf-inactive .h1,.wf-inactive .h2,.wf-inactive .h3,.wf-inactive .h4,.wf-inactive .h5,.wf-inactive .h6,.wf-inactive .newsletter__title,.wf-inactive .pretitle,.wf-inactive .section--servicesintro h2,.wf-inactive .section-header--guide .section-description h2,.wf-inactive .section-intro__main h3,.wf-inactive .section-nav:before,.wf-inactive .section-title,.wf-inactive .team__name,.wf-inactive .timeline__entry__title,.wf-inactive .toc:before,.wf-inactive h1,.wf-inactive h2,.wf-inactive h3,.wf-inactive h4,.wf-inactive h5,.wf-inactive h6,h1,h2,h3,h4,h5,h6{font-weight:300}.content--usecase>.row>h2,.featuredusecase__title,.h1,.h2,.h3,.section--industry .section-title,.section--servicesintro h2,.section-title,h1,h2,h3{margin-top:2rem;margin-bottom:2rem}#markdown-toc:before,.content__about__title,.docs__title,.driver__title,.feature__title,.h4,.h5,.h6,.newsletter__title,.pretitle,.section-header--guide .section-description h2,.section-intro__main h3,.section-nav:before,.team__name,.timeline__entry__title,.toc:before,h4,h5,h6{margin-top:1rem;margin-bottom:1rem}#markdown-toc:before,.docs__title,.driver__title,.feature__title,.h5,.h6,.newsletter__title,.pretitle,.section-header--guide .section-description .wf-active h2,.section-header--guide .section-description .wf-inactive h2,.section-header--guide .section-description h2,.section-intro__main .wf-active h3,.section-intro__main .wf-inactive h3,.section-intro__main h3,.section-nav:before,.team__name,.toc:before,.wf-active #markdown-toc:before,.wf-active .docs__title,.wf-active .driver__title,.wf-active .feature__title,.wf-active .h5,.wf-active .h6,.wf-active .newsletter__title,.wf-active .pretitle,.wf-active .section-header--guide .section-description h2,.wf-active .section-intro__main h3,.wf-active .section-nav:before,.wf-active .team__name,.wf-active .toc:before,.wf-active h5,.wf-active h6,.wf-inactive #markdown-toc:before,.wf-inactive .docs__title,.wf-inactive .driver__title,.wf-inactive .feature__title,.wf-inactive .h5,.wf-inactive .h6,.wf-inactive .newsletter__title,.wf-inactive .pretitle,.wf-inactive .section-header--guide .section-description h2,.wf-inactive .section-intro__main h3,.wf-inactive .section-nav:before,.wf-inactive .team__name,.wf-inactive .toc:before,.wf-inactive h5,.wf-inactive h6,h5,h6{font-weight:400}.h1,h1{font-size:2.7rem}.h2,.section--industry .section-title,.section-title,h2{font-size:2.3rem}.content--usecase>.row>h2,.featuredusecase__title,.h3,.section--servicesintro h2,h3{font-size:1.8rem}.content__about__title,.h4,.timeline__entry__title,h4{font-size:1.45rem}#markdown-toc:before,.docs__title,.driver__title,.feature__title,.h5,.newsletter__title,.section-header--guide .section-description h2,.section-nav:before,.team__name,.toc:before,h5{font-size:1.2rem}.h6,.pretitle,.section-intro__main h3,h6{font-size:1rem}p{margin:0 0 1rem}.alert,.menu--footer .menu__link,.menu__hiring,.small,.testimonial__cite,.timeline__entry__time,cite,small{font-size:.85rem;font-weight:400}.footer__copyright,.footer__copyright .menu__link,.footer__copyright small,.mini{font-size:.65rem;font-weight:400}.content--usecase .testimonial,.large,.section--servicestestimonial .testimonial{font-size:120%}.bold,.section--newsletter .form-control-feedback,.strong,cite,strong{font-weight:600}.italic,em{font-style:italic}.light{font-weight:300}.text-left{text-align:left}.text-right{text-align:right}.nav-link,.section-intro__main,.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.lead{font-size:1.2rem;color:#bfe6ec;line-height:1.33333}.pretitle{display:block;margin:0;margin-bottom:1rem;color:#cad2da;opacity:.6}ol,ul{margin-top:1rem;margin-bottom:1rem;padding-left:2rem}ol li,ul li{padding-left:.5rem}ol ol,ol ul,ul ol,ul ul{margin-top:.5rem;margin-bottom:0}ul li{list-style-type:circle}.list-unstyled,.nav-tabs,.parsley-errors-list{padding-left:0;margin:0}.list-unstyled li,.nav-tabs li,.parsley-errors-list li{list-style:none;margin-bottom:0;padding-left:0}.list-inline{padding-left:0;margin:0;margin-left:-5px}.list-inline li{list-style:none;margin-bottom:0;padding-left:0}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}blockquote{border-left:3px solid #9dabba;margin-left:0;margin-top:1rem;margin-bottom:1rem;padding:.5rem 1rem;font-style:italic}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}cite{font-style:normal}address{margin-bottom:1rem;font-style:normal;line-height:1.5}.trademark{top:-.45em;left:-.15em;margin-right:-.2em;opacity:.6;font-family:inherit;font-size:60%}::-moz-selection{color:#fff;background:#074354}::selection{color:#fff;background:#074354}.table{border-spacing:0;border-collapse:collapse;width:100%;max-width:100%;margin-top:1rem;margin-bottom:1rem;word-break:normal}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #9dabba}.table thead th{color:#bfe6ec;font-weight:400;vertical-align:bottom;border-bottom:2px solid #9dabba}.table tbody+tbody{border-top:2px solid #9dabba}.table .table{background-color:#445261}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #9dabba}.table-bordered td,.table-bordered th{border:1px solid #9dabba}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:#394552}.table-responsive{display:block;width:100%;min-height:.01%;overflow-x:auto;-webkit-overflow-scrolling:touch}.loader{border-radius:50%;width:1rem;height:1rem;font-size:1rem;text-indent:-9999rem;border-top:2px solid rgba(255,255,255,.2);border-right:2px solid rgba(255,255,255,.2);border-bottom:2px solid rgba(255,255,255,.2);border-left:2px solid #fff;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:spin 1.1s infinite linear;animation:spin 1.1s infinite linear;display:inline-block}.loader--dark{border-top-color:rgba(7,67,84,.2);border-right-color:rgba(7,67,84,.2);border-bottom-color:rgba(7,67,84,.2);border-left-color:#074354}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.btn{-webkit-transition:all .2s ease-out;transition:all .2s ease-out;display:inline-block;font-family:inherit;font-weight:600;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:0;-webkit-box-shadow:none;box-shadow:none;padding:.5rem 2rem;font-size:1rem;line-height:1.5;border-radius:.15rem}.btn:focus,.btn:hover{-webkit-box-shadow:0 1px 4px rgba(16,26,37,.4);box-shadow:0 1px 4px rgba(16,26,37,.4);-webkit-transform:translateY(-1px);transform:translateY(-1px)}.btn.active,.btn:active{background-image:none;outline:0;-webkit-transform:translateY(0);transform:translateY(0);-webkit-box-shadow:0 1px 2px rgba(16,26,37,.3);box-shadow:0 1px 2px rgba(16,26,37,.3)}.btn.disabled,.btn:disabled{opacity:.45;-webkit-box-shadow:none;box-shadow:none;cursor:not-allowed;pointer-events:none}.btn .icon{width:1rem;height:1rem;margin-right:.25rem;margin-bottom:-1px}.btn .loader{margin-bottom:-.2rem}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary,.page-newsletter .section--newsletter .btn{color:#074354!important;background:#39ba91}.btn-primary:focus,.btn-primary:hover,.page-newsletter .section--newsletter .btn:focus,.page-newsletter .section--newsletter .btn:hover{color:#074354!important;background-color:#46c69e}.btn-primary:active,.page-newsletter .section--newsletter .btn:active{color:#074354!important;background:#37b28b;-webkit-transition:none;transition:none}.btn-primary.disabled:focus,.btn-primary:disabled:focus,.page-newsletter .section--newsletter .btn:disabled:focus,.page-newsletter .section--newsletter .disabled.btn:focus{background-color:#39ba91}.btn-primary .icon,.page-newsletter .section--newsletter .btn .icon{fill:#074354}.btn-secondary{color:#074354!important;background:#9dabba}.btn-secondary:focus,.btn-secondary:hover{color:#074354!important;background-color:#acb8c5}.btn-secondary:active{color:#074354!important;background:#97a6b6;-webkit-transition:none;transition:none}.btn-secondary.disabled:focus,.btn-secondary:disabled:focus{background-color:#9dabba}.btn-secondary .icon{fill:#074354}.btn-blue{color:#bfe6ec!important;background:#074354}.btn-blue:focus,.btn-blue:hover{color:#bfe6ec!important;background-color:#09566c}.btn-blue:active{color:#bfe6ec!important;background:#063b4b;-webkit-transition:none;transition:none}.btn-blue.disabled:focus,.btn-blue:disabled:focus{background-color:#074354}.btn-blue .icon{fill:#bfe6ec}.btn-blue-light{color:#074354!important;background:#bfe6ec}.btn-blue-light:focus,.btn-blue-light:hover{color:#074354!important;background-color:#d3eef2}.btn-blue-light:active{color:#074354!important;background:#b7e3ea;-webkit-transition:none;transition:none}.btn-blue-light.disabled:focus,.btn-blue-light:disabled:focus{background-color:#bfe6ec}.btn-blue-light .icon{fill:#074354}.btn-violet{color:#3d1d4d!important;background:#b581cf}.btn-violet:focus,.btn-violet:hover{color:#3d1d4d!important;background-color:#c093d6}.btn-violet:active{color:#3d1d4d!important;background:#b17acc;-webkit-transition:none;transition:none}.btn-violet.disabled:focus,.btn-violet:disabled:focus{background-color:#b581cf}.btn-violet .icon{fill:#3d1d4d}.btn-info{color:#fff!important;background:#3e91ce}.btn-info:focus,.btn-info:hover{color:#fff!important;background-color:#529dd3}.btn-info:active{color:#fff!important;background:#368ccc;-webkit-transition:none;transition:none}.btn-info.disabled:focus,.btn-info:disabled:focus{background-color:#3e91ce}.btn-info .icon{fill:#fff}.btn-success{color:#fff!important;background:#388250}.btn-success:focus,.btn-success:hover{color:#fff!important;background-color:#40945b}.btn-success:active{color:#fff!important;background:#357b4c;-webkit-transition:none;transition:none}.btn-success.disabled:focus,.btn-success:disabled:focus{background-color:#388250}.btn-success .icon{fill:#fff}.btn-warning{color:#fff!important;background:#8e8e24}.btn-warning:focus,.btn-warning:hover{color:#fff!important;background-color:#a2a229}.btn-warning:active{color:#fff!important;background:#868622;-webkit-transition:none;transition:none}.btn-warning.disabled:focus,.btn-warning:disabled:focus{background-color:#8e8e24}.btn-warning .icon{fill:#fff}.btn-danger{color:#fff!important;background:#c9726a}.btn-danger:focus,.btn-danger:hover{color:#fff!important;background-color:#d0847d}.btn-danger:active{color:#fff!important;background:#c66b63;-webkit-transition:none;transition:none}.btn-danger.disabled:focus,.btn-danger:disabled:focus{background-color:#c9726a}.btn-danger .icon{fill:#fff}.btn-link{font-weight:400;color:inherit;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent;-webkit-box-shadow:none;box-shadow:none;background:0 0}.btn-lg{padding:1rem 3rem;font-size:1.2rem;line-height:1.33333;border-radius:.2rem}.btn-lg .icon{width:1.2rem;height:1.2rem}.btn-sm{padding:.4rem 1.25rem;font-size:.85rem;line-height:1.3;border-radius:.1rem}.btn-sm .icon{width:.85rem;height:.85rem}.btn-xs{padding:.15rem .75rem;font-size:.65rem;line-height:1.2;border-radius:.1rem}.btn-xs .icon{width:.65rem;height:.65rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.form{padding:1rem;background:#394552;border-radius:.15rem;margin-bottom:1rem}@media (min-width:40em){.form{padding:1.5rem 2.5rem}}.form-control,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field,.select2-container--bigchaindb .select2-selection--multiple,.select2-container--bigchaindb .select2-selection--single{display:block;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:.5rem 0;font-family:inherit;font-weight:400;font-size:1rem;color:#cad2da;background:0 0;border:none;border-bottom:2px solid #9dabba;border-radius:0}.form-control:focus,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:focus,.select2-container--bigchaindb .select2-selection--multiple:focus,.select2-container--bigchaindb .select2-selection--single:focus{outline:0;border-color:#cad2da}.form-control::-webkit-input-placeholder,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field::-webkit-input-placeholder,.select2-container--bigchaindb .select2-selection--multiple::-webkit-input-placeholder,.select2-container--bigchaindb .select2-selection--single::-webkit-input-placeholder{color:#9dabba;opacity:1}.form-control::-moz-placeholder,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field::-moz-placeholder,.select2-container--bigchaindb .select2-selection--multiple::-moz-placeholder,.select2-container--bigchaindb .select2-selection--single::-moz-placeholder{color:#9dabba;opacity:1}.form-control:-ms-input-placeholder,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:-ms-input-placeholder,.select2-container--bigchaindb .select2-selection--multiple:-ms-input-placeholder,.select2-container--bigchaindb .select2-selection--single:-ms-input-placeholder{color:#9dabba;opacity:1}.form-control::-ms-input-placeholder,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field::-ms-input-placeholder,.select2-container--bigchaindb .select2-selection--multiple::-ms-input-placeholder,.select2-container--bigchaindb .select2-selection--single::-ms-input-placeholder{color:#9dabba;opacity:1}.form-control::placeholder,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field::placeholder,.select2-container--bigchaindb .select2-selection--multiple::placeholder,.select2-container--bigchaindb .select2-selection--single::placeholder{color:#9dabba;opacity:1}.form-control:disabled,.form-control[readonly],.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:disabled,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field[readonly],.select2-container--bigchaindb .select2-selection--multiple:disabled,.select2-container--bigchaindb .select2-selection--multiple[readonly],.select2-container--bigchaindb .select2-selection--single:disabled,.select2-container--bigchaindb .select2-selection--single[readonly]{background-color:#394552;opacity:1}.form-control:disabled,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:disabled,.select2-container--bigchaindb .select2-selection--multiple:disabled,.select2-container--bigchaindb .select2-selection--single:disabled{cursor:disabled}.form-control:required+.form-label:after,.form-control:required+.select2-container--bigchaindb+.form-label:after,.form-control[required]+.form-label:after,.form-control[required]+.select2-container--bigchaindb+.form-label:after,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:required+.form-label:after,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:required+.select2-container--bigchaindb+.form-label:after,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field[required]+.form-label:after,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field[required]+.select2-container--bigchaindb+.form-label:after,.select2-container--bigchaindb .select2-selection--multiple:required+.form-label:after,.select2-container--bigchaindb .select2-selection--multiple:required+.select2-container--bigchaindb+.form-label:after,.select2-container--bigchaindb .select2-selection--multiple[required]+.form-label:after,.select2-container--bigchaindb .select2-selection--multiple[required]+.select2-container--bigchaindb+.form-label:after,.select2-container--bigchaindb .select2-selection--single:required+.form-label:after,.select2-container--bigchaindb .select2-selection--single:required+.select2-container--bigchaindb+.form-label:after,.select2-container--bigchaindb .select2-selection--single[required]+.form-label:after,.select2-container--bigchaindb .select2-selection--single[required]+.select2-container--bigchaindb+.form-label:after{content:'*'}.form-control.parsley-success~.form-label,.form-control:focus~.form-label,.form-control:invalid:not(.is-empty)~.form-label,.form-control:valid:not(.is-empty)~.form-label,.select2-container--bigchaindb .parsley-success.select2-selection--multiple~.form-label,.select2-container--bigchaindb .parsley-success.select2-selection--single~.form-label,.select2-container--bigchaindb .select2-search--dropdown .parsley-success.select2-search__field~.form-label,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:focus~.form-label,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:invalid:not(.is-empty)~.form-label,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:valid:not(.is-empty)~.form-label,.select2-container--bigchaindb .select2-selection--multiple:focus~.form-label,.select2-container--bigchaindb .select2-selection--multiple:invalid:not(.is-empty)~.form-label,.select2-container--bigchaindb .select2-selection--multiple:valid:not(.is-empty)~.form-label,.select2-container--bigchaindb .select2-selection--single:focus~.form-label,.select2-container--bigchaindb .select2-selection--single:invalid:not(.is-empty)~.form-label,.select2-container--bigchaindb .select2-selection--single:valid:not(.is-empty)~.form-label{-webkit-transform:translate3d(0,-1.5rem,0) scale(.7);transform:translate3d(0,-1.5rem,0) scale(.7);color:#cad2da}.form-control.parsley-success,.form-control.parsley-success:focus,.form-control:valid:not(.is-empty):not(select),.form-control:valid:not(.is-empty):not(select):focus,.select2-container--bigchaindb .parsley-success.select2-selection--multiple,.select2-container--bigchaindb .parsley-success.select2-selection--multiple:focus,.select2-container--bigchaindb .parsley-success.select2-selection--single,.select2-container--bigchaindb .parsley-success.select2-selection--single:focus,.select2-container--bigchaindb .select2-search--dropdown .parsley-success.select2-search__field,.select2-container--bigchaindb .select2-search--dropdown .parsley-success.select2-search__field:focus,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:valid:not(.is-empty):not(select),.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:valid:not(.is-empty):not(select):focus,.select2-container--bigchaindb .select2-selection--multiple:valid:not(.is-empty):not(select),.select2-container--bigchaindb .select2-selection--multiple:valid:not(.is-empty):not(select):focus,.select2-container--bigchaindb .select2-selection--single:valid:not(.is-empty):not(select),.select2-container--bigchaindb .select2-selection--single:valid:not(.is-empty):not(select):focus{border-color:#388250}.form-control.parsley-error,.form-control.parsley-error:focus,.form-control:invalid:not(.is-empty),.form-control:invalid:not(.is-empty):focus,.select2-container--bigchaindb .parsley-error.select2-selection--multiple,.select2-container--bigchaindb .parsley-error.select2-selection--multiple:focus,.select2-container--bigchaindb .parsley-error.select2-selection--single,.select2-container--bigchaindb .parsley-error.select2-selection--single:focus,.select2-container--bigchaindb .select2-search--dropdown .parsley-error.select2-search__field,.select2-container--bigchaindb .select2-search--dropdown .parsley-error.select2-search__field:focus,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:invalid:not(.is-empty),.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:invalid:not(.is-empty):focus,.select2-container--bigchaindb .select2-selection--multiple:invalid:not(.is-empty),.select2-container--bigchaindb .select2-selection--multiple:invalid:not(.is-empty):focus,.select2-container--bigchaindb .select2-selection--single:invalid:not(.is-empty),.select2-container--bigchaindb .select2-selection--single:invalid:not(.is-empty):focus{border-color:#c9726a;color:#c9726a}.background--photo .form-control,.background--photo .select2-container--bigchaindb .select2-search--dropdown .select2-search__field,.background--photo .select2-container--bigchaindb .select2-selection--multiple,.background--photo .select2-container--bigchaindb .select2-selection--single,.header .form-control,.header .select2-container--bigchaindb .select2-search--dropdown .select2-search__field,.header .select2-container--bigchaindb .select2-selection--multiple,.header .select2-container--bigchaindb .select2-selection--single,.select2-container--bigchaindb .background--photo .select2-selection--multiple,.select2-container--bigchaindb .background--photo .select2-selection--single,.select2-container--bigchaindb .header .select2-selection--multiple,.select2-container--bigchaindb .header .select2-selection--single,.select2-container--bigchaindb .select2-search--dropdown .background--photo .select2-search__field,.select2-container--bigchaindb .select2-search--dropdown .header .select2-search__field{border-bottom-color:rgba(255,255,255,.5)}.form-control--sm{padding:.5rem 0;font-size:.85rem}.form-control:required+.form-label:after,.form-control:required+.select2-container--bigchaindb+.form-label:after,.form-control[required]+.form-label:after,.form-control[required]+.select2-container--bigchaindb+.form-label:after,.required,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:required+.form-label:after,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field:required+.select2-container--bigchaindb+.form-label:after,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field[required]+.form-label:after,.select2-container--bigchaindb .select2-search--dropdown .select2-search__field[required]+.select2-container--bigchaindb+.form-label:after,.select2-container--bigchaindb .select2-selection--multiple:required+.form-label:after,.select2-container--bigchaindb .select2-selection--multiple:required+.select2-container--bigchaindb+.form-label:after,.select2-container--bigchaindb .select2-selection--multiple[required]+.form-label:after,.select2-container--bigchaindb .select2-selection--multiple[required]+.select2-container--bigchaindb+.form-label:after,.select2-container--bigchaindb .select2-selection--single:required+.form-label:after,.select2-container--bigchaindb .select2-selection--single:required+.select2-container--bigchaindb+.form-label:after,.select2-container--bigchaindb .select2-selection--single[required]+.form-label:after,.select2-container--bigchaindb .select2-selection--single[required]+.select2-container--bigchaindb+.form-label:after{color:#b581cf;padding-left:.1rem;padding-right:.1rem}.form-label{position:absolute;top:.5rem;left:0;right:0;-webkit-transition:.15s ease-out;transition:.15s ease-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:text;font-family:inherit;font-weight:400;font-size:1rem;line-height:1.5;color:#9dabba;-webkit-transform-origin:left;transform-origin:left}select+.form-label{visibility:hidden}.background--photo .form-label,.header .form-label{color:rgba(255,255,255,.5)}.form-group{margin-bottom:1rem;position:relative;margin-top:1rem}.form-group:last-of-type .btn{margin-top:1rem}.select2-container--bigchaindb .select2-search--dropdown textarea.select2-search__field,.select2-container--bigchaindb textarea.select2-selection--multiple,.select2-container--bigchaindb textarea.select2-selection--single,textarea.form-control{resize:none;-webkit-box-sizing:content-box;box-sizing:content-box}.select2-container--bigchaindb .select2-search--dropdown select.select2-search__field,.select2-container--bigchaindb select.select2-selection--multiple,.select2-container--bigchaindb select.select2-selection--single,select.form-control{color:#9dabba;font-weight:400}.select2-container--bigchaindb .select2-search--dropdown select.select2-search__field:focus::-ms-value,.select2-container--bigchaindb select.select2-selection--multiple:focus::-ms-value,.select2-container--bigchaindb select.select2-selection--single:focus::-ms-value,select.form-control:focus::-ms-value{color:#cad2da;background-color:transparent}.checkbox,.radio{position:relative;display:block;margin-bottom:.75rem}.checkbox label,.radio label{padding-left:1.75rem;margin-bottom:0;cursor:pointer}.checkbox label input:only-child,.radio label input:only-child{position:static}.checkbox.disabled label,.radio.disabled label{cursor:not-allowed}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-bottom:-.25rem;margin-left:-1.75rem;margin-right:.25rem;-webkit-appearance:button;-moz-appearance:button;appearance:button;background:0 0;width:1.3rem;height:1.3rem;border-radius:.15rem;border:2px solid #9dabba;outline:0}.checkbox input[type=checkbox]:focus,.checkbox-inline input[type=checkbox]:focus,.radio input[type=radio]:focus,.radio-inline input[type=radio]:focus{border-color:#cad2da}.checkbox input[type=checkbox]:checked,.checkbox-inline input[type=checkbox]:checked,.radio input[type=radio]:checked,.radio-inline input[type=radio]:checked{background:#39ba91;border-color:#cad2da}.radio input[type=radio],.radio-inline input[type=radio]{border-radius:50%}.checkbox+.checkbox,.radio+.radio{margin-top:-.25rem}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:1.25rem;margin-bottom:0;vertical-align:middle;cursor:pointer}.checkbox-inline.disabled,.radio-inline.disabled{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:.75rem}input[type=checkbox].disabled,input[type=checkbox]:disabled,input[type=radio].disabled,input[type=radio]:disabled{cursor:not-allowed}.form-group,.input-group{position:relative}.parsley-errors-list{position:absolute;right:0;bottom:1.2rem;font-size:.65rem}.parsley-errors-list,.parsley-errors-list li{color:#c9726a}.parsley-errors-list.filled{-webkit-animation:errors-list-show .2s cubic-bezier(0,1.02,.32,1.34) forwards;animation:errors-list-show .2s cubic-bezier(0,1.02,.32,1.34) forwards}@-webkit-keyframes errors-list-show{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(0,1.1rem,0);transform:translate3d(0,1.1rem,0)}}@keyframes errors-list-show{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(0,1.1rem,0);transform:translate3d(0,1.1rem,0)}}.form__gdpr{opacity:.7;font-size:.85rem;position:relative;margin-top:2rem}.form__gdpr .icon{stroke:#fff;color:#fff;stroke-width:1.5;opacity:.5;width:1.5rem;height:1.5rem;position:absolute;left:-.25rem;top:.25rem}.form__gdpr .text{margin-left:2rem}.form__gdpr a{-webkit-box-shadow:inset 0 -1px 0 rgba(57,186,145,.5);box-shadow:inset 0 -1px 0 rgba(57,186,145,.5)}.input-group{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.input-group .form-control,.input-group .select2-container--bigchaindb .select2-search--dropdown .select2-search__field,.input-group .select2-container--bigchaindb .select2-selection--multiple,.input-group .select2-container--bigchaindb .select2-selection--single,.select2-container--bigchaindb .input-group .select2-selection--multiple,.select2-container--bigchaindb .input-group .select2-selection--single,.select2-container--bigchaindb .select2-search--dropdown .input-group .select2-search__field{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-bottom:0}.input-group .form-control:not(:first-child):not(:last-child),.input-group .select2-container--bigchaindb .select2-search--dropdown .select2-search__field:not(:first-child):not(:last-child),.input-group .select2-container--bigchaindb .select2-selection--multiple:not(:first-child):not(:last-child),.input-group .select2-container--bigchaindb .select2-selection--single:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.select2-container--bigchaindb .input-group .select2-selection--multiple:not(:first-child):not(:last-child),.select2-container--bigchaindb .input-group .select2-selection--single:not(:first-child):not(:last-child),.select2-container--bigchaindb .select2-search--dropdown .input-group .select2-search__field:not(:first-child):not(:last-child){border-radius:0}.input-group-btn{white-space:nowrap;vertical-align:middle;position:relative;font-size:0}.form-group:last-of-type .input-group-btn>.btn,.input-group-btn>.btn{margin-top:0}.input-group .form-control:not(:last-child),.input-group .select2-container--bigchaindb .select2-search--dropdown .select2-search__field:not(:last-child),.input-group .select2-container--bigchaindb .select2-selection--multiple:not(:last-child),.input-group .select2-container--bigchaindb .select2-selection--single:not(:last-child),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle,.select2-container--bigchaindb .input-group .select2-selection--multiple:not(:last-child),.select2-container--bigchaindb .input-group .select2-selection--single:not(:last-child),.select2-container--bigchaindb .select2-search--dropdown .input-group .select2-search__field:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group .form-control:not(:first-child),.input-group .select2-container--bigchaindb .select2-search--dropdown .select2-search__field:not(:first-child),.input-group .select2-container--bigchaindb .select2-selection--multiple:not(:first-child),.input-group .select2-container--bigchaindb .select2-selection--single:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn,.input-group-btn:not(:last-child)>.btn:not(:first-child),.select2-container--bigchaindb .input-group .select2-selection--multiple:not(:first-child),.select2-container--bigchaindb .input-group .select2-selection--single:not(:first-child),.select2-container--bigchaindb .select2-search--dropdown .input-group .select2-search__field:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.select2-container{-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:block;height:28px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{-webkit-box-sizing:border-box;box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;-webkit-box-shadow:none;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:.15rem;outline:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#fff),to(#eee));background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:.15rem;border-bottom-right-radius:.15rem;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(#ccc));background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:.15rem;border-bottom-left-radius:.15rem;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,from(white),color-stop(50%,#eee));background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(white));background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:.15rem;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:.15rem;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;-webkit-box-shadow:none;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--bigchaindb{max-width:100%}.select2-container--bigchaindb .select2-selection--single{height:auto}.select2-container--bigchaindb .select2-selection--single .select2-selection__rendered{color:#cad2da;padding-left:0}.select2-container--bigchaindb .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:600}.select2-container--bigchaindb .select2-selection--single .select2-selection__placeholder{color:#9dabba}.select2-container--bigchaindb .select2-selection--single .select2-selection__arrow{position:absolute;right:.15em;top:0;bottom:0;margin:auto;height:1.25rem;width:2em;color:#9dabba}.select2-container--bigchaindb .select2-selection--single .select2-selection__arrow:after,.select2-container--bigchaindb .select2-selection--single .select2-selection__arrow:before{content:'';display:block;position:absolute;margin:auto;right:0;height:0;width:0;border:.263em solid transparent}.select2-container--bigchaindb .select2-selection--single .select2-selection__arrow:before{top:0;border-bottom-color:inherit}.select2-container--bigchaindb .select2-selection--single .select2-selection__arrow:after{bottom:0;border-top-color:inherit}.select2-container--bigchaindb .select2-selection--single .select2-selection__arrow b{display:none}.select2-container--bigchaindb[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--bigchaindb[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--bigchaindb.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--bigchaindb.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--bigchaindb .select2-selection--multiple{height:auto;cursor:text}.select2-container--bigchaindb .select2-selection--multiple .select2-selection__rendered{-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--bigchaindb .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--bigchaindb .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--bigchaindb .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:600;margin-top:5px;margin-right:10px}.select2-container--bigchaindb .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--bigchaindb .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:600;margin-right:2px}.select2-container--bigchaindb .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--bigchaindb[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--bigchaindb[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--bigchaindb[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--bigchaindb[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--bigchaindb[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--bigchaindb.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--bigchaindb.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--bigchaindb.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--bigchaindb .select2-dropdown{border-radius:.15rem;-webkit-box-shadow:0 3px 10px rgba(0,0,0,.3);box-shadow:0 3px 10px rgba(0,0,0,.3);background:#394552;color:#cad2da;font-family:inherit;font-size:.85rem;border:0}.select2-container--bigchaindb+.form-label{pointer-events:none}.select2-container--bigchaindb.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--bigchaindb.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--bigchaindb.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--bigchaindb.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--bigchaindb .select2-search--dropdown{padding:0}.select2-container--bigchaindb .select2-search--dropdown .select2-search__field{padding-left:1rem;padding-right:1rem;border-bottom:none!important;background:rgba(157,171,186,.2)}.select2-container--bigchaindb .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;-webkit-box-shadow:none;box-shadow:none;-webkit-appearance:textfield}.select2-container--bigchaindb .select2-results>.select2-results__options{max-height:20rem;overflow-y:auto;-webkit-overflow-scrolling:touch}@media (max-width:27rem),(max-height:27rem){.select2-container--bigchaindb .select2-results>.select2-results__options{max-height:11.25rem}}.select2-container--bigchaindb .select2-results__option{padding:.5rem 1rem .5rem 1rem;margin-bottom:0;display:block;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.select2-container--bigchaindb .select2-results__option[role=group]{padding:0;border-bottom:2px dashed #445261}.select2-container--bigchaindb .select2-results__option[aria-disabled=true]{color:#999}.select2-container--bigchaindb .select2-results__option[aria-selected=true]{background-color:transparent}.select2-container--bigchaindb .select2-results__option .select2-results__group{padding:6px;padding-bottom:0;cursor:default;display:block}.select2-container--bigchaindb .select2-results__option .select2-results__group:empty{display:none}.select2-container--bigchaindb .select2-results__option .select2-results__option{padding-left:1rem}.select2-container--bigchaindb .select2-results__option .select2-results__option .select2-results__option{margin-left:-1rem;padding-left:2rem}.select2-container--bigchaindb .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2rem;padding-left:3rem}.select2-container--bigchaindb .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3rem;padding-left:4rem}.select2-container--bigchaindb .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4rem;padding-left:5rem}.select2-container--bigchaindb .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5rem;padding-left:6rem}.select2-container--bigchaindb .select2-results__option--highlighted[aria-selected]{background-color:#39ba91;color:#074354}.logo{fill:#074354;color:#39ba91;width:300px;height:60px;display:block}.logo--white{fill:#fff;color:#fff}.logo--white--green{fill:#fff;color:#39ba91}.logo--dark{fill:#101a25}.logo--sm{width:140px;height:30px}.logo--full{display:block;width:100%;height:auto}.logo--services{color:#b581cf}.icon{fill:none;stroke:#39ba91;color:#bfe6ec;stroke-width:.75;stroke-linecap:round;stroke-linejoin:round;width:60px;height:60px}.icon--social{width:1rem;height:1rem;stroke:none;fill:#cad2da;margin-bottom:-2px}.icon--social.icon--gitter{stroke:#cad2da;stroke-width:2px}.icon--sm{width:.5rem;height:.5rem}.icon--gitter{stroke-width:1.5;fill:none;stroke:#cad2da}.icon--caret{stroke-width:2px;stroke:currentColor}.icon--external{stroke:currentColor}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}.grid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0}.grid__col{-webkit-box-flex:1;-ms-flex:1;flex:1;min-height:0;min-width:0}.row{max-width:calc(50em - 6rem);margin-left:auto;margin-right:auto;padding-left:1.5rem;padding-right:1.5rem}@media (min-width:40em){.row{padding-left:3rem;padding-right:3rem}}.header--developersguide>.row,.row--wide{max-width:70rem}.row--narrow{max-width:33.14286em}.grid--top{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.grid--bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.grid--center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.grid--justifycenter{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.grid__col--top{-ms-flex-item-align:start;align-self:flex-start}.grid__col--bottom{-ms-flex-item-align:end;align-self:flex-end}.grid__col--center{-ms-flex-item-align:center;align-self:center}.grid--gutters{margin:-3rem 0 3rem -3rem}.grid--gutters>.grid__col{padding:3rem 0 0 3rem}.grid--gutters--small{margin:-1rem 0 1rem -1rem}.grid--gutters--small>.grid__col{padding:1rem 0 0 1rem}@media (min-width:40em){.grid-small--gutters{margin:-3rem 0 3rem -3rem}.grid-small--gutters>.grid__col{padding:3rem 0 0 3rem}.grid-small--gutters--small{margin:-1rem 0 1rem -1rem}.grid-small--gutters--small>.grid__col{padding:1rem 0 0 1rem}}@media (min-width:58em){.grid-medium--gutters{margin:-3rem 0 3rem -3rem}.grid-medium--gutters>.grid__col{padding:3rem 0 0 3rem}.grid-medium--gutters--small{margin:-1rem 0 1rem -1rem}.grid-medium--gutters--small>.grid__col{padding:1rem 0 0 1rem}}@media (min-width:85em){.grid-large--gutters{margin:-3rem 0 3rem -3rem}.grid-large--gutters>.grid__col{padding:3rem 0 0 3rem}.grid-large--gutters--small{margin:-1rem 0 1rem -1rem}.grid-large--gutters--small>.grid__col{padding:1rem 0 0 1rem}}.grid--fit>.grid__col{-webkit-box-flex:1;-ms-flex:1;flex:1}.grid--full>.grid__col{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}.grid--third>.grid__col{-webkit-box-flex:0;-ms-flex:0 0 33.3%;flex:0 0 33.3%}.grid--half>.grid__col{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.grid--columns>.grid__col{max-width:none}.grid--columns>.grid__col.grid__col--1{-webkit-box-flex:0;-ms-flex:0 0 16%;flex:0 0 16%}.grid--columns>.grid__col.grid__col--2{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%}.grid--columns>.grid__col.grid__col--3{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%}.grid--columns>.grid__col.grid__col--4{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%}.grid--columns>.grid__col.grid__col--5{-webkit-box-flex:0;-ms-flex:0 0 84%;flex:0 0 84%}.grid--columns>.grid__col.grid__col--6{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}.grid--columns>.grid__col.grid__col--2-3{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%}.grid--columns>.grid__col.grid__col--1-3{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%}@media (min-width:40em){.grid-small--columns>.grid__col{max-width:none}.grid-small--columns>.grid__col.grid__col--1{-webkit-box-flex:0;-ms-flex:0 0 16%;flex:0 0 16%}.grid-small--columns>.grid__col.grid__col--2{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%}.grid-small--columns>.grid__col.grid__col--3{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%}.grid-small--columns>.grid__col.grid__col--4{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%}.grid-small--columns>.grid__col.grid__col--5{-webkit-box-flex:0;-ms-flex:0 0 84%;flex:0 0 84%}.grid-small--columns>.grid__col.grid__col--6{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}.grid-small--columns>.grid__col.grid__col--2-3{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%}.grid-small--columns>.grid__col.grid__col--1-3{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%}.grid-small--fit>.grid__col{-webkit-box-flex:1;-ms-flex:1;flex:1}.grid-small--full>.grid__col{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}.grid-small--third>.grid__col{-webkit-box-flex:0;-ms-flex:0 0 33.3%;flex:0 0 33.3%}.grid-small--half>.grid__col{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}}@media (min-width:58em){.grid-medium--columns>.grid__col{max-width:none}.grid-medium--columns>.grid__col.grid__col--1{-webkit-box-flex:0;-ms-flex:0 0 16%;flex:0 0 16%}.grid-medium--columns>.grid__col.grid__col--2{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%}.grid-medium--columns>.grid__col.grid__col--3{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%}.grid-medium--columns>.grid__col.grid__col--4{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%}.grid-medium--columns>.grid__col.grid__col--5{-webkit-box-flex:0;-ms-flex:0 0 84%;flex:0 0 84%}.grid-medium--columns>.grid__col.grid__col--6{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}.grid-medium--columns>.grid__col.grid__col--2-3{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%}.grid-medium--columns>.grid__col.grid__col--1-3{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%}.grid-medium--fit>.grid__col{-webkit-box-flex:1;-ms-flex:1;flex:1}.grid-medium--full>.grid__col{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}.grid-medium--third>.grid__col{-webkit-box-flex:0;-ms-flex:0 0 33.3%;flex:0 0 33.3%}.grid-medium--half>.grid__col{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}}@media (min-width:85em){.grid-large--columns>.grid__col{max-width:none}.grid-large--columns>.grid__col.grid__col--1{-webkit-box-flex:0;-ms-flex:0 0 16%;flex:0 0 16%}.grid-large--columns>.grid__col.grid__col--2{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%}.grid-large--columns>.grid__col.grid__col--3{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%}.grid-large--columns>.grid__col.grid__col--4{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%}.grid-large--columns>.grid__col.grid__col--5{-webkit-box-flex:0;-ms-flex:0 0 84%;flex:0 0 84%}.grid-large--columns>.grid__col.grid__col--6{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}.grid-large--columns>.grid__col.grid__col--2-3{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%}.grid-large--columns>.grid__col.grid__col--1-3{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%}.grid-large--fit>.grid__col{-webkit-box-flex:1;-ms-flex:1;flex:1}.grid-large--full>.grid__col{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}.grid-large--third>.grid__col{-webkit-box-flex:0;-ms-flex:0 0 33.3%;flex:0 0 33.3%}.grid-large--half>.grid__col{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}}figure{margin:0}.content--page--markdown img,.img--responsive,.team__image,.testimonial__avatar{max-width:100%;height:auto}.video-container{position:relative;padding-bottom:56.25%;padding-top:35px;height:0;overflow:hidden}.video-container>iframe{position:absolute;top:0;left:0;width:100%;height:100%}iframe{max-width:100%}.iframe-container{position:relative;padding-bottom:75%;height:0;overflow:hidden}.iframe-container>iframe{position:absolute;top:0;left:0;width:100%;height:100%}.menu{position:relative;z-index:10;width:100%;-ms-flex-item-align:start;align-self:flex-start;text-align:left}.menu .dropdown-menu{position:absolute!important}.menu__link{display:inline-block;padding:1rem .5rem;-webkit-box-shadow:none;box-shadow:none;position:relative;line-height:1}.menu__link:first-child{padding-left:0}@media (min-width:58em){.menu__link,.menu__link:first-child{padding:2rem 1rem}}.menu__link:not(.dropdown-toggle):after{content:'';position:absolute;height:2px;width:30px;background:#fff;display:block;left:50%;margin-left:-15px;bottom:.5rem;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center;transform-origin:center;-webkit-transition:-webkit-transform .2s ease-out;transition:-webkit-transform .2s ease-out;transition:transform .2s ease-out;transition:transform .2s ease-out,-webkit-transform .2s ease-out}@media (min-width:58em){.menu__link:not(.dropdown-toggle):after{bottom:1.3rem}}.menu__link.active,.menu__link:focus,.menu__link:hover{background:0 0}.menu__link.active:after,.menu__link:focus:after,.menu__link:hover:after{-webkit-transform:scale(1);transform:scale(1)}.menu__logo{display:inline-block;-webkit-box-shadow:none;box-shadow:none;padding-top:1rem}@media (min-width:58em){.menu__logo{padding-top:0;vertical-align:middle}}.menu__logo svg{opacity:.8;display:inline}@media (min-width:58em){.menu__logo svg{display:inline-block}}.menu__logo:focus,.menu__logo:hover{background:0 0}.menu__logo:focus svg,.menu__logo:hover svg{opacity:1}.menu__hiring{color:#39ba91;-webkit-box-shadow:none;box-shadow:none;padding:1rem .25rem;display:inline-block}@media (min-width:58em){.menu__hiring{margin-left:1rem}}.menu__hiring:focus,.menu__hiring:hover{background:0 0;color:rgba(57,186,145,.8)}.menu__hiring:focus .icon,.menu__hiring:hover .icon{stroke:rgba(57,186,145,.8)}.menu__hiring .icon{width:.85rem;height:.85rem;stroke:#39ba91;stroke-width:1.5;margin-bottom:-1px}.menu--main{background:rgba(16,26,37,.35);-webkit-backdrop-filter:saturate(150%) blur(10px);backdrop-filter:saturate(150%) blur(10px);border-bottom:1px solid rgba(68,82,97,.5);padding-top:.5rem;padding-bottom:.5rem}.menu--main .grid__col--2{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media (min-width:58em){.menu--main .grid__col--2{display:block;white-space:nowrap}}.menu--main .menu__logo{margin-bottom:.5rem}@media (min-width:58em){.menu--main .menu__logo{margin-bottom:0}}.menu--main .menu__link{color:#fff;opacity:.9}.menu--main .menu__link.active,.menu--main .menu__link:focus,.menu--main .menu__link:hover{opacity:1}@media (min-width:58em){.menu--main{padding-top:0;padding-bottom:0;text-align:right}}.menu-overflow{white-space:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;margin-left:-1.5rem;margin-right:-1.5rem;padding-left:1.5rem;padding-right:1.5rem;text-align:center}.menu-overflow::-webkit-scrollbar{display:none}@media (min-width:58em){.menu-overflow{margin:0;padding:0;white-space:normal;overflow:visible;text-align:right}}.menu--footer .grid__col:nth-child(2){margin-top:1rem}@media (min-width:40em){.menu--footer .grid__col:nth-child(2){margin-top:0}}.menu--footer .menu__logo{margin-top:.33333rem;margin-bottom:0}@media (min-width:40em){.menu--footer .menu__logo svg{margin:0}}.menu--footer .menu__link{padding:.5rem .25rem;color:#cad2da}@media (min-width:40em){.menu--footer .menu__link{display:block;text-align:left;padding:.5rem}}.menu--footer .menu__link:after{display:none}.menu--footer .menu__link.active,.menu--footer .menu__link:focus,.menu--footer .menu__link:hover{color:#39ba91}.footer__copyright{border-top:1px solid #445261;text-align:center;display:block;margin-top:2rem;padding-top:2rem}@media (min-width:58em){.footer__copyright{padding-bottom:2rem;text-align:left;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}}.footer__copyright .menu__link{display:inline-block;text-transform:none}@media (min-width:58em){.footer__copyright .menu__link{padding:0 1rem}}.footer__copyright .menu__link:first-child{margin-left:.5rem}.footer__copyright .menu__link:last-child{padding-right:0}.footer__copyright,.footer__copyright .menu__link,.footer__copyright small{color:#9dabba}.erdf{display:block;margin-top:2rem;margin-bottom:1rem;-webkit-box-shadow:none;box-shadow:none;text-align:center}@media (min-width:58em){.erdf{margin:0}}.erdf:focus,.erdf:hover{background:0 0}.erdf:focus .logo-erdf,.erdf:hover .logo-erdf{fill:#39ba91}.logo-erdf{fill:#9dabba;width:122px;height:30px;display:inline-block}.menu--sub{-webkit-transition:all .2s ease-out;transition:all .2s ease-out;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);background:#8e9eb0}.menu--sub .menu__link{color:#394552;margin-left:1rem;margin-right:1rem}.menu--sub .menu__link:after{display:none}.menu--sub .menu__link.active{color:#242c34}.menu--sub .menu-overflow{text-align:center}.menu--sub .icon{width:1rem;height:1rem;vertical-align:baseline;margin-right:.16667rem;margin-bottom:-2px;stroke-width:4px;color:#445261;stroke:#394552}.menu--sub .number{text-align:center;display:inline-block;width:1rem;height:1rem;border-radius:50%;font-size:.65rem;vertical-align:.1rem;background:#445261;color:#9dabba;font-weight:600;line-height:1rem;margin-right:.2rem;margin-left:-1.2rem}.menu--sub.sticky{background:rgba(142,158,176,.85);-webkit-backdrop-filter:saturate(200%) blur(10px);backdrop-filter:saturate(200%) blur(10px);-webkit-box-shadow:0 2px 6px rgba(57,69,82,.4);box-shadow:0 2px 6px rgba(57,69,82,.4);-webkit-transform:translate3d(0,-2rem,0);transform:translate3d(0,-2rem,0)}@media (min-width:40em){.menu--sub.sticky .menu__link{-webkit-transform:scale(.85) translate3d(0,.6rem,0);transform:scale(.85) translate3d(0,.6rem,0);-webkit-transform-origin:bottom;transform-origin:bottom}}.menu--sub.sticky .menu__link.active{color:#bfe6ec}.menu--sub.sticky .menu__link.active .number{background:#bfe6ec;color:#445261}body{position:relative}.sticky{position:fixed;top:0;width:100%;z-index:2}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky{position:-webkit-sticky;position:sticky}}.nav-tabs{display:-webkit-box;display:-ms-flexbox;display:flex;border-bottom:1px solid #39ba91}.nav-item{-webkit-box-flex:1;-ms-flex:1;flex:1}.nav-link{-webkit-box-shadow:none;box-shadow:none;display:block;padding:1rem;border-bottom:4px solid transparent}.nav-link.active{color:#fff;border-bottom-color:#39ba91}.tab-pane{display:none}.tab-pane.active{display:block}.alert{padding:1rem;margin-bottom:1rem;border-radius:.15rem;text-align:left}.alert>p+p{margin-top:5px}.alert>p:last-child{margin-bottom:0}.form .alert{text-align:center}.alert__icon{display:block;width:100%;height:2rem;stroke-width:3;margin:0 auto 1rem;border-bottom:1px solid transparent;padding-bottom:1rem}.alert--success{background-color:rgba(57,186,145,.4);color:#fff}.alert--success .alert__icon{stroke:#fff;border-bottom-color:rgba(255,255,255,.3)}.alert--success .alert__link{color:#e6e6e6}.alert--info{background-color:rgba(191,230,236,.2);color:#fff}.alert--info .alert__icon{stroke:#fff;border-bottom-color:rgba(255,255,255,.3)}.alert--info .alert__link{color:#e6e6e6}.alert--warning{background-color:rgba(142,142,36,.4);color:#fff}.alert--warning .alert__icon{stroke:#fff;border-bottom-color:rgba(255,255,255,.3)}.alert--warning .alert__link{color:#e6e6e6}.alert--danger{background-color:rgba(201,114,106,.4);color:#fff}.alert--danger .alert__icon{stroke:#fff;border-bottom-color:rgba(255,255,255,.3)}.alert--danger .alert__link{color:#e6e6e6}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:.7em;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code{padding:.1rem .3rem;color:#cad2da;background-color:#2f3943;border-radius:.15rem}kbd{padding:.1rem .3rem;color:#cad2da;background-color:#2f3943;border-radius:.1rem;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:600;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:.66667rem;margin:0 0 1rem;line-height:1.5;word-break:break-all;word-wrap:break-word;color:#cad2da;background-color:#2f3943;border-radius:.15rem;overflow:scroll;-webkit-overflow-scrolling:touch;max-height:28rem}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre;overflow-wrap:normal;word-wrap:normal;word-break:normal;overflow:auto;background-color:transparent;border-radius:0}.highlight{position:relative}.highlight .btn--clipboard,.highlight .success__text{position:absolute;top:1.65rem;right:.1rem}.highlight .success__text{top:3.5rem;right:-1.5rem;font-size:.65rem}.highlight__title{margin-top:0;margin-bottom:.25rem;margin-left:.66667rem;font-size:.85rem;color:#9dabba;display:inline-block}.btn--clipboard{padding:0 .5rem;-webkit-box-shadow:none;box-shadow:none;background:#445261;color:#cad2da;outline:0}.btn--clipboard svg{fill:currentColor;width:.85rem;height:.85rem}.btn--clipboard:focus,.btn--clipboard:hover{-webkit-transform:none;transform:none;background:#4f5f70}.btn--clipboard.success{background:#388250}.highlight pre{color:#cad2da;background-color:#2f3943}.highlight .hll{background:#282c34}.highlight .c{color:#84cfda;font-style:italic}.highlight .err{color:#960050;background-color:#1e0010}.highlight .k{color:#b581cf;font-weight:700}.highlight .l{color:#98c379}.highlight .n{color:#cad2da}.highlight .o{color:#cad2da}.highlight .p{color:#cad2da}.highlight .cm{color:#84cfda;font-style:italic}.highlight .cp{color:#84cfda;font-style:italic}.highlight .c1{color:#84cfda;font-style:italic}.highlight .cs{color:#84cfda;font-style:italic}.highlight .ge{font-style:italic}.highlight .gs{font-weight:700}.highlight .kc{color:#b581cf;font-weight:700}.highlight .kd{color:#b581cf;font-weight:700}.highlight .kn{color:#b581cf;font-weight:700}.highlight .kp{color:#b581cf;font-weight:700}.highlight .kr{color:#b581cf;font-weight:700}.highlight .kt{color:#b581cf;font-weight:700}.highlight .ld{color:#98c379}.highlight .m{color:#d19a66}.highlight .s{color:#98c379}.highlight .na{color:#d19a66}.highlight .nb{color:#e5c07b}.highlight .nc{color:#e5c07b}.highlight .no{color:#e5c07b}.highlight .nd{color:#e5c07b}.highlight .ni{color:#e5c07b}.highlight .ne{color:#e5c07b}.highlight .nf{color:#cad2da}.highlight .nl{color:#e5c07b}.highlight .nn{color:#cad2da}.highlight .nx{color:#cad2da}.highlight .py{color:#e5c07b}.highlight .nt{color:#e06c75}.highlight .nv{color:#e5c07b}.highlight .ow{font-weight:700}.highlight .w{color:#f8f8f2}.highlight .mf{color:#d19a66}.highlight .mh{color:#d19a66}.highlight .mi{color:#d19a66}.highlight .mo{color:#d19a66}.highlight .sb{color:#98c379}.highlight .sc{color:#98c379}.highlight .sd{color:#98c379}.highlight .s2{color:#98c379}.highlight .se{color:#98c379}.highlight .sh{color:#98c379}.highlight .si{color:#98c379}.highlight .sx{color:#98c379}.highlight .sr{color:#56b6c2}.highlight .s1{color:#98c379}.highlight .ss{color:#56b6c2}.highlight .bp{color:#e5c07b}.highlight .vc{color:#e5c07b}.highlight .vg{color:#e5c07b}.highlight .vi{color:#e06c75}.highlight .il{color:#d19a66}.highlight .gu{color:#75715e}.highlight .gd{color:#f92672}.highlight .gi{color:#a6e22e}.hero{position:relative;background:url(../img/hero-berlin-8f1441b4f1.jpg) no-repeat top center;background-size:cover;background-image:url(../img/hero-berlin-8f1441b4f1.jpg);text-align:center;overflow:hidden;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:480px;-ms-flex-wrap:wrap;flex-wrap:wrap}.hero:before{content:'';width:100%;height:100%;position:absolute;left:0;top:0;bottom:0;right:0;background:-webkit-gradient(linear,left top,right bottom,from(#074354),to(#101a25));background:linear-gradient(to bottom right,#074354 0,#101a25 100%);opacity:.7;z-index:0}.hero .row{z-index:1}.hero .row *{position:relative;z-index:5}.hero .section-title:after{background:rgba(191,230,236,.5)}.hero .header__title,.hero .section-description,.hero .section-title{color:#fff}@media (min-width:58em){.hero{height:100vh}}.hero .hero__title{color:#fff;font-size:1.8rem;margin-bottom:1rem}@media (min-width:40em){.hero .hero__title{font-size:2.3rem}}@media (min-width:58em){.hero .hero__title{font-size:2.7rem}}.hero .hero__title:after{display:none}.hero .hero__subtitle{font-size:1.45rem;margin-top:0}@media (min-width:40em){.hero .hero__subtitle{font-size:1.8rem}}.hero .section-subtitle{font-size:1.45rem}@media (min-width:40em){.hero .section-subtitle{font-size:1.8rem}}@media (min-width:58em){.hero .section-subtitle{font-size:2.3rem}}.wf-active .hero__action,.wf-active .hero__subtitle,.wf-active .hero__title,.wf-inactive .hero__action,.wf-inactive .hero__subtitle,.wf-inactive .hero__title{-webkit-animation:slide-in-from-bottom .7s cubic-bezier(0,1.02,.32,1.34);animation:slide-in-from-bottom .7s cubic-bezier(0,1.02,.32,1.34);-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.wf-active .hero__subtitle,.wf-inactive .hero__subtitle{-webkit-animation-delay:.3s;animation-delay:.3s}.wf-active .hero__action,.wf-inactive .hero__action{-webkit-animation-delay:.5s;animation-delay:.5s}.hero__community,.page-front .menu--main{-webkit-transition:all .2s ease-out;transition:all .2s ease-out;opacity:0;-webkit-transition-delay:.8s;transition-delay:.8s}.wf-active .hero__community,.wf-active .page-front .menu--main,.wf-inactive .hero__community,.wf-inactive .page-front .menu--main{opacity:1}.hero__content{margin-top:2rem;margin-bottom:4rem}@media (min-width:58em){.hero__content{-ms-flex-item-align:start;align-self:flex-start;margin-top:4rem;margin-bottom:0}}.hero__community{-ms-flex-item-align:end;align-self:flex-end;width:100%;background:rgba(16,26,37,.6);-webkit-backdrop-filter:saturate(150%) blur(10px);backdrop-filter:saturate(150%) blur(10px);border-top:1px solid rgba(68,82,97,.5);border-bottom:1px solid rgba(68,82,97,.5)}.hero__community .btn{font-weight:400;-webkit-box-shadow:none;box-shadow:none;background:0 0;opacity:.95}.hero__community .btn:focus,.hero__community .btn:hover{opacity:1}.hero__community .btn:first-child{display:block}@media (min-width:40em){.hero__community .btn:first-child{display:inline-block}}.hero__community .btn .icon{-webkit-transform:translateY(1px);transform:translateY(1px)}.hero__community .meetup-title,.hero__community .release,.hero__community .stars{display:inline-block;opacity:0;-webkit-transition:opacity .2s ease-out;transition:opacity .2s ease-out}.hero__community strong{font-weight:400}.hero__community .stars{font-size:.6rem;background:rgba(232,235,239,.15);padding:.1rem .3rem;border-radius:1rem;display:inline-block;-webkit-transform:translateY(-1px);transform:translateY(-1px);min-width:34px}.hero__community .release{min-width:44px}.hero__community .release:after{content:'';display:inline-block;width:.35rem;height:.35rem;border-radius:50%;background-color:#cc2740;vertical-align:top;margin-left:.125rem}.hero__community .icon{margin-right:.1rem}.hero__community .icon--gitter{-webkit-animation:gitterPulse 5s ease-out infinite;animation:gitterPulse 5s ease-out infinite;stroke-linecap:square;stroke-width:2px;fill:none}@-webkit-keyframes gitterPulse{0%{stroke:#cad2da}50%{stroke:#39ba91}100%{stroke:#cad2da}}@keyframes gitterPulse{0%{stroke:#cad2da}50%{stroke:#39ba91}100%{stroke:#cad2da}}.hero__community__label{opacity:.5}.hero__more{position:relative;z-index:2;color:#fff;opacity:.6;-ms-flex-item-align:end;align-self:flex-end;margin-left:auto;margin-right:auto;margin-bottom:1rem;display:none}@media (min-width:58em){.hero__more{display:inline-block}}.hero__more:focus,.hero__more:hover{opacity:1}.hero__more .icon{width:12px;height:12px;stroke:#fff;display:block;margin:auto}.header{background-image:url(../img/header-berlin-f6c4bafff6.jpg);background-position:center center}.header__content{padding:4rem 0;text-align:center}.wf-active .header__label,.wf-active .header__logo,.wf-active .header__tagline,.wf-active .header__title,.wf-inactive .header__label,.wf-inactive .header__logo,.wf-inactive .header__tagline,.wf-inactive .header__title{-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.wf-active .header__logo,.wf-active .header__tagline,.wf-inactive .header__logo,.wf-inactive .header__tagline{-webkit-animation-delay:.3s;animation-delay:.3s}.wf-active .header__btn,.wf-active .header__label,.wf-inactive .header__btn,.wf-inactive .header__label{-webkit-animation-delay:.5s;animation-delay:.5s}.header__tagline,.header__title{position:relative;z-index:1;text-align:center;margin:0}.header__tagline,h2.header__tagline{font-size:1.45rem;font-weight:400;margin-top:1rem}.footer{color:#9dabba;padding-top:3rem}.footer.section{padding-bottom:0}.team__image{background:#445261;width:230px;-webkit-clip-path:polygon(50% 0,90% 20%,100% 60%,75% 100%,25% 100%,0 60%,10% 20%);clip-path:polygon(50% 0,90% 20%,100% 60%,75% 100%,25% 100%,0 60%,10% 20%);-webkit-filter:grayscale(1);filter:grayscale(1)}.team__name{color:#cad2da;margin-bottom:0}.team__name:after{content:'';height:1px;width:3rem;display:block;margin:.76923rem auto .5rem auto;background:#bfe6ec}.team__position{margin-bottom:.5rem}.team__social{margin-bottom:0}.team__social__link{display:inline-block;margin:0 .5rem;-webkit-box-shadow:none;box-shadow:none}.team__social__link,.team__social__link:focus,.team__social__link:hover{background:0 0}.team__social__link:focus,.team__social__link:hover{-webkit-transform:translateY(-1px);transform:translateY(-1px);-webkit-filter:drop-shadow(0 1px 4px rgba(16, 26, 37, .4));filter:drop-shadow(0 1px 4px rgba(16, 26, 37, .4))}.team__social__link:active{-webkit-filter:drop-shadow(0 1px 2px rgba(16, 26, 37, .3));filter:drop-shadow(0 1px 2px rgba(16, 26, 37, .3));outline:0;-webkit-transform:none;transform:none}.team__social__link .icon{fill:#39ba91}.team__bio{text-align:left;font-size:.85rem;margin-bottom:0;margin-top:1rem;display:none;opacity:0;height:0;-webkit-transition:.4s ease-out;transition:.4s ease-out}.team__bio p:last-child{margin-bottom:0}.team__bio__trigger{display:block;text-align:center;cursor:pointer;padding-top:1rem;border-top:1px solid #394552;margin-top:3rem;margin-bottom:2rem;position:relative;font-size:.85rem;color:#445261}.team__bio__trigger span{width:2rem;height:2rem;display:block;margin-left:auto;margin-right:auto;margin-top:-2rem;background:#394552;color:#9dabba;font-size:1.2rem;line-height:1.35;-webkit-transition:.15s ease-out;transition:.15s ease-out}.team__bio__trigger:hover{border-top-color:#2f3943}.team__bio__trigger:hover span{background:#2f3943;color:#39ba91}.grid--team{margin:-3rem 0 3rem -3rem}.grid--team>.grid__col{padding:3rem 0 0 3rem}.timeline{position:relative}@media (min-width:40em){.timeline:before{content:'';width:400%;margin-left:-200%;height:1px;display:block;background:#fff;position:absolute;bottom:2.4rem}}.timeline__entry{text-align:center}.timeline__entry__time,.timeline__entry__title{display:block}.timeline__entry__title{color:#fff}.timeline__entry__title:after{content:'';width:.5rem;height:.5rem;border-radius:50%;margin:1rem auto;display:block;background:#fff}.timeline__entry__time{opacity:.5}.timeline__entry--future{opacity:.7}.terminal{max-width:100%;width:100%;background:#1a1f25}.terminal code{padding:1rem;color:#fdce93;display:block;word-break:break-all;word-wrap:break-word;background:0 0}.terminal code>span{display:block}.terminal code>span:before{content:'$';color:#2f3943;margin-right:1rem}.terminal code>span.comment:before{opacity:0}.terminal .comment{color:#445261}.terminal .deps{color:#8cd0d3;opacity:.5;font-style:italic}.terminal__link{-webkit-box-shadow:none;box-shadow:none}.terminal__link:focus,.terminal__link:hover{background:0 0;-webkit-box-shadow:inset 0 -2px 0 #39ba91;box-shadow:inset 0 -2px 0 #39ba91}.terminal,.windowframe{display:inline-block;max-width:100%;margin-left:auto;margin-right:auto;position:relative;padding-top:14px;border-radius:.15rem;overflow:hidden}@media (min-width:40em){.terminal,.windowframe{padding-top:21px}}.terminal:before,.windowframe:before{content:'';display:block;width:100%;height:14px;border-top-left-radius:.15rem;border-top-right-radius:.15rem;background:-webkit-gradient(linear,left top,left bottom,from(#394552),to(#394552));background:linear-gradient(to bottom,#394552 0,#394552 100%);margin-top:-14px}@media (min-width:40em){.terminal:before,.windowframe:before{height:21px;margin-top:-21px}}.terminal:after,.windowframe:after{content:'';width:6px;height:6px;position:absolute;left:6px;top:4px;background:#f55e4a;border-radius:50%;-webkit-box-shadow:10px 0 0 #f7ca44,20px 0 0 #48c54d;box-shadow:10px 0 0 #f7ca44,20px 0 0 #48c54d}@media (min-width:40em){.terminal:after,.windowframe:after{width:9px;height:9px;left:9px;top:6px;-webkit-box-shadow:15px 0 0 #f7ca44,30px 0 0 #48c54d;box-shadow:15px 0 0 #f7ca44,30px 0 0 #48c54d}}.nyan{position:relative}.nyan:before{content:'';position:absolute;left:0;right:0;top:0;bottom:0;background:url(../img/nyan.gif) no-repeat left center;background-size:50%;z-index:0;opacity:0;-webkit-animation:nyan-appear .6s ease-out forwards;animation:nyan-appear .6s ease-out forwards}.nyan code{position:relative;z-index:2}@-webkit-keyframes nyan-appear{0%{opacity:0;-webkit-transform:translate3d(-5rem,0,0);transform:translate3d(-5rem,0,0)}100%{opacity:.4;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes nyan-appear{0%{opacity:0;-webkit-transform:translate3d(-5rem,0,0);transform:translate3d(-5rem,0,0)}100%{opacity:.4;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.dropdown{position:relative;display:inline-block}.dropdown-toggle{-webkit-box-shadow:none;box-shadow:none;cursor:default}.dropdown-toggle:focus,.dropdown-toggle:hover{background:0 0}.dropdown-toggle:after{content:'';display:inline-block;width:14px;height:10px;background:url(../img/icon-caret-be8c9aab36.svg) no-repeat center center;background-size:contain;-webkit-transition:.15s ease-out;transition:.15s ease-out}.dropdown--hover:hover .dropdown-toggle:after,.dropdown.show .dropdown-toggle:after{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.dropdown-menu{position:absolute;top:100%;left:0;z-index:10;display:block;float:left;min-width:10rem;padding:.25rem 0;margin:0;font-size:1rem;color:#445261;text-align:left;list-style:none;border-radius:.15rem;-webkit-box-shadow:0 3px 10px rgba(0,0,0,.3);box-shadow:0 3px 10px rgba(0,0,0,.3);background:#394552;background-clip:padding-box;border:0;max-height:20rem;overflow-y:auto;-webkit-overflow-scrolling:touch;-webkit-transition:.2s cubic-bezier(0,1.02,.32,1.34);transition:.2s cubic-bezier(0,1.02,.32,1.34);opacity:0;-webkit-transform:scale(1,0);transform:scale(1,0);-webkit-transform-origin:top;transform-origin:top}@media (max-width:27rem),(max-height:27rem){.dropdown-menu{max-height:11.25rem}}.dropdown-item{display:block;width:100%;padding:.5rem 1rem;clear:both;font-weight:400;color:#cad2da;text-align:inherit;white-space:nowrap;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.dropdown-item:focus,.dropdown-item:hover{text-decoration:none}.dropdown-item.active{background:#cad2da;color:#394552;text-decoration:none}.dropdown-item[rel=external]:after{margin-left:0}.dropdown--hover:hover>.dropdown-menu,.dropdown-menu.show{-webkit-transform:scale(1,1);transform:scale(1,1);opacity:1}.dropdown--hover>.dropdown-toggle:active{pointer-events:none}.cookie-banner{position:fixed;bottom:.5rem;z-index:10;background:rgba(16,26,37,.6);-webkit-backdrop-filter:saturate(150%) blur(10px);backdrop-filter:saturate(150%) blur(10px);font-size:.85rem;padding:.5rem 1rem;text-align:center;max-width:36rem;border-radius:.15rem;-webkit-transition:opacity .6s ease-out;transition:opacity .6s ease-out;opacity:0;-webkit-transition-delay:3s;transition-delay:3s}.wf-active .cookie-banner,.wf-inactive .cookie-banner{opacity:1}.cookie-banner p{margin-bottom:.5rem}.cookie-banner p:first-child{opacity:.8}@media (min-width:40em){.cookie-banner{left:50%;margin-left:-18rem;text-align:left;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.cookie-banner p{margin:0}.cookie-banner p:first-child{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%}.cookie-banner p:last-child{-webkit-box-flex:0;-ms-flex:0 0 22%;flex:0 0 22%;text-align:right}.cookie-banner .btn:last-child{padding-right:0}.cookie-banner[style='display: block;']{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}}.invisible{visibility:hidden!important}.hide{display:none!important}.text-hide{font:'0/0' a;color:transparent;text-shadow:none;background-color:transparent;border:0}.content--page--markdown{padding-top:2rem;padding-bottom:2rem}@media (min-width:40em){.content--page--markdown{padding-top:5rem;padding-bottom:5rem}}.content--page--markdown h2,.content--page--markdown>h1{border-bottom:2px solid #bfe6ec;padding-bottom:1rem;margin-bottom:1.5rem;margin-top:3rem;position:relative;font-size:1.8rem}.content--page--markdown h2:hover .header-link,.content--page--markdown>h1:hover .header-link{opacity:1;-webkit-transform:translate3d(0,0,0) scale(.8);transform:translate3d(0,0,0) scale(.8)}.content--page--markdown h3{font-size:1.45rem}.content--page--markdown h4{font-size:1.2rem}.content--page--markdown .header-link{-webkit-box-shadow:none;box-shadow:none;display:block;padding:0 .25rem;opacity:0;-webkit-transform:translate3d(20px,0,0) scale(0);transform:translate3d(20px,0,0) scale(0);position:absolute;left:-1.5rem;top:0}.content--page--markdown .header-link,.content--page--markdown .header-link .header-icon{-webkit-transition:.2s cubic-bezier(0,1.02,.32,1.34);transition:.2s cubic-bezier(0,1.02,.32,1.34)}.content--page--markdown .header-link:focus,.content--page--markdown .header-link:hover{background:0 0}.content--page--markdown .header-link:focus .header-icon,.content--page--markdown .header-link:hover .header-icon{color:#5acca8}.content--page--markdown .header-link .header-icon{font-style:normal;font-size:1.8rem;color:#39ba91}.comments{margin-bottom:2rem}.comments .row>h1{font-size:2.3rem;border-bottom:1px solid #bfe6ec;padding-bottom:1rem;margin-bottom:2rem;text-align:center}#markdown-toc,#markdown-toc ol,.section-nav,.section-nav ol,.toc,.toc ol{counter-reset:item}#markdown-toc,#markdown-toc li,.section-nav,.section-nav li,.toc,.toc li{padding-left:0}#markdown-toc:before,.section-nav:before,.toc:before{content:'Contents';font-size:1.2rem;display:block;margin-top:0}#markdown-toc li,#markdown-toc ol,#markdown-toc ul,.section-nav li,.section-nav ol,.section-nav ul,.toc li,.toc ol,.toc ul{margin:0}#markdown-toc li,.section-nav li,.toc li{display:block}#markdown-toc>li:before,.section-nav>li:before,.toc>li:before{content:counters(item, ".") ". ";counter-increment:item;margin-right:.25rem;color:#cad2da;width:1rem;display:inline-block}.testimonials{margin-bottom:0}.testimonials .grid__col{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.testimonials.is-ready .grid__col:nth-child(2) .testimonial{-webkit-animation-delay:.3s;animation-delay:.3s}.testimonials.is-ready .grid__col:nth-child(3) .testimonial{-webkit-animation-delay:.6s;animation-delay:.6s}.is-ready .testimonial{-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.testimonial__quote{margin:0;position:relative;border:none;color:#cad2da;padding:0;font-style:normal;margin-bottom:1rem;-ms-flex-item-align:start;align-self:flex-start}.testimonial__quote:before{content:'“';font-family:'Avenir Next',Avenir,'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:250%;color:#9dabba;line-height:1;margin-left:-1rem}.testimonial__caption{-ms-flex-item-align:end;align-self:flex-end;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-top:2px solid #9dabba;padding-top:1rem;position:relative}.testimonial__caption:before{content:'';position:absolute;width:0;height:0;border-style:solid;left:4rem;top:0;border-width:.9rem .9rem 0 0;border-color:transparent;border-top-color:#9dabba}.testimonial__avatar{width:4rem;height:4rem;display:inline-block;margin-right:1rem;border-radius:50%;border:2px solid #9dabba}.testimonial__cite{font-style:normal;-webkit-box-flex:1;-ms-flex:1;flex:1;color:#cad2da}.testimonial__name{font-weight:600}.testimonial__org{display:block}.testimonial__org a{-webkit-box-shadow:none;box-shadow:none}.section{padding-top:3rem;padding-bottom:3rem;overflow:hidden}.section:last-child{border-bottom:0}.section .row{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}@media (min-width:40em){.section{padding-top:5rem;padding-bottom:5rem}}.section-header{margin-bottom:4rem}.section-description,.section-title{text-align:center}@media (min-width:40em){.section-description,.section-title{max-width:100%;margin-left:auto;margin-right:auto}}.text-left .section-description,.text-left .section-title{text-align:left}.section-title{margin-top:0;margin-bottom:2rem}.section-title:after{content:'';height:2px;width:3rem;display:block;margin:2rem auto 0;background:#9dabba}.text-left .section-title:after{margin-left:0}.section-description{font-size:1.2rem;margin-bottom:0;color:#e8ebef}.section-description+.section-description,.section-description+p{margin-top:1rem}.section-actions{margin-top:1rem}.section-actions .btn{margin-left:5px;margin-right:5px;min-width:200px}.section-cta--whitepaper{background-image:url(/assets/img/photo3-f95639086c.jpg)}@media (min-width:58em){.section-cta--services{padding-top:7rem;padding-bottom:7rem}}.section-cta--services .logo--services{margin-bottom:1rem;-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:left;transform-origin:left;color:#b581cf;fill:rgba(7,67,84,.5)}.section-cta--services .section-header{margin-bottom:0}.section-cta--services .section-title{text-align:left;margin-bottom:2.5rem}.section-cta--services .section-title:after{display:none}.partner{text-align:center;display:block;-webkit-box-shadow:none;box-shadow:none;max-width:100px;margin:auto}.partner__logo{fill:#bfe6ec;fill-opacity:.6;max-width:100%;height:20px}@media (min-width:40em){.partner__logo{height:30px}}.partner__logo--interledger{-webkit-transform:scale(1.2);transform:scale(1.2)}.partner__logo--recruit-technologies{-webkit-transform:translateY(-.3rem);transform:translateY(-.3rem)}.partner__logo--innogy{-webkit-transform:scale(1.6);transform:scale(1.6)}.partner__logo--innogy .stroke{fill:none;stroke:#bfe6ec;stroke-width:4px}@media (min-width:40em){.partner__logo--porsche{-webkit-transform:scale(1.2);transform:scale(1.2)}}.partner__logo--matrixthread,.partner__logo--volkswagen{-webkit-transform:scale(1.6);transform:scale(1.6)}.partner__logo--riddleandcode,.partner__logo--sicpa{-webkit-transform:scale(1.8);transform:scale(1.8)}.partner__logo--ae{-webkit-transform:scale(1.1);transform:scale(1.1)}.partner__logo--technoidentity{-webkit-transform:scale(1.3);transform:scale(1.3)}.article{position:relative;-webkit-transition:all .2s ease-out;transition:all .2s ease-out;background-size:cover;background-position:center;padding:1rem;border-radius:.15rem;overflow:hidden;-webkit-box-shadow:none;box-shadow:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:8rem}.article:before{content:'';width:100%;height:100%;position:absolute;left:0;top:0;bottom:0;right:0;background:-webkit-gradient(linear,left top,right bottom,from(#074354),to(#101a25));background:linear-gradient(to bottom right,#074354 0,#101a25 100%);opacity:.7;z-index:0}.article .row{z-index:1}.article:focus,.article:hover{background-size:cover;background-position:center;-webkit-box-shadow:0 2px 5px rgba(16,26,37,.2);box-shadow:0 2px 5px rgba(16,26,37,.2);-webkit-transform:translateY(-1px);transform:translateY(-1px)}.article__title,h1.article__title{font-size:1.2rem;font-weight:400;margin:0;color:#fff;position:relative;z-index:1}.section--getstarted{padding-bottom:0}.section--getstarted .section-header{margin-bottom:-3.5rem;position:relative;z-index:10}.section--getstarted .section-header .btn{margin-top:2rem}.section--newsletter{background:#39ba91;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.section--newsletter .form-group,.section--newsletter .grid{margin-bottom:0}.section--newsletter .form-control,.section--newsletter .select2-container--bigchaindb .select2-search--dropdown .select2-search__field,.section--newsletter .select2-container--bigchaindb .select2-selection--multiple,.section--newsletter .select2-container--bigchaindb .select2-selection--single,.select2-container--bigchaindb .section--newsletter .select2-selection--multiple,.select2-container--bigchaindb .section--newsletter .select2-selection--single,.select2-container--bigchaindb .select2-search--dropdown .section--newsletter .select2-search__field{border-color:#394552}.section--newsletter .form-control:focus,.section--newsletter .select2-container--bigchaindb .select2-search--dropdown .select2-search__field:focus,.section--newsletter .select2-container--bigchaindb .select2-selection--multiple:focus,.section--newsletter .select2-container--bigchaindb .select2-selection--single:focus,.select2-container--bigchaindb .section--newsletter .select2-selection--multiple:focus,.select2-container--bigchaindb .section--newsletter .select2-selection--single:focus,.select2-container--bigchaindb .select2-search--dropdown .section--newsletter .select2-search__field:focus{border-color:#000}.section--newsletter .form-control.parsley-error,.section--newsletter .select2-container--bigchaindb .parsley-error.select2-selection--multiple,.section--newsletter .select2-container--bigchaindb .parsley-error.select2-selection--single,.section--newsletter .select2-container--bigchaindb .select2-search--dropdown .parsley-error.select2-search__field,.select2-container--bigchaindb .section--newsletter .parsley-error.select2-selection--multiple,.select2-container--bigchaindb .section--newsletter .parsley-error.select2-selection--single,.select2-container--bigchaindb .select2-search--dropdown .section--newsletter .parsley-error.select2-search__field{border-color:#c9726a!important}.section--newsletter .btn{background:#074354}.section--newsletter .form-control,.section--newsletter .form-control:focus~.form-label,.section--newsletter .form-label,.section--newsletter .select2-container--bigchaindb .select2-search--dropdown .select2-search__field,.section--newsletter .select2-container--bigchaindb .select2-search--dropdown .select2-search__field:focus~.form-label,.section--newsletter .select2-container--bigchaindb .select2-selection--multiple,.section--newsletter .select2-container--bigchaindb .select2-selection--multiple:focus~.form-label,.section--newsletter .select2-container--bigchaindb .select2-selection--single,.section--newsletter .select2-container--bigchaindb .select2-selection--single:focus~.form-label,.select2-container--bigchaindb .section--newsletter .select2-selection--multiple,.select2-container--bigchaindb .section--newsletter .select2-selection--multiple:focus~.form-label,.select2-container--bigchaindb .section--newsletter .select2-selection--single,.select2-container--bigchaindb .section--newsletter .select2-selection--single:focus~.form-label,.select2-container--bigchaindb .select2-search--dropdown .section--newsletter .select2-search__field,.select2-container--bigchaindb .select2-search--dropdown .section--newsletter .select2-search__field:focus~.form-label{color:#394552}.section--newsletter .form-control-feedback{margin-top:.5rem}.section--newsletter .form--newsletter{margin-top:2rem}.section--newsletter .parsley-errors-list{right:auto;left:0;bottom:-.25rem}.newsletter__title{margin-top:0;margin-bottom:.25rem}.newsletter__gdpr,.newsletter__text,.newsletter__title{color:#394552}.newsletter__gdpr{opacity:.8}.newsletter__gdpr .icon{stroke:#074354;color:#074354}.newsletter__gdpr a{-webkit-box-shadow:inset 0 -1px 0 #074354;box-shadow:inset 0 -1px 0 #074354}.newsletter__gdpr a:focus,.newsletter__gdpr a:hover{background:#074354}.section-intro .section-header{margin-bottom:2rem}.section-intro .row:last-child>p:last-child{margin-top:3rem;margin-bottom:0}.section-intro__main{margin-bottom:4rem;margin-top:1rem}.section-intro__main h3{display:block;margin-bottom:0;margin-top:0;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}@media (min-width:40em){.section-intro__main h3{font-size:1.2rem}}.section-intro__main sub{font-size:.85rem}.section-intro__main .icon{display:block;margin:auto;margin-bottom:1rem}.section--firsttransaction .section-title{font-size:1.45rem;margin-bottom:2rem;text-align:left}@media (min-width:40em){.section--firsttransaction .section-title{margin-top:-2rem}}.section--firsttransaction .section-title:after{display:none}.section--firsttransaction .section-title+.grid{margin-bottom:0}.form--transaction{background:0 0;padding:0}@media (min-width:40em){.form--transaction{min-height:340px}}.form--transaction .form-group:first-child{margin-top:0}.form--transaction .message{text-align:left}.form--transaction__content{border:none;padding:0;width:100%}.waiting{width:100%}.waiting pre{min-height:200px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center;font-style:italic;border:1px solid #394552;background:0 0;overflow:hidden}@media (min-width:40em){.waiting pre{min-height:340px}}.response pre{border:1px solid #394552;line-height:1.3}@media (min-width:40em){.response pre{min-height:340px}}.response code{font-size:.65rem;word-break:break-all;word-wrap:break-word}.message{font-size:1rem}.code-example{-webkit-transition:all .2s ease-out;transition:all .2s ease-out;margin-top:2rem}@media (min-width:40em){.code-example{max-width:50%;margin-top:0}}.code-example .nav-link,.code-example pre{font-size:.65rem}.code-example .nav-tabs{border-bottom-color:#9dabba;opacity:.6}.code-example .nav-link{padding-top:.25rem;padding-bottom:.25rem;margin-bottom:-2px}.code-example .nav-link:focus,.code-example .nav-link:hover{background:0 0}.code-example .nav-link.active{border-bottom:2px solid #9dabba}.code-example pre{background:0 0;padding:1.5rem 0 0;margin-bottom:0;overflow-y:auto;overflow-x:auto}.code-example .highlight .p{color:#7db4b2}.section-title--numbered span{text-align:center;display:block;margin:auto auto .5rem;width:3rem;height:3rem;border-radius:50%;font-size:1.2rem;background:#bfe6ec;color:#445261;font-weight:400;line-height:3rem}.text-left .section-title--numbered span{display:inline-block;margin:0;vertical-align:.4rem}.background--light .section-title--numbered span{background:#9dabba;color:#fff}.section-title--numbered:after{display:none}.section--server{padding-bottom:0}.section--server .btn{margin-top:.5rem}.starbase{position:relative;margin-top:-2rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;opacity:.7}.starbase:before{content:'';position:absolute;display:block;left:0;right:0;bottom:0;top:0;background:#445261;-webkit-clip-path:polygon(0 25%,100% 0,100% 100%,0 100%);clip-path:polygon(0 25%,100% 0,100% 100%,0 100%)}.starbase__image{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.starbase__image img{position:relative;z-index:1;margin-bottom:-1.45%;width:100%}.starbase__image:before{content:'';position:absolute;display:block;left:-5%;right:-5%;bottom:auto;background:#556679;height:24%;width:calc(100vw + 5%)}.starbase--drivers{min-height:7rem}@media (min-width:58em){.starbase--drivers{min-height:12rem}}.starbase--drivers .starbase__image:before{height:40%}.starbase--drivers .starbase__image img{margin-bottom:-.5%}.choice{background:#4a5a6a;padding-top:4rem;padding-bottom:4rem}.choice__title{font-size:1.8rem;margin-top:0;margin-bottom:1.5rem}.choice__title:after{content:'';height:2px;width:3rem;display:block;margin:1.5rem 0 0;background:#9dabba}.choice__title__version{font-size:.85rem;color:#9dabba;font-family:europa,"Avenir Next",Avenir,"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400}.choice__title--community{text-align:center}.choice__title--community:after{position:relative;left:50%;margin-left:-1.5rem}.architecture{text-align:center}.architecture img{max-width:45rem}.section--drivers{padding-bottom:0}.section--drivers .choice__title{margin-bottom:2rem}.driver{padding:1rem;background:rgba(16,26,37,.15);border-radius:.15rem;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-shadow:none;box-shadow:none}.driver:focus,.driver:hover{background:#39ba91;-webkit-box-shadow:0 1px 4px rgba(16,26,37,.4);box-shadow:0 1px 4px rgba(16,26,37,.4);-webkit-transform:translateY(-1px);transform:translateY(-1px)}.driver:focus .driver__title,.driver:hover .driver__title{color:#fff}.driver:focus .driver__logo,.driver:hover .driver__logo{fill:#fff}.driver:active{outline:0;-webkit-transform:translateY(0);transform:translateY(0);-webkit-box-shadow:0 1px 2px rgba(16,26,37,.3);box-shadow:0 1px 2px rgba(16,26,37,.3)}.driver,.driver__logo,.driver__title{-webkit-transition:all .2s ease-out;transition:all .2s ease-out}.driver__logo{width:2rem;height:2rem;fill:#39ba91}.driver__title{color:#39ba91;margin-top:0;margin-bottom:1rem}.driver__meta{font-size:.85rem;font-weight:400;width:100%;-ms-flex-item-align:end;align-self:flex-end;margin:0}.driver__meta span{display:block}.driver__version{opacity:.75}.driver--community{text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.driver--community .driver__title{width:100%;margin-bottom:0;font-size:1rem}.driver--community .driver__repo{font-size:.65rem}.driver--community .driver__logo{width:1.5rem;height:1.5rem;margin-bottom:.5rem}.docs__actions{border-top:1px solid #bbc5d0;padding-top:2rem}.docs__title{margin-top:0}.docs__title:after{content:'';height:2px;width:2rem;display:block;margin-top:1rem;background:#9dabba}.docs__list{padding-left:0;text-align:left}.docs__list li{display:block;padding-left:0}.section--community{text-align:center}.section--community .section-header .section-description{margin-bottom:2rem}.section--community .social-link{display:inline-block;-webkit-box-shadow:none;box-shadow:none;padding:.4rem 1.25rem;margin-top:1rem}.section--community .social-link,.section--community .social-link .icon{-webkit-transition:all .2s ease-out;transition:all .2s ease-out}.section--community .social-link:focus,.section--community .social-link:hover{background:0 0}.section--community .social-link:focus .icon,.section--community .social-link:hover .icon{fill:#5acca8;-webkit-filter:drop-shadow(0 1px 4px rgba(16, 26, 37, .4));filter:drop-shadow(0 1px 4px rgba(16, 26, 37, .4));-webkit-transform:translateY(-1px);transform:translateY(-1px)}.section--community .social-link:focus .icon--gitter,.section--community .social-link:hover .icon--gitter{stroke:#5acca8}.section--community .social-link:active{outline:0}.section--community .social-link:active .icon{fill:#39ba91;-webkit-filter:drop-shadow(0 1px 2px rgba(16, 26, 37, .3));filter:drop-shadow(0 1px 2px rgba(16, 26, 37, .3));-webkit-transform:translateY(0);transform:translateY(0)}.section--community .social-link .icon{fill:#39ba91;width:1.5rem;height:1.5rem}.section--community .social-link .icon.icon--gitter{stroke:#39ba91}.section--community .social-link__title{font-size:.85rem;font-weight:400;color:#39ba91;display:block;text-align:center}.section--community h5{margin-top:0}.community__actions{border-bottom:1px solid #394552;margin-bottom:3rem;padding-bottom:2rem}.community__actions .icon{width:2rem;height:2rem;fill:#bfe6ec;opacity:.4;margin-bottom:.5rem}.community__actions .icon--gitter{stroke:#bfe6ec;stroke-width:2}.community__actions p{color:#bfe6ec;opacity:.8}.page-whitepaper .content--page--markdown>p:first-child{text-align:center}.section--whitepaper-download .section-header+.nav-link,.section--whitepaper-download .section-header+.section-intro__main,.section--whitepaper-download .section-header+.text-center{margin-top:-1rem}.page-404{position:relative;position:relative;background-image:url(/assets/img/fail-cat.gif);background-size:cover;background-position:center center}.page-404:before{content:'';width:100%;height:100%;position:absolute;left:0;top:0;bottom:0;right:0;background:-webkit-gradient(linear,left top,right bottom,from(#074354),to(#101a25));background:linear-gradient(to bottom right,#074354 0,#101a25 100%);opacity:.7;z-index:0}.page-404 .row{z-index:1}.page-404:before{z-index:-1}.page-404 .header{background:0 0}.page-404 .header:before{display:none}.page-404 .header__title{margin-bottom:2rem;padding-bottom:0}.page-404 .header__title:after{content:'';height:1px;width:5rem;display:block;margin:2rem auto 0;background:#cad2da}.page-404 .content--page--markdown{text-align:center;padding-top:0}.page-404 .content--page--markdown p{color:#fff}.page-404 .footer{background:0 0;border-color:rgba(255,255,255,.2)}.page-404 .footer__copyright{border-color:rgba(255,255,255,.1)}.page-404 .footer__copyright,.page-404 .footer__copyright .menu__link{color:rgba(255,255,255,.6)}.page-404 .menu--footer a{color:#fff}.page-styleguide .highlight{margin-bottom:2rem}.page-styleguide .typeface{font-size:7vw}.page-styleguide .section--newsletter .typeface.form-control-feedback,.page-styleguide .typeface.bold,.page-styleguide cite.typeface,.section--newsletter .page-styleguide .typeface.form-control-feedback{margin-bottom:2rem}.color{padding:1rem .5rem;margin-bottom:0;border-radius:.15rem;border:1px solid #596b7f;text-align:center}.color,.color .color-meta{-webkit-transition:all .2s ease-out;transition:all .2s ease-out}.color .color-meta{display:block;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:11px;color:#fff;opacity:0}.color:hover{background:#444!important}.color:hover .color-meta{opacity:1}.color-hex{margin-top:5px;font-size:16px!important;border-top:1px solid #777;padding-top:5px}.brand-main-blue{background:#074354}.brand-main-blue-light{background:#bfe6ec}.brand-main-blue-dark{background:#101a25}.brand-main-gray{background:#445261}.brand-main-green{background:#39ba91}.brand-main-violet{background:#b581cf}.brand-main-gray-light{background:#cad2da}.brand-main-gray-lighter{background:#e8ebef}.brand-success{background:#388250}.brand-info{background:#3e91ce}.brand-warning{background:#8e8e24}.brand-danger{background:#c9726a}.section--team{padding-top:0}.section--about{padding-top:4rem}.section--about .section-header{margin-bottom:2rem}.section--about h2:first-of-type{margin-top:0}@media (min-width:58em){.section--about .story{padding-right:3rem}}.widget{margin-top:2rem;padding:1.5rem;background:rgba(16,26,37,.15)}@media (min-width:58em){.widget:first-child{margin-top:5rem}}.widget__title{font-size:1.45rem;margin-bottom:.5rem;margin-top:0}.brand{margin-top:1.5rem}.brand:first-child{margin-top:0}.brand__logo{padding:2rem;border:1px solid rgba(157,171,186,.25);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.brand--dark .brand__logo{background:#cad2da}.brand--square .brand__logo{padding:1.2rem 2rem}.brand__logo__download{text-align:center;margin-bottom:0}.page-features .section--getstarted{background-color:#445261}.feature{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:1rem}.feature:first-of-type{padding-top:0}.feature__icon{-webkit-box-flex:0;-ms-flex:0 0 15%;flex:0 0 15%;margin-right:3%;margin-top:2px;margin-bottom:0;width:3rem;height:3rem}.feature__detail{-webkit-box-flex:0;-ms-flex:0 0 82%;flex:0 0 82%}.feature__title{color:#bfe6ec;margin-top:0;margin-bottom:.33333rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.feature__text p{margin-bottom:0}.feture_roadmap{padding:1rem 0 0}.feature__title__comingsoon,.feature__title__new{font-family:inherit;font-size:.85rem;color:#9dabba;background:#394552;display:inline-block;margin-left:.5rem;padding:.16667rem .5rem;border-radius:2px;white-space:nowrap}.feature__title__new{background:#bfe6ec;color:#101a25}.stacks__title{font-size:1.8rem}.stacks__image figcaption{margin:1rem 0}.table--comparison td{text-align:center}.table--comparison tbody td:first-child{text-align:left}.table--comparison .icon-check{width:1rem;height:1rem;margin:auto;display:block;stroke-width:3;stroke:#fff}.table--comparison a{display:inline-block;-webkit-box-shadow:none;box-shadow:none}.table--comparison a .icon-check{stroke:#39ba91}.table--comparison a:after{display:none!important}.section-usecases>.row>.section-header{margin-bottom:0}.section-usecases>.row>.section-header>.section-description{margin-bottom:3rem;padding-bottom:3rem;border-bottom:2px solid #4f5f70}.section--industry:first-child{margin-top:4rem}.section--industry .section-header{margin-bottom:2rem}.section--industry .section-header .icon{width:48px;height:48px;margin-bottom:-.33333rem;margin-right:.5rem;stroke-width:2}.section--industry .section-description,.section--industry .section-title{text-align:left}.section--industry .section-title{margin-top:0;margin-bottom:2rem}.section--industry .section-title:after{display:none}.featuredusecase{border-top:2px solid #4f5f70;padding-top:2rem;margin-top:2rem}@media (min-width:40em){.featuredusecase{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}}.featuredusecase__logo{-webkit-box-shadow:none;box-shadow:none;-webkit-transition:.2s ease-out;transition:.2s ease-out;display:block}.featuredusecase__logo:focus,.featuredusecase__logo:hover{background:0 0}.featuredusecase__logo:focus svg,.featuredusecase__logo:hover svg{fill:#39ba91}@media (min-width:40em){.featuredusecase__logo{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:5%}}.featuredusecase__logo img,.featuredusecase__logo svg{width:80px;max-width:80px;max-height:60px;height:auto;margin-bottom:.5rem;opacity:.6;-ms-flex-item-align:start;align-self:flex-start;fill:#bfe6ec;-webkit-transition:.2s ease-out;transition:.2s ease-out}@media (min-width:40em){.featuredusecase__logo img,.featuredusecase__logo svg{width:120px;max-width:120px;max-height:90px;height:auto;margin-bottom:0}}.featuredusecase__content{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%}.featuredusecase__title{margin-top:0;margin-bottom:1rem}.featuredusecase__title a{color:#39ba91;-webkit-box-shadow:none;box-shadow:none}.featuredusecase__title a:focus,.featuredusecase__title a:hover{color:#fff}.content--usecase{padding-top:4rem;padding-bottom:0}.content--usecase>.row>h2:first-child{margin-top:0}.content--usecase .testimonial{margin:4rem auto}@media (min-width:40em){.content--usecase .testimonial{max-width:66%}}.content--usecase .testimonial__quote:before{margin-left:-1.3rem}.content--usecase .testimonial__avatar{width:5rem;height:5rem;margin-top:1rem}.header--usecase{padding-bottom:4rem}.header--usecase hgroup{margin-top:3rem}.header--usecase .header__title{padding-top:0}.header--usecase .header__logo{width:140px;max-height:100px;display:block;margin-left:auto;margin-right:auto;margin-bottom:1rem;fill:#fff}.header--usecase .header__label{text-align:center;display:block;color:#bfe6ec;font-size:1.2rem}.content__about{margin-top:4rem;background:#394552;padding-top:3rem;padding-bottom:1rem}.content__about__title{margin-top:0;margin-bottom:1rem}.actionbar a{display:block;padding:2rem 1rem;background:#074354;color:#fff;text-align:center;-webkit-box-shadow:none;box-shadow:none;font-family:inherit}.actionbar a:focus,.actionbar a:hover{background:#09566c}.actionbar a.link-back{background:#101a25}.actionbar a.link-back:focus,.actionbar a.link-back:hover{background:#182737}.contactlist p{margin-bottom:0}.contactlist .p-adr{margin-bottom:1rem}.contactlist .social{margin-top:1rem}.form--cla{padding:1rem 2rem;background:#394552}@media (min-width:40em){.form--cla .grid{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.form--cla .grid .form-group{margin-bottom:0}}@media (min-width:40em){.form--cla .grid__col{-ms-flex-preferred-size:48%;flex-basis:48%}}.content--partner .partner__logo{margin-bottom:4rem;margin-left:auto;margin-right:auto;display:block}.content--partner .partner__logo--riddleandcode{-webkit-transform:scale(3);transform:scale(3)}.partner__actions{margin-top:2rem;padding-top:2rem;border-top:1px solid #445261;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.page-services .feature{display:block}.page-services .feature__title{margin-bottom:1rem;display:block}.page-services .feature__title:after{content:'';height:2px;width:3rem;display:block;margin-top:1.5rem}.page-services .feature__icon{margin-top:0;margin-bottom:.16667rem;width:2.2rem;height:2.2rem}.hero--services .logo--services{display:inline-block;opacity:.75;fill:#bfe6ec}.hero--services .hero__title{margin-top:1rem}.hero--services .hero__subtitle{margin-bottom:3rem;font-size:1.2rem}@media (min-width:40em){.hero--services .hero__subtitle{font-size:1.45rem}}.hero--services .hero__content{margin-top:2rem;margin-bottom:6rem}.hero--services .btn{min-width:220px}.section--servicesdetail .feature__icon{stroke:rgba(68,82,97,.65);color:rgba(181,129,207,.65)}.section--servicesdetail .feature__title:after{background:rgba(68,82,97,.2)}.section--servicesdetail .feature__text{color:rgba(7,67,84,.65)}.section--servicesdetail .actions{text-align:center;padding-top:3rem;border-top:2px solid rgba(68,82,97,.1)}.section--servicesintro .feature,.section--servicesintro .grid{margin-bottom:0}.section--servicesintro .btn{margin-top:2rem}.section--servicesintro h2{margin-bottom:1rem}.section--servicesintro .feature__title:after{background:rgba(157,171,186,.4)}.section--servicestestimonial .testimonial{margin:0 auto}@media (min-width:40em){.section--servicestestimonial .testimonial{max-width:66%}}.section--servicestestimonial .testimonial__quote:before{margin-left:-1.3rem}.form--services{background:#05303c}@media (min-width:40em){.form--services .grid{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}}@media (min-width:40em){.form--services .grid__col{-ms-flex-preferred-size:48%;flex-basis:48%}}.oceanprotocol{display:block;-webkit-box-shadow:none;box-shadow:none;height:100%;background:#141414;padding-top:.66667rem;padding-bottom:.66667rem}.oceanprotocol:focus,.oceanprotocol:hover{background:#212121}.oceanprotocol:focus .oceanprotocol__title,.oceanprotocol:hover .oceanprotocol__title{opacity:1}.oceanprotocol .row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}h1.oceanprotocol__title{font-size:.85rem;margin:0;opacity:.7;color:#fff;font-weight:600;-webkit-transition:.2s ease-out;transition:.2s ease-out}.oceanprotocol__logo{fill:#fff;width:1.2rem;height:1.2rem;margin-right:.25rem;margin-bottom:-.4rem;display:inline-block}.header--developersguide{background:url(../img/nosprite/starbase-guides-14966f9ca8.svg) no-repeat center bottom;background-size:contain;padding-bottom:18%}.header--developersguide:before{display:none}.header--developersguide .header__content{padding-top:5rem;padding-bottom:5rem}@media (min-width:40em){.header--developersguide .header__tagline{max-width:40rem;margin-left:auto;margin-right:auto}}.header--guide .header__content{padding-top:5rem;padding-bottom:5rem}.content--guide .content--page--markdown{padding-top:4rem}.content--guide .content--page--markdown h1,.content--guide .content--page--markdown h2,.content--guide .content--page--markdown h3,.content--guide .content--page--markdown h4{font-weight:400}.content--guide .content--page--markdown h2,.content--guide .content--page--markdown h3,.content--guide .content--page--markdown h4{text-align:left;border:0;padding:0}.content--guide .content--page--markdown h1{font-size:1.8rem}.content--guide .content--page--markdown h2{font-size:1.45rem;margin-top:2.5rem}.content--guide .content--page--markdown h3{font-size:1rem;font-weight:400;color:#fff;margin-bottom:1rem;margin-top:2rem}.section-header--guide{margin-bottom:3rem}.section-header--guide .section-description{text-align:left}.section-header--guide .section-description h2{margin-top:0;font-size:1.2rem}.section-header--guide .section-description ul{margin:0}.section--guides-more{padding-top:0}.guide{height:100%}.guide a{position:relative;background-size:cover;background-position:center;background-image:url(../img/hero-berlin-8f1441b4f1.jpg);display:block;-webkit-box-shadow:none;box-shadow:none;background-color:#101a25;padding:2rem;height:100%;border-radius:.15rem}.guide a:before{content:'';width:100%;height:100%;position:absolute;left:0;top:0;bottom:0;right:0;background:-webkit-gradient(linear,left top,right bottom,from(#074354),to(#101a25));background:linear-gradient(to bottom right,#074354 0,#101a25 100%);opacity:.7;z-index:0}.guide a .row{z-index:1}.guide a:before{opacity:.85}.guide a:focus,.guide a:hover{background-size:cover;background-position:center;-webkit-box-shadow:0 2px 5px rgba(16,26,37,.2);box-shadow:0 2px 5px rgba(16,26,37,.2);-webkit-transform:translateY(-1px);transform:translateY(-1px)}.guide .grid,.guide .guide__tagline,.guide .guide__title:only-child,.guide p:last-child{margin-bottom:0}.guide__tagline,.guide__title{position:relative;z-index:1}.guide__title,h1.guide__title{font-size:1.45rem;font-weight:400;margin-bottom:.66667rem;margin-top:0;color:#fff}.section--guides-more .guide__title,.section--guides-more h1.guide__title{font-size:1.2rem}.guide__tagline{color:#bfe6ec}.section--guideslist .guide{margin-bottom:2rem}.section--guideslist .guide a{padding:3rem}.section--guides .grid,.section--guides-more .grid{margin-bottom:3rem}.section-nav{background:#404d5b;margin-top:0;margin-bottom:2rem;padding:1.5rem;padding-bottom:2rem;border-radius:.15rem}.section-nav a:focus,.section-nav a:hover{color:#fff}li.toc-h1:before{font-size:1rem;opacity:.6;color:#bfe6ec}li.toc-h1 a{font-size:1rem;margin:0;-webkit-box-shadow:none;box-shadow:none;color:#bfe6ec}li.toc-h1 ul{padding-left:2.6rem}li.toc-h2 a{font-size:.85rem;color:#cad2da}li.toc-h3{display:none}.image--create-transfer{max-width:calc(100% + 1rem)!important;margin-left:-1rem}@media (min-width:40em){.image--create-transfer{max-width:calc(100% + 1.5rem)!important;margin-left:-1.5rem}}.page-newsletter .content--page--markdown{padding-top:0;padding-bottom:0}.page-newsletter .section--newsletter{width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:60vh;background:#394552}.page-newsletter .section--newsletter .form-control,.page-newsletter .section--newsletter .select2-container--bigchaindb .select2-search--dropdown .select2-search__field,.page-newsletter .section--newsletter .select2-container--bigchaindb .select2-selection--multiple,.page-newsletter .section--newsletter .select2-container--bigchaindb .select2-selection--single,.select2-container--bigchaindb .page-newsletter .section--newsletter .select2-selection--multiple,.select2-container--bigchaindb .page-newsletter .section--newsletter .select2-selection--single,.select2-container--bigchaindb .select2-search--dropdown .page-newsletter .section--newsletter .select2-search__field{border-color:#9dabba}.page-newsletter .section--newsletter .form-control:focus,.page-newsletter .section--newsletter .select2-container--bigchaindb .select2-search--dropdown .select2-search__field:focus,.page-newsletter .section--newsletter .select2-container--bigchaindb .select2-selection--multiple:focus,.page-newsletter .section--newsletter .select2-container--bigchaindb .select2-selection--single:focus,.select2-container--bigchaindb .page-newsletter .section--newsletter .select2-selection--multiple:focus,.select2-container--bigchaindb .page-newsletter .section--newsletter .select2-selection--single:focus,.select2-container--bigchaindb .select2-search--dropdown .page-newsletter .section--newsletter .select2-search__field:focus{border-color:#fff}.page-newsletter .section--newsletter .newsletter__title{color:#bfe6ec}.page-newsletter .section--newsletter .form-control,.page-newsletter .section--newsletter .form-control:focus~.form-label,.page-newsletter .section--newsletter .form-label,.page-newsletter .section--newsletter .newsletter__gdpr,.page-newsletter .section--newsletter .newsletter__text,.page-newsletter .section--newsletter .select2-container--bigchaindb .select2-search--dropdown .select2-search__field,.page-newsletter .section--newsletter .select2-container--bigchaindb .select2-search--dropdown .select2-search__field:focus~.form-label,.page-newsletter .section--newsletter .select2-container--bigchaindb .select2-selection--multiple,.page-newsletter .section--newsletter .select2-container--bigchaindb .select2-selection--multiple:focus~.form-label,.page-newsletter .section--newsletter .select2-container--bigchaindb .select2-selection--single,.page-newsletter .section--newsletter .select2-container--bigchaindb .select2-selection--single:focus~.form-label,.select2-container--bigchaindb .page-newsletter .section--newsletter .select2-selection--multiple,.select2-container--bigchaindb .page-newsletter .section--newsletter .select2-selection--multiple:focus~.form-label,.select2-container--bigchaindb .page-newsletter .section--newsletter .select2-selection--single,.select2-container--bigchaindb .page-newsletter .section--newsletter .select2-selection--single:focus~.form-label,.select2-container--bigchaindb .select2-search--dropdown .page-newsletter .section--newsletter .select2-search__field,.select2-container--bigchaindb .select2-search--dropdown .page-newsletter .section--newsletter .select2-search__field:focus~.form-label{color:#cad2da}.page-newsletter .section--newsletter .newsletter__gdpr{opacity:.6}.page-newsletter .section--newsletter .newsletter__gdpr .icon{stroke:#9dabba;color:#9dabba}.page-newsletter .section--newsletter .newsletter__gdpr a{-webkit-box-shadow:inset 0 -1px 0 #9dabba;box-shadow:inset 0 -1px 0 #9dabba}.page-newsletter .section--newsletter .newsletter__gdpr a:focus,.page-newsletter .section--newsletter .newsletter__gdpr a:hover{background:#9dabba} -------------------------------------------------------------------------------- /app/public/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bigchaindb/dashboard/35c3a278f7383e87838b8477b9b25d3fb2eeb39f/app/public/img/favicon.png -------------------------------------------------------------------------------- /app/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 20 | 21 | BigchainDB Dashboard 22 | 23 | 24 | 27 |
28 | 29 | 30 | -------------------------------------------------------------------------------- /app/readme.md: -------------------------------------------------------------------------------- 1 | # BigchainDB Dashboard - Application -------------------------------------------------------------------------------- /app/src/App.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bigchaindb/dashboard/35c3a278f7383e87838b8477b9b25d3fb2eeb39f/app/src/App.css -------------------------------------------------------------------------------- /app/src/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Container } from 'semantic-ui-react' 3 | import AppHeader from './components/header/AppHeader' 4 | import Timeline from './containers/Timeline' 5 | import AppFooter from './components/footer/AppFooter' 6 | import './App.css'; 7 | 8 | class App extends Component { 9 | 10 | render() { 11 | return ( 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | ); 20 | } 21 | } 22 | 23 | export default App; 24 | -------------------------------------------------------------------------------- /app/src/actions/ActionTypes.js: -------------------------------------------------------------------------------- 1 | export const MESSAGE_RECEIVED = 'VALID_TX_RECEIVED'; 2 | export const SET_MODAL = 'SET_MODAL'; 3 | export const UPDATE_STATS = 'UPDATE_STATS'; 4 | export const CHECK_BLOCKS = 'CHECK_BLOCKS' -------------------------------------------------------------------------------- /app/src/actions/actions.js: -------------------------------------------------------------------------------- 1 | import * as types from './ActionTypes' 2 | 3 | export const validTransaction = (txId, blockId, raw) => ({ 4 | type: types.MESSAGE_RECEIVED, 5 | txId, 6 | blockId, 7 | raw 8 | }); 9 | 10 | export const setModal = (title, content, open) => ({ 11 | type: types.SET_MODAL, 12 | title, 13 | content, 14 | open 15 | }) 16 | 17 | export const updateStats = (connected, blockHeight) => ({ 18 | type: types.UPDATE_STATS, 19 | connected, 20 | blockHeight 21 | }) 22 | 23 | export const checkBlocks = (blockId) => ({ 24 | type: types.CHECK_BLOCKS, 25 | blockId 26 | }) 27 | -------------------------------------------------------------------------------- /app/src/components/block/Block.css: -------------------------------------------------------------------------------- 1 | .bgreen{ 2 | border:1px solid #00C8A8; 3 | border-radius: 8px; 4 | resize: both; 5 | position: relative; 6 | padding: 6px; 7 | } 8 | 9 | .ui.grid { 10 | margin-top: 0rem !important; 11 | margin-bottom: 25rem !important; 12 | margin-left: 0rem !important; 13 | margin-right: -1rem !important; 14 | } 15 | 16 | .blockTitle{ 17 | max-width: 290px; 18 | text-align: center; 19 | cursor: pointer; 20 | margin-bottom: 10px; 21 | } 22 | .blockTitle #title { 23 | color: #00C8A8; 24 | } 25 | .blockTitle .blockNo { 26 | color: #fff; 27 | } 28 | 29 | .box{ 30 | display: flex; 31 | flex-direction: column; 32 | flex-wrap: wrap; 33 | margin: 10px; 34 | } 35 | .box> .ui .card { 36 | flex: 1 1 289px; 37 | margin: 10px; 38 | } 39 | 40 | .parent { 41 | display: flex; 42 | flex-direction: column; 43 | } 44 | 45 | .ui.centered.card { 46 | margin: 10px !important; 47 | } 48 | 49 | .dot { 50 | height: 15px; 51 | width: 15px; 52 | background-color: rgba(187, 187, 187, 0.6); 53 | border-radius: 50%; 54 | display: inline-block; 55 | position: absolute; 56 | margin-top: 20px; 57 | } 58 | 59 | .front{ 60 | position: absolute; 61 | left: -8px; 62 | } 63 | 64 | .back { 65 | position: absolute; 66 | right: -8px; 67 | } 68 | 69 | .line{ 70 | width: 34px; 71 | height: 8px; 72 | border-bottom: 2px solid rgba(187, 187, 187, 0.6); 73 | position: absolute; 74 | margin-left: 15px; 75 | } -------------------------------------------------------------------------------- /app/src/components/block/Block.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import Transaction from '../../containers/Transaction'; 3 | import './Block.css'; 4 | import * as utils from '../../services/utils'; 5 | 6 | export default class Block extends Component { 7 | maxTxWidth = 324; 8 | maxTitleHeight = 20; 9 | maxTxHeight = 300; 10 | headerHeight = utils.getPosition('appHeader').height; 11 | menuHeight = utils.getPosition('dash').height; 12 | viewPortHeight = utils.getViewportHeight(); 13 | heightRemainig = this.viewPortHeight - this.headerHeight - this.menuHeight; 14 | 15 | handleClick(){ 16 | this.props.onBlockClick(this.props.block); 17 | } 18 | 19 | render() { 20 | const calc = this.predictBlockSize(); 21 | const blockTitleStyle = { 22 | minWidth: calc.maxWidth+'px', 23 | maxWidth: calc.maxWidth+'px', 24 | } 25 | const blockStyle = { 26 | minWidth: calc.maxWidth+'px', 27 | maxWidth: calc.maxWidth+'px' 28 | } 29 | blockStyle['maxHeight'] = calc.maxHeight + 'px'; 30 | 31 | return( 32 |
33 |
34 | Block 35 | #{this.props.block} 36 |
37 |
38 | 39 | {this.props.prevBlock && (
)} 40 |
41 | 42 | { this.props.state.map((value, index) => { 43 | return 44 | }) 45 | } 46 | 47 |
48 |
49 | ) 50 | } 51 | 52 | predictBlockSize(){ 53 | const maxTx = Math.floor(this.heightRemainig/this.maxTxHeight); 54 | const maxCol = Math.ceil(this.props.state.length / maxTx); 55 | const maxRow = Math.ceil(this.props.state.length/ maxCol); 56 | const maxHeight = maxRow*this.maxTxHeight; 57 | let maxWidth = 0; 58 | if(this.props.state.length < maxTx){ 59 | maxWidth = this.maxTxWidth; 60 | }else{ 61 | maxWidth = maxCol*this.maxTxWidth 62 | } 63 | return {maxWidth, maxHeight}; 64 | } 65 | } -------------------------------------------------------------------------------- /app/src/components/footer/AppFooter.css: -------------------------------------------------------------------------------- 1 | .appfooter{ 2 | position: fixed; 3 | z-index: 5; 4 | margin-left: 100 px; 5 | bottom: 0; 6 | width: 100%; 7 | display: block; 8 | text-align: center; 9 | } 10 | 11 | .footer__copyright .menu__link{ 12 | color: #E8EBEF !important; 13 | font-size: 150%; 14 | } 15 | -------------------------------------------------------------------------------- /app/src/components/footer/AppFooter.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import './AppFooter.css'; 3 | 4 | export default class AppFooter extends Component { 5 | render() { 6 | return( 7 |
8 |
9 | © 2018 BigchainDB GmbH 10 | Terms 11 | Privacy 12 |
13 |
14 | ) 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/components/header/AppHeader.css: -------------------------------------------------------------------------------- 1 | .logo-item { 2 | margin-left: 3%; 3 | padding: 20px; 4 | position: relative; 5 | z-index: 5; 6 | } -------------------------------------------------------------------------------- /app/src/components/header/AppHeader.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { Header, Item } from 'semantic-ui-react' 3 | import './AppHeader.css'; 4 | 5 | export default class AppHeader extends Component { 6 | render() { 7 | return( 8 |
9 | 10 | 11 | 12 | 13 | 14 |
15 | ) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/components/modal/AppModal.css: -------------------------------------------------------------------------------- 1 | .modal-trim { 2 | word-wrap: break-word; 3 | width: 100%; 4 | margin-bottom: 0px; 5 | } 6 | pre { 7 | white-space: pre-wrap; /* Since CSS 2.1 */ 8 | white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ 9 | white-space: -pre-wrap; /* Opera 4-6 */ 10 | white-space: -o-pre-wrap; /* Opera 7 */ 11 | word-wrap: break-word; /* Internet Explorer 5.5+ */ 12 | } 13 | 14 | .modalHeader:before{ 15 | background: #fff; 16 | } 17 | 18 | .modalHeader span{ 19 | font-weight: bold !important; 20 | } 21 | 22 | .ui.modal > .content { 23 | padding: 0px !important; 24 | } 25 | 26 | .ui.modal > .close{ 27 | font-size: 27px !important; 28 | color: rgba(0, 0, 0, 0.85) !important; 29 | top: 0.5rem !important; 30 | right: 1.5rem !important; 31 | } 32 | -------------------------------------------------------------------------------- /app/src/components/modal/AppModal.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Modal } from 'semantic-ui-react'; 3 | import './AppModal.css'; 4 | class AppModal extends Component { 5 | open = false; 6 | close = () => { 7 | this.props.onClose(); 8 | } 9 | render() { 10 | return ( 11 |
12 | 13 | {this.props.state.title} 14 | 15 | 16 |
{JSON.stringify(this.props.state.content,null, 2)}
17 |
18 |
19 |
20 |
21 | ); 22 | } 23 | } 24 | 25 | export default AppModal; 26 | -------------------------------------------------------------------------------- /app/src/components/stats/Stats.css: -------------------------------------------------------------------------------- 1 | .ui.secondary.pointing.menu { 2 | background-color: #121A24 !important; 3 | margin-top: -14px; 4 | 5 | } 6 | .ui.secondary.inverted.pointing.menu .item { 7 | margin-left: 3%; 8 | } 9 | a { 10 | color: #767C83 !important; 11 | } 12 | 13 | .ui.secondary.pointing.menu .active.item { 14 | border-color: #71F3AE !important; 15 | } 16 | 17 | .connected { 18 | margin-right: 2%; 19 | width: 100%; 20 | } 21 | 22 | .connRight{ 23 | text-align: right !important; 24 | display: block !important; 25 | } 26 | 27 | div.item span{ 28 | font-weight: bold !important; 29 | } -------------------------------------------------------------------------------- /app/src/components/stats/Stats.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { Menu, Container } from 'semantic-ui-react' 3 | import './Stats.css'; 4 | 5 | export default class Stats extends Component { 6 | activeIndex = 0; 7 | render() { 8 | return( 9 | 10 | 11 | 12 | {this.props.name} 13 | 14 | 15 | {'Source:' } 16 | {this.props.context} 17 | 18 | 19 | {'Block Height: '} 20 | {this.props.state.lastBlock} 21 | 22 |
23 | 24 | {this.props.state.connected} 25 | 26 |
27 |
28 |
29 | ) 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/components/timeline/Timeline.css: -------------------------------------------------------------------------------- 1 | .blockDisplay { 2 | margin: 0 auto; 3 | } 4 | 5 | .letOverflow{ 6 | overflow: scroll; 7 | flex-wrap: nowrap !important; 8 | overflow-x: scroll; 9 | overflow-y: none; 10 | } 11 | 12 | ::-webkit-scrollbar { 13 | display: none; 14 | } 15 | 16 | #dash { 17 | margin-bottom: 1%; 18 | } 19 | 20 | .timeline:before{ 21 | visibility: hidden !important; 22 | } -------------------------------------------------------------------------------- /app/src/components/timeline/Timeline.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Container, Grid } from 'semantic-ui-react' 3 | import Stats from '../../containers/Stats' 4 | import Block from '../../containers/Block' 5 | import AppModal from '../../containers/AppModal'; 6 | import './Timeline.css'; 7 | 8 | class Timeline extends Component { 9 | render() { 10 | return ( 11 | 12 |
13 |
14 | 15 | { 16 | this.props.state.map((blockNo) => { 17 | return 18 | }) 19 | } 20 | 21 |
22 | 23 |
24 | ); 25 | } 26 | 27 | getPrevBlock(blockNo){ 28 | let result = this.props.state.indexOf(blockNo)+1; 29 | if(result === this.props.state.length) return -1; 30 | return result; 31 | } 32 | } 33 | 34 | export default Timeline; 35 | -------------------------------------------------------------------------------- /app/src/components/transaction/Transaction.css: -------------------------------------------------------------------------------- 1 | .fontSize100{ 2 | font-size: 70px; 3 | } 4 | .greenColor{ 5 | text-transform: uppercase; 6 | color: #39BA91 !important; 7 | font-weight: bold !important; 8 | } 9 | .upperCase{ 10 | text-transform: uppercase; 11 | font-weight: bold !important; 12 | } 13 | .font17{ 14 | font-size: 17px; 15 | } 16 | .marginTop4{ 17 | margin-top: 4%; 18 | } 19 | .mb10{ 20 | margin-bottom: 10%; 21 | } 22 | .payloadShadow{ 23 | box-shadow: 0 1px 3px 0 #25363a, 0 0 0 1px #3d646d !important; 24 | } 25 | i.icon, i.icons { 26 | font-size: 0.60em !important; 27 | color: #767C83 !important; 28 | } 29 | 30 | .trim { 31 | text-overflow: ellipsis; 32 | overflow: hidden; 33 | white-space: nowrap; 34 | width: 65%; 35 | } 36 | 37 | .wordWrap { 38 | text-overflow: ellipsis; 39 | overflow: hidden; 40 | } 41 | 42 | .createDesc{ 43 | max-height: 130px 44 | } 45 | 46 | .transferDesc{ 47 | max-height: 115px 48 | } 49 | 50 | .ui .card .cardBody{ 51 | min-height: 190px; 52 | max-height: 190px; 53 | } 54 | 55 | .create { 56 | background-color: #C6E5EB !important; 57 | } 58 | 59 | .transfer { 60 | background-color: #82CEE2 !important; 61 | } 62 | 63 | .cardHeader .right{ 64 | font-weight: bold !important; 65 | } 66 | 67 | .desc { 68 | overflow: hidden; 69 | } -------------------------------------------------------------------------------- /app/src/components/transaction/Transaction.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { Card } from 'semantic-ui-react' 3 | import './Transaction.css'; 4 | 5 | 6 | export default class Transaction extends Component { 7 | handleClick(){ 8 | this.props.onTxClick(this.props.state) 9 | } 10 | 11 | render() { 12 | return( 13 | 14 | 15 | 16 | {this.props.txId} 17 | 18 | 19 | {this.props.state.operation} 20 | 21 | { this.props.state.operation==='TRANSFER' && 22 | (
23 | Asset Id: 24 | {this.props.state.asset.id} 25 |
26 | ) 27 | } 28 |
29 | {this.props.desc}
30 |
31 |
32 |
33 | ) 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/configs/bigchaindb.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "host": "test.bigchaindb.com", 3 | "ws_port": 443, 4 | "api": "/api/v1/", 5 | "validTx": "streams/valid_transactions", 6 | "secure": true 7 | } -------------------------------------------------------------------------------- /app/src/configs/ui-mapper.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "create.description": "asset.data", 3 | "transfer.description": "metadata", 4 | "maxBlocks": 100, 5 | "contextName": "BigchainDB Testnet" 6 | } -------------------------------------------------------------------------------- /app/src/containers/AppModal.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux' 2 | import AppModal from '../components/modal/AppModal' 3 | import { setModal } from '../actions/actions' 4 | 5 | export default connect( 6 | (state) => ({ 7 | state: state.Modal 8 | } 9 | ), 10 | dispatch => ({ 11 | onClose: () =>{ 12 | dispatch(setModal('', '', false)) 13 | } 14 | }))(AppModal) -------------------------------------------------------------------------------- /app/src/containers/Block.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux' 2 | import { setModal } from '../actions/actions' 3 | import * as bdb from '../services/bdb'; 4 | import Block from '../components/block/Block' 5 | 6 | 7 | export default connect( 8 | (state, ownProps) => { 9 | if(state.Transaction[ownProps.block]){ 10 | return {state: Object.keys(state.Transaction[ownProps.block])} 11 | }else{ 12 | return {state: []} 13 | } 14 | }, 15 | dispatch => ({ 16 | onBlockClick: data =>{ 17 | bdb.getBlock(data).then(result => { 18 | dispatch(setModal('Block Details', result, true)); 19 | }) 20 | } 21 | }) 22 | 23 | )(Block) 24 | -------------------------------------------------------------------------------- /app/src/containers/Stats.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux' 2 | import Stats from '../components/stats/Stats' 3 | import UIMap from '../configs/ui-mapper.config.json'; 4 | 5 | export default connect( 6 | (state) => { 7 | const stats = state.Stats; 8 | const context = UIMap.contextName 9 | return {state: stats, context: context}; 10 | })(Stats) -------------------------------------------------------------------------------- /app/src/containers/Timeline.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux' 2 | import Timeline from '../components/timeline/Timeline' 3 | const mapStateToProps = state => ({ 4 | state: state.Blocks 5 | }); 6 | 7 | export default connect(mapStateToProps)(Timeline); -------------------------------------------------------------------------------- /app/src/containers/Transaction.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux' 2 | import { setModal } from '../actions/actions' 3 | import Transaction from '../components/transaction/Transaction' 4 | import UIMap from '../configs/ui-mapper.config.json'; 5 | 6 | export default connect( 7 | (state, ownProps) => { 8 | const rawTx = state.Transaction[ownProps.block][ownProps.txId]; 9 | const desc = rawTx.operation==='CREATE'?JSON.stringify(extractValue('create.description', rawTx)):JSON.stringify(extractValue('transfer.description', rawTx)); 10 | return {state: rawTx, desc: desc}; 11 | }, 12 | dispatch => ({ 13 | onTxClick: data =>{ 14 | dispatch(setModal('Transaction Details', data, true)); 15 | } 16 | }) 17 | 18 | )(Transaction) 19 | 20 | 21 | function extractValue(mapKey, state) { 22 | let result = state; // eslint-disable-next-line 23 | UIMap[mapKey].split('.').map( val => { 24 | result = result[val]; 25 | }); 26 | return result; 27 | } -------------------------------------------------------------------------------- /app/src/index.css: -------------------------------------------------------------------------------- 1 | *{ 2 | font-family: europa; 3 | font-style: normal; 4 | font-weight: 300 !important; 5 | } 6 | body { 7 | margin: 0; 8 | padding: 0; 9 | background-color: #3e4855; 10 | overflow-y: hidden; 11 | } -------------------------------------------------------------------------------- /app/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import { Provider } from 'react-redux' 4 | import { createStore, applyMiddleware } from 'redux' 5 | import thunk from 'redux-thunk'; 6 | import 'semantic-ui-css/semantic.css'; 7 | import './index.css'; 8 | import App from './App'; 9 | import registerServiceWorker from './registerServiceWorker'; 10 | import { composeWithDevTools } from 'redux-devtools-extension' 11 | import appReducer from './reducers/index' 12 | import setupSocket from './services/sockets'; 13 | 14 | const store = createStore(appReducer, composeWithDevTools(applyMiddleware( 15 | thunk 16 | ))); 17 | 18 | setupSocket(store.dispatch); 19 | 20 | ReactDOM.render( 21 | 22 | 23 | , 24 | document.getElementById('root') 25 | ); 26 | registerServiceWorker(); -------------------------------------------------------------------------------- /app/src/reducers/Blocks.js: -------------------------------------------------------------------------------- 1 | import uimapper from '../configs/ui-mapper.config.json' 2 | const initialState = []; 3 | const Blocks = (state = initialState, action) => { 4 | switch (action.type) { 5 | case 'CHECK_BLOCKS': 6 | if (!state.includes(action.blockId)){ 7 | state.unshift(action.blockId); 8 | } 9 | if(state.length > uimapper.maxBlocks){ 10 | state.splice(uimapper.maxBlocks, (state.length-uimapper.maxBlocks)); 11 | } 12 | return state.slice(); 13 | default: 14 | return state; 15 | } 16 | } 17 | 18 | export default Blocks; -------------------------------------------------------------------------------- /app/src/reducers/Modal.js: -------------------------------------------------------------------------------- 1 | const initialState = { 2 | title: '', 3 | content: null 4 | } 5 | 6 | const Modal = (state = initialState, action) => { 7 | switch (action.type) { 8 | case 'SET_MODAL': 9 | return Object.assign({}, {content: action.content, title: action.title, open: action.open}); 10 | default: 11 | return state; 12 | } 13 | } 14 | 15 | export default Modal; -------------------------------------------------------------------------------- /app/src/reducers/Stats.js: -------------------------------------------------------------------------------- 1 | import bigchaindb from '../configs/bigchaindb.config.json' 2 | 3 | const initialState = { 4 | connected: 'Disconnected', 5 | lastBlock: 0, 6 | totalTx: 0 7 | } 8 | 9 | const Stats = (state = initialState, action) => { 10 | switch (action.type) { 11 | case 'UPDATE_STATS': 12 | const connectionText = action.connected?'Connected to: '+ bigchaindb.host:'Disconnected'; 13 | return Object.assign({}, {connected: connectionText, lastBlock: action.blockHeight, totalTx: action.totalTx}); 14 | default: 15 | return state; 16 | } 17 | } 18 | 19 | export default Stats; -------------------------------------------------------------------------------- /app/src/reducers/Transaction.js: -------------------------------------------------------------------------------- 1 | const initialState = {} 2 | const Transaction = (state = initialState, action) => { 3 | switch (action.type) { 4 | case 'VALID_TX_RECEIVED': 5 | if (!state.hasOwnProperty(action.blockId)){ 6 | state[action.blockId] = {}; 7 | state[action.blockId][action.txId] = action.raw; 8 | }else{ 9 | state[action.blockId][action.txId] = action.raw; 10 | } 11 | return Object.assign({}, state, state); 12 | default: 13 | return state; 14 | } 15 | } 16 | 17 | export default Transaction; -------------------------------------------------------------------------------- /app/src/reducers/index.js: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux' 2 | import Transaction from './Transaction' 3 | import Modal from './Modal' 4 | import Stats from './Stats' 5 | import Blocks from './Blocks' 6 | 7 | const appReducer = combineReducers({ 8 | Transaction, 9 | Modal, 10 | Stats, 11 | Blocks 12 | }) 13 | 14 | export default appReducer 15 | -------------------------------------------------------------------------------- /app/src/registerServiceWorker.js: -------------------------------------------------------------------------------- 1 | // In production, we register a service worker to serve assets from local cache. 2 | 3 | // This lets the app load faster on subsequent visits in production, and gives 4 | // it offline capabilities. However, it also means that developers (and users) 5 | // will only see deployed updates on the "N+1" visit to a page, since previously 6 | // cached resources are updated in the background. 7 | 8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy. 9 | // This link also includes instructions on opting out of this behavior. 10 | 11 | const isLocalhost = Boolean( 12 | window.location.hostname === 'localhost' || 13 | // [::1] is the IPv6 localhost address. 14 | window.location.hostname === '[::1]' || 15 | // 127.0.0.1/8 is considered localhost for IPv4. 16 | window.location.hostname.match( 17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 18 | ) 19 | ); 20 | 21 | export default function register() { 22 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 23 | // The URL constructor is available in all browsers that support SW. 24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location); 25 | if (publicUrl.origin !== window.location.origin) { 26 | // Our service worker won't work if PUBLIC_URL is on a different origin 27 | // from what our page is served on. This might happen if a CDN is used to 28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374 29 | return; 30 | } 31 | 32 | window.addEventListener('load', () => { 33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 34 | 35 | if (isLocalhost) { 36 | // This is running on localhost. Lets check if a service worker still exists or not. 37 | checkValidServiceWorker(swUrl); 38 | 39 | // Add some additional logging to localhost, pointing developers to the 40 | // service worker/PWA documentation. 41 | navigator.serviceWorker.ready.then(() => { 42 | console.log( 43 | 'This web app is being served cache-first by a service ' + 44 | 'worker. To learn more, visit https://goo.gl/SC7cgQ' 45 | ); 46 | }); 47 | } else { 48 | // Is not local host. Just register service worker 49 | registerValidSW(swUrl); 50 | } 51 | }); 52 | } 53 | } 54 | 55 | function registerValidSW(swUrl) { 56 | navigator.serviceWorker 57 | .register(swUrl) 58 | .then(registration => { 59 | registration.onupdatefound = () => { 60 | const installingWorker = registration.installing; 61 | installingWorker.onstatechange = () => { 62 | if (installingWorker.state === 'installed') { 63 | if (navigator.serviceWorker.controller) { 64 | // At this point, the old content will have been purged and 65 | // the fresh content will have been added to the cache. 66 | // It's the perfect time to display a "New content is 67 | // available; please refresh." message in your web app. 68 | console.log('New content is available; please refresh.'); 69 | } else { 70 | // At this point, everything has been precached. 71 | // It's the perfect time to display a 72 | // "Content is cached for offline use." message. 73 | console.log('Content is cached for offline use.'); 74 | } 75 | } 76 | }; 77 | }; 78 | }) 79 | .catch(error => { 80 | console.error('Error during service worker registration:', error); 81 | }); 82 | } 83 | 84 | function checkValidServiceWorker(swUrl) { 85 | // Check if the service worker can be found. If it can't reload the page. 86 | fetch(swUrl) 87 | .then(response => { 88 | // Ensure service worker exists, and that we really are getting a JS file. 89 | if ( 90 | response.status === 404 || 91 | response.headers.get('content-type').indexOf('javascript') === -1 92 | ) { 93 | // No service worker found. Probably a different app. Reload the page. 94 | navigator.serviceWorker.ready.then(registration => { 95 | registration.unregister().then(() => { 96 | window.location.reload(); 97 | }); 98 | }); 99 | } else { 100 | // Service worker found. Proceed as normal. 101 | registerValidSW(swUrl); 102 | } 103 | }) 104 | .catch(() => { 105 | console.log( 106 | 'No internet connection found. App is running in offline mode.' 107 | ); 108 | }); 109 | } 110 | 111 | export function unregister() { 112 | if ('serviceWorker' in navigator) { 113 | navigator.serviceWorker.ready.then(registration => { 114 | registration.unregister(); 115 | }); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /app/src/services/bdb.js: -------------------------------------------------------------------------------- 1 | import * as driver from 'bigchaindb-driver'; 2 | import bigchaindb from '../configs/bigchaindb.config.json' 3 | 4 | const protocol = bigchaindb.secure?'https://':'http://'; 5 | 6 | const API_PATH = protocol + bigchaindb.host + bigchaindb.api 7 | const conn = new driver.Connection(API_PATH); 8 | 9 | export const getTransaction = (txId) => { 10 | return conn.getTransaction(txId).then(value => { 11 | return value 12 | }); 13 | } 14 | 15 | export const getBlock = (blockHeight) => { 16 | return conn.getBlock(blockHeight); 17 | } -------------------------------------------------------------------------------- /app/src/services/sockets.js: -------------------------------------------------------------------------------- 1 | import { validTransaction, updateStats, checkBlocks } from '../actions/actions'; 2 | import { getTransaction } from './bdb' 3 | import bigchaindb from '../configs/bigchaindb.config.json' 4 | 5 | let connected = false; 6 | const protocol = bigchaindb.secure?'wss://':'ws://'; 7 | 8 | const setupSocket = (dispatch) => { 9 | 10 | const socket = new WebSocket(protocol + bigchaindb.host.split(':')[0] 11 | +':' 12 | +bigchaindb.ws_port 13 | +bigchaindb.api 14 | +bigchaindb.validTx) 15 | 16 | socket.onopen = () => { 17 | connected = true; 18 | dispatch(updateStats(connected, '---', '---')); 19 | } 20 | socket.onmessage = (event) => { 21 | const data = JSON.parse(event.data); 22 | getTransaction(data.transaction_id).then(txData => { 23 | dispatch(validTransaction(data.transaction_id, data.height, txData)); 24 | dispatch(checkBlocks(data.height)); 25 | dispatch(updateStats(connected, data.height)); 26 | }); 27 | } 28 | socket.onclose = () => { 29 | connected = false; 30 | } 31 | 32 | return socket 33 | } 34 | 35 | export default setupSocket 36 | -------------------------------------------------------------------------------- /app/src/services/utils.js: -------------------------------------------------------------------------------- 1 | export function getPosition(id) { 2 | return document.getElementById(id).getBoundingClientRect(); 3 | } 4 | 5 | export function getViewportHeight() { 6 | return Math.max(document.documentElement.clientHeight, window.innerHeight || 0) 7 | } -------------------------------------------------------------------------------- /app/test/integrationTest.js: -------------------------------------------------------------------------------- 1 | import * as driver from 'bigchaindb-driver'; 2 | 3 | const API_PATH = 'http://localhost:9984/api/v1/' 4 | const conn = new driver.Connection(API_PATH) 5 | const alice = new driver.Ed25519Keypair() 6 | const bob = new driver.Ed25519Keypair() 7 | const MIN = 1; 8 | const MAX = 10; 9 | 10 | function createTx(){ 11 | const tx = driver.Transaction.makeCreateTransaction( 12 | { city: 'Berlin, DE', temperature: 22, datetime: new Date().toString() }, 13 | { what: 'My first BigchainDB transaction' }, 14 | [ driver.Transaction.makeOutput( 15 | driver.Transaction.makeEd25519Condition(alice.publicKey)) 16 | ], 17 | alice.publicKey 18 | ) 19 | const txSigned = driver.Transaction.signTransaction(tx, alice.privateKey) 20 | conn.postTransactionAsync(txSigned).then(tx => console.log(tx.id)); 21 | } 22 | 23 | function transferTx(){ 24 | const tx = driver.Transaction.makeCreateTransaction( 25 | { city: 'Berlin, DE', temperature: 22, datetime: new Date().toString() }, 26 | { what: 'My first BigchainDB transaction' }, 27 | [ driver.Transaction.makeOutput( 28 | driver.Transaction.makeEd25519Condition(alice.publicKey)) 29 | ], 30 | alice.publicKey 31 | ) 32 | const txSigned = driver.Transaction.signTransaction(tx, alice.privateKey) 33 | conn.postTransactionCommit(txSigned).then(tx => { 34 | const txTransferBob = driver.Transaction.makeTransferTransaction( 35 | [{ tx: tx, output_index: 0 }], 36 | [driver.Transaction.makeOutput(driver.Transaction.makeEd25519Condition(bob.publicKey))], 37 | {message: 'Transfered to Bob'} 38 | ) 39 | let txTransferBobSigned = driver.Transaction.signTransaction(txTransferBob, alice.privateKey) 40 | conn.postTransactionAsync(txTransferBobSigned).then(tx => console.log(tx.id)); 41 | }) 42 | } 43 | 44 | function getRandomInt(min, max) { 45 | return Math.floor(Math.random() * (max - min + 1)) + min; 46 | } 47 | 48 | function runTest(){ 49 | const runs = getRandomInt(MIN, MAX); 50 | for(let i=1;i< runs; i++){ 51 | if(i%2 == 0) transferTx() 52 | else createTx(); 53 | } 54 | } 55 | 56 | runTest(); -------------------------------------------------------------------------------- /app/test/testScript.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | while true; do 4 | babel-node integrationTest.js 5 | sleep 2; 6 | done -------------------------------------------------------------------------------- /specs/bdbdashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bigchaindb/dashboard/35c3a278f7383e87838b8477b9b25d3fb2eeb39f/specs/bdbdashboard.png -------------------------------------------------------------------------------- /specs/readme.md: -------------------------------------------------------------------------------- 1 | # BigchainDB Dashboard - High Level Design 2 | 3 | This document defines the high level design for the BigchainDB dashboard. 4 | 5 | ## Tech Stack 6 | 7 | The BigchainDB dashboard is a set of react components which can be packaged together and integrated with any existing react application. 8 | 9 | ## Solution Overview 10 | 11 | The overall BigchainDB dashboard can be divided into the following high-level solution components, 12 | 13 | ![Solution Diagram](./bdbdashboard.png "Solution Diagram") 14 | 15 | ### Data Source 16 | 17 | The data source of the dashboard will be the web socket of a BigchainDB node. The web socket will provide a stream of data on creation of blocks in the BigchainDB network. 18 | 19 | ### Mapper 20 | 21 | The mapper logic will map specific properties of the transaction assets into generic properties so that the whole solution can be reused across differnt dApps. Basically, this mapper will streamline the asset schemas. 22 | 23 | ### Dashboard UI 24 | 25 | The dashboard UI will be divided into two parts - blocks view and web socket stream view. 26 | -------------------------------------------------------------------------------- /specs/tasks.md: -------------------------------------------------------------------------------- 1 | # Developer Tasks 2 | 3 | 1. Setup react app solution 4 | 1. Setup web-socket connection with test-net 5 | 1. Create mapper logic 6 | 1. Read JSON config 7 | 1. Transform web-socket data based on JSON config 8 | 1. Create react components for dashboard, blocks, transactions, stream view and transaction details based on UI mockups 9 | 1. Package the app into a react component 10 | 1. Test integration with existing react app 11 | 1. Test responsive design and functions -------------------------------------------------------------------------------- /ux/IMG_1767.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bigchaindb/dashboard/35c3a278f7383e87838b8477b9b25d3fb2eeb39f/ux/IMG_1767.JPG -------------------------------------------------------------------------------- /ux/bigchaindb-dashboard-transaction-details-v0-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bigchaindb/dashboard/35c3a278f7383e87838b8477b9b25d3fb2eeb39f/ux/bigchaindb-dashboard-transaction-details-v0-4.png -------------------------------------------------------------------------------- /ux/bigchaindb-dashboard-v0-2-commented.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bigchaindb/dashboard/35c3a278f7383e87838b8477b9b25d3fb2eeb39f/ux/bigchaindb-dashboard-v0-2-commented.png -------------------------------------------------------------------------------- /ux/bigchaindb-dashboard-v0-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bigchaindb/dashboard/35c3a278f7383e87838b8477b9b25d3fb2eeb39f/ux/bigchaindb-dashboard-v0-2.png -------------------------------------------------------------------------------- /ux/bigchaindb-dashboard-v0-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bigchaindb/dashboard/35c3a278f7383e87838b8477b9b25d3fb2eeb39f/ux/bigchaindb-dashboard-v0-3.png -------------------------------------------------------------------------------- /ux/bigchaindb-dashboard-v0-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bigchaindb/dashboard/35c3a278f7383e87838b8477b9b25d3fb2eeb39f/ux/bigchaindb-dashboard-v0-4.png -------------------------------------------------------------------------------- /ux/readme.md: -------------------------------------------------------------------------------- 1 | # BigchainDB Dashboard - UX Assets and Artefacts 2 | 3 | Update –28.5.2018 [Marius] 4 | 5 | Two new layouts added: 6 | 7 | bigchaindb-dashboard-v0-4.png 8 | bigchaindb-dashboard-transaction-details-v0-4.png 9 | 10 | 11 | -- 12 | 13 | Update –25.5.2018 [Marius] 14 | 15 | Plz fing V0.3 a slightly reworked dashboard interface view (bigchaindb-dashboard-v0-3.png). 16 | I think there is much more potential for improvements regarding functionality and also UX & design – Let's work on it when I have some more time … 17 | 18 | Happy GDPR day ;) 19 | Marius 20 | 21 | 22 | -- 23 | 24 | 25 | Update – 18.5.2018 [Marius] 26 | 27 | First dashboard interface design thoughts. 28 | 29 | Blocks contain "transaction cards" which are separated in CREATE and TRANSFER transaction type. 30 | Each transaction contains minimal information – tbd. which are the essential ones. 31 | 32 | Each transaction card has a timestamp and a additional info menu at the bottom (here the user can get additional info e. g. about asset owner, crypto conditions, timestamp …) 33 | To provide even more information to the user, we can provide the functionality to expand each transaction card when the user clicks on it. (tbd) 34 | 35 | On the tab bar of the BDB dashboard the user can switch between different views e. g. a list of assets, transfers or a pure console view. 36 | 37 | Let's build up on this first FE thought :) 38 | I think we have to talk about wording regarding "create>asset" and "transfer>payload" – Possible naming: Transfer > Payload; Transfer > Transaction; Create > Transfer … 39 | --------------------------------------------------------------------------------