├── .gitignore ├── README.md ├── elm-package.json ├── examples ├── article │ ├── .DS_Store │ ├── dist │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── js │ │ │ └── main.2ee6e429.js │ │ └── static │ │ │ └── media │ │ │ └── panda.12f77371.jpg │ ├── elm-package.json │ └── src │ │ ├── .DS_Store │ │ ├── Main.elm │ │ ├── Ports.elm │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── index.js │ │ ├── main.css │ │ └── panda.jpg └── document │ ├── .DS_Store │ ├── dist │ ├── favicon.ico │ ├── index.html │ ├── js │ │ └── main.eab5c38b.js │ └── static │ │ └── media │ │ └── panda.12f77371.jpg │ ├── elm-package.json │ └── src │ ├── .DS_Store │ ├── Main.elm │ ├── Ports.elm │ ├── favicon.ico │ ├── index.html │ ├── index.js │ ├── main.css │ └── panda.jpg └── src └── ScrollProgress.elm /.gitignore: -------------------------------------------------------------------------------- 1 | elm-stuff 2 | elm.js 3 | examples 4 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # elm-scroll-progress 2 | 3 | Add a scroll progress indicator and track the `scrollTop` position of your app or a specific element. 4 | 5 | ```shell 6 | elm package install chrisbuttery/elm-scroll-progress 7 | ``` 8 | 9 | ### Examples 10 | You can scope to a specific element (e.g. and article) or to the document. 11 | 12 | [Article](http://chrisbuttery.github.io/elm-scroll-progress/examples/article/dist/index.html) | [Document](http://chrisbuttery.github.io/elm-scroll-progress/examples/document/dist/index.html) 13 | 14 | ## Usage 15 | 16 | 1. Import the module. 17 | 2. Create a new parent Msg type referencing the `ScrollProgress` `Msg`. 18 | 3. Subscribe to an incoming port, ensuring incoming data is passed back to `ScrollProgress.Progress`. 19 | 4. Cater for the ProgressMsg in your `update` function. 20 | 5. Map emitted messages from `ScrollProgress.view` to the type teh parent view expects (Msg). 21 | 22 | 23 | ```elm 24 | module Main exposing (..) 25 | import ScrollProgress exposing (..) 26 | 27 | -- MESSAGES 28 | 29 | type Msg 30 | = ProgressMsg ScrollProgress.Msg 31 | 32 | -- SUBSCRIPTIONS 33 | 34 | subscriptions : Model -> Sub Msg 35 | subscriptions model = 36 | Ports.onScroll (ProgressMsg << ScrollProgress.Progress) 37 | 38 | -- UPDATE 39 | 40 | update : Msg -> AppModel -> ( AppModel, Cmd Msg ) 41 | update message model = 42 | case message of 43 | ProgressMsg subMsg -> 44 | let 45 | ( updatedProgessModel, progressCmd ) = 46 | ScrollProgress.update subMsg model.progressModel 47 | in 48 | ( { model | progressModel = updatedProgessModel }, Cmd.map ProgressMsg progressCmd ) 49 | 50 | --VIEW 51 | 52 | view : AppModel -> Html Msg 53 | view model = 54 | Html.div [] 55 | [ Html.App.map ProgressMsg (ScrollProgress.view model.progressModel) 56 | , Html.h1 [] [ text "Read this " ] 57 | , Html.div [] [ text "Some article..." ] 58 | ] 59 | ``` 60 | 61 | Define an incoming port in your `Ports.elm` so JavaScript can pass in scrolling attributes. 62 | 63 | ```elm 64 | port module Ports exposing (..) 65 | import ProgressBar exposing (ScrollAttributes) 66 | 67 | port onScroll : (ScrollAttributes -> msg) -> Sub msg 68 | ``` 69 | 70 | In your JavaScript, add an eventListener to listen for the "scroll" event on the `window`. 71 | You can choose to target the document or a specifc element's `targetScrollHeight`. 72 | 73 | ```js 74 | var app = Elm.Main.embed(root); 75 | 76 | var target = document.querySelector('.some-article'); 77 | // or target the full page height with: 78 | // target = document.documentElement; 79 | 80 | window.addEventListener('scroll', function() { 81 | app.ports.onScroll.send({ 82 | scrollTop: document.documentElement.scrollTop || document.body.scrollTop, 83 | targetScrollHeight: target.scrollHeight, 84 | clientHeight: document.documentElement.clientHeight 85 | }); 86 | }); 87 | ``` 88 | Note: For this to work in Firefox, we need to check for `document.documentElement.scrollTop` otherwise fallback to `document.body.scrollTop`. 89 | 90 | ## Overrides 91 | 92 | All types for defining colors are `Maybe String`. 93 | By default, the color of the progress scale is defined as `Just #1684f6` however these `String` values can be whatever CSS colors you wish e.g: `"#336699"`, `"honeydew"`, `"rgba(0,0,0,0.5)"`, etc. 94 | 95 | You can choose to overide this color or include a linear gradient. 96 | 97 | To override the color of the element, define a new model for the Child inside of the Parent. 98 | 99 | ```elm 100 | module Main exposing (..) 101 | import ScrollProgress exposing (..) 102 | 103 | type alias AppModel = 104 | { progressModel : ScrollProgress.Model 105 | } 106 | 107 | newChildModel : ScrollProgress.Model 108 | newChildModel = 109 | { progress = 0 110 | , color = Just "hotpink" 111 | , from = Nothing 112 | , to = Nothing 113 | } 114 | 115 | initialModel : AppModel 116 | initialModel = 117 | { progressModel = newChildModel } 118 | ``` 119 | 120 | To replace a flat color for a linear gradient, populate the `from` and `to` properties. 121 | 122 | ```elm 123 | newChildModel : ScrollProgress.Model 124 | newChildModel = 125 | { progress = 0 126 | , color = Nothing 127 | , from = Just "lightseagreen" 128 | , to = Just "lightsalmon" 129 | } 130 | ``` 131 | 132 | # Building examples 133 | 134 | Install [Create Elm App](https://github.com/halfzebra/create-elm-app) and run `elm-app build` or `elm-app start` inside of `examples/article` & `examples/body`. 135 | 136 | Thanks goes to [Michael Troy](https://github.com/michaeltroy) for creating the examples. 137 | 138 | > [chrisbuttery.com](http://chrisbuttery.com)  ·  139 | > GitHub [@chrisbuttery](https://github.com/chrisbuttery)  ·  140 | > Twitter [@buttahz](https://twitter.com/buttahz)  ·  141 | > elm-lang slack [@butters](http://elmlang.herokuapp.com/) 142 | -------------------------------------------------------------------------------- /elm-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.3", 3 | "summary": "A scroll progress indicator", 4 | "repository": "https://github.com/chrisbuttery/elm-scroll-progress.git", 5 | "license": "BSD3", 6 | "source-directories": [ 7 | "src" 8 | ], 9 | "exposed-modules": [ 10 | "ScrollProgress" 11 | ], 12 | "dependencies": { 13 | "elm-lang/core": "4.0.5 <= v < 5.0.0", 14 | "elm-lang/html": "1.1.0 <= v < 2.0.0" 15 | }, 16 | "elm-version": "0.17.1 <= v < 0.18.0" 17 | } 18 | -------------------------------------------------------------------------------- /examples/article/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisbuttery/elm-scroll-progress/3e4dd2c1812812f878ba4bf3435b2380b43c6c1c/examples/article/.DS_Store -------------------------------------------------------------------------------- /examples/article/dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisbuttery/elm-scroll-progress/3e4dd2c1812812f878ba4bf3435b2380b43c6c1c/examples/article/dist/favicon.ico -------------------------------------------------------------------------------- /examples/article/dist/index.html: -------------------------------------------------------------------------------- 1 | Elm App

The Happy Panda

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Story written by The Happy Panda

