895 lines
52 KiB
HTML
895 lines
52 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en" dir="ltr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>SUBSPACE</title>
|
|
<meta name="description" content="Reactive ÐApp Development">
|
|
<meta http-equiv="X-UA-CompatibleSUBSPACE" content="IE=Edge,chrome=1">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<!-- Canonical links -->
|
|
<link rel="canonical" href="http://localhost:4000/react.html">
|
|
|
|
<!-- Icon -->
|
|
<meta name="msapplication-TileColor" content="#080E1A">
|
|
<link rel="icon" type="image/png" href="/images/favicon.png" sizes="32x32" />
|
|
|
|
<link rel="apple-touch-icon" sizes="76x76" href="/images/apple-touch-icon-60x60-precomposed.png">
|
|
<link rel="apple-touch-icon" sizes="76x76" href="/images/apple-touch-icon-76x76-precomposed.png">
|
|
<link rel="apple-touch-icon" sizes="120x120" href="/images/apple-touch-icon-120x120-precomposed.png">
|
|
<link rel="apple-touch-icon" sizes="152x152" href="/images/apple-touch-icon-152x152-precomposed.png">
|
|
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-precomposed.png">
|
|
<link rel="apple-touch-icon" href="/images/apple-touch-icon-precomposed.png">
|
|
<!-- CSS -->
|
|
|
|
<link rel="stylesheet" href="/css/application.css">
|
|
|
|
<!-- endbuild -->
|
|
|
|
<link href="https://fonts.googleapis.com/css?family=Roboto:400,700" rel="stylesheet">
|
|
|
|
<meta property="og:image" content="/img/share.png?v=0.0.5" />
|
|
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.4/styles/dracula.min.css">
|
|
<meta name="generator" content="Hexo 4.2.0"></head>
|
|
<body>
|
|
|
|
|
|
<body>
|
|
<div id="stars"></div>
|
|
<div id="stars2"></div>
|
|
<header role="banner" class="o-header">
|
|
<div class="o-header__container c-spotlightbox">
|
|
<div class="o-constrained">
|
|
<div class="o-header__top js-header">
|
|
<div><a href="/" class="a-logo">Keycard</a></div>
|
|
<nav role="navigation" class="o-navigation c-navigation">
|
|
<a href="#" class="c-navigation__trigger js-navigation-open">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="icon"><title>navigation-menu</title><rect x="0.5" y="2.5" width="23" height="3" rx="1" ry="1"/><rect x="0.5" y="10.5" width="23" height="3" rx="1" ry="1"/><rect x="0.5" y="18.5" width="23" height="3" rx="1" ry="1"/></svg>
|
|
</a>
|
|
<div class="o-navigation__list c-navigation__list js-navigation-list">
|
|
<a href="/" class="a-logo"></a>
|
|
<a href="#" class="o-navigation__close js-navigation-close">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="icon"><title>close</title><path d="M14.3,12.179a.25.25,0,0,1,0-.354l9.263-9.262A1.5,1.5,0,0,0,21.439.442L12.177,9.7a.25.25,0,0,1-.354,0L2.561.442A1.5,1.5,0,0,0,.439,2.563L9.7,11.825a.25.25,0,0,1,0,.354L.439,21.442a1.5,1.5,0,0,0,2.122,2.121L11.823,14.3a.25.25,0,0,1,.354,0l9.262,9.263a1.5,1.5,0,0,0,2.122-2.121Z"/></svg>
|
|
</a>
|
|
<a href="/getting-started.html" title="Getting started"
|
|
class="o-navigation__item ">
|
|
Getting started
|
|
</a>
|
|
<a href="/api.html" title="API"
|
|
class="o-navigation__item ">
|
|
API
|
|
</a>
|
|
<a href="https://github.com/embarklabs/subspace" title="Github"
|
|
class="o-navigation__item">
|
|
Github
|
|
</a>
|
|
|
|
</div>
|
|
</nav>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</header>
|
|
|
|
<div class="o-distance">
|
|
|
|
<!-- The main content area -->
|
|
<main role="main">
|
|
|
|
<div class="o-constrained o-content">
|
|
<div class="o-grid">
|
|
<div class="o-grid__column-1-1 o-grid__column-large-1-3">
|
|
<a href="" title="Docs categories" class="a-button js-docs-trigger c-side-navigation__trigger">Docs categories</a>
|
|
|
|
<ul class="c-side-navigation js-docs-sidebar">
|
|
<li class="c-side-navigation__header">
|
|
<a href="#" class="c-side-navigation__header__offset js-docs-trigger-close">
|
|
<svg width="18" height="17" viewBox="0 0 18 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect x="1.5752" y="0.368273" width="22" height="1" rx="0.5" transform="rotate(45 1.5752 0.368273)" fill="#090909"></rect> <rect x="0.868164" y="15.9246" width="22" height="1" rx="0.5" transform="rotate(-45 0.868164 15.9246)" fill="#090909"></rect> </svg>
|
|
</a>
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="how-it-works.html" class="c-side-navigation__item__anchor">How it works</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="getting-started.html" class="c-side-navigation__item__anchor">Getting Started</a>
|
|
|
|
<ul class="c-side-navigation__item__tree">
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="getting-started.html#Installation" class="c-side-navigation__item__anchor">Installation</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="getting-started.html#Importing-the-library" class="c-side-navigation__item__anchor">Importing the library</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="getting-started.html#Connecting-to-a-web3-provider" class="c-side-navigation__item__anchor">Connecting to a web3 provider</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="getting-started.html#Enhancing-your-contract-objects" class="c-side-navigation__item__anchor">Enhancing your contract objects</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="getting-started.html#Reacting-to-data" class="c-side-navigation__item__anchor">Reacting to data</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="getting-started.html#Tracking-state" class="c-side-navigation__item__anchor">Tracking state</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="getting-started.html#Tracking-events" class="c-side-navigation__item__anchor">Tracking events</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="getting-started.html#Tracking-balances" class="c-side-navigation__item__anchor">Tracking balances</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="getting-started.html#Getting-block-data-gas-prices-and-block-time" class="c-side-navigation__item__anchor">Getting block data, gas prices and block time</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="getting-started.html#Subscriptions" class="c-side-navigation__item__anchor">Subscriptions</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="getting-started.html#Cleanup" class="c-side-navigation__item__anchor">Cleanup</a>
|
|
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
|
|
<span class="c-side-navigation__item__anchor">Integrations</span>
|
|
|
|
|
|
<ul class="c-side-navigation__item__tree">
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="integrations-overview.html" class="c-side-navigation__item__anchor">Overview</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item is-active">
|
|
<a href="react.html" class="c-side-navigation__item__anchor">React</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="vue.html" class="c-side-navigation__item__anchor">Vue</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
|
|
<span class="c-side-navigation__item__anchor">Redux</span>
|
|
|
|
|
|
<ul class="c-side-navigation__item__tree">
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="redux.html" class="c-side-navigation__item__anchor">redux</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="redux-observable.html" class="c-side-navigation__item__anchor">redux-observable</a>
|
|
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="reactive-graphql.html" class="c-side-navigation__item__anchor">reactive-graphql</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="apollo-client.html" class="c-side-navigation__item__anchor">apollo-client</a>
|
|
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="tutorial.html" class="c-side-navigation__item__anchor">Tutorial</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="api.html" class="c-side-navigation__item__anchor">API</a>
|
|
|
|
<ul class="c-side-navigation__item__tree">
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="api.html#general" class="c-side-navigation__item__anchor">General</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="api.html#Contract-methods" class="c-side-navigation__item__anchor">Contract methods</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="api.html#Blocks-gas-price-and-block-time" class="c-side-navigation__item__anchor">Blocks, gas price and block time</a>
|
|
|
|
</li>
|
|
|
|
<li class="c-side-navigation__item ">
|
|
<a href="api.html#Low-level-API-for-data-tracking" class="c-side-navigation__item__anchor">Low level API for data tracking</a>
|
|
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<div class="o-grid__column-1-1 o-grid__column-large-2-3">
|
|
<h1 id="React"><a href="#React" class="headerlink" title="React"></a>React</h1><p>Subspace also provides a set of components that simplifies its usage within React projects through the <code>@embarklabs/subspace-react</code> package.</p>
|
|
<h3 id="Install"><a href="#Install" class="headerlink" title="Install"></a>Install</h3><p>You can install it through npm or yarn:</p>
|
|
|
|
<!-- Has Prism -->
|
|
<pre class="line-numbers" style="" ><code class="language-clike">npm install --save @embarklabs/subspace-react web3 rxjs # RxJS and Web3.js are needed peer-dependencies
|
|
</code></pre>
|
|
|
|
|
|
|
|
<h3 id="Usage"><a href="#Usage" class="headerlink" title="Usage"></a>Usage</h3><h4 id="SubspaceProvider"><a href="#SubspaceProvider" class="headerlink" title="SubspaceProvider"></a>SubspaceProvider</h4><p>To use most of the <code>subspace-react</code> components, you need to wrap your app with the <code><SubspaceProvider web3={web3} /></code> component. This will make Subspace available to any nested components that accesses it via the <code>useSubspace</code> hook or has been wrapped in the <code>withSubspace</code> higher order component. Any React component might use Subspace so it makes sense to add the provider near the top level of your dApp. The <code>SubspaceProvider</code> requires a web3 object and can receive an <code>options</code> object to initialize Subspace (optional).</p>
|
|
|
|
<!-- Has Prism -->
|
|
<pre class="line-numbers" style="" ><code class="language-js">// index.js
|
|
import React from 'react'
|
|
import ReactDOM from 'react-dom'
|
|
import MyApp from './MyApp'
|
|
import { SubspaceProvider } from '@embarklabs/subspace-react';
|
|
|
|
const web3 = new Web3("ws://localhost:8545");
|
|
|
|
const rootElement = document.getElementById('root')
|
|
ReactDOM.render(
|
|
<SubspaceProvider web3={web3} options={options}>
|
|
<MyApp />
|
|
</SubspaceProvider>,
|
|
rootElement
|
|
);
|
|
</code></pre>
|
|
|
|
|
|
|
|
<h4 id="useSubspace"><a href="#useSubspace" class="headerlink" title="useSubspace"></a>useSubspace</h4><p>Rather than relying on global variables or passing Subspace through props, The easiest way to access Subspace features is via the <code>useSubspace</code> hook. Be sure that your entire dApp is wrapped with a <code><SubspaceProvider /></code> to have it available througout the component tree.</p>
|
|
|
|
<!-- Has Prism -->
|
|
<pre class="line-numbers" style="" ><code class="language-js">// index.js
|
|
import React from 'react'
|
|
import { useSubspace } from '@embarklabs/subspace-react';
|
|
|
|
const MyComponent = () => {
|
|
const subspace = useSubspace();
|
|
|
|
// do something....
|
|
// subspace.trackBalance(web3.eth.defaultAccount);
|
|
|
|
return ...;
|
|
}
|
|
|
|
export default MyComponent
|
|
</code></pre>
|
|
|
|
|
|
|
|
<h4 id="withSubspace"><a href="#withSubspace" class="headerlink" title="withSubspace"></a>withSubspace</h4><p>This higher order component is provided as an alternative to the <code>useSubspace</code> hook. This injects the <code>subspace</code> property with an already initialized Subspace instance. Just like with the hook, your entire dApp needs to be wrapped with a <code><SubspaceProvider /></code>.</p>
|
|
|
|
<!-- Has Prism -->
|
|
<pre class="line-numbers" style="" ><code class="language-js">// index.js
|
|
import React from 'react'
|
|
import { withSubspace } from '@embarklabs/subspace-react';
|
|
|
|
const MyComponent = (props) => {
|
|
// do something....
|
|
// props.subspace.trackBalance(web3.eth.defaultAccount);
|
|
|
|
return ...;
|
|
}
|
|
|
|
export default withSubspace(MyComponent);
|
|
</code></pre>
|
|
|
|
|
|
|
|
<h4 id="observe"><a href="#observe" class="headerlink" title="observe"></a>observe</h4><p>Useful to make your component subscribe to any observable props it receives when the component is mounted and automatically unsubscribes when the component is unmounted. It can be used with any kind of observables.</p>
|
|
|
|
<!-- Has Prism -->
|
|
<pre class="line-numbers" style="" ><code class="language-js">import { observe } from '@embarklabs/subspace-react';
|
|
|
|
const ObserverComponent = observe(WrappedComponent);
|
|
</code></pre>
|
|
|
|
|
|
|
|
<h5 id="Example-usage"><a href="#Example-usage" class="headerlink" title="Example usage:"></a>Example usage:</h5>
|
|
<!-- Has Prism -->
|
|
<pre class="line-numbers" style="" ><code class="language-js">const MyComponent = ({eventData}) => {
|
|
// Handle initial state when no data is available
|
|
if (!eventData) {
|
|
return <p>No data</p>;
|
|
}
|
|
|
|
return <p>Value: {eventData.someReturnValue}</p>
|
|
};
|
|
|
|
|
|
const MyEnhancedComponent = observe(MyComponent);
|
|
|
|
|
|
const SomeOtherComponent = () => {
|
|
const myObservable$ = MyContractInstance.events.MyEvent.track({fromBlock: 1});
|
|
return <MyEnhancedComponent myProp={myObservable$} />;
|
|
}
|
|
</code></pre>
|
|
|
|
|
|
|
|
<div class="c-notification c-notification--warning">
|
|
<h3>Handling Contract Objects</h3>
|
|
The variable <code>MyContractInstance</code> is a <code>web3.eth.Contract</code> object pointing to a deployed contract address that has been enhanced with <code>subspace.contract()</code>. You can use a DApp framework like <a href="https://embark.status.im/docs/contracts_javascript.html" target="_blank" rel="noopener" />Embark</a> to easily import that contract instance: <code>import { MyContract } from './embarkArtifacts/contracts';</code>.
|
|
</div>
|
|
|
|
|
|
<div class="c-notification">
|
|
To learn more about how to use <code>subspace-react</code>, there are full working examples available in <a href="https://github.com/embark-framework/subspace/tree/master/examples/" target="_blank">Github</a>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</main>
|
|
</div>
|
|
|
|
|
|
<footer role="contentinfo" class="c-spotlightbox o-distance js-inviewport-item">
|
|
<div class="o-constrained">
|
|
<div class="o-banner o-center">
|
|
<p class="h3 o-banner__item">You want to dive <strong>into the framework?</strong></p>
|
|
<a href="/getting-started.html" title="" class="a-button o-banner__item">Getting
|
|
started</a>
|
|
</div>
|
|
<span class="c-divider u-background-color-light o-distance-xl"></span>
|
|
<div class="o-grid o-distance-xl">
|
|
<div class="o-grid__column-1-1 o-grid__column-xlarge-2-4">
|
|
<div>
|
|
<a href="./" class="a-logo">Subspace</a>
|
|
</div>
|
|
<div class="c-box u-inline-block u-border-color-light o-distance-m">
|
|
<div class="o-media-short">
|
|
<span class="u-text-color-quiet">We are part of EmbarkLabs</span>
|
|
<img src="/images/embark-logo.svg" class="o-vertical-alignment__item">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="o-grid__column-1-2 o-grid__column-large-1-4 o-grid__column-xlarge-1-4">
|
|
<p class="h6 u-text-color-quiet u-text-uppercase">Resources</p>
|
|
<ul class="o-list">
|
|
<li><a href="/getting-started.html" title="footer.resources.links.contact">Getting started</a></li>
|
|
<li><a href="/overview-integrations.html" title="footer.resources.links.privacy">Integrations</a></li>
|
|
<li><a href="/api.html" target="_blank" title="footer.resources.links.privacy" target="_blank">API</a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="o-grid__column-1-2 o-grid__column-large-1-4 o-grid__column-xlarge-1-4">
|
|
<p class="h6 u-text-color-quiet u-text-uppercase">The Status Network</p>
|
|
<ul class="o-list">
|
|
<li><a href="https://status.im/" title="footer.status.links.status" target="_blank">Status</a></li>
|
|
<li><a href="https://dap.ps/" title="dap.ps" target="_blank">dap.ps</a></li>
|
|
<li><a href="https://teller.exchange/" title="Teller" target="_blank">Teller</a></li>
|
|
<li><a href="https://assemble.fund/" title="Assemble" target="_blank">Assemble</a></li>
|
|
<li><a href="https://embark.status.im/" title="Embark" target="_blank">Embark</a></li>
|
|
<li><a href="https://subspace.status.im/" title="Subspace" target="_blank">Subspace</a></li>
|
|
<li><a href="https://vac.dev/" title="Vac" target="_blank">Vac</a></li>
|
|
<li><a href="https://nimbus.status.im/" title="Nimbus" target="_blank">Nimbus</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class="o-distance">
|
|
<p class="o-vertical-alignment o-center u-text-color-quiet">
|
|
MIT Licensed | Subspace is part of the Status Network
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
<script
|
|
src="https://code.jquery.com/jquery-3.3.1.min.js"
|
|
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
|
|
crossorigin="anonymous"></script>
|
|
|
|
<!-- Fathom - simple website analytics - https://github.com/usefathom/fathom -->
|
|
<script type="text/javascript">
|
|
(function(f, a, t, h, o, m){
|
|
a[h]=a[h]||function(){
|
|
(a[h].q=a[h].q||[]).push(arguments)
|
|
};
|
|
o=f.createElement('script'),
|
|
m=f.getElementsByTagName('script')[0];
|
|
o.async=1; o.src=t; o.id='fathom-script';
|
|
m.parentNode.insertBefore(o,m)
|
|
})(document, window, '//fathom.status.im/tracker.js', 'fathom');
|
|
fathom('set', 'siteId', 'DNONS');
|
|
fathom('trackPageview');
|
|
</script>
|
|
<!-- / Fathom -->
|
|
|
|
|
|
|
|
|
|
<script>
|
|
/*!
|
|
* jQuery.anchorScroll jQuery Plugin v1.0
|
|
*
|
|
* Author: Virgiliu Diaconu
|
|
* http://www.virgiliu.com
|
|
* Licensed under the MIT license.
|
|
*/
|
|
!function(o){"use strict";o.anchorScroll=function(l,t){var n=this;n.$el=o(l),n.el=l,n.init=function(){n.options=o.extend({},o.anchorScroll.defaultOptions,t)},n.$el.click(function(t){if(t.preventDefault(),o(t.target).closest("a").length&&o(n.el.hash).length){var e=o(n.el.hash).offset().top-n.options.offsetTop,s="this"===n.$el.data("classTo")?n.el:n.$el.data("classTo"),c=n.$el.data("onScroll"),a=n.$el.data("scrollEnd");"function"==typeof n.options.scrollStart&&n.options.scrollStart.call(l),o(s).addClass(c).removeClass(a),o("html,body").animate({scrollTop:e},n.options.scrollSpeed).promise().done(function(){o(s).addClass(a).removeClass(c),"function"==typeof n.options.scrollEnd&&n.options.scrollEnd.call(l)})}}),n.init()},o.anchorScroll.defaultOptions={scrollSpeed:800,offsetTop:0},o.fn.anchorScroll=function(l){return this.each(function(){new o.anchorScroll(this,l)})}}(jQuery,window,document);
|
|
</script>
|
|
|
|
<script>(function(root, factory) {
|
|
if (typeof define === "function" && define.amd) {
|
|
define([], function() {
|
|
return factory();
|
|
});
|
|
} else if (typeof exports === "object") {
|
|
module.exports = factory();
|
|
} else {
|
|
root.Headhesive = factory();
|
|
}
|
|
})(this, function() {
|
|
"use strict";
|
|
var _mergeObj = function(to, from) {
|
|
for (var p in from) {
|
|
if (from.hasOwnProperty(p)) {
|
|
to[p] = typeof from[p] === "object" ? _mergeObj(to[p], from[p]) : from[p];
|
|
}
|
|
}
|
|
return to;
|
|
};
|
|
var _throttle = function(func, wait) {
|
|
var _now = Date.now || function() {
|
|
return new Date().getTime();
|
|
};
|
|
var context, args, result;
|
|
var timeout = null;
|
|
var previous = 0;
|
|
var later = function() {
|
|
previous = _now();
|
|
timeout = null;
|
|
result = func.apply(context, args);
|
|
context = args = null;
|
|
};
|
|
return function() {
|
|
var now = _now();
|
|
var remaining = wait - (now - previous);
|
|
context = this;
|
|
args = arguments;
|
|
if (remaining <= 0) {
|
|
clearTimeout(timeout);
|
|
timeout = null;
|
|
previous = now;
|
|
result = func.apply(context, args);
|
|
context = args = null;
|
|
} else if (!timeout) {
|
|
timeout = setTimeout(later, remaining);
|
|
}
|
|
return result;
|
|
};
|
|
};
|
|
var _getScrollY = function() {
|
|
return window.pageYOffset !== undefined ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop;
|
|
};
|
|
var _getElemY = function(elem, side) {
|
|
var pos = 0;
|
|
var elemHeight = elem.offsetHeight;
|
|
while (elem) {
|
|
pos += elem.offsetTop;
|
|
elem = elem.offsetParent;
|
|
}
|
|
if (side === "bottom") {
|
|
pos = pos + elemHeight;
|
|
}
|
|
return pos;
|
|
};
|
|
var Headhesive = function(elem, options) {
|
|
if (!("querySelector" in document && "addEventListener" in window)) {
|
|
return;
|
|
}
|
|
this.visible = false;
|
|
this.options = {
|
|
offset: 300,
|
|
offsetSide: "top",
|
|
classes: {
|
|
clone: "headhesive",
|
|
stick: "headhesive--stick",
|
|
unstick: "headhesive--unstick"
|
|
},
|
|
throttle: 250,
|
|
onInit: function() {},
|
|
onStick: function() {},
|
|
onUnstick: function() {},
|
|
onDestroy: function() {}
|
|
};
|
|
this.elem = typeof elem === "string" ? document.querySelector(elem) : elem;
|
|
this.options = _mergeObj(this.options, options);
|
|
this.init();
|
|
};
|
|
Headhesive.prototype = {
|
|
constructor: Headhesive,
|
|
init: function() {
|
|
this.clonedElem = this.elem.cloneNode(true);
|
|
this.clonedElem.className += " " + this.options.classes.clone;
|
|
document.body.insertBefore(this.clonedElem, document.body.firstChild);
|
|
if (typeof this.options.offset === "number") {
|
|
this.scrollOffset = this.options.offset;
|
|
} else if (typeof this.options.offset === "string") {
|
|
this._setScrollOffset();
|
|
} else {
|
|
throw new Error("Invalid offset: " + this.options.offset);
|
|
}
|
|
this._throttleUpdate = _throttle(this.update.bind(this), this.options.throttle);
|
|
this._throttleScrollOffset = _throttle(this._setScrollOffset.bind(this), this.options.throttle);
|
|
window.addEventListener("scroll", this._throttleUpdate, false);
|
|
window.addEventListener("resize", this._throttleScrollOffset, false);
|
|
this.options.onInit.call(this);
|
|
},
|
|
_setScrollOffset: function() {
|
|
if (typeof this.options.offset === "string") {
|
|
this.scrollOffset = _getElemY(document.querySelector(this.options.offset), this.options.offsetSide);
|
|
}
|
|
},
|
|
destroy: function() {
|
|
document.body.removeChild(this.clonedElem);
|
|
window.removeEventListener("scroll", this._throttleUpdate);
|
|
window.removeEventListener("resize", this._throttleScrollOffset);
|
|
this.options.onDestroy.call(this);
|
|
},
|
|
stick: function() {
|
|
if (!this.visible) {
|
|
this.clonedElem.className = this.clonedElem.className.replace(new RegExp("(^|\\s)*" + this.options.classes.unstick + "(\\s|$)*", "g"), "");
|
|
this.clonedElem.className += " " + this.options.classes.stick;
|
|
this.visible = true;
|
|
this.options.onStick.call(this);
|
|
}
|
|
},
|
|
unstick: function() {
|
|
if (this.visible) {
|
|
this.clonedElem.className = this.clonedElem.className.replace(new RegExp("(^|\\s)*" + this.options.classes.stick + "(\\s|$)*", "g"), "");
|
|
this.clonedElem.className += " " + this.options.classes.unstick;
|
|
this.visible = false;
|
|
this.options.onUnstick.call(this);
|
|
}
|
|
},
|
|
update: function() {
|
|
if (_getScrollY() > this.scrollOffset) {
|
|
this.stick();
|
|
} else {
|
|
this.unstick();
|
|
}
|
|
}
|
|
};
|
|
return Headhesive;
|
|
});</script>
|
|
|
|
<script>
|
|
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):window.jQuery||window.Zepto)}(function(a){var b,c,d,e,f,g,h="Close",i="BeforeClose",j="AfterClose",k="BeforeAppend",l="MarkupParse",m="Open",n="Change",o="mfp",p="."+o,q="mfp-ready",r="mfp-removing",s="mfp-prevent-close",t=function(){},u=!!window.jQuery,v=a(window),w=function(a,c){b.ev.on(o+a+p,c)},x=function(b,c,d,e){var f=document.createElement("div");return f.className="mfp-"+b,d&&(f.innerHTML=d),e?c&&c.appendChild(f):(f=a(f),c&&f.appendTo(c)),f},y=function(c,d){b.ev.triggerHandler(o+c,d),b.st.callbacks&&(c=c.charAt(0).toLowerCase()+c.slice(1),b.st.callbacks[c]&&b.st.callbacks[c].apply(b,a.isArray(d)?d:[d]))},z=function(c){return c===g&&b.currTemplate.closeBtn||(b.currTemplate.closeBtn=a(b.st.closeMarkup.replace("%title%",b.st.tClose)),g=c),b.currTemplate.closeBtn},A=function(){a.magnificPopup.instance||(b=new t,b.init(),a.magnificPopup.instance=b)},B=function(){var a=document.createElement("p").style,b=["ms","O","Moz","Webkit"];if(void 0!==a.transition)return!0;for(;b.length;)if(b.pop()+"Transition"in a)return!0;return!1};t.prototype={constructor:t,init:function(){var c=navigator.appVersion;b.isLowIE=b.isIE8=document.all&&!document.addEventListener,b.isAndroid=/android/gi.test(c),b.isIOS=/iphone|ipad|ipod/gi.test(c),b.supportsTransition=B(),b.probablyMobile=b.isAndroid||b.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),d=a(document),b.popupsCache={}},open:function(c){var e;if(c.isObj===!1){b.items=c.items.toArray(),b.index=0;var g,h=c.items;for(e=0;e<h.length;e++)if(g=h[e],g.parsed&&(g=g.el[0]),g===c.el[0]){b.index=e;break}}else b.items=a.isArray(c.items)?c.items:[c.items],b.index=c.index||0;if(b.isOpen)return void b.updateItemHTML();b.types=[],f="",c.mainEl&&c.mainEl.length?b.ev=c.mainEl.eq(0):b.ev=d,c.key?(b.popupsCache[c.key]||(b.popupsCache[c.key]={}),b.currTemplate=b.popupsCache[c.key]):b.currTemplate={},b.st=a.extend(!0,{},a.magnificPopup.defaults,c),b.fixedContentPos="auto"===b.st.fixedContentPos?!b.probablyMobile:b.st.fixedContentPos,b.st.modal&&(b.st.closeOnContentClick=!1,b.st.closeOnBgClick=!1,b.st.showCloseBtn=!1,b.st.enableEscapeKey=!1),b.bgOverlay||(b.bgOverlay=x("bg").on("click"+p,function(){b.close()}),b.wrap=x("wrap").attr("tabindex",-1).on("click"+p,function(a){b._checkIfClose(a.target)&&b.close()}),b.container=x("container",b.wrap)),b.contentContainer=x("content"),b.st.preloader&&(b.preloader=x("preloader",b.container,b.st.tLoading));var i=a.magnificPopup.modules;for(e=0;e<i.length;e++){var j=i[e];j=j.charAt(0).toUpperCase()+j.slice(1),b["init"+j].call(b)}y("BeforeOpen"),b.st.showCloseBtn&&(b.st.closeBtnInside?(w(l,function(a,b,c,d){c.close_replaceWith=z(d.type)}),f+=" mfp-close-btn-in"):b.wrap.append(z())),b.st.alignTop&&(f+=" mfp-align-top"),b.fixedContentPos?b.wrap.css({overflow:b.st.overflowY,overflowX:"hidden",overflowY:b.st.overflowY}):b.wrap.css({top:v.scrollTop(),position:"absolute"}),(b.st.fixedBgPos===!1||"auto"===b.st.fixedBgPos&&!b.fixedContentPos)&&b.bgOverlay.css({height:d.height(),position:"absolute"}),b.st.enableEscapeKey&&d.on("keyup"+p,function(a){27===a.keyCode&&b.close()}),v.on("resize"+p,function(){b.updateSize()}),b.st.closeOnContentClick||(f+=" mfp-auto-cursor"),f&&b.wrap.addClass(f);var k=b.wH=v.height(),n={};if(b.fixedContentPos&&b._hasScrollBar(k)){var o=b._getScrollbarSize();o&&(n.marginRight=o)}b.fixedContentPos&&(b.isIE7?a("body, html").css("overflow","hidden"):n.overflow="hidden");var r=b.st.mainClass;return b.isIE7&&(r+=" mfp-ie7"),r&&b._addClassToMFP(r),b.updateItemHTML(),y("BuildControls"),a("html").css(n),b.bgOverlay.add(b.wrap).prependTo(b.st.prependTo||a(document.body)),b._lastFocusedEl=document.activeElement,setTimeout(function(){b.content?(b._addClassToMFP(q),b._setFocus()):b.bgOverlay.addClass(q),d.on("focusin"+p,b._onFocusIn)},16),b.isOpen=!0,b.updateSize(k),y(m),c},close:function(){b.isOpen&&(y(i),b.isOpen=!1,b.st.removalDelay&&!b.isLowIE&&b.supportsTransition?(b._addClassToMFP(r),setTimeout(function(){b._close()},b.st.removalDelay)):b._close())},_close:function(){y(h);var c=r+" "+q+" ";if(b.bgOverlay.detach(),b.wrap.detach(),b.container.empty(),b.st.mainClass&&(c+=b.st.mainClass+" "),b._removeClassFromMFP(c),b.fixedContentPos){var e={marginRight:""};b.isIE7?a("body, html").css("overflow",""):e.overflow="",a("html").css(e)}d.off("keyup"+p+" focusin"+p),b.ev.off(p),b.wrap.attr("class","mfp-wrap").removeAttr("style"),b.bgOverlay.attr("class","mfp-bg"),b.container.attr("class","mfp-container"),!b.st.showCloseBtn||b.st.closeBtnInside&&b.currTemplate[b.currItem.type]!==!0||b.currTemplate.closeBtn&&b.currTemplate.closeBtn.detach(),b.st.autoFocusLast&&b._lastFocusedEl&&a(b._lastFocusedEl).focus(),b.currItem=null,b.content=null,b.currTemplate=null,b.prevHeight=0,y(j)},updateSize:function(a){if(b.isIOS){var c=document.documentElement.clientWidth/window.innerWidth,d=window.innerHeight*c;b.wrap.css("height",d),b.wH=d}else b.wH=a||v.height();b.fixedContentPos||b.wrap.css("height",b.wH),y("Resize")},updateItemHTML:function(){var c=b.items[b.index];b.contentContainer.detach(),b.content&&b.content.detach(),c.parsed||(c=b.parseEl(b.index));var d=c.type;if(y("BeforeChange",[b.currItem?b.currItem.type:"",d]),b.currItem=c,!b.currTemplate[d]){var f=b.st[d]?b.st[d].markup:!1;y("FirstMarkupParse",f),f?b.currTemplate[d]=a(f):b.currTemplate[d]=!0}e&&e!==c.type&&b.container.removeClass("mfp-"+e+"-holder");var g=b["get"+d.charAt(0).toUpperCase()+d.slice(1)](c,b.currTemplate[d]);b.appendContent(g,d),c.preloaded=!0,y(n,c),e=c.type,b.container.prepend(b.contentContainer),y("AfterChange")},appendContent:function(a,c){b.content=a,a?b.st.showCloseBtn&&b.st.closeBtnInside&&b.currTemplate[c]===!0?b.content.find(".mfp-close").length||b.content.append(z()):b.content=a:b.content="",y(k),b.container.addClass("mfp-"+c+"-holder"),b.contentContainer.append(b.content)},parseEl:function(c){var d,e=b.items[c];if(e.tagName?e={el:a(e)}:(d=e.type,e={data:e,src:e.src}),e.el){for(var f=b.types,g=0;g<f.length;g++)if(e.el.hasClass("mfp-"+f[g])){d=f[g];break}e.src=e.el.attr("data-mfp-src"),e.src||(e.src=e.el.attr("href"))}return e.type=d||b.st.type||"inline",e.index=c,e.parsed=!0,b.items[c]=e,y("ElementParse",e),b.items[c]},addGroup:function(a,c){var d=function(d){d.mfpEl=this,b._openClick(d,a,c)};c||(c={});var e="click.magnificPopup";c.mainEl=a,c.items?(c.isObj=!0,a.off(e).on(e,d)):(c.isObj=!1,c.delegate?a.off(e).on(e,c.delegate,d):(c.items=a,a.off(e).on(e,d)))},_openClick:function(c,d,e){var f=void 0!==e.midClick?e.midClick:a.magnificPopup.defaults.midClick;if(f||!(2===c.which||c.ctrlKey||c.metaKey||c.altKey||c.shiftKey)){var g=void 0!==e.disableOn?e.disableOn:a.magnificPopup.defaults.disableOn;if(g)if(a.isFunction(g)){if(!g.call(b))return!0}else if(v.width()<g)return!0;c.type&&(c.preventDefault(),b.isOpen&&c.stopPropagation()),e.el=a(c.mfpEl),e.delegate&&(e.items=d.find(e.delegate)),b.open(e)}},updateStatus:function(a,d){if(b.preloader){c!==a&&b.container.removeClass("mfp-s-"+c),d||"loading"!==a||(d=b.st.tLoading);var e={status:a,text:d};y("UpdateStatus",e),a=e.status,d=e.text,b.preloader.html(d),b.preloader.find("a").on("click",function(a){a.stopImmediatePropagation()}),b.container.addClass("mfp-s-"+a),c=a}},_checkIfClose:function(c){if(!a(c).hasClass(s)){var d=b.st.closeOnContentClick,e=b.st.closeOnBgClick;if(d&&e)return!0;if(!b.content||a(c).hasClass("mfp-close")||b.preloader&&c===b.preloader[0])return!0;if(c===b.content[0]||a.contains(b.content[0],c)){if(d)return!0}else if(e&&a.contains(document,c))return!0;return!1}},_addClassToMFP:function(a){b.bgOverlay.addClass(a),b.wrap.addClass(a)},_removeClassFromMFP:function(a){this.bgOverlay.removeClass(a),b.wrap.removeClass(a)},_hasScrollBar:function(a){return(b.isIE7?d.height():document.body.scrollHeight)>(a||v.height())},_setFocus:function(){(b.st.focus?b.content.find(b.st.focus).eq(0):b.wrap).focus()},_onFocusIn:function(c){return c.target===b.wrap[0]||a.contains(b.wrap[0],c.target)?void 0:(b._setFocus(),!1)},_parseMarkup:function(b,c,d){var e;d.data&&(c=a.extend(d.data,c)),y(l,[b,c,d]),a.each(c,function(c,d){if(void 0===d||d===!1)return!0;if(e=c.split("_"),e.length>1){var f=b.find(p+"-"+e[0]);if(f.length>0){var g=e[1];"replaceWith"===g?f[0]!==d[0]&&f.replaceWith(d):"img"===g?f.is("img")?f.attr("src",d):f.replaceWith(a("<img>").attr("src",d).attr("class",f.attr("class"))):f.attr(e[1],d)}}else b.find(p+"-"+c).html(d)})},_getScrollbarSize:function(){if(void 0===b.scrollbarSize){var a=document.createElement("div");a.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(a),b.scrollbarSize=a.offsetWidth-a.clientWidth,document.body.removeChild(a)}return b.scrollbarSize}},a.magnificPopup={instance:null,proto:t.prototype,modules:[],open:function(b,c){return A(),b=b?a.extend(!0,{},b):{},b.isObj=!0,b.index=c||0,this.instance.open(b)},close:function(){return a.magnificPopup.instance&&a.magnificPopup.instance.close()},registerModule:function(b,c){c.options&&(a.magnificPopup.defaults[b]=c.options),a.extend(this.proto,c.proto),this.modules.push(b)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'<button title="%title%" type="button" class="mfp-close">×</button>',tClose:"Close (Esc)",tLoading:"Loading...",autoFocusLast:!0}},a.fn.magnificPopup=function(c){A();var d=a(this);if("string"==typeof c)if("open"===c){var e,f=u?d.data("magnificPopup"):d[0].magnificPopup,g=parseInt(arguments[1],10)||0;f.items?e=f.items[g]:(e=d,f.delegate&&(e=e.find(f.delegate)),e=e.eq(g)),b._openClick({mfpEl:e},d,f)}else b.isOpen&&b[c].apply(b,Array.prototype.slice.call(arguments,1));else c=a.extend(!0,{},c),u?d.data("magnificPopup",c):d[0].magnificPopup=c,b.addGroup(d,c);return d};var C,D,E,F="inline",G=function(){E&&(D.after(E.addClass(C)).detach(),E=null)};a.magnificPopup.registerModule(F,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){b.types.push(F),w(h+"."+F,function(){G()})},getInline:function(c,d){if(G(),c.src){var e=b.st.inline,f=a(c.src);if(f.length){var g=f[0].parentNode;g&&g.tagName&&(D||(C=e.hiddenClass,D=x(C),C="mfp-"+C),E=f.after(D).detach().removeClass(C)),b.updateStatus("ready")}else b.updateStatus("error",e.tNotFound),f=a("<div>");return c.inlineElement=f,f}return b.updateStatus("ready"),b._parseMarkup(d,{},c),d}}});var H,I="ajax",J=function(){H&&a(document.body).removeClass(H)},K=function(){J(),b.req&&b.req.abort()};a.magnificPopup.registerModule(I,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'<a href="%url%">The content</a> could not be loaded.'},proto:{initAjax:function(){b.types.push(I),H=b.st.ajax.cursor,w(h+"."+I,K),w("BeforeChange."+I,K)},getAjax:function(c){H&&a(document.body).addClass(H),b.updateStatus("loading");var d=a.extend({url:c.src,success:function(d,e,f){var g={data:d,xhr:f};y("ParseAjax",g),b.appendContent(a(g.data),I),c.finished=!0,J(),b._setFocus(),setTimeout(function(){b.wrap.addClass(q)},16),b.updateStatus("ready"),y("AjaxContentAdded")},error:function(){J(),c.finished=c.loadError=!0,b.updateStatus("error",b.st.ajax.tError.replace("%url%",c.src))}},b.st.ajax.settings);return b.req=a.ajax(d),""}}});var L,M=function(c){if(c.data&&void 0!==c.data.title)return c.data.title;var d=b.st.image.titleSrc;if(d){if(a.isFunction(d))return d.call(b,c);if(c.el)return c.el.attr(d)||""}return""};a.magnificPopup.registerModule("image",{options:{markup:'<div class="mfp-figure"><div class="mfp-close"></div><figure><div class="mfp-img"></div><figcaption><div class="mfp-bottom-bar"><div class="mfp-title"></div><div class="mfp-counter"></div></div></figcaption></figure></div>',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'<a href="%url%">The image</a> could not be loaded.'},proto:{initImage:function(){var c=b.st.image,d=".image";b.types.push("image"),w(m+d,function(){"image"===b.currItem.type&&c.cursor&&a(document.body).addClass(c.cursor)}),w(h+d,function(){c.cursor&&a(document.body).removeClass(c.cursor),v.off("resize"+p)}),w("Resize"+d,b.resizeImage),b.isLowIE&&w("AfterChange",b.resizeImage)},resizeImage:function(){var a=b.currItem;if(a&&a.img&&b.st.image.verticalFit){var c=0;b.isLowIE&&(c=parseInt(a.img.css("padding-top"),10)+parseInt(a.img.css("padding-bottom"),10)),a.img.css("max-height",b.wH-c)}},_onImageHasSize:function(a){a.img&&(a.hasSize=!0,L&&clearInterval(L),a.isCheckingImgSize=!1,y("ImageHasSize",a),a.imgHidden&&(b.content&&b.content.removeClass("mfp-loading"),a.imgHidden=!1))},findImageSize:function(a){var c=0,d=a.img[0],e=function(f){L&&clearInterval(L),L=setInterval(function(){return d.naturalWidth>0?void b._onImageHasSize(a):(c>200&&clearInterval(L),c++,void(3===c?e(10):40===c?e(50):100===c&&e(500)))},f)};e(1)},getImage:function(c,d){var e=0,f=function(){c&&(c.img[0].complete?(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("ready")),c.hasSize=!0,c.loaded=!0,y("ImageLoadComplete")):(e++,200>e?setTimeout(f,100):g()))},g=function(){c&&(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("error",h.tError.replace("%url%",c.src))),c.hasSize=!0,c.loaded=!0,c.loadError=!0)},h=b.st.image,i=d.find(".mfp-img");if(i.length){var j=document.createElement("img");j.className="mfp-img",c.el&&c.el.find("img").length&&(j.alt=c.el.find("img").attr("alt")),c.img=a(j).on("load.mfploader",f).on("error.mfploader",g),j.src=c.src,i.is("img")&&(c.img=c.img.clone()),j=c.img[0],j.naturalWidth>0?c.hasSize=!0:j.width||(c.hasSize=!1)}return b._parseMarkup(d,{title:M(c),img_replaceWith:c.img},c),b.resizeImage(),c.hasSize?(L&&clearInterval(L),c.loadError?(d.addClass("mfp-loading"),b.updateStatus("error",h.tError.replace("%url%",c.src))):(d.removeClass("mfp-loading"),b.updateStatus("ready")),d):(b.updateStatus("loading"),c.loading=!0,c.hasSize||(c.imgHidden=!0,d.addClass("mfp-loading"),b.findImageSize(c)),d)}}});var N,O=function(){return void 0===N&&(N=void 0!==document.createElement("p").style.MozTransform),N};a.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(a){return a.is("img")?a:a.find("img")}},proto:{initZoom:function(){var a,c=b.st.zoom,d=".zoom";if(c.enabled&&b.supportsTransition){var e,f,g=c.duration,j=function(a){var b=a.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),d="all "+c.duration/1e3+"s "+c.easing,e={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},f="transition";return e["-webkit-"+f]=e["-moz-"+f]=e["-o-"+f]=e[f]=d,b.css(e),b},k=function(){b.content.css("visibility","visible")};w("BuildControls"+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.content.css("visibility","hidden"),a=b._getItemToZoom(),!a)return void k();f=j(a),f.css(b._getOffset()),b.wrap.append(f),e=setTimeout(function(){f.css(b._getOffset(!0)),e=setTimeout(function(){k(),setTimeout(function(){f.remove(),a=f=null,y("ZoomAnimationEnded")},16)},g)},16)}}),w(i+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.st.removalDelay=g,!a){if(a=b._getItemToZoom(),!a)return;f=j(a)}f.css(b._getOffset(!0)),b.wrap.append(f),b.content.css("visibility","hidden"),setTimeout(function(){f.css(b._getOffset())},16)}}),w(h+d,function(){b._allowZoom()&&(k(),f&&f.remove(),a=null)})}},_allowZoom:function(){return"image"===b.currItem.type},_getItemToZoom:function(){return b.currItem.hasSize?b.currItem.img:!1},_getOffset:function(c){var d;d=c?b.currItem.img:b.st.zoom.opener(b.currItem.el||b.currItem);var e=d.offset(),f=parseInt(d.css("padding-top"),10),g=parseInt(d.css("padding-bottom"),10);e.top-=a(window).scrollTop()-f;var h={width:d.width(),height:(u?d.innerHeight():d[0].offsetHeight)-g-f};return O()?h["-moz-transform"]=h.transform="translate("+e.left+"px,"+e.top+"px)":(h.left=e.left,h.top=e.top),h}}});var P="iframe",Q="//about:blank",R=function(a){if(b.currTemplate[P]){var c=b.currTemplate[P].find("iframe");c.length&&(a||(c[0].src=Q),b.isIE8&&c.css("display",a?"block":"none"))}};a.magnificPopup.registerModule(P,{options:{markup:'<div class="mfp-iframe-scaler"><div class="mfp-close"></div><iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe></div>',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){b.types.push(P),w("BeforeChange",function(a,b,c){b!==c&&(b===P?R():c===P&&R(!0))}),w(h+"."+P,function(){R()})},getIframe:function(c,d){var e=c.src,f=b.st.iframe;a.each(f.patterns,function(){return e.indexOf(this.index)>-1?(this.id&&(e="string"==typeof this.id?e.substr(e.lastIndexOf(this.id)+this.id.length,e.length):this.id.call(this,e)),e=this.src.replace("%id%",e),!1):void 0});var g={};return f.srcAction&&(g[f.srcAction]=e),b._parseMarkup(d,g,c),b.updateStatus("ready"),d}}});var S=function(a){var c=b.items.length;return a>c-1?a-c:0>a?c+a:a},T=function(a,b,c){return a.replace(/%curr%/gi,b+1).replace(/%total%/gi,c)};a.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var c=b.st.gallery,e=".mfp-gallery";return b.direction=!0,c&&c.enabled?(f+=" mfp-gallery",w(m+e,function(){c.navigateByImgClick&&b.wrap.on("click"+e,".mfp-img",function(){return b.items.length>1?(b.next(),!1):void 0}),d.on("keydown"+e,function(a){37===a.keyCode?b.prev():39===a.keyCode&&b.next()})}),w("UpdateStatus"+e,function(a,c){c.text&&(c.text=T(c.text,b.currItem.index,b.items.length))}),w(l+e,function(a,d,e,f){var g=b.items.length;e.counter=g>1?T(c.tCounter,f.index,g):""}),w("BuildControls"+e,function(){if(b.items.length>1&&c.arrows&&!b.arrowLeft){var d=c.arrowMarkup,e=b.arrowLeft=a(d.replace(/%title%/gi,c.tPrev).replace(/%dir%/gi,"left")).addClass(s),f=b.arrowRight=a(d.replace(/%title%/gi,c.tNext).replace(/%dir%/gi,"right")).addClass(s);e.click(function(){b.prev()}),f.click(function(){b.next()}),b.container.append(e.add(f))}}),w(n+e,function(){b._preloadTimeout&&clearTimeout(b._preloadTimeout),b._preloadTimeout=setTimeout(function(){b.preloadNearbyImages(),b._preloadTimeout=null},16)}),void w(h+e,function(){d.off(e),b.wrap.off("click"+e),b.arrowRight=b.arrowLeft=null})):!1},next:function(){b.direction=!0,b.index=S(b.index+1),b.updateItemHTML()},prev:function(){b.direction=!1,b.index=S(b.index-1),b.updateItemHTML()},goTo:function(a){b.direction=a>=b.index,b.index=a,b.updateItemHTML()},preloadNearbyImages:function(){var a,c=b.st.gallery.preload,d=Math.min(c[0],b.items.length),e=Math.min(c[1],b.items.length);for(a=1;a<=(b.direction?e:d);a++)b._preloadItem(b.index+a);for(a=1;a<=(b.direction?d:e);a++)b._preloadItem(b.index-a)},_preloadItem:function(c){if(c=S(c),!b.items[c].preloaded){var d=b.items[c];d.parsed||(d=b.parseEl(c)),y("LazyLoad",d),"image"===d.type&&(d.img=a('<img class="mfp-img" />').on("load.mfploader",function(){d.hasSize=!0}).on("error.mfploader",function(){d.hasSize=!0,d.loadError=!0,y("LazyLoadError",d)}).attr("src",d.src)),d.preloaded=!0}}}});var U="retina";a.magnificPopup.registerModule(U,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=b.st.retina,c=a.ratio;c=isNaN(c)?c():c,c>1&&(w("ImageHasSize."+U,function(a,b){b.img.css({"max-width":b.img[0].naturalWidth/c,width:"100%"})}),w("ElementParse."+U,function(b,d){d.src=a.replaceSrc(d,c)}))}}}}),A()});
|
|
</script>
|
|
|
|
<script>
|
|
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery')) :
|
|
typeof define === 'function' && define.amd ? define(['jquery'], factory) :
|
|
(factory(global.jQuery));
|
|
}(this, (function ($) { 'use strict';
|
|
|
|
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
|
|
|
|
/**
|
|
* @author Mudit Ameta
|
|
* @license https://github.com/zeusdeux/isInViewport/blob/master/license.md MIT
|
|
*/
|
|
|
|
// expose isInViewport as a custom pseudo-selector
|
|
$.extend($.expr.pseudos || $.expr[':'], {
|
|
// if $.expr.createPseudo is available, use it
|
|
'in-viewport': $.expr.createPseudo
|
|
? $.expr.createPseudo(function (argsString) { return function (currElement) { return isInViewport(currElement, getSelectorArgs(argsString)); }; })
|
|
: function (currObj, index, meta) { return isInViewport(currObj, getSelectorArgs(meta[3])); }
|
|
});
|
|
|
|
|
|
// expose isInViewport as a function too
|
|
// this lets folks pass around actual objects as options (like custom viewport)
|
|
// and doesn't tie 'em down to strings. It also prevents isInViewport from
|
|
// having to look up and wrap the dom element corresponding to the viewport selector
|
|
$.fn.isInViewport = function(options) {
|
|
return this.filter(function (i, el) { return isInViewport(el, options); })
|
|
};
|
|
|
|
$.fn.run = run;
|
|
|
|
// lets you chain any arbitrary function or an array of functions and returns a jquery object
|
|
function run(args) {
|
|
var this$1 = this;
|
|
|
|
if (arguments.length === 1 && typeof args === 'function') {
|
|
args = [args];
|
|
}
|
|
|
|
if (!(args instanceof Array)) {
|
|
throw new SyntaxError('isInViewport: Argument(s) passed to .do/.run should be a function or an array of functions')
|
|
}
|
|
|
|
args.forEach(function (arg) {
|
|
if (typeof arg !== 'function') {
|
|
console.warn('isInViewport: Argument(s) passed to .do/.run should be a function or an array of functions');
|
|
console.warn('isInViewport: Ignoring non-function values in array and moving on');
|
|
} else {
|
|
[].slice.call(this$1).forEach(function (t) { return arg.call($(t)); });
|
|
}
|
|
});
|
|
|
|
return this
|
|
}
|
|
|
|
|
|
// gets the width of the scrollbar
|
|
function getScrollbarWidth(viewport) {
|
|
// append a div that has 100% width to get true width of viewport
|
|
var el = $('<div></div>').css({
|
|
width: '100%'
|
|
});
|
|
viewport.append(el);
|
|
|
|
// subtract true width from the viewport width which is inclusive
|
|
// of scrollbar by default
|
|
var scrollBarWidth = viewport.width() - el.width();
|
|
|
|
// remove our element from DOM
|
|
el.remove();
|
|
return scrollBarWidth
|
|
}
|
|
|
|
|
|
// Returns true if DOM element `element` is in viewport
|
|
function isInViewport(element, options) {
|
|
var ref = element.getBoundingClientRect();
|
|
var top = ref.top;
|
|
var bottom = ref.bottom;
|
|
var left = ref.left;
|
|
var right = ref.right;
|
|
|
|
var settings = $.extend({
|
|
tolerance: 0,
|
|
viewport: window
|
|
}, options);
|
|
var isVisibleFlag = false;
|
|
var $viewport = settings.viewport.jquery ? settings.viewport : $(settings.viewport);
|
|
|
|
if (!$viewport.length) {
|
|
console.warn('isInViewport: The viewport selector you have provided matches no element on page.');
|
|
console.warn('isInViewport: Defaulting to viewport as window');
|
|
$viewport = $(window);
|
|
}
|
|
|
|
var $viewportHeight = $viewport.height();
|
|
var $viewportWidth = $viewport.width();
|
|
var typeofViewport = $viewport[0].toString();
|
|
|
|
// if the viewport is other than window recalculate the top,
|
|
// bottom,left and right wrt the new viewport
|
|
// the [object DOMWindow] check is for window object type in PhantomJS
|
|
if ($viewport[0] !== window && typeofViewport !== '[object Window]' && typeofViewport !== '[object DOMWindow]') {
|
|
// use getBoundingClientRect() instead of $.Offset()
|
|
// since the original top/bottom positions are calculated relative to browser viewport and not document
|
|
var viewportRect = $viewport[0].getBoundingClientRect();
|
|
|
|
// recalculate these relative to viewport
|
|
top = top - viewportRect.top;
|
|
bottom = bottom - viewportRect.top;
|
|
left = left - viewportRect.left;
|
|
right = right - viewportRect.left;
|
|
|
|
// get the scrollbar width from cache or calculate it
|
|
isInViewport.scrollBarWidth = isInViewport.scrollBarWidth || getScrollbarWidth($viewport);
|
|
|
|
// remove the width of the scrollbar from the viewport width
|
|
$viewportWidth -= isInViewport.scrollBarWidth;
|
|
}
|
|
|
|
// handle falsy, non-number and non-integer tolerance value
|
|
// same as checking using isNaN and then setting to 0
|
|
// bitwise operators deserve some love too you know
|
|
settings.tolerance = ~~Math.round(parseFloat(settings.tolerance));
|
|
|
|
if (settings.tolerance < 0) {
|
|
settings.tolerance = $viewportHeight + settings.tolerance; // viewport height - tol
|
|
}
|
|
|
|
// the element is NOT in viewport iff it is completely out of
|
|
// viewport laterally or if it is completely out of the tolerance
|
|
// region. Therefore, if it is partially in view then it is considered
|
|
// to be in the viewport and hence true is returned. Because we have adjusted
|
|
// the left/right positions relative to the viewport, we should check the
|
|
// element's right against the viewport's 0 (left side), and the element's
|
|
// left against the viewport's width to see if it is outside of the viewport.
|
|
|
|
if (right <= 0 || left >= $viewportWidth) {
|
|
return isVisibleFlag
|
|
}
|
|
|
|
// if the element is bound to some tolerance
|
|
isVisibleFlag = settings.tolerance ? top <= settings.tolerance && bottom >= settings.tolerance : bottom > 0 && top <= $viewportHeight;
|
|
|
|
return isVisibleFlag
|
|
}
|
|
|
|
|
|
// get the selector args from the args string proved by Sizzle
|
|
function getSelectorArgs(argsString) {
|
|
if (argsString) {
|
|
var args = argsString.split(',');
|
|
|
|
// when user only gives viewport and no tolerance
|
|
if (args.length === 1 && isNaN(args[0])) {
|
|
args[1] = args[0];
|
|
args[0] = void 0;
|
|
}
|
|
|
|
return {
|
|
tolerance: args[0] ? args[0].trim() : void 0,
|
|
viewport: args[1] ? $(args[1].trim()) : void 0
|
|
}
|
|
}
|
|
return {}
|
|
}
|
|
|
|
})));
|
|
|
|
//# sourceMappingURL=isInViewport.js.map
|
|
</script>
|
|
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.19.0/prism.min.js"></script>
|
|
<script>
|
|
$(document).ready(function() {
|
|
$(document).on('scroll',function(e)
|
|
{
|
|
$('h2[id]').each(function()
|
|
{
|
|
if ( $(this).offset().top < window.pageYOffset + 100
|
|
&& $(this).offset().top +
|
|
$(this).height() > window.pageYOffset + 100
|
|
)
|
|
{
|
|
|
|
$(this).addClass('is-active');
|
|
|
|
var data = $(this).attr('id');
|
|
|
|
window.location.hash = '#!' + data;
|
|
|
|
var $location = window.location.hash.replace(/^#!/, '');
|
|
|
|
$('.js-docs-sidebar a').each(function() {
|
|
if($(this).attr('href').indexOf($location) > -1) {
|
|
$(this).addClass('is-active');
|
|
} else {
|
|
$(this).removeClass('is-active');
|
|
}
|
|
});
|
|
}
|
|
|
|
});
|
|
});
|
|
|
|
|
|
$(window).scroll(function() {
|
|
$('.js-inviewport-item').isInViewport({
|
|
tolerance: 0
|
|
})
|
|
.addClass('is-active');
|
|
});
|
|
|
|
var options = {
|
|
classes: {
|
|
clone: 'o-header__top--clone',
|
|
stick: 'is-sticky',
|
|
unstick: 'is-unsticky'
|
|
}
|
|
};
|
|
if($(window).width() >= 767) {
|
|
var header = new Headhesive('.js-header', options);
|
|
}
|
|
$('.js-navigation-open').on('click', function(event) {
|
|
event.preventDefault();
|
|
|
|
$('.js-navigation-list').addClass('is-active');
|
|
});
|
|
|
|
$('.js-navigation-close').on('click', function(event) {
|
|
event.preventDefault();
|
|
|
|
$('.js-navigation-list').removeClass('is-active');
|
|
});
|
|
|
|
$('.js-header-keyvisual').addClass('is-active');
|
|
|
|
// Popup
|
|
$('.js-popup').magnificPopup({
|
|
type: 'inline',
|
|
preloader: false,
|
|
focus: '#name',
|
|
|
|
// When elemened is focused, some mobile browsers in some cases zoom in
|
|
// It looks not nice, so we disable it:
|
|
callbacks: {
|
|
beforeOpen: function() {
|
|
if($(window).width() < 700) {
|
|
this.st.focus = false;
|
|
} else {
|
|
this.st.focus = '#name';
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// Scroll
|
|
$('.js-anchor-scroll').anchorScroll({
|
|
scrollSpeed: 800, // scroll speed
|
|
offsetTop: 100, // offset for fixed top bars (defaults to 0)
|
|
onScroll: function () {
|
|
// callback on scroll start
|
|
},
|
|
scrollEnd: function () {
|
|
// callback on scroll end
|
|
}
|
|
});
|
|
});
|
|
|
|
$('.js-docs-trigger').on('click', function(event) {
|
|
event.preventDefault();
|
|
|
|
$('.js-docs-sidebar').addClass('is-active');
|
|
});
|
|
|
|
$('.js-docs-trigger-close').on('click', function(event) {
|
|
event.preventDefault();
|
|
|
|
$('.js-docs-sidebar').removeClass('is-active');
|
|
});
|
|
</script>
|
|
</body>
|
|
|
|
|
|
</body>
|
|
</html>
|
|
|