diff --git a/.psysh.php b/.psysh.php deleted file mode 100644 index d237947d..00000000 --- a/.psysh.php +++ /dev/null @@ -1,3 +0,0 @@ -command('inspire') - // ->hourly(); + $schedule->command('horizon:snapshot')->everyFiveMinutes(); } /** diff --git a/app/Providers/HorizonServiceProvider.php b/app/Providers/HorizonServiceProvider.php new file mode 100644 index 00000000..f7b18c07 --- /dev/null +++ b/app/Providers/HorizonServiceProvider.php @@ -0,0 +1,32 @@ +environment('production') !== true) { + // we aren’t live so just let us into Horizon + return true; + } + if ($request->session()->has('loggedin')) { + // are we logged in as an authed user + return $request->session()->get('loggedin'); + } + + return false; + }); + } +} diff --git a/changelog.md b/changelog.md index 3296b035..9b3df2b1 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,8 @@ # Changelog +## Version {next} + - Add Laravel Horizon + ## Version 0.6 (2017-09-06) - Update laravel version to 5.5 - Improve .travis.yml and add back dusk tests diff --git a/composer.json b/composer.json index 8d47a8aa..78c96fd5 100644 --- a/composer.json +++ b/composer.json @@ -16,6 +16,7 @@ "jonnybarnes/indieweb": "dev-master", "jonnybarnes/webmentions-parser": "0.4.*", "laravel/framework": "5.5.*", + "laravel/horizon": "^1.0", "laravel/scout": "^3.0", "laravel/tinker": "^1.0", "lcobucci/jwt": "^3.1", diff --git a/composer.lock b/composer.lock index fac17582..224a0680 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "4aa8e5b3bd31788aff471c6f0f650cd7", + "content-hash": "551d407b87a7d9ff3e65969f33605014", "packages": [ { "name": "aws/aws-sdk-php", @@ -180,6 +180,63 @@ ], "time": "2016-08-19T16:43:44+00:00" }, + { + "name": "cakephp/chronos", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/cakephp/chronos.git", + "reference": "0621b191334d8dcb56907688986dd24eb8c38234" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cakephp/chronos/zipball/0621b191334d8dcb56907688986dd24eb8c38234", + "reference": "0621b191334d8dcb56907688986dd24eb8c38234", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "require-dev": { + "athletic/athletic": "~0.1", + "cakephp/cakephp-codesniffer": "~2.3", + "phpbench/phpbench": "@dev", + "phpstan/phpstan": "^0.6.4", + "phpunit/phpunit": "<6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cake\\Chronos\\": "src" + }, + "files": [ + "src/carbon_compat.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "http://nesbot.com" + }, + { + "name": "The CakePHP Team", + "homepage": "http://cakephp.org" + } + ], + "description": "A simple API extension for DateTime.", + "homepage": "http://cakephp.org", + "keywords": [ + "date", + "datetime", + "time" + ], + "time": "2017-04-27T01:27:49+00:00" + }, { "name": "cocur/slugify", "version": "v3.0", @@ -1888,6 +1945,74 @@ ], "time": "2017-09-07T13:50:21+00:00" }, + { + "name": "laravel/horizon", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/horizon.git", + "reference": "856fe55c6d054dc063e71d97c0873013803d96df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/horizon/zipball/856fe55c6d054dc063e71d97c0873013803d96df", + "reference": "856fe55c6d054dc063e71d97c0873013803d96df", + "shasum": "" + }, + "require": { + "cakephp/chronos": "^1.0", + "ext-pcntl": "*", + "ext-posix": "*", + "illuminate/contracts": "~5.5", + "illuminate/queue": "~5.5", + "illuminate/support": "~5.5", + "php": ">=7.1.0", + "predis/predis": "^1.1", + "ramsey/uuid": "^3.5", + "symfony/debug": "~3.3" + }, + "require-dev": { + "mockery/mockery": "~0.9", + "orchestra/database": "~3.5", + "orchestra/testbench": "~3.5", + "phpunit/phpunit": "~6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Horizon\\HorizonServiceProvider" + ], + "aliases": { + "Horizon": "Laravel\\Horizon\\Horizon" + } + } + }, + "autoload": { + "psr-4": { + "Laravel\\Horizon\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Dashboard and code-driven configuration for Laravel queues.", + "keywords": [ + "laravel", + "queue" + ], + "time": "2017-09-06T19:57:45+00:00" + }, { "name": "laravel/scout", "version": "v3.0.7", diff --git a/config/app.php b/config/app.php index c4ce36ec..4469800e 100644 --- a/config/app.php +++ b/config/app.php @@ -204,6 +204,7 @@ return [ App\Providers\AuthServiceProvider::class, // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, + App\Providers\HorizonServiceProvider::class, App\Providers\RouteServiceProvider::class, /* diff --git a/config/horizon.php b/config/horizon.php new file mode 100644 index 00000000..88cece39 --- /dev/null +++ b/config/horizon.php @@ -0,0 +1,66 @@ + 'default', + + /* + |-------------------------------------------------------------------------- + | Queue Wait Time Thresholds + |-------------------------------------------------------------------------- + | + | This option allows you to configure when the LongWaitDetected event + | will be fired. Every connection / queue combination may have its + | own, unique threshold (in seconds) before this event is fired. + | + */ + + 'waits' => [ + 'redis:default' => 60, + ], + + /* + |-------------------------------------------------------------------------- + | Queue Worker Configuration + |-------------------------------------------------------------------------- + | + | Here you may define the queue worker settings used by your application + | in all environments. These supervisors and settings handle all your + | queued jobs and will be provisioned by Horizon during deployment. + | + */ + + 'environments' => [ + 'production' => [ + 'supervisor-1' => [ + 'connection' => 'redis', + 'queue' => ['default'], + 'balance' => 'simple', + 'processes' => 10, + 'tries' => 3, + ], + ], + + 'local' => [ + 'supervisor-1' => [ + 'connection' => 'redis', + 'queue' => ['default'], + 'balance' => 'simple', + 'processes' => 3, + 'tries' => 3, + ], + ], + ], + +]; diff --git a/public/vendor/horizon/css/app.css b/public/vendor/horizon/css/app.css new file mode 100644 index 00000000..d7d1fbe4 --- /dev/null +++ b/public/vendor/horizon/css/app.css @@ -0,0 +1,2 @@ +a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,dialog,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,html,i,iframe,img,ins,kbd,label,legend,li,main,mark,menu,meter,nav,object,ol,output,p,pre,progress,q,rp,rt,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video,xmp{border:0;margin:0;padding:0;font-size:100%}body,html{height:100%}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section{display:block}b,strong{font-weight:700}img{color:transparent;font-size:0;-ms-interpolation-mode:bicubic}ol,ul{list-style:none}li{display:list-item}table{border-collapse:collapse;border-spacing:0}caption,td,th{font-weight:400;vertical-align:top;text-align:left}q{quotes:none}q:after,q:before{content:"";content:none}small,sub,sup{font-size:75%}sub,sup{line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}svg{overflow:hidden}*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}html{font-size:62.5%;-webkit-box-sizing:border-box;box-sizing:border-box;height:100%}body{min-height:100%}h1,h2,h3,h4,h5,h6{font-weight:400}hr{background:none;border-top:1px solid rgba(0,0,0,.2);margin:0}a{text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}button{cursor:pointer;border:none}button,input,textarea{outline:none;font-family:Lato}img{max-width:100%;font-style:italic;vertical-align:middle}img[height],img[width]{max-width:none}body{background:#ebebeb;font-family:Lato}::-webkit-input-placeholder{color:#bbb}::-moz-placeholder{color:#bbb}:-ms-input-placeholder{color:#bbb}:-moz-placeholder{color:#bbb}.wrapper{width:940px;margin-left:auto;margin-right:auto}.main-sidebar{-webkit-box-flex:0;-ms-flex:0 1 16rem;flex:0 1 16rem}.main-content{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.frame{margin-left:-2rem;margin-right:-2rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.frame--xpad [class^=blk]{padding-left:0;padding-right:0}[class^=blk]{padding-left:2rem!important;padding-right:2rem!important}.blk1{width:8.333333333333334%}.blk2{width:16.666666666666668%}.blk3{width:25%}.blk4{width:33.333333333333336%}.blk5{width:41.66666666666667%}.blk6{width:50.00000000000001%}.blk7{width:58.33333333333334%}.blk8{width:66.66666666666667%}.blk9{width:75%}.blk10{width:83.33333333333333%}.blk11{width:91.66666666666666%}.blk12{width:99.99999999999999%}.btn{border-width:1px;border-style:solid;font-weight:600}.btn-default{background-color:#fff;border-color:#fff;color:#7746ec}.btn-primary{background-color:#7746ec;border-color:#7746ec;color:#fff}.btn-link{background-color:transparent;border-color:transparent;color:#424c55}.btn-md{height:34px;font-size:1.4rem;border-radius:3px;padding-left:2rem!important;padding-right:2rem!important}.nav-item{font-size:1.5rem;margin-bottom:2rem}.nav-item-active a.nav-link{color:#7746ec}.nav-item-active a.nav-link>i>svg{fill:#7746ec}.nav-link{display:block;color:#405263}.nav-link>i{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-item-align:center;align-self:center;position:relative;height:1em;width:1em;margin-right:1.5rem}.nav-link>i>svg{width:2rem;height:2rem}.nav-link>i svg{fill:currentColor;fill:#bdbdbd;bottom:-.3em;position:absolute}.nav-link:hover{color:#7746ec}.nav-link:hover>i>svg{fill:#7746ec}.modal{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.7);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.modal-content{background-color:#f8f8f8;border-radius:6px;min-width:400px;overflow:hidden;margin-top:10rem;-ms-flex-item-align:start;align-self:flex-start;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.25);box-shadow:0 2px 4px rgba(0,0,0,.25)}.modal-header{padding:2rem;background-color:#fff}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;padding:2rem}.panel{-webkit-box-shadow:0 2px 3px rgba(0,0,0,.16);box-shadow:0 2px 3px rgba(0,0,0,.16)}.panel-heading{font-size:2.2rem;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding-left:2rem!important;padding-right:2rem!important;color:#252d34;height:6rem}.panel-default{background-color:#fff;border-radius:4px;overflow:hidden}.panel-content{background:#fafafa;overflow-x:scroll}.simple-pagination{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:2rem;border-top-style:solid;border-top-width:1px;border-color:#d8d8d8}.pagination,.simple-pagination{display:-webkit-box;display:-ms-flexbox;display:flex}.pagination{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center;position:relative;font-size:0}.pagination :first-child a,.pagination :last-child a{border:none;position:absolute;top:0;width:auto}.pagination :first-child a>span,.pagination :last-child a>span{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.pagination :first-child a{left:0}.pagination :last-child a{right:0}.pagination .disabled>a{opacity:.3}.pagination>li{margin-left:-1px}.pagination>li.active>a{background-color:#7746ec;color:#fff}.pagination>li>a{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:1.5rem;color:#424c55;border-left-style:solid;border-left-width:1px;border-right-style:solid;border-right-width:1px;border-color:#d8d8d8;cursor:pointer!important;width:4rem;height:4rem}.vab{vertical-align:baseline}.table{max-width:100%;width:100%;border-collapse:collapse;border-spacing:0}.table>thead>tr>th{background-color:#ebecee;height:4.1rem;vertical-align:middle;padding:5px;font-size:1.5rem}.table>tbody>tr:last-child td{border-bottom:none}.table>tbody>tr:hover{background-color:#f5f8fc}.table>tbody>tr>td{vertical-align:middle;height:60px;font-size:1.5rem;border-bottom:1px solid #d8d8d8;color:#424c55;font-weight:300;padding:5px}.table>tbody>tr>td>a{color:#7746ec}.table>tbody>tr>td>i{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-item-align:center;align-self:center;position:relative;height:1em;width:1em;margin-right:1.5rem}.table>tbody>tr>td>i>svg{width:2rem;height:2rem}.table>tbody>tr>td>i svg{bottom:-.3em;position:absolute}.search-input{height:3.4rem;border:2px solid #d8d8d8;border-radius:23px;padding-left:2rem!important;padding-right:2rem!important;font-size:1.5rem;color:#424c55}.stat,.stats{display:-webkit-box;display:-ms-flexbox;display:flex}.stat{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:2rem;-webkit-box-flex:1;-ms-flex:1;flex:1;border-right-style:solid;border-right-width:1px;border-bottom-style:solid;border-bottom-width:1px;border-color:#d8d8d8}.stat-last{border-right:none}.stat-title{color:#5b656e;font-size:1.3rem;text-transform:uppercase;margin-bottom:1rem}.stat-meta{color:#5b656e;font-size:1.5rem;margin-bottom:1rem;color:#252d34}.stat-value{font-size:2.2rem;color:#252d34}.tabs{display:-webkit-box;display:-ms-flexbox;display:flex}.tabs-default{background-color:#fafafa;border-bottom:1px solid #bcbcbc}.tab{margin-left:2rem;margin-right:2rem}.tab-link{height:4.2rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center;font-size:1.5rem;color:#405263;border-top:3px solid transparent;border-bottom:3px solid transparent}.tab-link-active{color:#7746ec;border-bottom:3px solid #7746ec}.xbrdr{border:none}.brdr1{border-width:1px}.brdr1,.brdr2{border-style:solid}.brdr2{border-width:2px}.brdr1--top{border-top-style:solid;border-top-width:1px}.brdr1--left{border-left-style:solid;border-left-width:1px}.brdr1--right{border-right-style:solid;border-right-width:1px}.brdr1--bottom{border-bottom-style:solid;border-bottom-width:1px}.bcg1{border-color:#d8d8d8}.bcg2{border-color:#ebecee}.bcg3{border-color:#424c55}.bcg4{border-color:#252d34}.bcg5{border-color:#4d5e6e}.bcg6{border-color:#fafafa}.bcg7{border-color:#405263}.border-width-1{border-width:1px}.border-bottom-style-solid{border-bottom-style:solid}.border-color-primary{border-color:#7746ec}.border-color-gray-1{border-color:#d8d8d8}.br2{border-radius:2px}.br3{border-radius:3px}.br4{border-radius:4px}.br6{border-radius:6px}.br23{border-radius:23px}.bgtrans{background-color:transparent}.bgw{background-color:#fff}.bg1{background-color:#7746ec}.bgsuccess{background-color:#779356}.bgdanger{background-color:red}.bgg1{background-color:#d8d8d8}.bgg2{background-color:#ebecee}.bgg3{background-color:#424c55}.bgg4{background-color:#252d34}.bgg5{background-color:#4d5e6e}.bgg6{background-color:#fafafa}.bgg7{background-color:#405263}.bgg8{background-color:#5b656e}.bgg9{background-color:#bdbdbd}.bgg10{background-color:#b1b1b1}.bgg11{background-color:#f8f8f8}.tc1{color:#7746ec}.tcw{color:#fff}.tcsuccess{color:#779356}.tcdanger{color:red}.tcg1{color:#d8d8d8}.tcg2{color:#ebecee}.tcg3{color:#424c55}.tcg4{color:#252d34}.tcg5{color:#4d5e6e}.tcg6{color:#fafafa}.tcg7{color:#405263}.tcg8{color:#5b656e}.tcg9{color:#bdbdbd}.tcg10{color:#b1b1b1}.tcg11{color:#f8f8f8}.basic-text{color:#424c55}.bc1{border-color:#7746ec}.bctrans{border-color:transparent}.bcw{border-color:#fff}.fw{fill:#fff}.fcc{fill:currentColor}.f1{fill:#7746ec}.fsuccess{fill:#779356}.fdanger{fill:red}.fwarning{fill:#ff973c}.fg1{fill:#d8d8d8}.fg2{fill:#ebecee}.fg3{fill:#424c55}.fg4{fill:#252d34}.fg5{fill:#4d5e6e}.fg6{fill:#fafafa}.fg7{fill:#405263}.fg8{fill:#5b656e}.fg9{fill:#bdbdbd}.fg10{fill:#b1b1b1}.fg11{fill:#f8f8f8}.h34{height:3.4rem}.w140{width:14rem}.w100\%{width:100%}.db{display:block}.dib{display:inline-block}.dn{display:none}.df{display:-webkit-box;display:-ms-flexbox;display:flex}.flex1{-webkit-box-flex:1;-ms-flex:1;flex:1}.aic{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.aife{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.acc{-ms-flex-line-pack:center;align-content:center}.jcc{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.jcfe{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.jcsb{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.fdr{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.fdc,.fdr{-webkit-box-direction:normal}.fdc{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.fww{-ms-flex-wrap:wrap;flex-wrap:wrap}.ico{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-item-align:center;align-self:center;position:relative}.ico,.ico svg{height:1em;width:1em}.ico-baseline svg{bottom:-.24em;position:absolute}.ico20>svg{width:2rem;height:2rem}.circle{border-radius:99px}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.spin{-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}.pointer{cursor:pointer!important}.fade-enter-active,.fade-leave-active{-webkit-transition:opacity .2s;transition:opacity .2s}.fade-enter,.fade-leave-to{opacity:0}.form-control{font-family:inherit;display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-webkit-box-shadow:none;box-shadow:none;border:2px solid #d7d7d7}.mh2{margin-left:2rem;margin-right:2rem}.mt10{margin-top:10rem}.ml1{margin-left:1rem}.ml1\.5{margin-left:1.5rem}.ml2{margin-left:2rem}.mr0\.5{margin-right:.5rem}.mr1{margin-right:1rem}.mr1\.5{margin-right:1.5rem}.mr2{margin-right:2rem}.mb1{margin-bottom:1rem}.mb1\.5{margin-bottom:1.5rem}.mb2{margin-bottom:2rem}.mb3{margin-bottom:3rem}.mv1{margin-top:1rem;margin-bottom:1rem}.mv2{margin-top:2rem;margin-bottom:2rem}.mv3{margin-top:3rem;margin-bottom:3rem}.mv4{margin-top:4rem;margin-bottom:4rem}.pa2{padding:2rem}.pa4{padding:4rem}.pa6{padding:6rem}.pa8{padding:8rem}.pb1{padding-bottom:1rem}.pb1\.5{padding-bottom:1.5rem}.pb2{padding-bottom:2rem}.pb3{padding-bottom:3rem}.pl1{padding-left:1rem}.pl1\.5{padding-left:1.5rem}.pl2{padding-left:2rem!important}.ph1{padding-left:1rem;padding-right:1rem}.ph2{padding-left:2rem!important;padding-right:2rem!important}.pv1{padding-top:1rem;padding-bottom:1rem}.pv2{padding-top:2rem;padding-bottom:2rem}.pv3{padding-top:3rem;padding-bottom:3rem}.pr3{padding-right:3rem}.uppercase{text-transform:uppercase}.sans{font-family:Lato}.ft13{font-size:1.3rem}.ft14{font-size:1.4rem}.ft15{font-size:1.5rem}.ft22{font-size:2.2rem}.fw1{font-weight:100}.fw2{font-weight:200}.fw3{font-weight:300}.fw4{font-weight:400}.fw5{font-weight:500}.fw6{font-weight:600}.fw7{font-weight:700}.fw8{font-weight:800}.fw9{font-weight:900}.tal{text-align:left}.tac{text-align:center}.tar{text-align:right}.lh1{line-height:1}.lh1\.1{line-height:1.1}.lh1\.2{line-height:1.2}.lh1\.3{line-height:1.3}.lh1\.4{line-height:1.4}.lh1\.5{line-height:1.5}.lh1\.6{line-height:1.6}.lh1\.7{line-height:1.7}.lh1\.8{line-height:1.8}.lh1\.9{line-height:1.9}.lh2{line-height:2}.jobDetailsText{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;overflow-y:scroll;max-height:400px}.jobDetailsText pre,.jobDetailsText span{margin-bottom:5px;display:block;background:#efefef;padding:1px 3px} +/*# sourceMappingURL=app.css.map*/ \ No newline at end of file diff --git a/public/vendor/horizon/css/app.css.map b/public/vendor/horizon/css/app.css.map new file mode 100644 index 00000000..0dfa3187 --- /dev/null +++ b/public/vendor/horizon/css/app.css.map @@ -0,0 +1 @@ +{"version":3,"file":"/css/app.css","sources":[],"mappings":"","sourceRoot":""} \ No newline at end of file diff --git a/public/vendor/horizon/img/horizon.svg b/public/vendor/horizon/img/horizon.svg new file mode 100644 index 00000000..8cce2850 --- /dev/null +++ b/public/vendor/horizon/img/horizon.svg @@ -0,0 +1,13 @@ + + \ No newline at end of file diff --git a/public/vendor/horizon/img/sprite.svg b/public/vendor/horizon/img/sprite.svg new file mode 100644 index 00000000..b90154aa --- /dev/null +++ b/public/vendor/horizon/img/sprite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/vendor/horizon/js/app.js b/public/vendor/horizon/js/app.js new file mode 100644 index 00000000..1a0c5c35 --- /dev/null +++ b/public/vendor/horizon/js/app.js @@ -0,0 +1,2 @@ +!function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=0)}({"+66z":function(t,e){function n(t){return i.call(t)}var r=Object.prototype,i=r.toString;t.exports=n},"+ItH":function(t,e,n){"use strict";t.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('