-------------------------------------------------------------------------------- /examples/article/dist/js/main.2ee6e429.js: -------------------------------------------------------------------------------- 1 | !function(t){function r(n){if(e[n])return e[n].exports;var o=e[n]={exports:{},id:n,loaded:!1};return t[n].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}var e={};return r.m=t,r.c=e,r.p="",r(0)}([function(t,r,e){t.exports=e(1)},function(t,r,e){e(2);const n=e(7),o=document.getElementById("root"),a=n.Main.embed(o),i=document.querySelector(".article");window.addEventListener("scroll",function(){a.ports.onScroll.send({scrollTop:document.documentElement.scrollTop||document.body.scrollTop,targetScrollHeight:i.scrollHeight,clientHeight:document.documentElement.clientHeight})})},function(t,r,e){var n=e(3);"string"==typeof n&&(n=[[t.id,n,""]]);e(6)(n,{});n.locals&&(t.exports=n.locals)},function(t,r,e){r=t.exports=e(4)(),r.push([t.id,'body{background:#ccc;height:2000px;margin:0;position:relative}#root{left:0;position:fixed;top:0;width:100%;z-index:20}.scroll-progress{font-size:12px;font:menu;height:4px}.article{background:#fff;border-radius:2px;border:1px solid #c1c1c1;font:menu;margin:60px auto;max-width:800px;padding:30px;position:relative;width:80%;z-index:10}.article:after{background:#fff;box-shadow:0 10px 10px #b2b2b2;content:"";height:100%;left:0;position:absolute;top:0;width:100%;z-index:-10}h1{font-family:Libre Baskerville,serif;font-size:3.3em;padding:30px 0 50px;text-align:center}h1,p{color:rgba(0,0,0,.8)}p{font-family:Open Sans,sans-serif;font-size:21px;line-height:1.58;margin:0;text-indent:30px}p:first-of-type{text-indent:0}p:first-of-type:first-letter{background-color:#699933;border:4px solid #577f2a;color:#fff;float:left;font-family:Georgia;font-size:60px;line-height:50px;margin:10px 30px 10px 10px;padding:20px}p:nth-of-type(2){border-left:4px solid rgba(105,153,51,.15);color:#577f2a;font-family:Libre Baskerville,serif;margin:30px 10px;padding:0 20px 0 30px;text-indent:0}p:nth-of-type(4){color:#c6c6c6;font-family:Libre Baskerville;font-size:15px;margin-top:20px}.panda{background:url('+e(5)+") no-repeat 50%;background-size:cover;height:400px;margin:20px 20px 40px 0;width:100%}",""])},function(t,r){t.exports=function(){var t=[];return t.toString=function(){for(var t=[],r=0;r=0&&b.splice(r,1)}function u(t){var r=document.createElement("style");return r.type="text/css",a(t,r),r}function c(t){var r=document.createElement("link");return r.rel="stylesheet",a(t,r),r}function l(t,r){var e,n,o;if(r.singleton){var a=m++;e=v||(v=u(r)),n=f.bind(null,e,a,!1),o=f.bind(null,e,a,!0)}else t.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(e=c(r),n=s.bind(null,e),o=function(){i(e),e.href&&URL.revokeObjectURL(e.href)}):(e=u(r),n=_.bind(null,e),o=function(){i(e)});return n(t),function(r){if(r){if(r.css===t.css&&r.media===t.media&&r.sourceMap===t.sourceMap)return;n(t=r)}else o()}}function f(t,r,e,n){var o=e?"":n.css;if(t.styleSheet)t.styleSheet.cssText=y(r,o);else{var a=document.createTextNode(o),i=t.childNodes;i[r]&&t.removeChild(i[r]),i.length?t.insertBefore(a,i[r]):t.appendChild(a)}}function _(t,r){var e=r.css,n=r.media;if(n&&t.setAttribute("media",n),t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}function s(t,r){var e=r.css,n=r.sourceMap;n&&(e+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */");var o=new Blob([e],{type:"text/css"}),a=t.href;t.href=URL.createObjectURL(o),a&&URL.revokeObjectURL(a)}var d={},h=function(t){var r;return function(){return"undefined"==typeof r&&(r=t.apply(this,arguments)),r}},p=h(function(){return/msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase())}),g=h(function(){return document.head||document.getElementsByTagName("head")[0]}),v=null,m=0,b=[];t.exports=function(t,r){r=r||{},"undefined"==typeof r.singleton&&(r.singleton=p()),"undefined"==typeof r.insertAt&&(r.insertAt="bottom");var e=o(t);return n(e,r),function(t){for(var a=[],i=0;i=J(r))throw new Error("Index "+t+" is out of range. Check the length of your array first or use getMaybe or getWithDefault.");return n(t,r)}function n(t,r){for(var e=r.height;e>0;e--){for(var n=t>>5*e;r.lengths[n]<=t;)n++;n>0&&(t-=r.lengths[n-1]),r=r.table[n]}return r.table[t]}function o(t,r,e){return t<0||J(e)<=t?e:a(t,r,e)}function a(t,r,e){if(e=P(e),0===e.height)e.table[t]=r;else{var n=I(t,e);n>0&&(t-=e.lengths[n-1]),e.table[n]=a(t,r,e.table[n])}return e}function i(t,r){if(t<=0)return K;var e=Math.floor(Math.log(t)/Math.log(W));return u(r,e,0,t)}function u(t,r,e,n){if(0===r){for(var o=new Array((n-e)%(W+1)),a=0;a0?c[a-1]:0);return{ctor:"_Array",height:r,table:o,lengths:c}}function c(t){if("[]"===t.ctor)return K;for(var r=new Array(W),e=[],n=0;"[]"!==t.ctor;)if(r[n]=t._0,t=t._1,n++,n===W){var o={ctor:"_Array",height:0,table:r};f(o,e),r=new Array(W),n=0}if(n>0){var o={ctor:"_Array",height:0,table:r.splice(0,n)};f(o,e)}for(var a=0;a0&&f(e[a],e);var i=e[e.length-1];return i.height>0&&1===i.table.length?i.table[0]:i}function f(t,r){var e=t.height;if(r.length===e){var n={ctor:"_Array",height:e+1,table:[],lengths:[]};r.push(n)}r[e].table.push(t);var o=J(t);r[e].lengths.length>0&&(o+=r[e].lengths[r[e].lengths.length-1]),r[e].lengths.push(o),r[e].table.length===W&&(f(r[e],r),r[e]={ctor:"_Array",height:e+1,table:[],lengths:[]})}function _(t,r){var e=s(t,r);if(null!==e)return e;var n=U(t,r.height);return q(r,n)}function s(t,r){if(0===r.height){if(r.table.length=0;e--)t=0===r.height?R.Cons(r.table[e],t):h(t,r.table[e]);return t}function p(t,r){var e={ctor:"_Array",height:r.height,table:new Array(r.table.length)};r.height>0&&(e.lengths=r.lengths);for(var n=0;n0&&(n.lengths=r.lengths);for(var o=0;o0?r.lengths[n-1]:0),r.table[n]);if(0===n)return o;var e={ctor:"_Array",height:r.height,table:r.table.slice(0,n),lengths:r.lengths.slice(0,n)};return o.table.length>0&&(e.table[n]=o,e.lengths[n]=J(o)+(n>0?e.lengths[n-1]:0)),e}function T(t,r){if(0===t)return r;if(0===r.height){var e={ctor:"_Array",height:0};return e.table=r.table.slice(t,r.table.length+1),e}var n=I(t,r),o=T(t-(n>0?r.lengths[n-1]:0),r.table[n]);if(n===r.table.length-1)return o;var e={ctor:"_Array",height:r.height,table:r.table.slice(n,r.table.length+1),lengths:new Array(r.table.length-n)};e.table[0]=o;for(var a=0,i=0;i0){for(var n=J(e[0]),o=0;o0){var a=A(t,r);a>$&&(e=C(e[0],e[1],a))}return q(e[0],e[1])}function B(t,r){if(0===t.height&&0===r.height)return[t,r];if(1!==t.height||1!==r.height)if(t.height===r.height){t=P(t),r=P(r);var e=B(M(t),j(r));x(t,e[1]),N(r,e[0])}else if(t.height>r.height){t=P(t);var e=B(M(t),r);x(t,e[0]),r=z(e[1],e[1].height+1)}else{r=P(r);var e=B(t,j(r)),n=0===e[0].table.length?0:1,o=0===n?1:0;N(r,e[n]),t=z(e[o],e[o].height+1)}if(0===t.table.length||0===r.table.length)return[t,r];var a=A(t,r);return a<=$?[t,r]:C(t,r,a)}function x(t,r){var e=t.table.length-1;t.table[e]=r,t.lengths[e]=J(r),t.lengths[e]+=e>0?t.lengths[e-1]:0}function N(t,r){if(r.table.length>0){t.table[0]=r,t.lengths[0]=J(r);for(var e=J(t.table[0]),n=1;n0&&(e.lengths=new Array(r)),e}function C(t,r,e){for(var n=L(t.height,Math.min(W,t.table.length+r.table.length-e)),o=L(t.height,n.table.length-(t.table.length+r.table.length-e)),a=0;E(t.table,r.table,a).table.length%W===0;)S(n.table,o.table,a,E(t.table,r.table,a)),S(n.lengths,o.lengths,a,E(t.lengths,r.lengths,a)),a++;for(var i=a,u=new L(t.height-1,0),c=0;a-i-(u.table.length>0?1:0)0)for(var _=u.lengths.length,s=_;s<_+f-c;s++)u.lengths[s]=J(u.table[s]),u.lengths[s]+=s>0?u.lengths[s-1]:0;c+=f,l.table.length<=f&&(a++,c=0),u.table.length===W&&(O(n,o,i,u),u=L(t.height-1,0),i++)}for(u.table.length>0&&(O(n,o,i,u),i++);a0&&(r.lengths=t.lengths.slice()),r}function J(t){return 0===t.height?t.table.length:t.lengths[t.lengths.length-1]}function I(t,r){for(var e=t>>5*r.height;r.lengths[e]<=t;)e++;return e}function U(t,r){return 0===r?{ctor:"_Array",height:0,table:[t]}:{ctor:"_Array",height:r,table:[U(t,r-1)],lengths:[1]}}function z(t,r){return r===t.height?t:{ctor:"_Array",height:r,table:[z(t,r-1)],lengths:[J(t)]}}function q(t,r){return{ctor:"_Array",height:t.height+1,table:[t,r],lengths:[J(t),J(t)+J(r)]}}function F(t){var r=new Array(J(t));return D(r,0,t),r}function D(t,r,e){for(var n=0;n0?i[u-1]:0);return{ctor:"_Array",height:r,table:a,lengths:i}}var W=32,$=2,K={ctor:"_Array",height:0,table:[]};return{empty:K,fromList:c,toList:d,initialize:r(i),append:r(w),push:r(_),slice:e(y),get:r(t),set:e(o),map:r(p),indexedMap:r(g),foldl:e(m),foldr:e(b),length:J,toJSArray:F,fromJSArray:H}}(),h=function(){function t(t,r){return t/r|0}function n(t,r){return t%r}function o(t,r){if(0===r)throw new Error("Cannot perform mod 0. Division by zero error.");var e=t%r,n=0===t?0:r>0?t>=0?e:e+r:-o(-t,-r);return n===r?0:n}function a(t,r){return Math.log(r)/Math.log(t)}function i(t){return-t}function u(t){return t<0?-t:t}function c(t,r){return p.cmp(t,r)<0?t:r}function l(t,r){return p.cmp(t,r)>0?t:r}function f(t,r,e){return p.cmp(e,t)<0?t:p.cmp(e,r)>0?r:e}function _(t,r){return{ctor:k[p.cmp(t,r)+1]}}function s(t,r){return t!==r}function d(t){return!t}function h(t){return t===1/0||t===-(1/0)}function g(t){return 0|t}function v(t){return t*Math.PI/180}function m(t){return 2*Math.PI*t}function b(t){var r=t._0,e=t._1;return p.Tuple2(r*Math.cos(e),r*Math.sin(e))}function y(t){var r=t._0,e=t._1;return p.Tuple2(Math.sqrt(r*r+e*e),Math.atan2(e,r))}var k=["LT","EQ","GT"];return{div:r(t),rem:r(n),mod:r(o),pi:Math.PI,e:Math.E,cos:Math.cos,sin:Math.sin,tan:Math.tan,acos:Math.acos,asin:Math.asin,atan:Math.atan,atan2:r(Math.atan2),degrees:v,turns:m,fromPolar:b,toPolar:y,sqrt:Math.sqrt,logBase:r(a),negate:i,abs:u,min:r(c),max:r(l),clamp:e(f),compare:r(_),xor:r(s),not:d,truncate:g,ceiling:Math.ceil,floor:Math.floor,round:Math.round,toFloat:function(t){return t},isNaN:isNaN,isInfinite:h}}(),p=function(){function t(t,r){for(var n,o=[],a=e(t,r,0,o);a&&(n=o.pop());)a=e(n.x,n.y,0,o);return a}function e(t,r,n,o){if(n>100)return o.push({x:t,y:r}),!0;if(t===r)return!0;if("object"!=typeof t){if("function"==typeof t)throw new Error('Trying to use `(==)` on functions. There is no way to know if functions are "the same" in the Elm sense. Read more about this at http://package.elm-lang.org/packages/elm-lang/core/latest/Basics#== which describes why it is this way and what the better version will look like.');return!1}if(null===t||null===r)return!1;if(t instanceof Date)return t.getTime()===r.getTime();if(!("ctor"in t)){for(var a in t)if(!e(t[a],r[a],n+1,o))return!1;return!0}if("RBNode_elm_builtin"!==t.ctor&&"RBEmpty_elm_builtin"!==t.ctor||(t=at(t),r=at(r)),"Set_elm_builtin"===t.ctor&&(t=_elm_lang$core$Set$toList(t),r=_elm_lang$core$Set$toList(r)),"::"===t.ctor){for(var i=t,u=r;"::"===i.ctor&&"::"===u.ctor;){if(!e(i._0,u._0,n+1,o))return!1;i=i._1,u=u._1}return i.ctor===u.ctor}if("_Array"===t.ctor){var c=d.toJSArray(t),l=d.toJSArray(r);if(c.length!==l.length)return!1;for(var f=0;f=1){if(a=n(t._0,r._0),a!==v)return a;if(i>=2){if(a=n(t._1,r._1),a!==v)return a;if(i>=3){if(a=n(t._2,r._2),a!==v)return a;if(i>=4){if(a=n(t._3,r._3),a!==v)return a;if(i>=5){if(a=n(t._4,r._4),a!==v)return a;if(i>=6){if(a=n(t._5,r._5),a!==v)return a;if(i>=7)throw new Error("Comparison error: "+u)}}}}}}return v}throw new Error("Comparison error: comparison is only defined on ints, floats, times, chars, strings, lists of comparable values, and tuples of comparable values.")}function o(t,r){return{ctor:"_Tuple2",_0:t,_1:r}}function a(t){return new String(t)}function i(t){return y++}function u(t,r){var e={};for(var n in t){var o=n in r?r[n]:t[n];e[n]=o}return e}function c(t,r){return{ctor:"::",_0:t,_1:r}}function l(t,r){if("string"==typeof t)return t+r;if("[]"===t.ctor)return r;var e=c(t._0,k),n=e;for(t=t._1;"[]"!==t.ctor;)n._1=c(t._0,k),t=t._1,n=n._1;return n._1=r,e}function f(t,r){return function(e){throw new Error("Ran into a `Debug.crash` in module `"+t+"` "+s(r)+"\nThe message provided by the code author is:\n\n "+e)}}function _(t,r,e){return function(n){throw new Error("Ran into a `Debug.crash` in module `"+t+"`\n\nThis was caused by the `case` expression "+s(r)+".\nOne of the branches ended with a crash and the following value got through:\n\n "+h(e)+"\n\nThe message provided by the code author is:\n\n "+n)}}function s(t){return t.start.line==t.end.line?"on line "+t.start.line:"between lines "+t.start.line+" and "+t.end.line}function h(t){var r=typeof t;if("function"===r){var e=t.func?t.func.name:t.name;return""}if("boolean"===r)return t?"True":"False";if("number"===r)return t+"";if(t instanceof String)return"'"+p(t,!0)+"'";if("string"===r)return'"'+p(t,!1)+'"';if(null===t)return"null";if("object"===r&&"ctor"in t){var n=t.ctor.substring(0,5);if("_Tupl"===n){var o=[];for(var a in t)"ctor"!==a&&o.push(h(t[a]));return"("+o.join(",")+")"}if("_Task"===n)return"";if("_Array"===t.ctor){var i=F(t);return"Array.fromList "+h(i)}if(""===t.ctor)return"";if("_Process"===t.ctor)return"";if("::"===t.ctor){var o="["+h(t._0);for(t=t._1;"::"===t.ctor;)o+=","+h(t._0),t=t._1;return o+"]"}if("[]"===t.ctor)return"[]";if("Set_elm_builtin"===t.ctor)return"Set.fromList "+h(_elm_lang$core$Set$toList(t));if("RBNode_elm_builtin"===t.ctor||"RBEmpty_elm_builtin"===t.ctor)return"Dict.fromList "+h(at(t));var o="";for(var u in t)if("ctor"!==u){var c=h(t[u]),l=c[0],f="{"===l||"("===l||"<"===l||'"'===l||c.indexOf(" ")<0;o+=" "+(f?c:"("+c+")")}return t.ctor+o}if("object"===r){if(t instanceof Date)return"<"+t.toString()+">";if(t.elm_web_socket)return"";var o=[];for(var a in t)o.push(a+" = "+h(t[a]));return 0===o.length?"{}":"{ "+o.join(", ")+" }"}return""}function p(t,r){var e=t.replace(/\\/g,"\\\\").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r").replace(/\v/g,"\\v").replace(/\0/g,"\\0");return r?e.replace(/\'/g,"\\'"):e.replace(/\"/g,'\\"')}var g=-1,v=0,m=1,b={ctor:"_Tuple0"},y=0,k={ctor:"[]"};return{eq:t,cmp:n,Tuple0:b,Tuple2:o,chr:a,update:u,guid:i,append:r(l),crash:f,crashCase:_,toString:h}}(),g=(r(function(t,r){var e=r;return l(t,e._0,e._1)}),e(function(t,r,e){return t({ctor:"_Tuple2",_0:r,_1:e})}),e(function(t,r,e){return l(t,e,r)}),r(function(t,r){return t})),v=v||{};v["<|"]=r(function(t,r){return t(r)});var v=v||{};v["|>"]=r(function(t,r){return r(t)});var v=v||{};v[">>"]=e(function(t,r,e){return r(t(e))});var v=v||{};v["<<"]=e(function(t,r,e){return t(r(e))});var v=v||{};v["++"]=p.append;var m=p.toString,b=(h.isInfinite,h.isNaN,h.toFloat),y=h.ceiling,k=(h.floor,h.truncate,h.round,h.not),v=(h.xor,v||{});v["||"]=h.or;var v=v||{};v["&&"]=h.and;var T=(h.max,h.min,h.compare),v=v||{};v[">="]=h.ge;var v=v||{};v["<="]=h.le;var v=v||{};v[">"]=h.gt;var v=v||{};v["<"]=h.lt;var v=v||{};v["/="]=h.neq;var v=v||{};v["=="]=h.eq;var v=(h.e,h.pi,h.clamp,h.logBase,h.abs,h.negate,h.sqrt,h.atan2,h.atan,h.asin,h.acos,h.tan,h.sin,h.cos,v||{});v["^"]=h.exp;var v=v||{};v["%"]=h.mod;var v=(h.rem,v||{});v["//"]=h.div;var v=v||{};v["/"]=h.floatDiv;var v=v||{};v["*"]=h.mul;var v=v||{};v["-"]=h.sub;var v=v||{};v["+"]=h.add;var w=(h.toPolar,h.fromPolar,h.turns,h.degrees,r(function(t,r){var e=r;return"Just"===e.ctor?e._0:t})),B={ctor:"Nothing"},x=(r(function(t,r){var e=t;return"Just"===e.ctor?r(e._0):B}),function(t){return{ctor:"Just",_0:t}}),R=(r(function(t,r){var e=r;return"Just"===e.ctor?x(t(e._0)):B}),e(function(t,r,e){var n={ctor:"_Tuple2",_0:r,_1:e};return"_Tuple2"===n.ctor&&"Just"===n._0.ctor&&"Just"===n._1.ctor?x(l(t,n._0._0,n._1._0)):B}),n(function(t,r,e,n){var o={ctor:"_Tuple3",_0:r,_1:e,_2:n};return"_Tuple3"===o.ctor&&"Just"===o._0.ctor&&"Just"===o._1.ctor&&"Just"===o._2.ctor?x(f(t,o._0._0,o._1._0,o._2._0)):B}),o(function(t,r,e,n,o){var a={ctor:"_Tuple4",_0:r,_1:e,_2:n,_3:o};return"_Tuple4"===a.ctor&&"Just"===a._0.ctor&&"Just"===a._1.ctor&&"Just"===a._2.ctor&&"Just"===a._3.ctor?x(_(t,a._0._0,a._1._0,a._2._0,a._3._0)):B}),a(function(t,r,e,n,o,a){var i={ctor:"_Tuple5",_0:r,_1:e,_2:n,_3:o,_4:a};return"_Tuple5"===i.ctor&&"Just"===i._0.ctor&&"Just"===i._1.ctor&&"Just"===i._2.ctor&&"Just"===i._3.ctor&&"Just"===i._4.ctor?x(s(t,i._0._0,i._1._0,i._2._0,i._3._0,i._4._0)):B}),function(){function t(t,r){return{ctor:"::",_0:t,_1:r}}function i(r){for(var e=k,n=r.length;n--;)e=t(r[n],e);return e}function u(t){for(var r=[];"[]"!==t.ctor;)r.push(t._0),t=t._1;return r}function c(r,e){var n=k;if(r<=e)do n=t(e,n);while(e-- >r);return n}function d(t,r,e){for(var n=u(e),o=r,a=n.length;a--;)o=l(t,n[a],o);return o}function h(t,r,e){for(var n=[];"[]"!==r.ctor&&"[]"!==e.ctor;)n.push(l(t,r._0,e._0)),r=r._1,e=e._1;return i(n)}function g(t,r,e,n){for(var o=[];"[]"!==r.ctor&&"[]"!==e.ctor&&"[]"!==n.ctor;)o.push(f(t,r._0,e._0,n._0)),r=r._1,e=e._1,n=n._1;return i(o)}function v(t,r,e,n,o){for(var a=[];"[]"!==r.ctor&&"[]"!==e.ctor&&"[]"!==n.ctor&&"[]"!==o.ctor;)a.push(_(t,r._0,e._0,n._0,o._0)),r=r._1,e=e._1,n=n._1,o=o._1;return i(a)}function m(t,r,e,n,o,a){for(var u=[];"[]"!==r.ctor&&"[]"!==e.ctor&&"[]"!==n.ctor&&"[]"!==o.ctor&&"[]"!==a.ctor;)u.push(s(t,r._0,e._0,n._0,o._0,a._0)),r=r._1,e=e._1,n=n._1,o=o._1,a=a._1;return i(u)}function b(t,r){return i(u(r).sort(function(r,e){return p.cmp(t(r),t(e))}))}function y(t,r){return i(u(r).sort(function(r,e){var n=t(r)(e).ctor;return"EQ"===n?0:"LT"===n?-1:1}))}var k={ctor:"[]"};return{Nil:k,Cons:t,cons:r(t),toArray:u,fromArray:i,range:c,foldr:e(d),map2:e(h),map3:n(g),map4:o(v),map5:a(m),sortBy:r(b),sortWith:r(y)}}()),N=(R.sortWith,R.sortBy,r(function(t,r){for(;;){if(p.cmp(t,0)<1)return r;var e=r;if("[]"===e.ctor)return r;var n=t-1,o=e._1;t=n,r=o}}),R.map5,R.map4,R.map3,R.map2),A=r(function(t,r){for(;;){var e=r;if("[]"===e.ctor)return!1;if(t(e._0))return!0;var n=t,o=e._1;t=n,r=o}}),E=(r(function(t,r){return k(l(A,function(r){return k(t(r))},r))}),R.foldr),S=e(function(t,r,e){for(;;){var n=e;if("[]"===n.ctor)return r;var o=t,a=l(t,n._0,r),i=n._1;t=o,r=a,e=i}}),O=function(t){return f(S,r(function(t,r){return r+1}),0,t)},L=(r(function(t,r){return f(N,t,R.range(0,O(r)-1),r)}),r(function(t,r){return l(A,function(r){return p.eq(r,t)},r)}),L||{});L["::"]=R.cons;var C=r(function(t,e){return f(E,r(function(r,e){return l(L["::"],t(r),e)}),R.fromArray([]),e)}),M=(r(function(t,e){var n=r(function(r,e){return t(r)?l(L["::"],r,e):e});return f(E,n,R.fromArray([]),e)}),e(function(t,r,e){var n=t(r);return"Just"===n.ctor?l(L["::"],n._0,e):e})),j=(r(function(t,r){return f(E,M(t),R.fromArray([]),r)}),function(t){return f(S,r(function(t,r){return l(L["::"],t,r)}),R.fromArray([]),t)}),P=(e(function(t,e,n){var o=r(function(r,e){var n=e;return"::"===n.ctor?l(L["::"],l(t,r,n._0),e):R.fromArray([])});return j(f(S,o,R.fromArray([e]),n))}),r(function(t,e){var n=e;return"[]"===n.ctor?t:f(E,r(function(t,r){return l(L["::"],t,r)}),e,t)})),J=function(t){return f(E,P,R.fromArray([]),t)},I=(r(function(t,r){return J(l(C,t,r))}),r(function(t,e){var n=r(function(r,e){var n=e,o=n._0,a=n._1;return t(r)?{ctor:"_Tuple2",_0:l(L["::"],r,o),_1:a}:{ctor:"_Tuple2",_0:o,_1:l(L["::"],r,a)}});return f(E,n,{ctor:"_Tuple2",_0:R.fromArray([]),_1:R.fromArray([])},e)}),r(function(t,e){var n=e;if("[]"===n.ctor)return R.fromArray([]);var o=r(function(r,e){return l(L["::"],t,l(L["::"],r,e))}),a=f(E,o,R.fromArray([]),n._1);return l(L["::"],n._0,a)}),e(function(t,r,e){for(;;){if(p.cmp(t,0)<1)return e;var n=r;if("[]"===n.ctor)return e;var o=t-1,a=n._1,i=l(L["::"],n._0,e);t=o,r=a,e=i}})),U=r(function(t,r){return j(f(I,t,r,R.fromArray([])))}),z=e(function(t,r,e){if(p.cmp(r,0)<1)return R.fromArray([]);var n={ctor:"_Tuple2",_0:r,_1:e};t:do{r:do{if("_Tuple2"!==n.ctor)break t;if("[]"===n._1.ctor)return e;if("::"!==n._1._1.ctor){if(1===n._0)break r;break t}switch(n._0){case 1:break r;case 2:return R.fromArray([n._1._0,n._1._1._0]);case 3:if("::"===n._1._1._1.ctor)return R.fromArray([n._1._0,n._1._1._0,n._1._1._1._0]);break t;default:if("::"===n._1._1._1.ctor&&"::"===n._1._1._1._1.ctor){var o=n._1._1._1._0,a=n._1._1._0,i=n._1._0,u=n._1._1._1._1._0,c=n._1._1._1._1._1;return p.cmp(t,1e3)>0?l(L["::"],i,l(L["::"],a,l(L["::"],o,l(L["::"],u,l(U,r-4,c))))):l(L["::"],i,l(L["::"],a,l(L["::"],o,l(L["::"],u,f(z,t+1,r-4,c)))))}break t}}while(!1);return R.fromArray([n._1._0])}while(!1);return e}),q=(r(function(t,r){return f(z,0,t,r)}),e(function(t,r,e){for(;;){if(p.cmp(r,0)<1)return t;var n=l(L["::"],e,t),o=r-1,a=e;t=n,r=o,e=a}})),F=(r(function(t,r){return f(q,R.fromArray([]),t,r)}),d.append,d.length,d.slice,d.set,r(function(t,r){return p.cmp(0,t)<1&&p.cmp(t,d.length(r))<0?x(l(d.get,t,r)):B}),d.push,d.empty,r(function(t,e){var n=r(function(r,e){return t(r)?l(d.push,r,e):e});return f(d.foldl,n,d.empty,e)}),d.foldr,d.foldl,d.indexedMap,d.map,d.toList),D=(d.fromList,d.initialize),H=(r(function(t,r){return l(D,t,g(r))}),function(){return{fromCode:function(t){return p.chr(String.fromCharCode(t))},toCode:function(t){return t.charCodeAt(0)},toUpper:function(t){return p.chr(t.toUpperCase())},toLower:function(t){return p.chr(t.toLowerCase())},toLocaleUpper:function(t){return p.chr(t.toLocaleUpperCase())},toLocaleLower:function(t){return p.chr(t.toLocaleLowerCase())}}}()),Q=(H.fromCode,H.toCode),W=(H.toLocaleLower,H.toLocaleUpper,H.toLower,H.toUpper,e(function(t,r,e){var n=Q(e);return p.cmp(n,Q(t))>-1&&p.cmp(n,Q(r))<1})),$=(l(W,p.chr("A"),p.chr("Z")),l(W,p.chr("a"),p.chr("z")),l(W,p.chr("0"),p.chr("9")),l(W,p.chr("0"),p.chr("7")),function(){function t(t){return{ctor:"_Task_succeed",value:t}}function e(t){return{ctor:"_Task_fail",value:t}}function n(t){return{ctor:"_Task_nativeBinding",callback:t,cancel:null}}function o(t,r){return{ctor:"_Task_andThen",task:t,callback:r}}function a(t,r){return{ctor:"_Task_onError",task:t,callback:r}}function i(t){return{ctor:"_Task_receive",callback:t}}function u(t){var r={ctor:"_Process",id:p.guid(),root:t,stack:null,mailbox:[]};return h(r),r}function c(r){return n(function(e){var n=u(r);e(t(n))})}function l(t,r){t.mailbox.push(r),h(t)}function f(r,e){return n(function(n){l(r,e),n(t(p.Tuple0))})}function _(r){return n(function(e){var n=r.root;"_Task_nativeBinding"===n.ctor&&n.cancel&&n.cancel(),r.root=null,e(t(p.Tuple0))})}function s(r){return n(function(e){var n=setTimeout(function(){e(t(p.Tuple0))},r);return function(){clearTimeout(n)}})}function d(t,r){for(;t

Oops! Something went wrong when starting your Elm program.

'+t+"
"}function a(t,r){return function(e,n,a){try{var c=u(t,r);return a||(c.renderer=i),d(t,c,e,n)}catch(l){throw e.innerHTML=o(l.message),l}}}function i(){return{update:function(){}}}function u(t,e){var n=e.main;if("undefined"==typeof n.init){var o=k(R.Nil),a=p.Tuple2(p.Tuple0,o);return Zt({init:function(){return a},view:function(){return n},update:r(function(){return a}),subscriptions:function(){return o}})}var i=e.flags,u=i?s(t,n.init,i):c(t,n.init);return Zt({init:u,view:n.view,update:n.update,subscriptions:n.subscriptions})}function c(t,r){return function(e){if("undefined"!=typeof e)throw new Error("You are giving module `"+t+"` an argument in JavaScript.\nThis module does not take arguments though! You probably need to change the\ninitialization code to something like `Elm."+t+".fullscreen()`"); 2 | return r()}}function s(t,r,e){return function(n){var o=l(Ht.run,e,n);if("Err"===o.ctor)throw new Error("You are trying to initialize module `"+t+"` with an unexpected argument.\nWhen trying to convert it to a usable Elm value, I run into this problem:\n\n"+o._0);return r(o._0)}}function d(t,r,e,n){function o(t,r){return $.nativeBinding(function(e){var n=l(c,t,r);r=n._0,i.update(_(r));var o=n._1,a=f(r);w(d,o,a),e($.succeed(r))})}function a(t){$.rawSend(g,t)}var i,u=r.init,c=r.update,f=r.subscriptions,_=r.view,s=r.renderer,d={},p=$.nativeBinding(function(t){var r=u(n),o=r._0;i=s(e,a,_(o));var c=r._1,l=f(o);w(d,c,l),t($.succeed(o))}),g=b(p,o),v=h(d,a);return v?{ports:v}:{}}function h(t,r){var e;for(var n in C){var o=C[n];o.isForeign&&(e=e||{},e[n]="cmd"===o.tag?S(n):L(n,r)),t[n]=g(o,r)}return e}function g(t,r){function e(t,r){if("self"===t.ctor)return f(i,n,t._0,r);var e=t._0;switch(o){case"cmd":return f(a,n,e.cmds,r);case"sub":return f(a,n,e.subs,r);case"fx":return _(a,n,e.cmds,e.subs,r)}}var n={main:r,self:void 0},o=t.tag,a=t.onEffects,i=t.onSelfMsg,u=b(t.init,e);return n.self=u,u}function v(t,r){return $.nativeBinding(function(e){t.main(r),e($.succeed(p.Tuple0))})}function m(t,r){return l($.send,t.self,{ctor:"self",_0:r})}function b(t,r){function e(t){var o=$.receive(function(e){return r(e,t)});return l(n,o,e)}var n=$.andThen,o=l(n,t,e);return $.rawSpawn(o)}function y(t){return function(r){return{type:"leaf",home:t,value:r}}}function k(t){return{type:"node",branches:t}}function T(t,r){return{type:"map",tagger:t,tree:r}}function w(t,r,e){var n={};B(!0,r,n,null),B(!1,e,n,null);for(var o in t){var a=o in n?n[o]:{cmds:R.Nil,subs:R.Nil};$.rawSend(t[o],{ctor:"fx",_0:a})}}function B(t,r,e,n){switch(r.type){case"leaf":var o=r.home,a=x(t,o,n,r.value);return void(e[o]=N(t,a,e[o]));case"node":for(var i=r.branches;"[]"!==i.ctor;)B(t,i._0,e,n),i=i._1;return;case"map":return void B(t,r.tree,e,{tagger:r.tagger,rest:n})}}function x(t,r,e,n){function o(t){for(var r=e;r;)t=r.tagger(t),r=r.rest;return t}var a=t?C[r].cmdMap:C[r].subMap;return l(a,o,n)}function N(t,r,e){return e=e||{cmds:R.Nil,subs:R.Nil},t?(e.cmds=R.Cons(r,e.cmds),e):(e.subs=R.Cons(r,e.subs),e)}function A(t){if(t in C)throw new Error("There can only be one port named `"+t+"`, but your program has multiple.")}function E(t,r){return A(t),C[t]={tag:"cmd",cmdMap:M,converter:r,isForeign:!0},y(t)}function S(t){function r(t,r,e){for(;"[]"!==r.ctor;){for(var n=i(r._0),o=0;o=0&&a.splice(r,1)}var a=[],i=C[t].converter,u=$.succeed(null);return C[t].init=u,C[t].onEffects=e(r),{subscribe:n,unsubscribe:o}}function O(t,r){return A(t),C[t]={tag:"sub",subMap:j,converter:r,isForeign:!0},y(t)}function L(t,r){function n(t,r,e){for(var n=o(t,r,e),a=0;a0;)1&t&&(e+=r),t>>=1,r+=r;return e}function m(t,r,e){return e.slice(t,r)}function b(t,r){return t<1?"":r.slice(0,t)}function y(t,r){return t<1?"":r.slice(-t)}function k(t,r){return t<1?r:r.slice(t)}function T(t,r){return t<1?r:r.slice(0,-t)}function w(t,r,e){var n=(t-e.length)/2;return v(Math.ceil(n),r)+e+v(0|n,r)}function N(t,r,e){return e+v(t-e.length,r)}function A(t,r,e){return v(t-e.length,r)+e}function E(t){return t.trim()}function S(t){return t.replace(/^\s+/,"")}function O(t){return t.replace(/\s+$/,"")}function L(t){return R.fromArray(t.trim().split(/\s+/g))}function C(t){return R.fromArray(t.split(/\r\n|\r|\n/g))}function M(t){return t.toUpperCase()}function j(t){return t.toLowerCase()}function P(t,r){for(var e=r.length;e--;)if(t(p.chr(r[e])))return!0;return!1}function J(t,r){for(var e=r.length;e--;)if(!t(p.chr(r[e])))return!1;return!0}function I(t,r){return r.indexOf(t)>-1}function U(t,r){return 0===r.indexOf(t)}function z(t,r){return r.length>=t.length&&r.lastIndexOf(t)===r.length-t.length}function q(t,r){var e=t.length;if(e<1)return R.Nil;for(var n=0,o=[];(n=r.indexOf(t,n))>-1;)o.push(n),n+=e;return R.fromArray(o)}function F(t){var r=t.length;if(0===r)return Z("could not convert string '"+t+"' to an Int");var e=0;if("-"===t[0]){if(1===r)return Z("could not convert string '"+t+"' to an Int");e=1}for(var n=e;n0?{ctor:"_Tuple2",_0:c,_1:f(o,r,e,u)}:{ctor:"_Tuple2",_0:s,_1:_(n,h,d,e,u)};var g=r,v=e,m={ctor:"_Tuple2",_0:s,_1:f(t,h,d,u)};r=g,e=v,a=m}}),l=f(it,c,{ctor:"_Tuple2",_0:at(a),_1:u},i),s=l._0,d=l._1;return f(S,r(function(r,e){var n=r;return f(t,n._0,n._1,e)}),d,s)}),n(function(t,r,e,n){return rt.crash(nt(R.fromArray(["Internal red-black tree invariant violated, expected ",t," and got ",m(r),"/",e,"/",n,"\nPlease report this bug to "])))})),ct=function(t){var r=t;t:do{if("RBNode_elm_builtin"===r.ctor){if("BBlack"===r._0.ctor)return!0;break t}if("LBBlack"===r._0.ctor)return!0;break t}while(!1);return!1},lt=r(function(t,r){for(;;){var e=r;if("RBEmpty_elm_builtin"===e.ctor)return t;var n=l(lt,t+1,e._4),o=e._3;t=n,r=o}}),ft=r(function(t,r){t:for(;;){var e=r;if("RBEmpty_elm_builtin"===e.ctor)return B;var n=l(T,t,e._1);switch(n.ctor){case"LT":var o=t,a=e._3;t=o,r=a;continue t;case"EQ":return x(e._2);default:var i=t,u=e._4;t=i,r=u;continue t}}}),_t=r(function(t,r){var e=l(ft,t,r);return"Just"===e.ctor}),st=e(function(t,r,e){for(;;){var n=e;if("RBEmpty_elm_builtin"===n.ctor)return{ctor:"_Tuple2",_0:t,_1:r};var o=n._1,a=n._2,i=n._4;t=o,r=a,e=i}}),dt={ctor:"NBlack"},ht={ctor:"BBlack"},pt={ctor:"Black"},gt=function(t){var r=t;if("RBNode_elm_builtin"===r.ctor){var e=r._0;return p.eq(e,pt)||p.eq(e,ht)}return!0},vt={ctor:"Red"},mt=function(t){var r=t;switch(r.ctor){case"Black":return ht;case"Red":return pt;case"NBlack":return vt;default:return rt.crash("Can't make a double black node more black!")}},bt=function(t){var r=t;switch(r.ctor){case"BBlack":return pt;case"Black":return vt;case"Red":return dt;default:return rt.crash("Can't make a negative black node less black!")}},yt={ctor:"LBBlack"},kt={ctor:"LBlack"},Tt=function(t){return{ctor:"RBEmpty_elm_builtin",_0:t}},wt=Tt(kt),Bt=o(function(t,r,e,n,o){return{ctor:"RBNode_elm_builtin",_0:t,_1:r,_2:e,_3:n,_4:o}}),xt=function(t){var r=t;return"RBNode_elm_builtin"===r.ctor&&"Red"===r._0.ctor?s(Bt,pt,r._1,r._2,r._3,r._4):t},Rt=function(t){var r=t;return"RBNode_elm_builtin"===r.ctor?s(Bt,bt(r._0),r._1,r._2,r._3,r._4):Tt(kt)},Nt=function(t){return function(r){return function(e){return function(n){return function(o){return function(a){return function(i){return function(u){return function(c){return function(l){return function(f){return s(Bt,bt(t),n,o,s(Bt,pt,r,e,u,c),s(Bt,pt,a,i,l,f))}}}}}}}}}}},At=function(t){var r=t;return"RBEmpty_elm_builtin"===r.ctor?Tt(kt):s(Bt,pt,r._1,r._2,r._3,r._4)},Et=function(t){var r=t;return"RBEmpty_elm_builtin"===r.ctor?rt.crash("can't make a Leaf red"):s(Bt,vt,r._1,r._2,r._3,r._4)},St=function(t){var r=t;t:do{r:do{e:do{n:do{o:do{a:do{i:do{if("RBNode_elm_builtin"!==r.ctor)break t;if("RBNode_elm_builtin"===r._3.ctor)if("RBNode_elm_builtin"===r._4.ctor)switch(r._3._0.ctor){case"Red":switch(r._4._0.ctor){case"Red":if("RBNode_elm_builtin"===r._3._3.ctor&&"Red"===r._3._3._0.ctor)break i;if("RBNode_elm_builtin"===r._3._4.ctor&&"Red"===r._3._4._0.ctor)break a;if("RBNode_elm_builtin"===r._4._3.ctor&&"Red"===r._4._3._0.ctor)break o;if("RBNode_elm_builtin"===r._4._4.ctor&&"Red"===r._4._4._0.ctor)break n;break t;case"NBlack":if("RBNode_elm_builtin"===r._3._3.ctor&&"Red"===r._3._3._0.ctor)break i;if("RBNode_elm_builtin"===r._3._4.ctor&&"Red"===r._3._4._0.ctor)break a;if("BBlack"===r._0.ctor&&"RBNode_elm_builtin"===r._4._3.ctor&&"Black"===r._4._3._0.ctor&&"RBNode_elm_builtin"===r._4._4.ctor&&"Black"===r._4._4._0.ctor)break e;break t;default:if("RBNode_elm_builtin"===r._3._3.ctor&&"Red"===r._3._3._0.ctor)break i;if("RBNode_elm_builtin"===r._3._4.ctor&&"Red"===r._3._4._0.ctor)break a;break t}case"NBlack":switch(r._4._0.ctor){case"Red":if("RBNode_elm_builtin"===r._4._3.ctor&&"Red"===r._4._3._0.ctor)break o;if("RBNode_elm_builtin"===r._4._4.ctor&&"Red"===r._4._4._0.ctor)break n;if("BBlack"===r._0.ctor&&"RBNode_elm_builtin"===r._3._3.ctor&&"Black"===r._3._3._0.ctor&&"RBNode_elm_builtin"===r._3._4.ctor&&"Black"===r._3._4._0.ctor)break r;break t;case"NBlack":if("BBlack"===r._0.ctor){if("RBNode_elm_builtin"===r._4._3.ctor&&"Black"===r._4._3._0.ctor&&"RBNode_elm_builtin"===r._4._4.ctor&&"Black"===r._4._4._0.ctor)break e;if("RBNode_elm_builtin"===r._3._3.ctor&&"Black"===r._3._3._0.ctor&&"RBNode_elm_builtin"===r._3._4.ctor&&"Black"===r._3._4._0.ctor)break r;break t}break t;default:if("BBlack"===r._0.ctor&&"RBNode_elm_builtin"===r._3._3.ctor&&"Black"===r._3._3._0.ctor&&"RBNode_elm_builtin"===r._3._4.ctor&&"Black"===r._3._4._0.ctor)break r;break t}default:switch(r._4._0.ctor){case"Red":if("RBNode_elm_builtin"===r._4._3.ctor&&"Red"===r._4._3._0.ctor)break o;if("RBNode_elm_builtin"===r._4._4.ctor&&"Red"===r._4._4._0.ctor)break n;break t;case"NBlack":if("BBlack"===r._0.ctor&&"RBNode_elm_builtin"===r._4._3.ctor&&"Black"===r._4._3._0.ctor&&"RBNode_elm_builtin"===r._4._4.ctor&&"Black"===r._4._4._0.ctor)break e;break t;default:break t}}else switch(r._3._0.ctor){case"Red":if("RBNode_elm_builtin"===r._3._3.ctor&&"Red"===r._3._3._0.ctor)break i;if("RBNode_elm_builtin"===r._3._4.ctor&&"Red"===r._3._4._0.ctor)break a;break t;case"NBlack":if("BBlack"===r._0.ctor&&"RBNode_elm_builtin"===r._3._3.ctor&&"Black"===r._3._3._0.ctor&&"RBNode_elm_builtin"===r._3._4.ctor&&"Black"===r._3._4._0.ctor)break r;break t;default:break t}else{if("RBNode_elm_builtin"!==r._4.ctor)break t;switch(r._4._0.ctor){case"Red":if("RBNode_elm_builtin"===r._4._3.ctor&&"Red"===r._4._3._0.ctor)break o;if("RBNode_elm_builtin"===r._4._4.ctor&&"Red"===r._4._4._0.ctor)break n;break t;case"NBlack":if("BBlack"===r._0.ctor&&"RBNode_elm_builtin"===r._4._3.ctor&&"Black"===r._4._3._0.ctor&&"RBNode_elm_builtin"===r._4._4.ctor&&"Black"===r._4._4._0.ctor)break e;break t;default:break t}}}while(!1);return Nt(r._0)(r._3._3._1)(r._3._3._2)(r._3._1)(r._3._2)(r._1)(r._2)(r._3._3._3)(r._3._3._4)(r._3._4)(r._4)}while(!1);return Nt(r._0)(r._3._1)(r._3._2)(r._3._4._1)(r._3._4._2)(r._1)(r._2)(r._3._3)(r._3._4._3)(r._3._4._4)(r._4)}while(!1);return Nt(r._0)(r._1)(r._2)(r._4._3._1)(r._4._3._2)(r._4._1)(r._4._2)(r._3)(r._4._3._3)(r._4._3._4)(r._4._4)}while(!1);return Nt(r._0)(r._1)(r._2)(r._4._1)(r._4._2)(r._4._4._1)(r._4._4._2)(r._3)(r._4._3)(r._4._4._3)(r._4._4._4)}while(!1);return s(Bt,pt,r._4._3._1,r._4._3._2,s(Bt,pt,r._1,r._2,r._3,r._4._3._3),s(Ot,pt,r._4._1,r._4._2,r._4._3._4,Et(r._4._4)))}while(!1);return s(Bt,pt,r._3._4._1,r._3._4._2,s(Ot,pt,r._3._1,r._3._2,Et(r._3._3),r._3._4._3),s(Bt,pt,r._1,r._2,r._3._4._4,r._4))}while(!1);return t},Ot=o(function(t,r,e,n,o){var a=s(Bt,t,r,e,n,o);return gt(a)?St(a):a}),Lt=o(function(t,r,e,n,o){return ct(n)||ct(o)?s(Ot,mt(t),r,e,Rt(n),Rt(o)):s(Bt,t,r,e,n,o)}),Ct=o(function(t,r,e,n,o){var a=o;return"RBEmpty_elm_builtin"===a.ctor?f(Mt,t,n,o):s(Lt,t,r,e,n,s(Ct,a._0,a._1,a._2,a._3,a._4))}),Mt=e(function(t,r,e){var n={ctor:"_Tuple2",_0:r,_1:e};if("RBEmpty_elm_builtin"!==n._0.ctor){if("RBEmpty_elm_builtin"===n._1.ctor){var o=n._1._0,a=n._0._0,i={ctor:"_Tuple3",_0:t,_1:a,_2:o};return"_Tuple3"===i.ctor&&"Black"===i._0.ctor&&"Red"===i._1.ctor&&"LBlack"===i._2.ctor?s(Bt,pt,n._0._1,n._0._2,n._0._3,n._0._4):_(ut,"Black/Red/LBlack",t,m(a),m(o))}var u=n._0._2,c=n._0._4,l=n._0._1,d=s(Ct,n._0._0,l,u,n._0._3,c),h=f(st,l,u,c),p=h._0,g=h._1;return s(Lt,t,p,g,d,e)}if("RBEmpty_elm_builtin"!==n._1.ctor){var v=n._1._0,b=n._0._0,y={ctor:"_Tuple3",_0:t,_1:b,_2:v};return"_Tuple3"===y.ctor&&"Black"===y._0.ctor&&"LBlack"===y._1.ctor&&"Red"===y._2.ctor?s(Bt,pt,n._1._1,n._1._2,n._1._3,n._1._4):_(ut,"Black/LBlack/Red",t,m(b),m(v))}var k=t;switch(k.ctor){case"Red":return Tt(kt);case"Black":return Tt(yt);default:return rt.crash("cannot have bblack or nblack nodes at this point")}}),jt=r(function(t,r){var e=r;if("RBEmpty_elm_builtin"===e.ctor)return Tt(kt);var n=e._1;return s(Bt,e._0,n,l(t,n,e._2),l(jt,t,e._3),l(jt,t,e._4))}),Pt={ctor:"Same"},Jt={ctor:"Remove"},It={ctor:"Insert"},Ut=e(function(t,r,e){var n=function(e){var o=e;if("RBEmpty_elm_builtin"===o.ctor){var a=r(B);return"Nothing"===a.ctor?{ctor:"_Tuple2",_0:Pt,_1:wt}:{ctor:"_Tuple2",_0:It,_1:s(Bt,vt,t,a._0,wt,wt)}}var i=o._2,u=o._4,c=o._3,_=o._1,d=o._0,h=l(T,t,_);switch(h.ctor){case"EQ":var p=r(x(i));return"Nothing"===p.ctor?{ctor:"_Tuple2",_0:Jt,_1:f(Mt,d,c,u)}:{ctor:"_Tuple2",_0:Pt,_1:s(Bt,d,_,p._0,c,u)};case"LT":var g=n(c),v=g._0,m=g._1,b=v;switch(b.ctor){case"Same":return{ctor:"_Tuple2",_0:Pt,_1:s(Bt,d,_,i,m,u)};case"Insert":return{ctor:"_Tuple2",_0:It,_1:s(Ot,d,_,i,m,u)};default:return{ctor:"_Tuple2",_0:Jt,_1:s(Lt,d,_,i,m,u)}}default:var y=n(u),v=y._0,k=y._1,w=v;switch(w.ctor){case"Same":return{ctor:"_Tuple2",_0:Pt,_1:s(Bt,d,_,i,c,k)};case"Insert":return{ctor:"_Tuple2",_0:It,_1:s(Ot,d,_,i,c,k)};default:return{ctor:"_Tuple2",_0:Jt,_1:s(Lt,d,_,i,c,k)}}}},o=n(e),a=o._0,i=o._1,u=a;switch(u.ctor){case"Same":return i;case"Insert":return xt(i);default:return At(i)}}),zt=e(function(t,r,e){return f(Ut,t,g(x(r)),e)}),qt=(r(function(t,r){return f(zt,t,r,wt)}),r(function(t,r){return f(it,zt,r,t)}),r(function(t,r){var n=e(function(r,e,n){return l(t,r,e)?f(zt,r,e,n):n});return f(it,n,wt,r)})),Ft=(r(function(t,e){return l(qt,r(function(t,r){return l(_t,t,e)}),t)}),r(function(t,r){var n=e(function(r,e,n){var o=n,a=o._1,i=o._0;return l(t,r,e)?{ctor:"_Tuple2",_0:f(zt,r,e,i),_1:a}:{ctor:"_Tuple2",_0:i,_1:f(zt,r,e,a)}});return f(it,n,{ctor:"_Tuple2",_0:wt,_1:wt},r)}),r(function(t,r){return f(Ut,t,g(B),r)})),Dt=(r(function(t,r){return f(it,e(function(t,r,e){return l(Ft,t,e)}),t,r)}),K.batch),Ht=(Dt(R.fromArray([])),K.map,rt.crash,rt.log,function(){function t(t){return{ctor:"",tag:"succeed",msg:t}}function l(t){return{ctor:"",tag:"fail",msg:t}}function f(t){return{ctor:"",tag:t}}function _(t,r){return{ctor:"",tag:t,decoder:r}}function s(t){return{ctor:"",tag:"null",value:t}}function h(t,r){return{ctor:"",tag:"field",field:t,decoder:r}}function g(t){return{ctor:"",tag:"key-value",decoder:t}}function v(t,r){return{ctor:"",tag:"map-many",func:t,decoders:r}}function m(t,r){return{ctor:"",tag:"tuple",func:t,decoders:r}}function b(t,r){return{ctor:"",tag:"andThen",decoder:t,callback:r}}function y(t,r){return{ctor:"",tag:"customAndThen",decoder:t,callback:r}}function k(t){return{ctor:"",tag:"oneOf",decoders:t}}function T(t,r){return v(t,[r])}function w(t,r,e){return v(t,[r,e])}function N(t,r,e,n){return v(t,[r,e,n])}function A(t,r,e,n,o){return v(t,[r,e,n,o])}function E(t,r,e,n,o,a){return v(t,[r,e,n,o,a])}function S(t,r,e,n,o,a,i){return v(t,[r,e,n,o,a,i])}function O(t,r,e,n,o,a,i,u){return v(t,[r,e,n,o,a,i,u])}function L(t,r,e,n,o,a,i,u,c){return v(t,[r,e,n,o,a,i,u,c])}function C(t,r){return m(t,[r])}function M(t,r,e){return m(t,[r,e])}function j(t,r,e,n){return m(t,[r,e,n])}function P(t,r,e,n,o){return m(t,[r,e,n,o])}function J(t,r,e,n,o,a){return m(t,[r,e,n,o,a])}function I(t,r,e,n,o,a,i){return m(t,[r,e,n,o,a,i])}function U(t,r,e,n,o,a,i,u){return m(t,[r,e,n,o,a,i,u])}function z(t,r,e,n,o,a,i,u,c){return m(t,[r,e,n,o,a,i,u,c])}function q(t){return{tag:"ok",value:t}}function F(t,r){return{tag:"primitive",type:t,value:r}}function D(t,r){return{tag:"index",index:t,rest:r}}function H(t,r){return{tag:"field",field:t,rest:r}}function Q(t){return{tag:"oneOf",problems:t}}function W(t){return{tag:"custom",msg:t}}function $(t){return{tag:"fail",msg:t}}function K(t){for(var r="_";t;)switch(t.tag){case"primitive":return"Expecting "+t.type+("_"===r?"":" at "+r)+" but instead got: "+G(t.value);case"index":r+="["+t.index+"]",t=t.rest;break;case"field":r+="."+t.field,t=t.rest;break;case"oneOf":for(var e=t.problems,n=0;n.");case"PENDING_REQUEST":X(o),u="EXTRA_REQUEST";var t=S(c,l);return i=q(i,c,t,a),void(c=l);case"EXTRA_REQUEST":return void(u="NO_REQUEST")}}var a={tagger:r,parent:void 0},i=w(e,a);t.appendChild(i);var u="NO_REQUEST",c=e,l=e;return{update:n}}function w(t,r){switch(t.type){case"thunk":return t.node||(t.node=t.thunk()),w(t.node,r);case"tagger":for(var e=t.node,n=t.tagger;"tagger"===e.type;)"object"!=typeof n?n=[n,e.tagger]:n.push(e.tagger),e=e.node;var o={tagger:n,parent:r},a=w(e,o);return a.elm_event_node_ref=o,a;case"text":return document.createTextNode(t.text);case"node":var a=t.namespace?document.createElementNS(t.namespace,t.tag):document.createElement(t.tag);B(a,r,t.facts);for(var i=t.children,u=0;u0&&e.push(O("p-thunk",n,f)));case"tagger":for(var _=t.tagger,s=r.tagger,d=!1,h=t.node;"tagger"===h.type;)d=!0,"object"!=typeof _?_=[_,h.tagger]:_.push(h.tagger),h=h.node;for(var p=r.node;"tagger"===p.type;)d=!0,"object"!=typeof s?s=[s,p.tagger]:s.push(p.tagger),p=p.node;return d&&_.length!==s.length?void e.push(O("p-redraw",n,r)):((d?C(_,s):_===s)||e.push(O("p-tagger",n,s)),void L(h,p,e,n+1));case"text":if(t.text!==r.text)return void e.push(O("p-text",n,r.text));return;case"node":if(t.tag!==r.tag||t.namespace!==r.namespace)return void e.push(O("p-redraw",n,r));var g=M(t.facts,r.facts);return"undefined"!=typeof g&&e.push(O("p-facts",n,g)),void j(t,r,e,n);case"keyed-node":if(t.tag!==r.tag||t.namespace!==r.namespace)return void e.push(O("p-redraw",n,r));var g=M(t.facts,r.facts);return"undefined"!=typeof g&&e.push(O("p-facts",n,g)),void P(t,r,e,n);case"custom":if(t.impl!==r.impl)return void e.push(O("p-redraw",n,r));var g=M(t.facts,r.facts);"undefined"!=typeof g&&e.push(O("p-facts",n,g));var v=r.impl.diff(t,r);if(v)return void e.push(O("p-custom",n,v));return}}}function C(t,r){for(var e=0;eu?e.push(O("p-remove-last",n,i-u)):i0||i.length>0||"undefined"!=typeof S)&&e.push(O("p-reorder",n,{patches:o,inserts:i,endInserts:S}))}function J(t,r,e,n,o,a){var i=t[e];if("undefined"==typeof i)return i={tag:"insert",vnode:n,index:o,data:void 0},a.push({index:o,entry:i}),void(t[e]=i);if("remove"===i.tag){a.push({index:o,entry:i}),i.tag="move";var u=[];return L(i.vnode,n,u,i.index),i.index=o,void(i.data.data={patches:u,entry:i})}J(t,r,e+Z,n,o,a)}function I(t,r,e,n,o){var a=t[e];if("undefined"==typeof a){var i=O("p-remove",o,void 0);return r.push(i),void(t[e]={tag:"remove",vnode:n,index:o,data:i})}if("insert"===a.tag){a.tag="move";var u=[];L(n,a.vnode,u,o);var i=O("p-remove",o,{patches:u,entry:a});return void r.push(i)}I(t,r,e+Z,n,o)}function U(t,r,e,n){z(t,r,e,0,0,r.descendantsCount,n)}function z(t,r,e,n,o,a,i){for(var u=e[n],c=u.index;c===o;){var l=u.type;if("p-thunk"===l)U(t,r.node,u.data,i);else if("p-reorder"===l){u.domNode=t,u.eventNode=i;var f=u.data.patches;f.length>0&&z(t,r,f,0,o,a,i)}else if("p-remove"===l){u.domNode=t,u.eventNode=i;var _=u.data;if("undefined"!=typeof _){_.entry.data=t;var f=_.patches;f.length>0&&z(t,r,f,0,o,a,i)}}else u.domNode=t,u.eventNode=i;if(n++,!(u=e[n])||(c=u.index)>a)return n}switch(r.type){case"tagger":for(var s=r.node;"tagger"===s.type;)s=s.node;return z(t,s,e,n,o+1,a,t.elm_event_node_ref);case"node":for(var d=r.children,h=t.childNodes,p=0;pa))return n;o=v}return n;case"keyed-node":for(var d=r.children,h=t.childNodes,p=0;pa))return n;o=v}return n;case"text":case"thunk":throw new Error("should never traverse `text` or `thunk` nodes like this")}}function q(t,r,e,n){return 0===e.length?t:(U(t,r,e,n),F(t,e))}function F(t,r){for(var e=0;e0?100:p.cmp(o,0)<0?0:o},vr=r(function(t,r){var e=t;return{ctor:"_Tuple2",_0:p.update(r,{progress:gr(e._0)}),_1:Y}}),mr=({progress:0,color:x("red"),from:B,to:B},n(function(t,r,e,n){return{progress:t,color:r,from:e,to:n}}),e(function(t,r,e){return{scrollTop:t,targetScrollHeight:r,clientHeight:e}}),function(t){return{ctor:"Progress",_0:t}}),br=K.incomingPort("onScroll",l(Kt,l(Vt[":="],"scrollTop",Yt),function(t){return l(Kt,l(Vt[":="],"targetScrollHeight",Yt),function(r){return l(Kt,l(Vt[":="],"clientHeight",Yt),function(e){return $t({scrollTop:t,targetScrollHeight:r,clientHeight:e})})})})),yr={progress:0,color:B,to:x("lightsalmon"),from:x("lightseagreen")},kr={progressModel:yr},Tr={ctor:"_Tuple2",_0:kr,_1:Y},wr=function(t){return{ctor:"ProgressMsg",_0:t}},Br=function(t){return l(ur,R.fromArray([]),R.fromArray([l(fr,wr,pr(t.progressModel))]))},xr=r(function(t,r){var e=t,n=l(vr,e._0,r.progressModel),o=n._0,a=n._1;return{ctor:"_Tuple2",_0:p.update(r,{progressModel:o}),_1:l(X,wr,a)}}),Rr=function(t){return br(function(t){return wr(mr(t))})},Nr={main:lr({init:Tr,view:Br,update:xr,subscriptions:Rr})},Ar={};if(Ar.Main=Ar.Main||{},K.addPublicModule(Ar.Main,"Main","undefined"==typeof Nr?null:Nr),"function"==typeof define&&define.amd)return void define([],function(){return Ar});if("object"==typeof t)return void(t.exports=Ar);var Er=this.Elm;if("undefined"==typeof Er)return void(this.Elm=Ar);for(var Sr in Ar){if(Sr in Er)throw new Error("There are two Elm modules called `"+Sr+"` on this page! Rename one of them.");Er[Sr]=Ar[Sr]}}).call(this)}]); -------------------------------------------------------------------------------- /examples/article/dist/static/media/panda.12f77371.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisbuttery/elm-scroll-progress/3e4dd2c1812812f878ba4bf3435b2380b43c6c1c/examples/article/dist/static/media/panda.12f77371.jpg -------------------------------------------------------------------------------- /examples/article/elm-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.0", 3 | "summary": "helpful summary of your project, less than 80 characters", 4 | "repository": "https://github.com/user/project.git", 5 | "license": "BSD3", 6 | "source-directories": [ 7 | "src", 8 | "../../src/" 9 | ], 10 | "exposed-modules": [], 11 | "dependencies": { 12 | "elm-lang/core": "4.0.5 <= v < 5.0.0", 13 | "elm-lang/html": "1.1.0 <= v < 2.0.0" 14 | }, 15 | "elm-version": "0.17.1 <= v < 0.18.0" 16 | } 17 | -------------------------------------------------------------------------------- /examples/article/src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisbuttery/elm-scroll-progress/3e4dd2c1812812f878ba4bf3435b2380b43c6c1c/examples/article/src/.DS_Store -------------------------------------------------------------------------------- /examples/article/src/Main.elm: -------------------------------------------------------------------------------- 1 | module Main exposing (..) 2 | 3 | import Html exposing (text, Html, div) 4 | import Html.App 5 | import ScrollProgress exposing (..) 6 | import Ports 7 | 8 | 9 | -- MODEL 10 | 11 | 12 | type alias AppModel = 13 | { progressModel : ScrollProgress.Model 14 | } 15 | 16 | 17 | childModel : ScrollProgress.Model 18 | childModel = 19 | { progress = 0 20 | , color = Nothing 21 | , to = Just "lightsalmon" 22 | , from = Just "lightseagreen" 23 | } 24 | 25 | 26 | initialModel : AppModel 27 | initialModel = 28 | { progressModel = childModel } 29 | 30 | 31 | init : ( AppModel, Cmd Msg ) 32 | init = 33 | ( initialModel, Cmd.none ) 34 | 35 | 36 | 37 | -- MESSAGES 38 | 39 | 40 | type Msg 41 | = ProgressMsg ScrollProgress.Msg 42 | 43 | 44 | 45 | -- VIEW 46 | 47 | 48 | view : AppModel -> Html Msg 49 | view model = 50 | Html.div [] 51 | [ Html.App.map ProgressMsg (ScrollProgress.view model.progressModel) ] 52 | 53 | 54 | 55 | -- UPDATE 56 | 57 | 58 | update : Msg -> AppModel -> ( AppModel, Cmd Msg ) 59 | update message model = 60 | case message of 61 | ProgressMsg subMsg -> 62 | let 63 | ( updatedProgessModel, progressCmd ) = 64 | ScrollProgress.update subMsg model.progressModel 65 | in 66 | ( { model | progressModel = updatedProgessModel }, Cmd.map ProgressMsg progressCmd ) 67 | 68 | 69 | 70 | -- SUBSCIPTIONS 71 | 72 | 73 | subscriptions : AppModel -> Sub Msg 74 | subscriptions model = 75 | Ports.onScroll (ProgressMsg << ScrollProgress.Progress) 76 | 77 | 78 | 79 | -- APP 80 | 81 | 82 | main : Program Never 83 | main = 84 | Html.App.program 85 | { init = init 86 | , view = view 87 | , update = update 88 | , subscriptions = subscriptions 89 | } 90 | -------------------------------------------------------------------------------- /examples/article/src/Ports.elm: -------------------------------------------------------------------------------- 1 | port module Ports exposing (..) 2 | 3 | import ScrollProgress exposing (ScrollAttributes) 4 | 5 | 6 | -- PORTS 7 | 8 | 9 | port onScroll : (ScrollAttributes -> msg) -> Sub msg 10 | -------------------------------------------------------------------------------- /examples/article/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisbuttery/elm-scroll-progress/3e4dd2c1812812f878ba4bf3435b2380b43c6c1c/examples/article/src/favicon.ico -------------------------------------------------------------------------------- /examples/article/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Elm App 8 | 9 | 10 |
11 |
12 |

The Happy Panda

13 |
14 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 15 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 16 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 17 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 18 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 19 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 20 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 21 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 22 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 23 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 24 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 25 |

26 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 27 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 28 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 29 | consequat.

30 |

Duis aute irure dolor in reprehenderit in voluptate velit esse 31 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 32 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 33 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 34 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 35 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 36 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 37 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 38 |

39 |

Story written by The Happy Panda

40 |
41 | 42 | 43 | -------------------------------------------------------------------------------- /examples/article/src/index.js: -------------------------------------------------------------------------------- 1 | require('./main.css'); 2 | 3 | const Elm = require('./Main.elm'); 4 | const root = document.getElementById('root'); 5 | const app = Elm.Main.embed(root); 6 | 7 | const target = document.querySelector('.article'); 8 | // ... or target the body 9 | // const target = document.documentElement; 10 | 11 | window.addEventListener('scroll', function() { 12 | app.ports.onScroll.send({ 13 | scrollTop: document.documentElement.scrollTop || document.body.scrollTop, 14 | targetScrollHeight: target.scrollHeight, 15 | clientHeight: document.documentElement.clientHeight 16 | }); 17 | }); -------------------------------------------------------------------------------- /examples/article/src/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: #ccc; 3 | height: 2000px; 4 | margin: 0; 5 | position: relative; 6 | } 7 | 8 | #root { 9 | left: 0; 10 | position: fixed; 11 | top: 0; 12 | width: 100%; 13 | z-index: 20; 14 | } 15 | 16 | .scroll-progress { 17 | font-size: 12px; 18 | font: menu; 19 | height: 4px; 20 | } 21 | 22 | .article { 23 | background: white; 24 | border-radius: 2px; 25 | border-radius: 2px; 26 | border: 1px solid #c1c1c1; 27 | font: menu; 28 | margin: 60px auto; 29 | max-width: 800px; 30 | padding: 30px; 31 | position: relative; 32 | width: 80%; 33 | z-index: 10; 34 | } 35 | 36 | .article:after { 37 | background: #fff; 38 | box-shadow: 0 10px 10px #b2b2b2; 39 | content: ""; 40 | height: 100%; 41 | left: 0; 42 | position: absolute; 43 | top: 0; 44 | width: 100%; 45 | z-index: -10; 46 | } 47 | 48 | h1 { 49 | color: rgba(0, 0, 0, 0.8); 50 | font-family: 'Libre Baskerville', serif; 51 | font-size: 3.3em; 52 | padding: 30px 0 50px 0; 53 | text-align: center; 54 | } 55 | 56 | p { 57 | color: rgba(0, 0, 0, 0.8); 58 | font-family: 'Open Sans', sans-serif; 59 | font-size: 21px; 60 | line-height: 1.58; 61 | margin: 0; 62 | text-indent: 30px; 63 | } 64 | 65 | p:first-of-type { 66 | text-indent: 0; 67 | } 68 | 69 | p:first-of-type:first-letter { 70 | background-color: #699933; 71 | border: 4px solid #577f2a; 72 | color: white; 73 | float: left; 74 | font-family: Georgia; 75 | font-size: 60px; 76 | line-height: 50px; 77 | margin: 10px 30px 10px 10px; 78 | padding: 20px; 79 | } 80 | 81 | p:nth-of-type(2) { 82 | border-left: 4px solid rgba(105, 153, 51, 0.15); 83 | color: #577f2a; 84 | font-family: 'Libre Baskerville', serif; 85 | margin: 30px 10px; 86 | padding: 0 20px 0 30px; 87 | text-indent: 0; 88 | } 89 | 90 | p:nth-of-type(4) { 91 | color: rgb(198, 198, 198); 92 | font-family: 'Libre Baskerville'; 93 | font-size: 15px; 94 | margin-top: 20px; 95 | } 96 | 97 | .panda { 98 | background: url('./panda.jpg') no-repeat center; 99 | background-size: cover; 100 | height: 400px; 101 | margin: 20px 20px 40px 0; 102 | width: 100%; 103 | } 104 | -------------------------------------------------------------------------------- /examples/article/src/panda.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisbuttery/elm-scroll-progress/3e4dd2c1812812f878ba4bf3435b2380b43c6c1c/examples/article/src/panda.jpg -------------------------------------------------------------------------------- /examples/document/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisbuttery/elm-scroll-progress/3e4dd2c1812812f878ba4bf3435b2380b43c6c1c/examples/document/.DS_Store -------------------------------------------------------------------------------- /examples/document/dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisbuttery/elm-scroll-progress/3e4dd2c1812812f878ba4bf3435b2380b43c6c1c/examples/document/dist/favicon.ico -------------------------------------------------------------------------------- /examples/document/dist/index.html: -------------------------------------------------------------------------------- 1 | Elm App

The Happy Panda

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Story written by The Happy Panda

-------------------------------------------------------------------------------- /examples/document/dist/js/main.eab5c38b.js: -------------------------------------------------------------------------------- 1 | !function(t){function r(n){if(e[n])return e[n].exports;var o=e[n]={exports:{},id:n,loaded:!1};return t[n].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}var e={};return r.m=t,r.c=e,r.p="",r(0)}([function(t,r,e){t.exports=e(1)},function(t,r,e){e(2);const n=e(7),o=document.getElementById("root"),a=n.Main.embed(o),i=document.documentElement;window.addEventListener("scroll",function(){a.ports.onScroll.send({scrollTop:document.documentElement.scrollTop||document.body.scrollTop,targetScrollHeight:i.scrollHeight,clientHeight:document.documentElement.clientHeight})})},function(t,r,e){var n=e(3);"string"==typeof n&&(n=[[t.id,n,""]]);e(6)(n,{});n.locals&&(t.exports=n.locals)},function(t,r,e){r=t.exports=e(4)(),r.push([t.id,'body{background:#ccc;height:2000px;margin:0;position:relative}#root{left:0;position:fixed;top:0;width:100%;z-index:20}.scroll-progress{font-size:12px;font:menu;height:4px}.article{background:#fff;border-radius:2px;border:1px solid #c1c1c1;font:menu;margin:60px auto;max-width:800px;padding:30px;position:relative;width:80%;z-index:10}.article:after{background:#fff;box-shadow:0 10px 10px #b2b2b2;content:"";height:100%;left:0;position:absolute;top:0;width:100%;z-index:-10}h1{font-family:Libre Baskerville,serif;font-size:3.3em;padding:30px 0 50px;text-align:center}h1,p{color:rgba(0,0,0,.8)}p{font-family:Open Sans,sans-serif;font-size:21px;line-height:1.58;margin:0;text-indent:30px}p:first-of-type{text-indent:0}p:first-of-type:first-letter{background-color:#699933;border:4px solid #577f2a;color:#fff;float:left;font-family:Georgia;font-size:60px;line-height:50px;margin:10px 30px 10px 10px;padding:20px}p:nth-of-type(2){border-left:4px solid rgba(105,153,51,.15);color:#577f2a;font-family:Libre Baskerville,serif;margin:30px 10px;padding:0 20px 0 30px;text-indent:0}p:nth-of-type(4){color:#c6c6c6;font-family:Libre Baskerville;font-size:15px;margin-top:20px}.panda{background:url('+e(5)+") no-repeat 50%;background-size:cover;height:400px;margin:20px 20px 40px 0;width:100%}",""])},function(t,r){t.exports=function(){var t=[];return t.toString=function(){for(var t=[],r=0;r=0&&b.splice(r,1)}function u(t){var r=document.createElement("style");return r.type="text/css",a(t,r),r}function c(t){var r=document.createElement("link");return r.rel="stylesheet",a(t,r),r}function l(t,r){var e,n,o;if(r.singleton){var a=m++;e=v||(v=u(r)),n=f.bind(null,e,a,!1),o=f.bind(null,e,a,!0)}else t.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(e=c(r),n=s.bind(null,e),o=function(){i(e),e.href&&URL.revokeObjectURL(e.href)}):(e=u(r),n=_.bind(null,e),o=function(){i(e)});return n(t),function(r){if(r){if(r.css===t.css&&r.media===t.media&&r.sourceMap===t.sourceMap)return;n(t=r)}else o()}}function f(t,r,e,n){var o=e?"":n.css;if(t.styleSheet)t.styleSheet.cssText=y(r,o);else{var a=document.createTextNode(o),i=t.childNodes;i[r]&&t.removeChild(i[r]),i.length?t.insertBefore(a,i[r]):t.appendChild(a)}}function _(t,r){var e=r.css,n=r.media;if(n&&t.setAttribute("media",n),t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}function s(t,r){var e=r.css,n=r.sourceMap;n&&(e+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */");var o=new Blob([e],{type:"text/css"}),a=t.href;t.href=URL.createObjectURL(o),a&&URL.revokeObjectURL(a)}var d={},h=function(t){var r;return function(){return"undefined"==typeof r&&(r=t.apply(this,arguments)),r}},p=h(function(){return/msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase())}),g=h(function(){return document.head||document.getElementsByTagName("head")[0]}),v=null,m=0,b=[];t.exports=function(t,r){r=r||{},"undefined"==typeof r.singleton&&(r.singleton=p()),"undefined"==typeof r.insertAt&&(r.insertAt="bottom");var e=o(t);return n(e,r),function(t){for(var a=[],i=0;i=J(r))throw new Error("Index "+t+" is out of range. Check the length of your array first or use getMaybe or getWithDefault.");return n(t,r)}function n(t,r){for(var e=r.height;e>0;e--){for(var n=t>>5*e;r.lengths[n]<=t;)n++;n>0&&(t-=r.lengths[n-1]),r=r.table[n]}return r.table[t]}function o(t,r,e){return t<0||J(e)<=t?e:a(t,r,e)}function a(t,r,e){if(e=P(e),0===e.height)e.table[t]=r;else{var n=I(t,e);n>0&&(t-=e.lengths[n-1]),e.table[n]=a(t,r,e.table[n])}return e}function i(t,r){if(t<=0)return K;var e=Math.floor(Math.log(t)/Math.log(W));return u(r,e,0,t)}function u(t,r,e,n){if(0===r){for(var o=new Array((n-e)%(W+1)),a=0;a0?c[a-1]:0);return{ctor:"_Array",height:r,table:o,lengths:c}}function c(t){if("[]"===t.ctor)return K;for(var r=new Array(W),e=[],n=0;"[]"!==t.ctor;)if(r[n]=t._0,t=t._1,n++,n===W){var o={ctor:"_Array",height:0,table:r};f(o,e),r=new Array(W),n=0}if(n>0){var o={ctor:"_Array",height:0,table:r.splice(0,n)};f(o,e)}for(var a=0;a0&&f(e[a],e);var i=e[e.length-1];return i.height>0&&1===i.table.length?i.table[0]:i}function f(t,r){var e=t.height;if(r.length===e){var n={ctor:"_Array",height:e+1,table:[],lengths:[]};r.push(n)}r[e].table.push(t);var o=J(t);r[e].lengths.length>0&&(o+=r[e].lengths[r[e].lengths.length-1]),r[e].lengths.push(o),r[e].table.length===W&&(f(r[e],r),r[e]={ctor:"_Array",height:e+1,table:[],lengths:[]})}function _(t,r){var e=s(t,r);if(null!==e)return e;var n=U(t,r.height);return F(r,n)}function s(t,r){if(0===r.height){if(r.table.length=0;e--)t=0===r.height?R.Cons(r.table[e],t):h(t,r.table[e]);return t}function p(t,r){var e={ctor:"_Array",height:r.height,table:new Array(r.table.length)};r.height>0&&(e.lengths=r.lengths);for(var n=0;n0&&(n.lengths=r.lengths);for(var o=0;o0?r.lengths[n-1]:0),r.table[n]);if(0===n)return o;var e={ctor:"_Array",height:r.height,table:r.table.slice(0,n),lengths:r.lengths.slice(0,n)};return o.table.length>0&&(e.table[n]=o,e.lengths[n]=J(o)+(n>0?e.lengths[n-1]:0)),e}function T(t,r){if(0===t)return r;if(0===r.height){var e={ctor:"_Array",height:0};return e.table=r.table.slice(t,r.table.length+1),e}var n=I(t,r),o=T(t-(n>0?r.lengths[n-1]:0),r.table[n]);if(n===r.table.length-1)return o;var e={ctor:"_Array",height:r.height,table:r.table.slice(n,r.table.length+1),lengths:new Array(r.table.length-n)};e.table[0]=o;for(var a=0,i=0;i0){for(var n=J(e[0]),o=0;o0){var a=A(t,r);a>$&&(e=C(e[0],e[1],a))}return F(e[0],e[1])}function B(t,r){if(0===t.height&&0===r.height)return[t,r];if(1!==t.height||1!==r.height)if(t.height===r.height){t=P(t),r=P(r);var e=B(M(t),j(r));x(t,e[1]),N(r,e[0])}else if(t.height>r.height){t=P(t);var e=B(M(t),r);x(t,e[0]),r=z(e[1],e[1].height+1)}else{r=P(r);var e=B(t,j(r)),n=0===e[0].table.length?0:1,o=0===n?1:0;N(r,e[n]),t=z(e[o],e[o].height+1)}if(0===t.table.length||0===r.table.length)return[t,r];var a=A(t,r);return a<=$?[t,r]:C(t,r,a)}function x(t,r){var e=t.table.length-1;t.table[e]=r,t.lengths[e]=J(r),t.lengths[e]+=e>0?t.lengths[e-1]:0}function N(t,r){if(r.table.length>0){t.table[0]=r,t.lengths[0]=J(r);for(var e=J(t.table[0]),n=1;n0&&(e.lengths=new Array(r)),e}function C(t,r,e){for(var n=L(t.height,Math.min(W,t.table.length+r.table.length-e)),o=L(t.height,n.table.length-(t.table.length+r.table.length-e)),a=0;E(t.table,r.table,a).table.length%W===0;)O(n.table,o.table,a,E(t.table,r.table,a)),O(n.lengths,o.lengths,a,E(t.lengths,r.lengths,a)),a++;for(var i=a,u=new L(t.height-1,0),c=0;a-i-(u.table.length>0?1:0)0)for(var _=u.lengths.length,s=_;s<_+f-c;s++)u.lengths[s]=J(u.table[s]),u.lengths[s]+=s>0?u.lengths[s-1]:0;c+=f,l.table.length<=f&&(a++,c=0),u.table.length===W&&(S(n,o,i,u),u=L(t.height-1,0),i++)}for(u.table.length>0&&(S(n,o,i,u),i++);a0&&(r.lengths=t.lengths.slice()),r}function J(t){return 0===t.height?t.table.length:t.lengths[t.lengths.length-1]}function I(t,r){for(var e=t>>5*r.height;r.lengths[e]<=t;)e++;return e}function U(t,r){return 0===r?{ctor:"_Array",height:0,table:[t]}:{ctor:"_Array",height:r,table:[U(t,r-1)],lengths:[1]}}function z(t,r){return r===t.height?t:{ctor:"_Array",height:r,table:[z(t,r-1)],lengths:[J(t)]}}function F(t,r){return{ctor:"_Array",height:t.height+1,table:[t,r],lengths:[J(t),J(t)+J(r)]}}function q(t){var r=new Array(J(t));return D(r,0,t),r}function D(t,r,e){for(var n=0;n0?i[u-1]:0);return{ctor:"_Array",height:r,table:a,lengths:i}}var W=32,$=2,K={ctor:"_Array",height:0,table:[]};return{empty:K,fromList:c,toList:d,initialize:r(i),append:r(w),push:r(_),slice:e(y),get:r(t),set:e(o),map:r(p),indexedMap:r(g),foldl:e(m),foldr:e(b),length:J,toJSArray:q,fromJSArray:H}}(),h=function(){function t(t,r){return t/r|0}function n(t,r){return t%r}function o(t,r){if(0===r)throw new Error("Cannot perform mod 0. Division by zero error.");var e=t%r,n=0===t?0:r>0?t>=0?e:e+r:-o(-t,-r);return n===r?0:n}function a(t,r){return Math.log(r)/Math.log(t)}function i(t){return-t}function u(t){return t<0?-t:t}function c(t,r){return p.cmp(t,r)<0?t:r}function l(t,r){return p.cmp(t,r)>0?t:r}function f(t,r,e){return p.cmp(e,t)<0?t:p.cmp(e,r)>0?r:e}function _(t,r){return{ctor:k[p.cmp(t,r)+1]}}function s(t,r){return t!==r}function d(t){return!t}function h(t){return t===1/0||t===-(1/0)}function g(t){return 0|t}function v(t){return t*Math.PI/180}function m(t){return 2*Math.PI*t}function b(t){var r=t._0,e=t._1;return p.Tuple2(r*Math.cos(e),r*Math.sin(e))}function y(t){var r=t._0,e=t._1;return p.Tuple2(Math.sqrt(r*r+e*e),Math.atan2(e,r))}var k=["LT","EQ","GT"];return{div:r(t),rem:r(n),mod:r(o),pi:Math.PI,e:Math.E,cos:Math.cos,sin:Math.sin,tan:Math.tan,acos:Math.acos,asin:Math.asin,atan:Math.atan,atan2:r(Math.atan2),degrees:v,turns:m,fromPolar:b,toPolar:y,sqrt:Math.sqrt,logBase:r(a),negate:i,abs:u,min:r(c),max:r(l),clamp:e(f),compare:r(_),xor:r(s),not:d,truncate:g,ceiling:Math.ceil,floor:Math.floor,round:Math.round,toFloat:function(t){return t},isNaN:isNaN,isInfinite:h}}(),p=function(){function t(t,r){for(var n,o=[],a=e(t,r,0,o);a&&(n=o.pop());)a=e(n.x,n.y,0,o);return a}function e(t,r,n,o){if(n>100)return o.push({x:t,y:r}),!0;if(t===r)return!0;if("object"!=typeof t){if("function"==typeof t)throw new Error('Trying to use `(==)` on functions. There is no way to know if functions are "the same" in the Elm sense. Read more about this at http://package.elm-lang.org/packages/elm-lang/core/latest/Basics#== which describes why it is this way and what the better version will look like.');return!1}if(null===t||null===r)return!1;if(t instanceof Date)return t.getTime()===r.getTime();if(!("ctor"in t)){for(var a in t)if(!e(t[a],r[a],n+1,o))return!1;return!0}if("RBNode_elm_builtin"!==t.ctor&&"RBEmpty_elm_builtin"!==t.ctor||(t=at(t),r=at(r)),"Set_elm_builtin"===t.ctor&&(t=_elm_lang$core$Set$toList(t),r=_elm_lang$core$Set$toList(r)),"::"===t.ctor){for(var i=t,u=r;"::"===i.ctor&&"::"===u.ctor;){if(!e(i._0,u._0,n+1,o))return!1;i=i._1,u=u._1}return i.ctor===u.ctor}if("_Array"===t.ctor){var c=d.toJSArray(t),l=d.toJSArray(r);if(c.length!==l.length)return!1;for(var f=0;f=1){if(a=n(t._0,r._0),a!==v)return a;if(i>=2){if(a=n(t._1,r._1),a!==v)return a;if(i>=3){if(a=n(t._2,r._2),a!==v)return a;if(i>=4){if(a=n(t._3,r._3),a!==v)return a;if(i>=5){if(a=n(t._4,r._4),a!==v)return a;if(i>=6){if(a=n(t._5,r._5),a!==v)return a;if(i>=7)throw new Error("Comparison error: "+u)}}}}}}return v}throw new Error("Comparison error: comparison is only defined on ints, floats, times, chars, strings, lists of comparable values, and tuples of comparable values.")}function o(t,r){return{ctor:"_Tuple2",_0:t,_1:r}}function a(t){return new String(t)}function i(t){return y++}function u(t,r){var e={};for(var n in t){var o=n in r?r[n]:t[n];e[n]=o}return e}function c(t,r){return{ctor:"::",_0:t,_1:r}}function l(t,r){if("string"==typeof t)return t+r;if("[]"===t.ctor)return r;var e=c(t._0,k),n=e;for(t=t._1;"[]"!==t.ctor;)n._1=c(t._0,k),t=t._1,n=n._1;return n._1=r,e}function f(t,r){return function(e){throw new Error("Ran into a `Debug.crash` in module `"+t+"` "+s(r)+"\nThe message provided by the code author is:\n\n "+e)}}function _(t,r,e){return function(n){throw new Error("Ran into a `Debug.crash` in module `"+t+"`\n\nThis was caused by the `case` expression "+s(r)+".\nOne of the branches ended with a crash and the following value got through:\n\n "+h(e)+"\n\nThe message provided by the code author is:\n\n "+n)}}function s(t){return t.start.line==t.end.line?"on line "+t.start.line:"between lines "+t.start.line+" and "+t.end.line}function h(t){var r=typeof t;if("function"===r){var e=t.func?t.func.name:t.name;return""}if("boolean"===r)return t?"True":"False";if("number"===r)return t+"";if(t instanceof String)return"'"+p(t,!0)+"'";if("string"===r)return'"'+p(t,!1)+'"';if(null===t)return"null";if("object"===r&&"ctor"in t){var n=t.ctor.substring(0,5);if("_Tupl"===n){var o=[];for(var a in t)"ctor"!==a&&o.push(h(t[a]));return"("+o.join(",")+")"}if("_Task"===n)return"";if("_Array"===t.ctor){var i=q(t);return"Array.fromList "+h(i)}if(""===t.ctor)return"";if("_Process"===t.ctor)return"";if("::"===t.ctor){var o="["+h(t._0);for(t=t._1;"::"===t.ctor;)o+=","+h(t._0),t=t._1;return o+"]"}if("[]"===t.ctor)return"[]";if("Set_elm_builtin"===t.ctor)return"Set.fromList "+h(_elm_lang$core$Set$toList(t));if("RBNode_elm_builtin"===t.ctor||"RBEmpty_elm_builtin"===t.ctor)return"Dict.fromList "+h(at(t));var o="";for(var u in t)if("ctor"!==u){var c=h(t[u]),l=c[0],f="{"===l||"("===l||"<"===l||'"'===l||c.indexOf(" ")<0;o+=" "+(f?c:"("+c+")")}return t.ctor+o}if("object"===r){if(t instanceof Date)return"<"+t.toString()+">";if(t.elm_web_socket)return"";var o=[];for(var a in t)o.push(a+" = "+h(t[a]));return 0===o.length?"{}":"{ "+o.join(", ")+" }"}return""}function p(t,r){var e=t.replace(/\\/g,"\\\\").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r").replace(/\v/g,"\\v").replace(/\0/g,"\\0");return r?e.replace(/\'/g,"\\'"):e.replace(/\"/g,'\\"')}var g=-1,v=0,m=1,b={ctor:"_Tuple0"},y=0,k={ctor:"[]"};return{eq:t,cmp:n,Tuple0:b,Tuple2:o,chr:a,update:u,guid:i,append:r(l),crash:f,crashCase:_,toString:h}}(),g=(r(function(t,r){var e=r;return l(t,e._0,e._1)}),e(function(t,r,e){return t({ctor:"_Tuple2",_0:r,_1:e})}),e(function(t,r,e){return l(t,e,r)}),r(function(t,r){return t})),v=v||{};v["<|"]=r(function(t,r){return t(r)});var v=v||{};v["|>"]=r(function(t,r){return r(t)});var v=v||{};v[">>"]=e(function(t,r,e){return r(t(e))});var v=v||{};v["<<"]=e(function(t,r,e){return t(r(e))});var v=v||{};v["++"]=p.append;var m=p.toString,b=(h.isInfinite,h.isNaN,h.toFloat),y=h.ceiling,k=(h.floor,h.truncate,h.round,h.not),v=(h.xor,v||{});v["||"]=h.or;var v=v||{};v["&&"]=h.and;var T=(h.max,h.min,h.compare),v=v||{};v[">="]=h.ge;var v=v||{};v["<="]=h.le;var v=v||{};v[">"]=h.gt;var v=v||{};v["<"]=h.lt;var v=v||{};v["/="]=h.neq;var v=v||{};v["=="]=h.eq;var v=(h.e,h.pi,h.clamp,h.logBase,h.abs,h.negate,h.sqrt,h.atan2,h.atan,h.asin,h.acos,h.tan,h.sin,h.cos,v||{});v["^"]=h.exp;var v=v||{};v["%"]=h.mod;var v=(h.rem,v||{});v["//"]=h.div;var v=v||{};v["/"]=h.floatDiv;var v=v||{};v["*"]=h.mul;var v=v||{};v["-"]=h.sub;var v=v||{};v["+"]=h.add;var w=(h.toPolar,h.fromPolar,h.turns,h.degrees,r(function(t,r){var e=r;return"Just"===e.ctor?e._0:t})),B={ctor:"Nothing"},x=(r(function(t,r){var e=t;return"Just"===e.ctor?r(e._0):B}),function(t){return{ctor:"Just",_0:t}}),R=(r(function(t,r){var e=r;return"Just"===e.ctor?x(t(e._0)):B}),e(function(t,r,e){var n={ctor:"_Tuple2",_0:r,_1:e};return"_Tuple2"===n.ctor&&"Just"===n._0.ctor&&"Just"===n._1.ctor?x(l(t,n._0._0,n._1._0)):B}),n(function(t,r,e,n){var o={ctor:"_Tuple3",_0:r,_1:e,_2:n};return"_Tuple3"===o.ctor&&"Just"===o._0.ctor&&"Just"===o._1.ctor&&"Just"===o._2.ctor?x(f(t,o._0._0,o._1._0,o._2._0)):B}),o(function(t,r,e,n,o){var a={ctor:"_Tuple4",_0:r,_1:e,_2:n,_3:o};return"_Tuple4"===a.ctor&&"Just"===a._0.ctor&&"Just"===a._1.ctor&&"Just"===a._2.ctor&&"Just"===a._3.ctor?x(_(t,a._0._0,a._1._0,a._2._0,a._3._0)):B}),a(function(t,r,e,n,o,a){var i={ctor:"_Tuple5",_0:r,_1:e,_2:n,_3:o,_4:a};return"_Tuple5"===i.ctor&&"Just"===i._0.ctor&&"Just"===i._1.ctor&&"Just"===i._2.ctor&&"Just"===i._3.ctor&&"Just"===i._4.ctor?x(s(t,i._0._0,i._1._0,i._2._0,i._3._0,i._4._0)):B}),function(){function t(t,r){return{ctor:"::",_0:t,_1:r}}function i(r){for(var e=k,n=r.length;n--;)e=t(r[n],e);return e}function u(t){for(var r=[];"[]"!==t.ctor;)r.push(t._0),t=t._1;return r}function c(r,e){var n=k;if(r<=e)do n=t(e,n);while(e-- >r);return n}function d(t,r,e){for(var n=u(e),o=r,a=n.length;a--;)o=l(t,n[a],o);return o}function h(t,r,e){for(var n=[];"[]"!==r.ctor&&"[]"!==e.ctor;)n.push(l(t,r._0,e._0)),r=r._1,e=e._1;return i(n)}function g(t,r,e,n){for(var o=[];"[]"!==r.ctor&&"[]"!==e.ctor&&"[]"!==n.ctor;)o.push(f(t,r._0,e._0,n._0)),r=r._1,e=e._1,n=n._1;return i(o)}function v(t,r,e,n,o){for(var a=[];"[]"!==r.ctor&&"[]"!==e.ctor&&"[]"!==n.ctor&&"[]"!==o.ctor;)a.push(_(t,r._0,e._0,n._0,o._0)),r=r._1,e=e._1,n=n._1,o=o._1;return i(a)}function m(t,r,e,n,o,a){for(var u=[];"[]"!==r.ctor&&"[]"!==e.ctor&&"[]"!==n.ctor&&"[]"!==o.ctor&&"[]"!==a.ctor;)u.push(s(t,r._0,e._0,n._0,o._0,a._0)),r=r._1,e=e._1,n=n._1,o=o._1,a=a._1;return i(u)}function b(t,r){return i(u(r).sort(function(r,e){return p.cmp(t(r),t(e))}))}function y(t,r){return i(u(r).sort(function(r,e){var n=t(r)(e).ctor;return"EQ"===n?0:"LT"===n?-1:1}))}var k={ctor:"[]"};return{Nil:k,Cons:t,cons:r(t),toArray:u,fromArray:i,range:c,foldr:e(d),map2:e(h),map3:n(g),map4:o(v),map5:a(m),sortBy:r(b),sortWith:r(y)}}()),N=(R.sortWith,R.sortBy,r(function(t,r){for(;;){if(p.cmp(t,0)<1)return r;var e=r;if("[]"===e.ctor)return r;var n=t-1,o=e._1;t=n,r=o}}),R.map5,R.map4,R.map3,R.map2),A=r(function(t,r){for(;;){var e=r;if("[]"===e.ctor)return!1;if(t(e._0))return!0;var n=t,o=e._1;t=n,r=o}}),E=(r(function(t,r){return k(l(A,function(r){return k(t(r))},r))}),R.foldr),O=e(function(t,r,e){for(;;){var n=e;if("[]"===n.ctor)return r;var o=t,a=l(t,n._0,r),i=n._1;t=o,r=a,e=i}}),S=function(t){return f(O,r(function(t,r){return r+1}),0,t)},L=(r(function(t,r){return f(N,t,R.range(0,S(r)-1),r)}),r(function(t,r){return l(A,function(r){return p.eq(r,t)},r)}),L||{});L["::"]=R.cons;var C=r(function(t,e){return f(E,r(function(r,e){return l(L["::"],t(r),e)}),R.fromArray([]),e)}),M=(r(function(t,e){var n=r(function(r,e){return t(r)?l(L["::"],r,e):e});return f(E,n,R.fromArray([]),e)}),e(function(t,r,e){var n=t(r);return"Just"===n.ctor?l(L["::"],n._0,e):e})),j=(r(function(t,r){return f(E,M(t),R.fromArray([]),r)}),function(t){return f(O,r(function(t,r){return l(L["::"],t,r)}),R.fromArray([]),t)}),P=(e(function(t,e,n){var o=r(function(r,e){var n=e;return"::"===n.ctor?l(L["::"],l(t,r,n._0),e):R.fromArray([])});return j(f(O,o,R.fromArray([e]),n))}),r(function(t,e){var n=e;return"[]"===n.ctor?t:f(E,r(function(t,r){return l(L["::"],t,r)}),e,t)})),J=function(t){return f(E,P,R.fromArray([]),t)},I=(r(function(t,r){return J(l(C,t,r))}),r(function(t,e){var n=r(function(r,e){var n=e,o=n._0,a=n._1;return t(r)?{ctor:"_Tuple2",_0:l(L["::"],r,o),_1:a}:{ctor:"_Tuple2",_0:o,_1:l(L["::"],r,a)}});return f(E,n,{ctor:"_Tuple2",_0:R.fromArray([]),_1:R.fromArray([])},e)}),r(function(t,e){var n=e;if("[]"===n.ctor)return R.fromArray([]);var o=r(function(r,e){return l(L["::"],t,l(L["::"],r,e))}),a=f(E,o,R.fromArray([]),n._1);return l(L["::"],n._0,a)}),e(function(t,r,e){for(;;){if(p.cmp(t,0)<1)return e;var n=r;if("[]"===n.ctor)return e;var o=t-1,a=n._1,i=l(L["::"],n._0,e);t=o,r=a,e=i}})),U=r(function(t,r){return j(f(I,t,r,R.fromArray([])))}),z=e(function(t,r,e){if(p.cmp(r,0)<1)return R.fromArray([]);var n={ctor:"_Tuple2",_0:r,_1:e};t:do{r:do{if("_Tuple2"!==n.ctor)break t;if("[]"===n._1.ctor)return e;if("::"!==n._1._1.ctor){if(1===n._0)break r;break t}switch(n._0){case 1:break r;case 2:return R.fromArray([n._1._0,n._1._1._0]);case 3:if("::"===n._1._1._1.ctor)return R.fromArray([n._1._0,n._1._1._0,n._1._1._1._0]);break t;default:if("::"===n._1._1._1.ctor&&"::"===n._1._1._1._1.ctor){var o=n._1._1._1._0,a=n._1._1._0,i=n._1._0,u=n._1._1._1._1._0,c=n._1._1._1._1._1;return p.cmp(t,1e3)>0?l(L["::"],i,l(L["::"],a,l(L["::"],o,l(L["::"],u,l(U,r-4,c))))):l(L["::"],i,l(L["::"],a,l(L["::"],o,l(L["::"],u,f(z,t+1,r-4,c)))))}break t}}while(!1);return R.fromArray([n._1._0])}while(!1);return e}),F=(r(function(t,r){return f(z,0,t,r)}),e(function(t,r,e){for(;;){if(p.cmp(r,0)<1)return t;var n=l(L["::"],e,t),o=r-1,a=e;t=n,r=o,e=a}})),q=(r(function(t,r){return f(F,R.fromArray([]),t,r)}),d.append,d.length,d.slice,d.set,r(function(t,r){return p.cmp(0,t)<1&&p.cmp(t,d.length(r))<0?x(l(d.get,t,r)):B}),d.push,d.empty,r(function(t,e){var n=r(function(r,e){return t(r)?l(d.push,r,e):e});return f(d.foldl,n,d.empty,e)}),d.foldr,d.foldl,d.indexedMap,d.map,d.toList),D=(d.fromList,d.initialize),H=(r(function(t,r){return l(D,t,g(r))}),function(){return{fromCode:function(t){return p.chr(String.fromCharCode(t))},toCode:function(t){return t.charCodeAt(0)},toUpper:function(t){return p.chr(t.toUpperCase())},toLower:function(t){return p.chr(t.toLowerCase())},toLocaleUpper:function(t){return p.chr(t.toLocaleUpperCase())},toLocaleLower:function(t){return p.chr(t.toLocaleLowerCase())}}}()),Q=(H.fromCode,H.toCode),W=(H.toLocaleLower,H.toLocaleUpper,H.toLower,H.toUpper,e(function(t,r,e){var n=Q(e);return p.cmp(n,Q(t))>-1&&p.cmp(n,Q(r))<1})),$=(l(W,p.chr("A"),p.chr("Z")),l(W,p.chr("a"),p.chr("z")),l(W,p.chr("0"),p.chr("9")),l(W,p.chr("0"),p.chr("7")),function(){function t(t){return{ctor:"_Task_succeed",value:t}}function e(t){return{ctor:"_Task_fail",value:t}}function n(t){return{ctor:"_Task_nativeBinding",callback:t,cancel:null}}function o(t,r){return{ctor:"_Task_andThen",task:t,callback:r}}function a(t,r){return{ctor:"_Task_onError",task:t,callback:r}}function i(t){return{ctor:"_Task_receive",callback:t}}function u(t){var r={ctor:"_Process",id:p.guid(),root:t,stack:null,mailbox:[]};return h(r),r}function c(r){return n(function(e){var n=u(r);e(t(n))})}function l(t,r){t.mailbox.push(r),h(t)}function f(r,e){return n(function(n){l(r,e),n(t(p.Tuple0))})}function _(r){return n(function(e){var n=r.root;"_Task_nativeBinding"===n.ctor&&n.cancel&&n.cancel(),r.root=null,e(t(p.Tuple0))})}function s(r){return n(function(e){var n=setTimeout(function(){e(t(p.Tuple0))},r);return function(){clearTimeout(n)}})}function d(t,r){for(;t

Oops! Something went wrong when starting your Elm program.

'+t+"
"}function a(t,r){return function(e,n,a){try{var c=u(t,r);return a||(c.renderer=i),d(t,c,e,n)}catch(l){throw e.innerHTML=o(l.message),l}}}function i(){return{update:function(){}}}function u(t,e){var n=e.main;if("undefined"==typeof n.init){var o=k(R.Nil),a=p.Tuple2(p.Tuple0,o);return Zt({init:function(){return a},view:function(){return n},update:r(function(){return a}),subscriptions:function(){return o}})}var i=e.flags,u=i?s(t,n.init,i):c(t,n.init);return Zt({init:u,view:n.view,update:n.update,subscriptions:n.subscriptions})}function c(t,r){return function(e){if("undefined"!=typeof e)throw new Error("You are giving module `"+t+"` an argument in JavaScript.\nThis module does not take arguments though! You probably need to change the\ninitialization code to something like `Elm."+t+".fullscreen()`"); 2 | return r()}}function s(t,r,e){return function(n){var o=l(Ht.run,e,n);if("Err"===o.ctor)throw new Error("You are trying to initialize module `"+t+"` with an unexpected argument.\nWhen trying to convert it to a usable Elm value, I run into this problem:\n\n"+o._0);return r(o._0)}}function d(t,r,e,n){function o(t,r){return $.nativeBinding(function(e){var n=l(c,t,r);r=n._0,i.update(_(r));var o=n._1,a=f(r);w(d,o,a),e($.succeed(r))})}function a(t){$.rawSend(g,t)}var i,u=r.init,c=r.update,f=r.subscriptions,_=r.view,s=r.renderer,d={},p=$.nativeBinding(function(t){var r=u(n),o=r._0;i=s(e,a,_(o));var c=r._1,l=f(o);w(d,c,l),t($.succeed(o))}),g=b(p,o),v=h(d,a);return v?{ports:v}:{}}function h(t,r){var e;for(var n in C){var o=C[n];o.isForeign&&(e=e||{},e[n]="cmd"===o.tag?O(n):L(n,r)),t[n]=g(o,r)}return e}function g(t,r){function e(t,r){if("self"===t.ctor)return f(i,n,t._0,r);var e=t._0;switch(o){case"cmd":return f(a,n,e.cmds,r);case"sub":return f(a,n,e.subs,r);case"fx":return _(a,n,e.cmds,e.subs,r)}}var n={main:r,self:void 0},o=t.tag,a=t.onEffects,i=t.onSelfMsg,u=b(t.init,e);return n.self=u,u}function v(t,r){return $.nativeBinding(function(e){t.main(r),e($.succeed(p.Tuple0))})}function m(t,r){return l($.send,t.self,{ctor:"self",_0:r})}function b(t,r){function e(t){var o=$.receive(function(e){return r(e,t)});return l(n,o,e)}var n=$.andThen,o=l(n,t,e);return $.rawSpawn(o)}function y(t){return function(r){return{type:"leaf",home:t,value:r}}}function k(t){return{type:"node",branches:t}}function T(t,r){return{type:"map",tagger:t,tree:r}}function w(t,r,e){var n={};B(!0,r,n,null),B(!1,e,n,null);for(var o in t){var a=o in n?n[o]:{cmds:R.Nil,subs:R.Nil};$.rawSend(t[o],{ctor:"fx",_0:a})}}function B(t,r,e,n){switch(r.type){case"leaf":var o=r.home,a=x(t,o,n,r.value);return void(e[o]=N(t,a,e[o]));case"node":for(var i=r.branches;"[]"!==i.ctor;)B(t,i._0,e,n),i=i._1;return;case"map":return void B(t,r.tree,e,{tagger:r.tagger,rest:n})}}function x(t,r,e,n){function o(t){for(var r=e;r;)t=r.tagger(t),r=r.rest;return t}var a=t?C[r].cmdMap:C[r].subMap;return l(a,o,n)}function N(t,r,e){return e=e||{cmds:R.Nil,subs:R.Nil},t?(e.cmds=R.Cons(r,e.cmds),e):(e.subs=R.Cons(r,e.subs),e)}function A(t){if(t in C)throw new Error("There can only be one port named `"+t+"`, but your program has multiple.")}function E(t,r){return A(t),C[t]={tag:"cmd",cmdMap:M,converter:r,isForeign:!0},y(t)}function O(t){function r(t,r,e){for(;"[]"!==r.ctor;){for(var n=i(r._0),o=0;o=0&&a.splice(r,1)}var a=[],i=C[t].converter,u=$.succeed(null);return C[t].init=u,C[t].onEffects=e(r),{subscribe:n,unsubscribe:o}}function S(t,r){return A(t),C[t]={tag:"sub",subMap:j,converter:r,isForeign:!0},y(t)}function L(t,r){function n(t,r,e){for(var n=o(t,r,e),a=0;a0;)1&t&&(e+=r),t>>=1,r+=r;return e}function m(t,r,e){return e.slice(t,r)}function b(t,r){return t<1?"":r.slice(0,t)}function y(t,r){return t<1?"":r.slice(-t)}function k(t,r){return t<1?r:r.slice(t)}function T(t,r){return t<1?r:r.slice(0,-t)}function w(t,r,e){var n=(t-e.length)/2;return v(Math.ceil(n),r)+e+v(0|n,r)}function N(t,r,e){return e+v(t-e.length,r)}function A(t,r,e){return v(t-e.length,r)+e}function E(t){return t.trim()}function O(t){return t.replace(/^\s+/,"")}function S(t){return t.replace(/\s+$/,"")}function L(t){return R.fromArray(t.trim().split(/\s+/g))}function C(t){return R.fromArray(t.split(/\r\n|\r|\n/g))}function M(t){return t.toUpperCase()}function j(t){return t.toLowerCase()}function P(t,r){for(var e=r.length;e--;)if(t(p.chr(r[e])))return!0;return!1}function J(t,r){for(var e=r.length;e--;)if(!t(p.chr(r[e])))return!1;return!0}function I(t,r){return r.indexOf(t)>-1}function U(t,r){return 0===r.indexOf(t)}function z(t,r){return r.length>=t.length&&r.lastIndexOf(t)===r.length-t.length}function F(t,r){var e=t.length;if(e<1)return R.Nil;for(var n=0,o=[];(n=r.indexOf(t,n))>-1;)o.push(n),n+=e;return R.fromArray(o)}function q(t){var r=t.length;if(0===r)return Z("could not convert string '"+t+"' to an Int");var e=0;if("-"===t[0]){if(1===r)return Z("could not convert string '"+t+"' to an Int");e=1}for(var n=e;n0?{ctor:"_Tuple2",_0:c,_1:f(o,r,e,u)}:{ctor:"_Tuple2",_0:s,_1:_(n,h,d,e,u)};var g=r,v=e,m={ctor:"_Tuple2",_0:s,_1:f(t,h,d,u)};r=g,e=v,a=m}}),l=f(it,c,{ctor:"_Tuple2",_0:at(a),_1:u},i),s=l._0,d=l._1;return f(O,r(function(r,e){var n=r;return f(t,n._0,n._1,e)}),d,s)}),n(function(t,r,e,n){return rt.crash(nt(R.fromArray(["Internal red-black tree invariant violated, expected ",t," and got ",m(r),"/",e,"/",n,"\nPlease report this bug to "])))})),ct=function(t){var r=t;t:do{if("RBNode_elm_builtin"===r.ctor){if("BBlack"===r._0.ctor)return!0;break t}if("LBBlack"===r._0.ctor)return!0;break t}while(!1);return!1},lt=r(function(t,r){for(;;){var e=r;if("RBEmpty_elm_builtin"===e.ctor)return t;var n=l(lt,t+1,e._4),o=e._3;t=n,r=o}}),ft=r(function(t,r){t:for(;;){var e=r;if("RBEmpty_elm_builtin"===e.ctor)return B;var n=l(T,t,e._1);switch(n.ctor){case"LT":var o=t,a=e._3;t=o,r=a;continue t;case"EQ":return x(e._2);default:var i=t,u=e._4;t=i,r=u;continue t}}}),_t=r(function(t,r){var e=l(ft,t,r);return"Just"===e.ctor}),st=e(function(t,r,e){for(;;){var n=e;if("RBEmpty_elm_builtin"===n.ctor)return{ctor:"_Tuple2",_0:t,_1:r};var o=n._1,a=n._2,i=n._4;t=o,r=a,e=i}}),dt={ctor:"NBlack"},ht={ctor:"BBlack"},pt={ctor:"Black"},gt=function(t){var r=t;if("RBNode_elm_builtin"===r.ctor){var e=r._0;return p.eq(e,pt)||p.eq(e,ht)}return!0},vt={ctor:"Red"},mt=function(t){var r=t;switch(r.ctor){case"Black":return ht;case"Red":return pt;case"NBlack":return vt;default:return rt.crash("Can't make a double black node more black!")}},bt=function(t){var r=t;switch(r.ctor){case"BBlack":return pt;case"Black":return vt;case"Red":return dt;default:return rt.crash("Can't make a negative black node less black!")}},yt={ctor:"LBBlack"},kt={ctor:"LBlack"},Tt=function(t){return{ctor:"RBEmpty_elm_builtin",_0:t}},wt=Tt(kt),Bt=o(function(t,r,e,n,o){return{ctor:"RBNode_elm_builtin",_0:t,_1:r,_2:e,_3:n,_4:o}}),xt=function(t){var r=t;return"RBNode_elm_builtin"===r.ctor&&"Red"===r._0.ctor?s(Bt,pt,r._1,r._2,r._3,r._4):t},Rt=function(t){var r=t;return"RBNode_elm_builtin"===r.ctor?s(Bt,bt(r._0),r._1,r._2,r._3,r._4):Tt(kt)},Nt=function(t){return function(r){return function(e){return function(n){return function(o){return function(a){return function(i){return function(u){return function(c){return function(l){return function(f){return s(Bt,bt(t),n,o,s(Bt,pt,r,e,u,c),s(Bt,pt,a,i,l,f))}}}}}}}}}}},At=function(t){var r=t;return"RBEmpty_elm_builtin"===r.ctor?Tt(kt):s(Bt,pt,r._1,r._2,r._3,r._4)},Et=function(t){var r=t;return"RBEmpty_elm_builtin"===r.ctor?rt.crash("can't make a Leaf red"):s(Bt,vt,r._1,r._2,r._3,r._4)},Ot=function(t){var r=t;t:do{r:do{e:do{n:do{o:do{a:do{i:do{if("RBNode_elm_builtin"!==r.ctor)break t;if("RBNode_elm_builtin"===r._3.ctor)if("RBNode_elm_builtin"===r._4.ctor)switch(r._3._0.ctor){case"Red":switch(r._4._0.ctor){case"Red":if("RBNode_elm_builtin"===r._3._3.ctor&&"Red"===r._3._3._0.ctor)break i;if("RBNode_elm_builtin"===r._3._4.ctor&&"Red"===r._3._4._0.ctor)break a;if("RBNode_elm_builtin"===r._4._3.ctor&&"Red"===r._4._3._0.ctor)break o;if("RBNode_elm_builtin"===r._4._4.ctor&&"Red"===r._4._4._0.ctor)break n;break t;case"NBlack":if("RBNode_elm_builtin"===r._3._3.ctor&&"Red"===r._3._3._0.ctor)break i;if("RBNode_elm_builtin"===r._3._4.ctor&&"Red"===r._3._4._0.ctor)break a;if("BBlack"===r._0.ctor&&"RBNode_elm_builtin"===r._4._3.ctor&&"Black"===r._4._3._0.ctor&&"RBNode_elm_builtin"===r._4._4.ctor&&"Black"===r._4._4._0.ctor)break e;break t;default:if("RBNode_elm_builtin"===r._3._3.ctor&&"Red"===r._3._3._0.ctor)break i;if("RBNode_elm_builtin"===r._3._4.ctor&&"Red"===r._3._4._0.ctor)break a;break t}case"NBlack":switch(r._4._0.ctor){case"Red":if("RBNode_elm_builtin"===r._4._3.ctor&&"Red"===r._4._3._0.ctor)break o;if("RBNode_elm_builtin"===r._4._4.ctor&&"Red"===r._4._4._0.ctor)break n;if("BBlack"===r._0.ctor&&"RBNode_elm_builtin"===r._3._3.ctor&&"Black"===r._3._3._0.ctor&&"RBNode_elm_builtin"===r._3._4.ctor&&"Black"===r._3._4._0.ctor)break r;break t;case"NBlack":if("BBlack"===r._0.ctor){if("RBNode_elm_builtin"===r._4._3.ctor&&"Black"===r._4._3._0.ctor&&"RBNode_elm_builtin"===r._4._4.ctor&&"Black"===r._4._4._0.ctor)break e;if("RBNode_elm_builtin"===r._3._3.ctor&&"Black"===r._3._3._0.ctor&&"RBNode_elm_builtin"===r._3._4.ctor&&"Black"===r._3._4._0.ctor)break r;break t}break t;default:if("BBlack"===r._0.ctor&&"RBNode_elm_builtin"===r._3._3.ctor&&"Black"===r._3._3._0.ctor&&"RBNode_elm_builtin"===r._3._4.ctor&&"Black"===r._3._4._0.ctor)break r;break t}default:switch(r._4._0.ctor){case"Red":if("RBNode_elm_builtin"===r._4._3.ctor&&"Red"===r._4._3._0.ctor)break o;if("RBNode_elm_builtin"===r._4._4.ctor&&"Red"===r._4._4._0.ctor)break n;break t;case"NBlack":if("BBlack"===r._0.ctor&&"RBNode_elm_builtin"===r._4._3.ctor&&"Black"===r._4._3._0.ctor&&"RBNode_elm_builtin"===r._4._4.ctor&&"Black"===r._4._4._0.ctor)break e;break t;default:break t}}else switch(r._3._0.ctor){case"Red":if("RBNode_elm_builtin"===r._3._3.ctor&&"Red"===r._3._3._0.ctor)break i;if("RBNode_elm_builtin"===r._3._4.ctor&&"Red"===r._3._4._0.ctor)break a;break t;case"NBlack":if("BBlack"===r._0.ctor&&"RBNode_elm_builtin"===r._3._3.ctor&&"Black"===r._3._3._0.ctor&&"RBNode_elm_builtin"===r._3._4.ctor&&"Black"===r._3._4._0.ctor)break r;break t;default:break t}else{if("RBNode_elm_builtin"!==r._4.ctor)break t;switch(r._4._0.ctor){case"Red":if("RBNode_elm_builtin"===r._4._3.ctor&&"Red"===r._4._3._0.ctor)break o;if("RBNode_elm_builtin"===r._4._4.ctor&&"Red"===r._4._4._0.ctor)break n;break t;case"NBlack":if("BBlack"===r._0.ctor&&"RBNode_elm_builtin"===r._4._3.ctor&&"Black"===r._4._3._0.ctor&&"RBNode_elm_builtin"===r._4._4.ctor&&"Black"===r._4._4._0.ctor)break e;break t;default:break t}}}while(!1);return Nt(r._0)(r._3._3._1)(r._3._3._2)(r._3._1)(r._3._2)(r._1)(r._2)(r._3._3._3)(r._3._3._4)(r._3._4)(r._4)}while(!1);return Nt(r._0)(r._3._1)(r._3._2)(r._3._4._1)(r._3._4._2)(r._1)(r._2)(r._3._3)(r._3._4._3)(r._3._4._4)(r._4)}while(!1);return Nt(r._0)(r._1)(r._2)(r._4._3._1)(r._4._3._2)(r._4._1)(r._4._2)(r._3)(r._4._3._3)(r._4._3._4)(r._4._4)}while(!1);return Nt(r._0)(r._1)(r._2)(r._4._1)(r._4._2)(r._4._4._1)(r._4._4._2)(r._3)(r._4._3)(r._4._4._3)(r._4._4._4)}while(!1);return s(Bt,pt,r._4._3._1,r._4._3._2,s(Bt,pt,r._1,r._2,r._3,r._4._3._3),s(St,pt,r._4._1,r._4._2,r._4._3._4,Et(r._4._4)))}while(!1);return s(Bt,pt,r._3._4._1,r._3._4._2,s(St,pt,r._3._1,r._3._2,Et(r._3._3),r._3._4._3),s(Bt,pt,r._1,r._2,r._3._4._4,r._4))}while(!1);return t},St=o(function(t,r,e,n,o){var a=s(Bt,t,r,e,n,o);return gt(a)?Ot(a):a}),Lt=o(function(t,r,e,n,o){return ct(n)||ct(o)?s(St,mt(t),r,e,Rt(n),Rt(o)):s(Bt,t,r,e,n,o)}),Ct=o(function(t,r,e,n,o){var a=o;return"RBEmpty_elm_builtin"===a.ctor?f(Mt,t,n,o):s(Lt,t,r,e,n,s(Ct,a._0,a._1,a._2,a._3,a._4))}),Mt=e(function(t,r,e){var n={ctor:"_Tuple2",_0:r,_1:e};if("RBEmpty_elm_builtin"!==n._0.ctor){if("RBEmpty_elm_builtin"===n._1.ctor){var o=n._1._0,a=n._0._0,i={ctor:"_Tuple3",_0:t,_1:a,_2:o};return"_Tuple3"===i.ctor&&"Black"===i._0.ctor&&"Red"===i._1.ctor&&"LBlack"===i._2.ctor?s(Bt,pt,n._0._1,n._0._2,n._0._3,n._0._4):_(ut,"Black/Red/LBlack",t,m(a),m(o))}var u=n._0._2,c=n._0._4,l=n._0._1,d=s(Ct,n._0._0,l,u,n._0._3,c),h=f(st,l,u,c),p=h._0,g=h._1;return s(Lt,t,p,g,d,e)}if("RBEmpty_elm_builtin"!==n._1.ctor){var v=n._1._0,b=n._0._0,y={ctor:"_Tuple3",_0:t,_1:b,_2:v};return"_Tuple3"===y.ctor&&"Black"===y._0.ctor&&"LBlack"===y._1.ctor&&"Red"===y._2.ctor?s(Bt,pt,n._1._1,n._1._2,n._1._3,n._1._4):_(ut,"Black/LBlack/Red",t,m(b),m(v))}var k=t;switch(k.ctor){case"Red":return Tt(kt);case"Black":return Tt(yt);default:return rt.crash("cannot have bblack or nblack nodes at this point")}}),jt=r(function(t,r){var e=r;if("RBEmpty_elm_builtin"===e.ctor)return Tt(kt);var n=e._1;return s(Bt,e._0,n,l(t,n,e._2),l(jt,t,e._3),l(jt,t,e._4))}),Pt={ctor:"Same"},Jt={ctor:"Remove"},It={ctor:"Insert"},Ut=e(function(t,r,e){var n=function(e){var o=e;if("RBEmpty_elm_builtin"===o.ctor){var a=r(B);return"Nothing"===a.ctor?{ctor:"_Tuple2",_0:Pt,_1:wt}:{ctor:"_Tuple2",_0:It,_1:s(Bt,vt,t,a._0,wt,wt)}}var i=o._2,u=o._4,c=o._3,_=o._1,d=o._0,h=l(T,t,_);switch(h.ctor){case"EQ":var p=r(x(i));return"Nothing"===p.ctor?{ctor:"_Tuple2",_0:Jt,_1:f(Mt,d,c,u)}:{ctor:"_Tuple2",_0:Pt,_1:s(Bt,d,_,p._0,c,u)};case"LT":var g=n(c),v=g._0,m=g._1,b=v;switch(b.ctor){case"Same":return{ctor:"_Tuple2",_0:Pt,_1:s(Bt,d,_,i,m,u)};case"Insert":return{ctor:"_Tuple2",_0:It,_1:s(St,d,_,i,m,u)};default:return{ctor:"_Tuple2",_0:Jt,_1:s(Lt,d,_,i,m,u)}}default:var y=n(u),v=y._0,k=y._1,w=v;switch(w.ctor){case"Same":return{ctor:"_Tuple2",_0:Pt,_1:s(Bt,d,_,i,c,k)};case"Insert":return{ctor:"_Tuple2",_0:It,_1:s(St,d,_,i,c,k)};default:return{ctor:"_Tuple2",_0:Jt,_1:s(Lt,d,_,i,c,k)}}}},o=n(e),a=o._0,i=o._1,u=a;switch(u.ctor){case"Same":return i;case"Insert":return xt(i);default:return At(i)}}),zt=e(function(t,r,e){return f(Ut,t,g(x(r)),e)}),Ft=(r(function(t,r){return f(zt,t,r,wt)}),r(function(t,r){return f(it,zt,r,t)}),r(function(t,r){var n=e(function(r,e,n){return l(t,r,e)?f(zt,r,e,n):n});return f(it,n,wt,r)})),qt=(r(function(t,e){return l(Ft,r(function(t,r){return l(_t,t,e)}),t)}),r(function(t,r){var n=e(function(r,e,n){var o=n,a=o._1,i=o._0;return l(t,r,e)?{ctor:"_Tuple2",_0:f(zt,r,e,i),_1:a}:{ctor:"_Tuple2",_0:i,_1:f(zt,r,e,a)}});return f(it,n,{ctor:"_Tuple2",_0:wt,_1:wt},r)}),r(function(t,r){return f(Ut,t,g(B),r)})),Dt=(r(function(t,r){return f(it,e(function(t,r,e){return l(qt,t,e)}),t,r)}),K.batch),Ht=(Dt(R.fromArray([])),K.map,rt.crash,rt.log,function(){function t(t){return{ctor:"",tag:"succeed",msg:t}}function l(t){return{ctor:"",tag:"fail",msg:t}}function f(t){return{ctor:"",tag:t}}function _(t,r){return{ctor:"",tag:t,decoder:r}}function s(t){return{ctor:"",tag:"null",value:t}}function h(t,r){return{ctor:"",tag:"field",field:t,decoder:r}}function g(t){return{ctor:"",tag:"key-value",decoder:t}}function v(t,r){return{ctor:"",tag:"map-many",func:t,decoders:r}}function m(t,r){return{ctor:"",tag:"tuple",func:t,decoders:r}}function b(t,r){return{ctor:"",tag:"andThen",decoder:t,callback:r}}function y(t,r){return{ctor:"",tag:"customAndThen",decoder:t,callback:r}}function k(t){return{ctor:"",tag:"oneOf",decoders:t}}function T(t,r){return v(t,[r])}function w(t,r,e){return v(t,[r,e])}function N(t,r,e,n){return v(t,[r,e,n])}function A(t,r,e,n,o){return v(t,[r,e,n,o])}function E(t,r,e,n,o,a){return v(t,[r,e,n,o,a])}function O(t,r,e,n,o,a,i){return v(t,[r,e,n,o,a,i])}function S(t,r,e,n,o,a,i,u){return v(t,[r,e,n,o,a,i,u])}function L(t,r,e,n,o,a,i,u,c){return v(t,[r,e,n,o,a,i,u,c])}function C(t,r){return m(t,[r])}function M(t,r,e){return m(t,[r,e])}function j(t,r,e,n){return m(t,[r,e,n])}function P(t,r,e,n,o){return m(t,[r,e,n,o])}function J(t,r,e,n,o,a){return m(t,[r,e,n,o,a])}function I(t,r,e,n,o,a,i){return m(t,[r,e,n,o,a,i])}function U(t,r,e,n,o,a,i,u){return m(t,[r,e,n,o,a,i,u])}function z(t,r,e,n,o,a,i,u,c){return m(t,[r,e,n,o,a,i,u,c])}function F(t){return{tag:"ok",value:t}}function q(t,r){return{tag:"primitive",type:t,value:r}}function D(t,r){return{tag:"index",index:t,rest:r}}function H(t,r){return{tag:"field",field:t,rest:r}}function Q(t){return{tag:"oneOf",problems:t}}function W(t){return{tag:"custom",msg:t}}function $(t){return{tag:"fail",msg:t}}function K(t){for(var r="_";t;)switch(t.tag){case"primitive":return"Expecting "+t.type+("_"===r?"":" at "+r)+" but instead got: "+G(t.value);case"index":r+="["+t.index+"]",t=t.rest;break;case"field":r+="."+t.field,t=t.rest;break;case"oneOf":for(var e=t.problems,n=0;n.");case"PENDING_REQUEST":X(o),u="EXTRA_REQUEST";var t=O(c,l);return i=F(i,c,t,a),void(c=l);case"EXTRA_REQUEST":return void(u="NO_REQUEST")}}var a={tagger:r,parent:void 0},i=w(e,a);t.appendChild(i);var u="NO_REQUEST",c=e,l=e;return{update:n}}function w(t,r){switch(t.type){case"thunk":return t.node||(t.node=t.thunk()),w(t.node,r);case"tagger":for(var e=t.node,n=t.tagger;"tagger"===e.type;)"object"!=typeof n?n=[n,e.tagger]:n.push(e.tagger),e=e.node;var o={tagger:n,parent:r},a=w(e,o);return a.elm_event_node_ref=o,a;case"text":return document.createTextNode(t.text);case"node":var a=t.namespace?document.createElementNS(t.namespace,t.tag):document.createElement(t.tag);B(a,r,t.facts);for(var i=t.children,u=0;u0&&e.push(S("p-thunk",n,f)));case"tagger":for(var _=t.tagger,s=r.tagger,d=!1,h=t.node;"tagger"===h.type;)d=!0,"object"!=typeof _?_=[_,h.tagger]:_.push(h.tagger),h=h.node;for(var p=r.node;"tagger"===p.type;)d=!0,"object"!=typeof s?s=[s,p.tagger]:s.push(p.tagger),p=p.node;return d&&_.length!==s.length?void e.push(S("p-redraw",n,r)):((d?C(_,s):_===s)||e.push(S("p-tagger",n,s)),void L(h,p,e,n+1));case"text":if(t.text!==r.text)return void e.push(S("p-text",n,r.text));return;case"node":if(t.tag!==r.tag||t.namespace!==r.namespace)return void e.push(S("p-redraw",n,r));var g=M(t.facts,r.facts);return"undefined"!=typeof g&&e.push(S("p-facts",n,g)),void j(t,r,e,n);case"keyed-node":if(t.tag!==r.tag||t.namespace!==r.namespace)return void e.push(S("p-redraw",n,r));var g=M(t.facts,r.facts);return"undefined"!=typeof g&&e.push(S("p-facts",n,g)),void P(t,r,e,n);case"custom":if(t.impl!==r.impl)return void e.push(S("p-redraw",n,r));var g=M(t.facts,r.facts);"undefined"!=typeof g&&e.push(S("p-facts",n,g));var v=r.impl.diff(t,r);if(v)return void e.push(S("p-custom",n,v));return}}}function C(t,r){for(var e=0;eu?e.push(S("p-remove-last",n,i-u)):i0||i.length>0||"undefined"!=typeof O)&&e.push(S("p-reorder",n,{patches:o,inserts:i,endInserts:O}))}function J(t,r,e,n,o,a){var i=t[e];if("undefined"==typeof i)return i={tag:"insert",vnode:n,index:o,data:void 0},a.push({index:o,entry:i}),void(t[e]=i);if("remove"===i.tag){a.push({index:o,entry:i}),i.tag="move";var u=[];return L(i.vnode,n,u,i.index),i.index=o,void(i.data.data={patches:u,entry:i})}J(t,r,e+Z,n,o,a)}function I(t,r,e,n,o){var a=t[e];if("undefined"==typeof a){var i=S("p-remove",o,void 0);return r.push(i),void(t[e]={tag:"remove",vnode:n,index:o,data:i})}if("insert"===a.tag){a.tag="move";var u=[];L(n,a.vnode,u,o);var i=S("p-remove",o,{patches:u,entry:a});return void r.push(i)}I(t,r,e+Z,n,o)}function U(t,r,e,n){z(t,r,e,0,0,r.descendantsCount,n)}function z(t,r,e,n,o,a,i){for(var u=e[n],c=u.index;c===o;){var l=u.type;if("p-thunk"===l)U(t,r.node,u.data,i);else if("p-reorder"===l){u.domNode=t,u.eventNode=i;var f=u.data.patches;f.length>0&&z(t,r,f,0,o,a,i)}else if("p-remove"===l){u.domNode=t,u.eventNode=i;var _=u.data;if("undefined"!=typeof _){_.entry.data=t;var f=_.patches;f.length>0&&z(t,r,f,0,o,a,i)}}else u.domNode=t,u.eventNode=i;if(n++,!(u=e[n])||(c=u.index)>a)return n}switch(r.type){case"tagger":for(var s=r.node;"tagger"===s.type;)s=s.node;return z(t,s,e,n,o+1,a,t.elm_event_node_ref);case"node":for(var d=r.children,h=t.childNodes,p=0;pa))return n;o=v}return n;case"keyed-node":for(var d=r.children,h=t.childNodes,p=0;pa))return n;o=v}return n;case"text":case"thunk":throw new Error("should never traverse `text` or `thunk` nodes like this")}}function F(t,r,e,n){return 0===e.length?t:(U(t,r,e,n),q(t,e))}function q(t,r){for(var e=0;e0?100:p.cmp(o,0)<0?0:o},vr=r(function(t,r){var e=t;return{ctor:"_Tuple2",_0:p.update(r,{progress:gr(e._0)}),_1:Y}}),mr=({progress:0,color:x("red"),from:B,to:B},n(function(t,r,e,n){return{progress:t,color:r,from:e,to:n}}),e(function(t,r,e){return{scrollTop:t,targetScrollHeight:r,clientHeight:e}}),function(t){return{ctor:"Progress",_0:t}}),br=K.incomingPort("onScroll",l(Kt,l(Vt[":="],"scrollTop",Yt),function(t){return l(Kt,l(Vt[":="],"targetScrollHeight",Yt),function(r){return l(Kt,l(Vt[":="],"clientHeight",Yt),function(e){return $t({scrollTop:t,targetScrollHeight:r,clientHeight:e})})})})),yr={progress:0,color:B,to:x("lightsalmon"),from:x("lightseagreen")},kr={progressModel:yr},Tr={ctor:"_Tuple2",_0:kr,_1:Y},wr=function(t){return{ctor:"ProgressMsg",_0:t}},Br=function(t){return l(ur,R.fromArray([]),R.fromArray([l(fr,wr,pr(t.progressModel))]))},xr=r(function(t,r){var e=t,n=l(vr,e._0,r.progressModel),o=n._0,a=n._1;return{ctor:"_Tuple2",_0:p.update(r,{progressModel:o}),_1:l(X,wr,a)}}),Rr=function(t){return br(function(t){return wr(mr(t))})},Nr={main:lr({init:Tr,view:Br,update:xr,subscriptions:Rr})},Ar={};if(Ar.Main=Ar.Main||{},K.addPublicModule(Ar.Main,"Main","undefined"==typeof Nr?null:Nr),"function"==typeof define&&define.amd)return void define([],function(){return Ar});if("object"==typeof t)return void(t.exports=Ar);var Er=this.Elm;if("undefined"==typeof Er)return void(this.Elm=Ar);for(var Or in Ar){if(Or in Er)throw new Error("There are two Elm modules called `"+Or+"` on this page! Rename one of them.");Er[Or]=Ar[Or]}}).call(this)}]); -------------------------------------------------------------------------------- /examples/document/dist/static/media/panda.12f77371.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisbuttery/elm-scroll-progress/3e4dd2c1812812f878ba4bf3435b2380b43c6c1c/examples/document/dist/static/media/panda.12f77371.jpg -------------------------------------------------------------------------------- /examples/document/elm-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.0", 3 | "summary": "helpful summary of your project, less than 80 characters", 4 | "repository": "https://github.com/user/project.git", 5 | "license": "BSD3", 6 | "source-directories": [ 7 | "src", 8 | "../../src/" 9 | ], 10 | "exposed-modules": [], 11 | "dependencies": { 12 | "elm-lang/core": "4.0.5 <= v < 5.0.0", 13 | "elm-lang/html": "1.1.0 <= v < 2.0.0" 14 | }, 15 | "elm-version": "0.17.1 <= v < 0.18.0" 16 | } 17 | -------------------------------------------------------------------------------- /examples/document/src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisbuttery/elm-scroll-progress/3e4dd2c1812812f878ba4bf3435b2380b43c6c1c/examples/document/src/.DS_Store -------------------------------------------------------------------------------- /examples/document/src/Main.elm: -------------------------------------------------------------------------------- 1 | module Main exposing (..) 2 | 3 | import Html exposing (text, Html, div) 4 | import Html.App 5 | import ScrollProgress exposing (..) 6 | import Ports 7 | 8 | 9 | -- MODEL 10 | 11 | 12 | type alias AppModel = 13 | { progressModel : ScrollProgress.Model 14 | } 15 | 16 | 17 | childModel : ScrollProgress.Model 18 | childModel = 19 | { progress = 0 20 | , color = Nothing 21 | , to = Just "lightsalmon" 22 | , from = Just "lightseagreen" 23 | } 24 | 25 | 26 | initialModel : AppModel 27 | initialModel = 28 | { progressModel = childModel } 29 | 30 | 31 | init : ( AppModel, Cmd Msg ) 32 | init = 33 | ( initialModel, Cmd.none ) 34 | 35 | 36 | 37 | -- MESSAGES 38 | 39 | 40 | type Msg 41 | = ProgressMsg ScrollProgress.Msg 42 | 43 | 44 | 45 | -- VIEW 46 | 47 | 48 | view : AppModel -> Html Msg 49 | view model = 50 | Html.div [] 51 | [ Html.App.map ProgressMsg (ScrollProgress.view model.progressModel) ] 52 | 53 | 54 | 55 | -- UPDATE 56 | 57 | 58 | update : Msg -> AppModel -> ( AppModel, Cmd Msg ) 59 | update message model = 60 | case message of 61 | ProgressMsg subMsg -> 62 | let 63 | ( updatedProgessModel, progressCmd ) = 64 | ScrollProgress.update subMsg model.progressModel 65 | in 66 | ( { model | progressModel = updatedProgessModel }, Cmd.map ProgressMsg progressCmd ) 67 | 68 | 69 | 70 | -- SUBSCIPTIONS 71 | 72 | 73 | subscriptions : AppModel -> Sub Msg 74 | subscriptions model = 75 | Ports.onScroll (ProgressMsg << ScrollProgress.Progress) 76 | 77 | 78 | 79 | -- APP 80 | 81 | 82 | main : Program Never 83 | main = 84 | Html.App.program 85 | { init = init 86 | , view = view 87 | , update = update 88 | , subscriptions = subscriptions 89 | } 90 | -------------------------------------------------------------------------------- /examples/document/src/Ports.elm: -------------------------------------------------------------------------------- 1 | port module Ports exposing (..) 2 | 3 | import ScrollProgress exposing (ScrollAttributes) 4 | 5 | 6 | -- PORTS 7 | 8 | 9 | port onScroll : (ScrollAttributes -> msg) -> Sub msg 10 | -------------------------------------------------------------------------------- /examples/document/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisbuttery/elm-scroll-progress/3e4dd2c1812812f878ba4bf3435b2380b43c6c1c/examples/document/src/favicon.ico -------------------------------------------------------------------------------- /examples/document/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Elm App 8 | 9 | 10 |
11 |
12 |

The Happy Panda

13 |
14 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 15 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 16 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 17 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 18 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 19 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 20 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 21 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 22 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 23 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 24 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 25 |

26 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 27 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 28 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 29 | consequat.

30 |

Duis aute irure dolor in reprehenderit in voluptate velit esse 31 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 32 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod 33 | tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 34 | quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 35 | consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 36 | cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 37 | proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 38 |

39 |

Story written by The Happy Panda

40 |
41 | 42 | 43 | -------------------------------------------------------------------------------- /examples/document/src/index.js: -------------------------------------------------------------------------------- 1 | require('./main.css'); 2 | 3 | const Elm = require('./Main.elm'); 4 | const root = document.getElementById('root'); 5 | const app = Elm.Main.embed(root); 6 | 7 | const target = document.documentElement; 8 | // ... or target a specific element 9 | // const target = document.querySelector('.article'); 10 | 11 | window.addEventListener('scroll', function() { 12 | app.ports.onScroll.send({ 13 | scrollTop: document.documentElement.scrollTop || document.body.scrollTop, 14 | targetScrollHeight: target.scrollHeight, 15 | clientHeight: document.documentElement.clientHeight 16 | }); 17 | }); -------------------------------------------------------------------------------- /examples/document/src/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: #ccc; 3 | height: 2000px; 4 | margin: 0; 5 | position: relative; 6 | } 7 | 8 | #root { 9 | left: 0; 10 | position: fixed; 11 | top: 0; 12 | width: 100%; 13 | z-index: 20; 14 | } 15 | 16 | .scroll-progress { 17 | font-size: 12px; 18 | font: menu; 19 | height: 4px; 20 | } 21 | 22 | .article { 23 | background: white; 24 | border-radius: 2px; 25 | border-radius: 2px; 26 | border: 1px solid #c1c1c1; 27 | font: menu; 28 | margin: 60px auto; 29 | max-width: 800px; 30 | padding: 30px; 31 | position: relative; 32 | width: 80%; 33 | z-index: 10; 34 | } 35 | 36 | .article:after { 37 | background: #fff; 38 | box-shadow: 0 10px 10px #b2b2b2; 39 | content: ""; 40 | height: 100%; 41 | left: 0; 42 | position: absolute; 43 | top: 0; 44 | width: 100%; 45 | z-index: -10; 46 | } 47 | 48 | h1 { 49 | color: rgba(0, 0, 0, 0.8); 50 | font-family: 'Libre Baskerville', serif; 51 | font-size: 3.3em; 52 | padding: 30px 0 50px 0; 53 | text-align: center; 54 | } 55 | 56 | p { 57 | color: rgba(0, 0, 0, 0.8); 58 | font-family: 'Open Sans', sans-serif; 59 | font-size: 21px; 60 | line-height: 1.58; 61 | margin: 0; 62 | text-indent: 30px; 63 | } 64 | 65 | p:first-of-type { 66 | text-indent: 0; 67 | } 68 | 69 | p:first-of-type:first-letter { 70 | background-color: #699933; 71 | border: 4px solid #577f2a; 72 | color: white; 73 | float: left; 74 | font-family: Georgia; 75 | font-size: 60px; 76 | line-height: 50px; 77 | margin: 10px 30px 10px 10px; 78 | padding: 20px; 79 | } 80 | 81 | p:nth-of-type(2) { 82 | border-left: 4px solid rgba(105, 153, 51, 0.15); 83 | color: #577f2a; 84 | font-family: 'Libre Baskerville', serif; 85 | margin: 30px 10px; 86 | padding: 0 20px 0 30px; 87 | text-indent: 0; 88 | } 89 | 90 | p:nth-of-type(4) { 91 | color: rgb(198, 198, 198); 92 | font-family: 'Libre Baskerville'; 93 | font-size: 15px; 94 | margin-top: 20px; 95 | } 96 | 97 | .panda { 98 | background: url('./panda.jpg') no-repeat center; 99 | background-size: cover; 100 | height: 400px; 101 | margin: 20px 20px 40px 0; 102 | width: 100%; 103 | } 104 | -------------------------------------------------------------------------------- /examples/document/src/panda.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisbuttery/elm-scroll-progress/3e4dd2c1812812f878ba4bf3435b2380b43c6c1c/examples/document/src/panda.jpg -------------------------------------------------------------------------------- /src/ScrollProgress.elm: -------------------------------------------------------------------------------- 1 | module ScrollProgress exposing (..) 2 | 3 | {-| ScrollProgress functions and Msg. 4 | 5 | # Model 6 | @docs Model, ScrollAttributes, initialModel 7 | 8 | # Message 9 | @docs Msg 10 | 11 | # Update function 12 | @docs update, calculateProgress 13 | 14 | # View function 15 | @docs view 16 | 17 | -} 18 | 19 | import Html exposing (Html, text, div) 20 | import Html.App as App 21 | import Html.Attributes exposing (style, class) 22 | 23 | 24 | {-| A type representing a model. 25 | -} 26 | type alias Model = 27 | { progress : Int 28 | , color : Maybe String 29 | , from : Maybe String 30 | , to : Maybe String 31 | } 32 | 33 | 34 | {-| A type representing the arrtibutes we're expecting 'on scroll'. 35 | -} 36 | type alias ScrollAttributes = 37 | { scrollTop : Int 38 | , targetScrollHeight : Int 39 | , clientHeight : Int 40 | } 41 | 42 | 43 | {-| Initalize the model 44 | -} 45 | initialModel : Model 46 | initialModel = 47 | { progress = 0 48 | , color = Just "#1684f6" 49 | , from = Nothing 50 | , to = Nothing 51 | } 52 | 53 | 54 | {-| A union type representing The Elm Architect's `Msg` 55 | -} 56 | type Msg 57 | = Progress ScrollAttributes 58 | 59 | 60 | {-| A function to calculate the percentage an element has been scrolled 61 | -} 62 | calculateProgress : ScrollAttributes -> Int 63 | calculateProgress attributes = 64 | let 65 | scrollTop = 66 | toFloat attributes.scrollTop 67 | 68 | targetScrollHeight = 69 | toFloat attributes.targetScrollHeight 70 | 71 | clientHeight = 72 | toFloat attributes.clientHeight 73 | 74 | progress = 75 | scrollTop 76 | / (targetScrollHeight - clientHeight) 77 | * 100 78 | |> ceiling 79 | in 80 | if progress > 100 then 81 | 100 82 | else if progress < 0 then 83 | 0 84 | else 85 | progress 86 | 87 | 88 | {-| The Elm Architect's update function. 89 | -} 90 | update : Msg -> Model -> ( Model, Cmd Msg ) 91 | update msg model = 92 | case msg of 93 | Progress attributes -> 94 | ( { model | progress = calculateProgress attributes }, Cmd.none ) 95 | 96 | 97 | {-| A view function that will render the scroll progress ekement. 98 | -} 99 | view : Model -> Html Msg 100 | view model = 101 | let 102 | color = 103 | Maybe.withDefault "" model.color 104 | 105 | from = 106 | Maybe.withDefault "" model.from 107 | 108 | to = 109 | Maybe.withDefault "" model.to 110 | 111 | background = 112 | if color == "" && from /= "" && to /= "" then 113 | [ ( "background", from ) 114 | , ( "background", "linear-gradient( to right, " ++ from ++ ", " ++ to ++ " )" ) 115 | ] 116 | else if color /= "" then 117 | [ ( "background", color ) ] 118 | else 119 | [ ( "background", "red" ) ] 120 | 121 | transition = 122 | [ ( "transition", "0.1s width" ) 123 | , ( "width", (toString model.progress) ++ "%" ) 124 | ] 125 | 126 | styles = 127 | List.append background transition 128 | in 129 | div 130 | [ class "scroll-progress" 131 | , style styles 132 | ] 133 | [] 134 | --------------------------------------------------------------------------------