From b583a6ead873f538140b3c6f04311c300bab0499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Mon, 9 Jan 2017 17:26:07 +0100 Subject: [PATCH 001/120] Fetching data from the Twitter API --- _includes/footer.html | 1 + _layouts/frontpage.html | 17 +- resources/js/vendor/tweetMachine.min.js | 5 + resources/php/getFromTwitter.php | 89 ++ resources/php/inc/twitteroauth/OAuth.php | 874 ++++++++++++++++++ .../php/inc/twitteroauth/twitteroauth.php | 245 +++++ 6 files changed, 1228 insertions(+), 3 deletions(-) create mode 100755 resources/js/vendor/tweetMachine.min.js create mode 100644 resources/php/getFromTwitter.php create mode 100755 resources/php/inc/twitteroauth/OAuth.php create mode 100755 resources/php/inc/twitteroauth/twitteroauth.php diff --git a/_includes/footer.html b/_includes/footer.html index f593b4bfc..ef544a468 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -54,6 +54,7 @@ + diff --git a/_layouts/frontpage.html b/_layouts/frontpage.html index 8321702df..e63d53f59 100644 --- a/_layouts/frontpage.html +++ b/_layouts/frontpage.html @@ -199,9 +199,7 @@

Scala on Twitter

- +

 
See more tweets, or
Follow Scala on Twitter @@ -217,3 +215,16 @@

Scala on Twitter

{% include footer.html %} + + \ No newline at end of file diff --git a/resources/js/vendor/tweetMachine.min.js b/resources/js/vendor/tweetMachine.min.js new file mode 100755 index 000000000..45dc62f88 --- /dev/null +++ b/resources/js/vendor/tweetMachine.min.js @@ -0,0 +1,5 @@ +/* + * jQuery TweetMachine v0.2.1b + * GitHub: https://github.com/ryangiglio/jquery-tweetMachine + * Copyright (c) 2013 Ryan Giglio (@ryangiglio) + */(function(e){e.fn.tweetMachine=function(t,n,r){e(this).each(function(){var i,s;if(this.tweetMachine){i=e.extend(this.tweetMachine.settings,n);this.tweetMachine.settings=i;t&&(this.tweetMachine.query=t);this.tweetMachine.interval&&this.tweetMachine.refresh();r&&(this.tweetMachine.callback=r)}else{i=e.extend({backendScript:"ajax/getFromTwitter.php",endpoint:"search/tweets",user_name:"jason_alvis",include_retweets:!0,exclude_replies:!1,rate:5e3,limit:5,autoRefresh:!0,animateOut:!1,animateIn:!0,tweetFormat:"
  • ",localization:{seconds:"seconds ago",minute:"a minute ago",minutes:"minutes ago",hour:"an hour ago",hours:"hours ago",day:"a day ago",days:"days ago"},filter:!1},n);this.tweetMachine={settings:i,query:t,interval:!1,container:this,lastTweetID:null,callback:r,relativeTime:function(e){var t,n,r;n=Date.parse(e);t=(Date.parse(Date())-n)/1e3;r="";t<60?r=t+" "+i.localization.seconds:t<120?r=i.localization.minute:t<2700?r=parseInt(t/60,10).toString()+" "+i.localization.minutes:t<5400?r=i.localization.hour:t<86400?r=""+parseInt(t/3600,10).toString()+" "+i.localization.hours:t<172800?r=i.localization.day:r=parseInt(t/86400,10).toString()+" "+i.localization.days;return r},updateTimestamps:function(){var t;t=this;e(t.container).find(".time").each(function(){var n,r;r=e(this);n=r.data("timestamp");r.html(t.relativeTime(n))})},parseText:function(e){e=e.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/g,function(e){return''+e+""});e=e.replace(/@[A-Za-z0-9_]+/g,function(e){return''+e+""});e=e.replace(/#[A-Za-z0-9_\-]+/g,function(e){return''+e+""});return e},buildTweet:function(t){var n,r;n=this;r=e(n.settings.tweetFormat);r.find(".avatar").attr("src",t.user.profile_image_url.replace("normal","reasonably_small"));r.find(".username").attr("href","http://twitter.com/"+t.user.screen_name).attr("target","_blank").html(""+t.user.screen_name);r.find(".time").attr("href","http://twitter.com/"+t.user.screen_name+"/status/"+t.id_str).attr("target","_blank").html(n.relativeTime(t.created_at)).data("timestamp",t.created_at);r.find(".content").html(n.parseText(t.text));n.settings.animateIn&&r.css("opacity","0");return r},refresh:function(t){var n,r;r=this;if(t||r.settings.autoRefresh){r.settings.endpoint==="search/tweets"&&(n={q:r.query,count:this.settings.requestLimit?this.settings.requestLimit:this.settings.limit,since_id:r.lastTweetID});r.settings.endpoint==="statuses/user_timeline"&&(n={screen_name:i.user_name,count:this.settings.requestLimit?this.settings.requestLimit:this.settings.limit,include_rts:i.include_retweets,exclude_replies:i.exclude_replies});e.getJSON(r.settings.backendScript,{endpoint:r.settings.endpoint,queryParams:n},function(n){var i;if(n[0])if(n[0].message)e(".twitter-error").length?e(".twitter-error").html('

    Error '+n[0].code+": "+n[0].message+"

    "):e(r.container).before('");else{e(".twitter-error").length&&e(".twitter-error").remove();n.reverse();i=0;e.each(n,function(){var n,s;n=this;if(!r.settings.filter||r.settings.filter(this)){s=r.buildTweet(n);t||r.settings.animateOut||e(r.container).children(":last-child").remove();e(r.container).prepend(s);r.settings.animateIn&&e(r.container).children(":first-child").animate({opacity:1});i++;r.lastTweetID=n.id_str;if(i>r.settings.limit)return!1}})}if(typeof r.callback=="function"){if(typeof n=="undefined"||typeof i=="undefined"){n=null;i=0}r.callback(n,i)}})}},start:function(){var e;e=this;if(!this.interval){this.interval=setInterval(function(){e.refresh()},e.settings.rate);this.refresh(!0)}},stop:function(){var e;e=this;if(e.interval){clearInterval(e.interval);e.interval=!1}},clear:function(){var t;t=this;e(t.container).find(".tweet").remove();t.lastTweetID=null}};s=this.tweetMachine;this.timeInterval=setInterval(function(){s.updateTimestamps()},s.settings.rate);this.tweetMachine.start()}})}})(jQuery); \ No newline at end of file diff --git a/resources/php/getFromTwitter.php b/resources/php/getFromTwitter.php new file mode 100644 index 000000000..3c598ecab --- /dev/null +++ b/resources/php/getFromTwitter.php @@ -0,0 +1,89 @@ +get($endpoint, $queryParams); + + + error_log(print_r($tweets, TRUE), 0); + + /* + * If Twitter returned statuses, the request was successful + */ + + // Method if you are using endpoint "search/tweets" + if ($endpoint === "search/tweets") { + if ( isset($tweets->statuses) ) { + echo json_encode($tweets->statuses); + } + else { // There was a problem somewhere + // Return the error Twitter sent so Javascript can parse it and display the error + echo json_encode($tweets->errors); + } + } + + // Method if you are using endpoint "statuses/user_timeline" + if ($endpoint === "statuses/user_timeline") { + if ( isset($tweets[0]->user->id) ) { + echo json_encode($tweets); + } + else { // There was a problem somewhere + // Return the error Twitter sent so Javascript can parse it and display the error + echo json_encode($tweets->errors); + } + } \ No newline at end of file diff --git a/resources/php/inc/twitteroauth/OAuth.php b/resources/php/inc/twitteroauth/OAuth.php new file mode 100755 index 000000000..67a94c479 --- /dev/null +++ b/resources/php/inc/twitteroauth/OAuth.php @@ -0,0 +1,874 @@ +key = $key; + $this->secret = $secret; + $this->callback_url = $callback_url; + } + + function __toString() { + return "OAuthConsumer[key=$this->key,secret=$this->secret]"; + } +} + +class OAuthToken { + // access tokens and request tokens + public $key; + public $secret; + + /** + * key = the token + * secret = the token secret + */ + function __construct($key, $secret) { + $this->key = $key; + $this->secret = $secret; + } + + /** + * generates the basic string serialization of a token that a server + * would respond to request_token and access_token calls with + */ + function to_string() { + return "oauth_token=" . + OAuthUtil::urlencode_rfc3986($this->key) . + "&oauth_token_secret=" . + OAuthUtil::urlencode_rfc3986($this->secret); + } + + function __toString() { + return $this->to_string(); + } +} + +/** + * A class for implementing a Signature Method + * See section 9 ("Signing Requests") in the spec + */ +abstract class OAuthSignatureMethod { + /** + * Needs to return the name of the Signature Method (ie HMAC-SHA1) + * @return string + */ + abstract public function get_name(); + + /** + * Build up the signature + * NOTE: The output of this function MUST NOT be urlencoded. + * the encoding is handled in OAuthRequest when the final + * request is serialized + * @param OAuthRequest $request + * @param OAuthConsumer $consumer + * @param OAuthToken $token + * @return string + */ + abstract public function build_signature($request, $consumer, $token); + + /** + * Verifies that a given signature is correct + * @param OAuthRequest $request + * @param OAuthConsumer $consumer + * @param OAuthToken $token + * @param string $signature + * @return bool + */ + public function check_signature($request, $consumer, $token, $signature) { + $built = $this->build_signature($request, $consumer, $token); + return $built == $signature; + } +} + +/** + * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104] + * where the Signature Base String is the text and the key is the concatenated values (each first + * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&' + * character (ASCII code 38) even if empty. + * - Chapter 9.2 ("HMAC-SHA1") + */ +class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod { + function get_name() { + return "HMAC-SHA1"; + } + + public function build_signature($request, $consumer, $token) { + $base_string = $request->get_signature_base_string(); + $request->base_string = $base_string; + + $key_parts = array( + $consumer->secret, + ($token) ? $token->secret : "" + ); + + $key_parts = OAuthUtil::urlencode_rfc3986($key_parts); + $key = implode('&', $key_parts); + + return base64_encode(hash_hmac('sha1', $base_string, $key, true)); + } +} + +/** + * The PLAINTEXT method does not provide any security protection and SHOULD only be used + * over a secure channel such as HTTPS. It does not use the Signature Base String. + * - Chapter 9.4 ("PLAINTEXT") + */ +class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod { + public function get_name() { + return "PLAINTEXT"; + } + + /** + * oauth_signature is set to the concatenated encoded values of the Consumer Secret and + * Token Secret, separated by a '&' character (ASCII code 38), even if either secret is + * empty. The result MUST be encoded again. + * - Chapter 9.4.1 ("Generating Signatures") + * + * Please note that the second encoding MUST NOT happen in the SignatureMethod, as + * OAuthRequest handles this! + */ + public function build_signature($request, $consumer, $token) { + $key_parts = array( + $consumer->secret, + ($token) ? $token->secret : "" + ); + + $key_parts = OAuthUtil::urlencode_rfc3986($key_parts); + $key = implode('&', $key_parts); + $request->base_string = $key; + + return $key; + } +} + +/** + * The RSA-SHA1 signature method uses the RSASSA-PKCS1-v1_5 signature algorithm as defined in + * [RFC3447] section 8.2 (more simply known as PKCS#1), using SHA-1 as the hash function for + * EMSA-PKCS1-v1_5. It is assumed that the Consumer has provided its RSA public key in a + * verified way to the Service Provider, in a manner which is beyond the scope of this + * specification. + * - Chapter 9.3 ("RSA-SHA1") + */ +abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod { + public function get_name() { + return "RSA-SHA1"; + } + + // Up to the SP to implement this lookup of keys. Possible ideas are: + // (1) do a lookup in a table of trusted certs keyed off of consumer + // (2) fetch via http using a url provided by the requester + // (3) some sort of specific discovery code based on request + // + // Either way should return a string representation of the certificate + protected abstract function fetch_public_cert(&$request); + + // Up to the SP to implement this lookup of keys. Possible ideas are: + // (1) do a lookup in a table of trusted certs keyed off of consumer + // + // Either way should return a string representation of the certificate + protected abstract function fetch_private_cert(&$request); + + public function build_signature($request, $consumer, $token) { + $base_string = $request->get_signature_base_string(); + $request->base_string = $base_string; + + // Fetch the private key cert based on the request + $cert = $this->fetch_private_cert($request); + + // Pull the private key ID from the certificate + $privatekeyid = openssl_get_privatekey($cert); + + // Sign using the key + $ok = openssl_sign($base_string, $signature, $privatekeyid); + + // Release the key resource + openssl_free_key($privatekeyid); + + return base64_encode($signature); + } + + public function check_signature($request, $consumer, $token, $signature) { + $decoded_sig = base64_decode($signature); + + $base_string = $request->get_signature_base_string(); + + // Fetch the public key cert based on the request + $cert = $this->fetch_public_cert($request); + + // Pull the public key ID from the certificate + $publickeyid = openssl_get_publickey($cert); + + // Check the computed signature against the one passed in the query + $ok = openssl_verify($base_string, $decoded_sig, $publickeyid); + + // Release the key resource + openssl_free_key($publickeyid); + + return $ok == 1; + } +} + +class OAuthRequest { + private $parameters; + private $http_method; + private $http_url; + // for debug purposes + public $base_string; + public static $version = '1.0'; + public static $POST_INPUT = 'php://input'; + + function __construct($http_method, $http_url, $parameters=NULL) { + @$parameters or $parameters = array(); + $parameters = array_merge( OAuthUtil::parse_parameters(parse_url($http_url, PHP_URL_QUERY)), $parameters); + $this->parameters = $parameters; + $this->http_method = $http_method; + $this->http_url = $http_url; + } + + + /** + * attempt to build up a request from what was passed to the server + */ + public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) { + $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") + ? 'http' + : 'https'; + @$http_url or $http_url = $scheme . + '://' . $_SERVER['HTTP_HOST'] . + ':' . + $_SERVER['SERVER_PORT'] . + $_SERVER['REQUEST_URI']; + @$http_method or $http_method = $_SERVER['REQUEST_METHOD']; + + // We weren't handed any parameters, so let's find the ones relevant to + // this request. + // If you run XML-RPC or similar you should use this to provide your own + // parsed parameter-list + if (!$parameters) { + // Find request headers + $request_headers = OAuthUtil::get_headers(); + + // Parse the query-string to find GET parameters + $parameters = OAuthUtil::parse_parameters($_SERVER['QUERY_STRING']); + + // It's a POST request of the proper content-type, so parse POST + // parameters and add those overriding any duplicates from GET + if ($http_method == "POST" + && @strstr($request_headers["Content-Type"], + "application/x-www-form-urlencoded") + ) { + $post_data = OAuthUtil::parse_parameters( + file_get_contents(self::$POST_INPUT) + ); + $parameters = array_merge($parameters, $post_data); + } + + // We have a Authorization-header with OAuth data. Parse the header + // and add those overriding any duplicates from GET or POST + if (@substr($request_headers['Authorization'], 0, 6) == "OAuth ") { + $header_parameters = OAuthUtil::split_header( + $request_headers['Authorization'] + ); + $parameters = array_merge($parameters, $header_parameters); + } + + } + + return new OAuthRequest($http_method, $http_url, $parameters); + } + + /** + * pretty much a helper function to set up the request + */ + public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) { + @$parameters or $parameters = array(); + $defaults = array("oauth_version" => OAuthRequest::$version, + "oauth_nonce" => OAuthRequest::generate_nonce(), + "oauth_timestamp" => OAuthRequest::generate_timestamp(), + "oauth_consumer_key" => $consumer->key); + if ($token) + $defaults['oauth_token'] = $token->key; + + $parameters = array_merge($defaults, $parameters); + + return new OAuthRequest($http_method, $http_url, $parameters); + } + + public function set_parameter($name, $value, $allow_duplicates = true) { + if ($allow_duplicates && isset($this->parameters[$name])) { + // We have already added parameter(s) with this name, so add to the list + if (is_scalar($this->parameters[$name])) { + // This is the first duplicate, so transform scalar (string) + // into an array so we can add the duplicates + $this->parameters[$name] = array($this->parameters[$name]); + } + + $this->parameters[$name][] = $value; + } else { + $this->parameters[$name] = $value; + } + } + + public function get_parameter($name) { + return isset($this->parameters[$name]) ? $this->parameters[$name] : null; + } + + public function get_parameters() { + return $this->parameters; + } + + public function unset_parameter($name) { + unset($this->parameters[$name]); + } + + /** + * The request parameters, sorted and concatenated into a normalized string. + * @return string + */ + public function get_signable_parameters() { + // Grab all parameters + $params = $this->parameters; + + // Remove oauth_signature if present + // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.") + if (isset($params['oauth_signature'])) { + unset($params['oauth_signature']); + } + + return OAuthUtil::build_http_query($params); + } + + /** + * Returns the base string of this request + * + * The base string defined as the method, the url + * and the parameters (normalized), each urlencoded + * and the concated with &. + */ + public function get_signature_base_string() { + $parts = array( + $this->get_normalized_http_method(), + $this->get_normalized_http_url(), + $this->get_signable_parameters() + ); + + $parts = OAuthUtil::urlencode_rfc3986($parts); + + return implode('&', $parts); + } + + /** + * just uppercases the http method + */ + public function get_normalized_http_method() { + return strtoupper($this->http_method); + } + + /** + * parses the url and rebuilds it to be + * scheme://host/path + */ + public function get_normalized_http_url() { + $parts = parse_url($this->http_url); + + $port = @$parts['port']; + $scheme = $parts['scheme']; + $host = $parts['host']; + $path = @$parts['path']; + + $port or $port = ($scheme == 'https') ? '443' : '80'; + + if (($scheme == 'https' && $port != '443') + || ($scheme == 'http' && $port != '80')) { + $host = "$host:$port"; + } + return "$scheme://$host$path"; + } + + /** + * builds a url usable for a GET request + */ + public function to_url() { + $post_data = $this->to_postdata(); + $out = $this->get_normalized_http_url(); + if ($post_data) { + $out .= '?'.$post_data; + } + return $out; + } + + /** + * builds the data one would send in a POST request + */ + public function to_postdata() { + return OAuthUtil::build_http_query($this->parameters); + } + + /** + * builds the Authorization: header + */ + public function to_header($realm=null) { + $first = true; + if($realm) { + $out = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986($realm) . '"'; + $first = false; + } else + $out = 'Authorization: OAuth'; + + $total = array(); + foreach ($this->parameters as $k => $v) { + if (substr($k, 0, 5) != "oauth") continue; + if (is_array($v)) { + throw new OAuthException('Arrays not supported in headers'); + } + $out .= ($first) ? ' ' : ','; + $out .= OAuthUtil::urlencode_rfc3986($k) . + '="' . + OAuthUtil::urlencode_rfc3986($v) . + '"'; + $first = false; + } + return $out; + } + + public function __toString() { + return $this->to_url(); + } + + + public function sign_request($signature_method, $consumer, $token) { + $this->set_parameter( + "oauth_signature_method", + $signature_method->get_name(), + false + ); + $signature = $this->build_signature($signature_method, $consumer, $token); + $this->set_parameter("oauth_signature", $signature, false); + } + + public function build_signature($signature_method, $consumer, $token) { + $signature = $signature_method->build_signature($this, $consumer, $token); + return $signature; + } + + /** + * util function: current timestamp + */ + private static function generate_timestamp() { + return time(); + } + + /** + * util function: current nonce + */ + private static function generate_nonce() { + $mt = microtime(); + $rand = mt_rand(); + + return md5($mt . $rand); // md5s look nicer than numbers + } +} + +class OAuthServer { + protected $timestamp_threshold = 300; // in seconds, five minutes + protected $version = '1.0'; // hi blaine + protected $signature_methods = array(); + + protected $data_store; + + function __construct($data_store) { + $this->data_store = $data_store; + } + + public function add_signature_method($signature_method) { + $this->signature_methods[$signature_method->get_name()] = + $signature_method; + } + + // high level functions + + /** + * process a request_token request + * returns the request token on success + */ + public function fetch_request_token(&$request) { + $this->get_version($request); + + $consumer = $this->get_consumer($request); + + // no token required for the initial token request + $token = NULL; + + $this->check_signature($request, $consumer, $token); + + // Rev A change + $callback = $request->get_parameter('oauth_callback'); + $new_token = $this->data_store->new_request_token($consumer, $callback); + + return $new_token; + } + + /** + * process an access_token request + * returns the access token on success + */ + public function fetch_access_token(&$request) { + $this->get_version($request); + + $consumer = $this->get_consumer($request); + + // requires authorized request token + $token = $this->get_token($request, $consumer, "request"); + + $this->check_signature($request, $consumer, $token); + + // Rev A change + $verifier = $request->get_parameter('oauth_verifier'); + $new_token = $this->data_store->new_access_token($token, $consumer, $verifier); + + return $new_token; + } + + /** + * verify an api call, checks all the parameters + */ + public function verify_request(&$request) { + $this->get_version($request); + $consumer = $this->get_consumer($request); + $token = $this->get_token($request, $consumer, "access"); + $this->check_signature($request, $consumer, $token); + return array($consumer, $token); + } + + // Internals from here + /** + * version 1 + */ + private function get_version(&$request) { + $version = $request->get_parameter("oauth_version"); + if (!$version) { + // Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present. + // Chapter 7.0 ("Accessing Protected Ressources") + $version = '1.0'; + } + if ($version !== $this->version) { + throw new OAuthException("OAuth version '$version' not supported"); + } + return $version; + } + + /** + * figure out the signature with some defaults + */ + private function get_signature_method(&$request) { + $signature_method = + @$request->get_parameter("oauth_signature_method"); + + if (!$signature_method) { + // According to chapter 7 ("Accessing Protected Ressources") the signature-method + // parameter is required, and we can't just fallback to PLAINTEXT + throw new OAuthException('No signature method parameter. This parameter is required'); + } + + if (!in_array($signature_method, + array_keys($this->signature_methods))) { + throw new OAuthException( + "Signature method '$signature_method' not supported " . + "try one of the following: " . + implode(", ", array_keys($this->signature_methods)) + ); + } + return $this->signature_methods[$signature_method]; + } + + /** + * try to find the consumer for the provided request's consumer key + */ + private function get_consumer(&$request) { + $consumer_key = @$request->get_parameter("oauth_consumer_key"); + if (!$consumer_key) { + throw new OAuthException("Invalid consumer key"); + } + + $consumer = $this->data_store->lookup_consumer($consumer_key); + if (!$consumer) { + throw new OAuthException("Invalid consumer"); + } + + return $consumer; + } + + /** + * try to find the token for the provided request's token key + */ + private function get_token(&$request, $consumer, $token_type="access") { + $token_field = @$request->get_parameter('oauth_token'); + $token = $this->data_store->lookup_token( + $consumer, $token_type, $token_field + ); + if (!$token) { + throw new OAuthException("Invalid $token_type token: $token_field"); + } + return $token; + } + + /** + * all-in-one function to check the signature on a request + * should guess the signature method appropriately + */ + private function check_signature(&$request, $consumer, $token) { + // this should probably be in a different method + $timestamp = @$request->get_parameter('oauth_timestamp'); + $nonce = @$request->get_parameter('oauth_nonce'); + + $this->check_timestamp($timestamp); + $this->check_nonce($consumer, $token, $nonce, $timestamp); + + $signature_method = $this->get_signature_method($request); + + $signature = $request->get_parameter('oauth_signature'); + $valid_sig = $signature_method->check_signature( + $request, + $consumer, + $token, + $signature + ); + + if (!$valid_sig) { + throw new OAuthException("Invalid signature"); + } + } + + /** + * check that the timestamp is new enough + */ + private function check_timestamp($timestamp) { + if( ! $timestamp ) + throw new OAuthException( + 'Missing timestamp parameter. The parameter is required' + ); + + // verify that timestamp is recentish + $now = time(); + if (abs($now - $timestamp) > $this->timestamp_threshold) { + throw new OAuthException( + "Expired timestamp, yours $timestamp, ours $now" + ); + } + } + + /** + * check that the nonce is not repeated + */ + private function check_nonce($consumer, $token, $nonce, $timestamp) { + if( ! $nonce ) + throw new OAuthException( + 'Missing nonce parameter. The parameter is required' + ); + + // verify that the nonce is uniqueish + $found = $this->data_store->lookup_nonce( + $consumer, + $token, + $nonce, + $timestamp + ); + if ($found) { + throw new OAuthException("Nonce already used: $nonce"); + } + } + +} + +class OAuthDataStore { + function lookup_consumer($consumer_key) { + // implement me + } + + function lookup_token($consumer, $token_type, $token) { + // implement me + } + + function lookup_nonce($consumer, $token, $nonce, $timestamp) { + // implement me + } + + function new_request_token($consumer, $callback = null) { + // return a new token attached to this consumer + } + + function new_access_token($token, $consumer, $verifier = null) { + // return a new access token attached to this consumer + // for the user associated with this token if the request token + // is authorized + // should also invalidate the request token + } + +} + +class OAuthUtil { + public static function urlencode_rfc3986($input) { + if (is_array($input)) { + return array_map(array('OAuthUtil', 'urlencode_rfc3986'), $input); + } else if (is_scalar($input)) { + return str_replace( + '+', + ' ', + str_replace('%7E', '~', rawurlencode($input)) + ); + } else { + return ''; + } +} + + + // This decode function isn't taking into consideration the above + // modifications to the encoding process. However, this method doesn't + // seem to be used anywhere so leaving it as is. + public static function urldecode_rfc3986($string) { + return urldecode($string); + } + + // Utility function for turning the Authorization: header into + // parameters, has to do some unescaping + // Can filter out any non-oauth parameters if needed (default behaviour) + public static function split_header($header, $only_allow_oauth_parameters = true) { + $pattern = '/(([-_a-z]*)=("([^"]*)"|([^,]*)),?)/'; + $offset = 0; + $params = array(); + while (preg_match($pattern, $header, $matches, PREG_OFFSET_CAPTURE, $offset) > 0) { + $match = $matches[0]; + $header_name = $matches[2][0]; + $header_content = (isset($matches[5])) ? $matches[5][0] : $matches[4][0]; + if (preg_match('/^oauth_/', $header_name) || !$only_allow_oauth_parameters) { + $params[$header_name] = OAuthUtil::urldecode_rfc3986($header_content); + } + $offset = $match[1] + strlen($match[0]); + } + + if (isset($params['realm'])) { + unset($params['realm']); + } + + return $params; + } + + // helper to try to sort out headers for people who aren't running apache + public static function get_headers() { + if (function_exists('apache_request_headers')) { + // we need this to get the actual Authorization: header + // because apache tends to tell us it doesn't exist + $headers = apache_request_headers(); + + // sanitize the output of apache_request_headers because + // we always want the keys to be Cased-Like-This and arh() + // returns the headers in the same case as they are in the + // request + $out = array(); + foreach( $headers AS $key => $value ) { + $key = str_replace( + " ", + "-", + ucwords(strtolower(str_replace("-", " ", $key))) + ); + $out[$key] = $value; + } + } else { + // otherwise we don't have apache and are just going to have to hope + // that $_SERVER actually contains what we need + $out = array(); + if( isset($_SERVER['CONTENT_TYPE']) ) + $out['Content-Type'] = $_SERVER['CONTENT_TYPE']; + if( isset($_ENV['CONTENT_TYPE']) ) + $out['Content-Type'] = $_ENV['CONTENT_TYPE']; + + foreach ($_SERVER as $key => $value) { + if (substr($key, 0, 5) == "HTTP_") { + // this is chaos, basically it is just there to capitalize the first + // letter of every word that is not an initial HTTP and strip HTTP + // code from przemek + $key = str_replace( + " ", + "-", + ucwords(strtolower(str_replace("_", " ", substr($key, 5)))) + ); + $out[$key] = $value; + } + } + } + return $out; + } + + // This function takes a input like a=b&a=c&d=e and returns the parsed + // parameters like this + // array('a' => array('b','c'), 'd' => 'e') + public static function parse_parameters( $input ) { + if (!isset($input) || !$input) return array(); + + $pairs = explode('&', $input); + + $parsed_parameters = array(); + foreach ($pairs as $pair) { + $split = explode('=', $pair, 2); + $parameter = OAuthUtil::urldecode_rfc3986($split[0]); + $value = isset($split[1]) ? OAuthUtil::urldecode_rfc3986($split[1]) : ''; + + if (isset($parsed_parameters[$parameter])) { + // We have already recieved parameter(s) with this name, so add to the list + // of parameters with this name + + if (is_scalar($parsed_parameters[$parameter])) { + // This is the first duplicate, so transform scalar (string) into an array + // so we can add the duplicates + $parsed_parameters[$parameter] = array($parsed_parameters[$parameter]); + } + + $parsed_parameters[$parameter][] = $value; + } else { + $parsed_parameters[$parameter] = $value; + } + } + return $parsed_parameters; + } + + public static function build_http_query($params) { + if (!$params) return ''; + + // Urlencode both keys and values + $keys = OAuthUtil::urlencode_rfc3986(array_keys($params)); + $values = OAuthUtil::urlencode_rfc3986(array_values($params)); + $params = array_combine($keys, $values); + + // Parameters are sorted by name, using lexicographical byte value ordering. + // Ref: Spec: 9.1.1 (1) + uksort($params, 'strcmp'); + + $pairs = array(); + foreach ($params as $parameter => $value) { + if (is_array($value)) { + // If two or more parameters share the same name, they are sorted by their value + // Ref: Spec: 9.1.1 (1) + natsort($value); + foreach ($value as $duplicate_value) { + $pairs[] = $parameter . '=' . $duplicate_value; + } + } else { + $pairs[] = $parameter . '=' . $value; + } + } + // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61) + // Each name-value pair is separated by an '&' character (ASCII code 38) + return implode('&', $pairs); + } +} + +?> diff --git a/resources/php/inc/twitteroauth/twitteroauth.php b/resources/php/inc/twitteroauth/twitteroauth.php new file mode 100755 index 000000000..963598814 --- /dev/null +++ b/resources/php/inc/twitteroauth/twitteroauth.php @@ -0,0 +1,245 @@ +http_status; } + function lastAPICall() { return $this->last_api_call; } + + /** + * construct TwitterOAuth object + */ + function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) { + $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1(); + $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret); + if (!empty($oauth_token) && !empty($oauth_token_secret)) { + $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret); + } else { + $this->token = NULL; + } + } + + + /** + * Get a request_token from Twitter + * + * @returns a key/value array containing oauth_token and oauth_token_secret + */ + function getRequestToken($oauth_callback = NULL) { + $parameters = array(); + if (!empty($oauth_callback)) { + $parameters['oauth_callback'] = $oauth_callback; + } + $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters); + $token = OAuthUtil::parse_parameters($request); + $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); + return $token; + } + + /** + * Get the authorize URL + * + * @returns a string + */ + function getAuthorizeURL($token, $sign_in_with_twitter = TRUE) { + if (is_array($token)) { + $token = $token['oauth_token']; + } + if (empty($sign_in_with_twitter)) { + return $this->authorizeURL() . "?oauth_token={$token}"; + } else { + return $this->authenticateURL() . "?oauth_token={$token}"; + } + } + + /** + * Exchange request token and secret for an access token and + * secret, to sign API calls. + * + * @returns array("oauth_token" => "the-access-token", + * "oauth_token_secret" => "the-access-secret", + * "user_id" => "9436992", + * "screen_name" => "abraham") + */ + function getAccessToken($oauth_verifier = FALSE) { + $parameters = array(); + if (!empty($oauth_verifier)) { + $parameters['oauth_verifier'] = $oauth_verifier; + } + $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters); + $token = OAuthUtil::parse_parameters($request); + $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); + return $token; + } + + /** + * One time exchange of username and password for access token and secret. + * + * @returns array("oauth_token" => "the-access-token", + * "oauth_token_secret" => "the-access-secret", + * "user_id" => "9436992", + * "screen_name" => "abraham", + * "x_auth_expires" => "0") + */ + function getXAuthToken($username, $password) { + $parameters = array(); + $parameters['x_auth_username'] = $username; + $parameters['x_auth_password'] = $password; + $parameters['x_auth_mode'] = 'client_auth'; + $request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters); + $token = OAuthUtil::parse_parameters($request); + $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); + return $token; + } + + /** + * GET wrapper for oAuthRequest. + */ + function get($url, $parameters = array()) { + $response = $this->oAuthRequest($url, 'GET', $parameters); + if ($this->format === 'json' && $this->decode_json) { + return json_decode($response); + } + return $response; + } + + /** + * POST wrapper for oAuthRequest. + */ + function post($url, $parameters = array()) { + $response = $this->oAuthRequest($url, 'POST', $parameters); + if ($this->format === 'json' && $this->decode_json) { + return json_decode($response); + } + return $response; + } + + /** + * DELETE wrapper for oAuthReqeust. + */ + function delete($url, $parameters = array()) { + $response = $this->oAuthRequest($url, 'DELETE', $parameters); + if ($this->format === 'json' && $this->decode_json) { + return json_decode($response); + } + return $response; + } + + /** + * Format and sign an OAuth / API request + */ + function oAuthRequest($url, $method, $parameters) { + if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) { + $url = "{$this->host}{$url}.{$this->format}"; + } + $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters); + $request->sign_request($this->sha1_method, $this->consumer, $this->token); + switch ($method) { + case 'GET': + return $this->http($request->to_url(), 'GET'); + default: + return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata()); + } + } + + /** + * Make an HTTP request + * + * @return API results + */ + function http($url, $method, $postfields = NULL) { + $this->http_info = array(); + $ci = curl_init(); + /* Curl settings */ + curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent); + curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout); + curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout); + curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE); + curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:')); + curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer); + curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader')); + curl_setopt($ci, CURLOPT_HEADER, FALSE); + + switch ($method) { + case 'POST': + curl_setopt($ci, CURLOPT_POST, TRUE); + if (!empty($postfields)) { + curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields); + } + break; + case 'DELETE': + curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE'); + if (!empty($postfields)) { + $url = "{$url}?{$postfields}"; + } + } + + curl_setopt($ci, CURLOPT_URL, $url); + $response = curl_exec($ci); + $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE); + $this->http_info = array_merge($this->http_info, curl_getinfo($ci)); + $this->url = $url; + curl_close ($ci); + return $response; + } + + /** + * Get the header info to store. + */ + function getHeader($ch, $header) { + $i = strpos($header, ':'); + if (!empty($i)) { + $key = str_replace('-', '_', strtolower(substr($header, 0, $i))); + $value = trim(substr($header, $i + 2)); + $this->http_header[$key] = $value; + } + return strlen($header); + } +} From 4c80890d6a29f75b2d8d1204acbf3be55dffe08f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Mon, 9 Jan 2017 17:31:04 +0100 Subject: [PATCH 002/120] Using correct @scala_lang account --- _layouts/frontpage.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/frontpage.html b/_layouts/frontpage.html index e63d53f59..147a689b0 100644 --- a/_layouts/frontpage.html +++ b/_layouts/frontpage.html @@ -220,7 +220,7 @@

    Scala on Twitter

    $('#tweets').tweetMachine('', { backendScript: '/resources/php/getFromTwitter.php', endpoint: 'statuses/user_timeline', - user_name: 'javitaiyou', + user_name: 'scala_lang', include_retweets: true, exclude_replies: false, limit: 5, From 1b46577660d8d9228cddcce8a4395cb9762348b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Tue, 10 Jan 2017 12:18:08 +0100 Subject: [PATCH 003/120] Mostly recreating original DOM structure of the tweet carousel - For retweets get original tweet text and user information --- _includes/footer.html | 2 +- _layouts/frontpage.html | 25 +- resources/js/tweetMachine-update.js | 384 ++++++++++++++++++++++++++++ 3 files changed, 409 insertions(+), 2 deletions(-) create mode 100755 resources/js/tweetMachine-update.js diff --git a/_includes/footer.html b/_includes/footer.html index ef544a468..bc511fd48 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -54,7 +54,7 @@ - + diff --git a/_layouts/frontpage.html b/_layouts/frontpage.html index 147a689b0..4bee1e10f 100644 --- a/_layouts/frontpage.html +++ b/_layouts/frontpage.html @@ -225,6 +225,29 @@

    Scala on Twitter

    exclude_replies: false, limit: 5, autoRefresh: false, - tweetFormat: "
  • " + tweetFormat: `
    +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    + + + +
    +
    +
    + ` }); \ No newline at end of file diff --git a/resources/js/tweetMachine-update.js b/resources/js/tweetMachine-update.js new file mode 100755 index 000000000..9dfec6aa0 --- /dev/null +++ b/resources/js/tweetMachine-update.js @@ -0,0 +1,384 @@ +/* + * jQuery TweetMachine v0.2.1b + * GitHub: https://github.com/ryangiglio/jquery-tweetMachine + * Copyright (c) 2013 Ryan Giglio (@ryangiglio) + */ +(function ($) { + // Plugin body + $.fn.tweetMachine = function (query, options, callback) { + // For each instance of the plugin + $(this).each(function () { + var settings, tweetMachine; + // If this.tweetMachine is already initialized, just change the settings + if (this.tweetMachine) { + // Overwrite the initialized/default settings + settings = $.extend(this.tweetMachine.settings, options); + this.tweetMachine.settings = settings; + + // If a new query has been passed + if (query) { + // Replace the old query + this.tweetMachine.query = query; + } + // If a tweet interval is already set up + if (this.tweetMachine.interval) { + // Refresh now so the new settings can kick in + this.tweetMachine.refresh(); + } + // If a new callback was passed + if (callback) { + // Replace the old callback + this.tweetMachine.callback = callback; + } + } else { // It's not initialized, so let's do that + settings = $.extend({ + backendScript: '/resources/php/getFromTwitter.php', // Path to your backend script that holds your Twitter credentials and calls the API + endpoint: 'statuses/user_timeline', // Twitter API endpoint to call. Currently only search/tweets is supported + user_name: 'scala_lang', // Set your username + include_retweets: true, // Set to true or false if you want to include retweets + exclude_replies: false, // Set to true or false if you want to exclude replies + rate: 5000, // Rate in ms to refresh the tweets. Any higher than 5000 for search/tweets will get you rate limited + limit: 5, // Number of tweets to display at a time + autoRefresh: true, // CURRENTLY REQUIRED. Auto-refresh the tweets + animateOut: false, // NOT YET SUPPORTED. Animate out old tweets. + animateIn: true, // Fade in new tweets. + tweetFormat: "
  • ", // Format for each tweet + localization: { // Verbiage to use for timestamps + seconds: 'seconds ago', + minute: 'a minute ago', + minutes: 'minutes ago', + hour: 'an hour ago', + hours: 'hours ago', + day: 'a day ago', + days: 'days ago' + }, + filter: false // Function to filter tweet results. + }, options); + this.tweetMachine = { + settings: settings, // Set the settings object + query: query, // Set the query to search for + interval: false, // This will hold the refresh interval when it is created + container: this, // Set the object that contains the tweets + lastTweetID: null, // This will hold the ID of the last tweet displayed + callback: callback, // This callback will run after each refresh + + /* + * Function to generate a relative timestamp from Twitter's time string + */ + relativeTime: function (timeString) { + var delta, parsedDate, r; + + // Create a Date object + parsedDate = Date.parse(timeString); + + // Get the number of seconds ago that the tweet was created + delta = (Date.parse(Date()) - parsedDate) / 1000; + + // String to hold the relative time + r = ''; + + // If it was less than a minute ago + if (delta < 60) { + r = delta + " " + settings.localization.seconds; + // If it was less than 2 minutes ago + } else if (delta < 120) { + r = settings.localization.minute; + // If it was less than 45 minutes ago + } else if (delta < (45 * 60)) { + r = (parseInt(delta / 60, 10)).toString() + " " + settings.localization.minutes; + // If it was less than 90 minutes ago + } else if (delta < (90 * 60)) { + r = settings.localization.hour; + // If it was less than a day ago + } else if (delta < (24 * 60 * 60)) { + r = '' + (parseInt(delta / 3600, 10)).toString() + " " + settings.localization.hours; + // If it was less than 2 days ago + } else if (delta < (48 * 60 * 60)) { + r = settings.localization.day; + } else { + r = (parseInt(delta / 86400, 10)).toString() + " " + settings.localization.days; + } + return r; + }, + + /* + * Function to update the timestamps of each tweet + */ + updateTimestamps: function () { + var tweetMachine; + tweetMachine = this; + // Loop over each timestamp + $(tweetMachine.container).find('.time').each(function () { + var originalTime, timeElement; + + // Save a reference to the time element + timeElement = $(this); + + // Get the original time from the data stored on the timestamp + originalTime = timeElement.data('timestamp'); + + // Generate and show a new time based on the original time + timeElement.html(tweetMachine.relativeTime(originalTime)); + }); + }, + + /* + * Function to parse the text of a tweet and and add links to links, hashtags, and usernames + */ + parseText: function (text) { + // Links + text = text.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/g, function (m) { + return '' + m + ''; + }); + // Usernames + text = text.replace(/@[A-Za-z0-9_]+/g, function (u) { + return '' + u + ''; + }); + // Hashtags + text = text.replace(/#[A-Za-z0-9_\-]+/g, function (u) { + return '' + u + ''; + }); + return text; + }, + + /* + * Function to build the tweet as a jQuery object + */ + buildTweet: function (tweet) { + var tweetMachine, tweetObj; + tweetMachine = this; + + var actualTweet = /^RT/.test(tweet.text) ? tweet.retweeted_status : tweet; + + // Create the tweet from the tweetFormat setting + tweetObj = $(tweetMachine.settings.tweetFormat); + + // Set the avatar. NOTE: reasonably_small is Twitter's suffix for the largest square avatar that they store + tweetObj.find('.avatar') + .attr('src', actualTweet.user.profile_image_url.replace("normal", "reasonably_small")); + + // Set the username + tweetObj.find('.username') + .attr('href', "http://twitter.com/" + actualTweet.user.screen_name) + .attr('target', '_blank') + .html("" + actualTweet.user.screen_name); + + // Set the timestamp + tweetObj.find('.time') + .attr('href', "http://twitter.com/" + actualTweet.user.screen_name + "/status/" + actualTweet.id_str) + .attr('target', '_blank') + .html(tweetMachine.relativeTime(actualTweet.created_at)) + // Save the created_at time as jQuery data so we can update it later + .data('timestamp', actualTweet.created_at); + + // Set the text + tweetObj.find('.content') + .html(tweetMachine.parseText(actualTweet.text)); + + // If we are animating in the new tweets + if (tweetMachine.settings.animateIn) { + // Set the opacity to 0 so it can fade in + tweetObj.css('opacity', '0'); + } + + return tweetObj; + }, + + /* + * Function to handle the reloading of tweets + */ + refresh: function (firstLoad) { + var queryParams, tweetMachine; + tweetMachine = this; + + // If it is the first load or we're refreshing automatically + if (firstLoad || tweetMachine.settings.autoRefresh) { + // Set the query parameters that the endpoint needs + + /* + * Twitter feed for search through tweets only + * API Reference: https://dev.twitter.com/docs/api/1.1/get/search/tweets + */ + if (tweetMachine.settings.endpoint === "search/tweets") { + queryParams = { + q: tweetMachine.query, + count: (this.settings.requestLimit) ? this.settings.requestLimit: this.settings.limit, + since_id: tweetMachine.lastTweetID + }; + } + + /* + * Twitter feed for username only + * API Reference: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline + */ + if (tweetMachine.settings.endpoint === "statuses/user_timeline") { + queryParams = { + screen_name: settings.user_name, + count: (this.settings.requestLimit) ? this.settings.requestLimit: this.settings.limit, + include_rts: settings.include_retweets, + exclude_replies: settings.exclude_replies + }; + } + + // Call your backend script to get JSON back from Twitter + $.getJSON(tweetMachine.settings.backendScript, { + endpoint: tweetMachine.settings.endpoint, + queryParams: queryParams + }, function (tweets) { + var tweetsDisplayed; + + // If we got a response from Twitter + if ( tweets[0] ) { + // If there is an error message + if ( tweets[0].message ) { + // If there is already an error displayed + if ( $('.twitter-error').length ) { + // Update the error message + $('.twitter-error').html('

    Error ' + tweets[0].code + ': ' + tweets[0].message + '

    '); + } + else { // There isn't an error displayed yet + // Display an error message above the container + $(tweetMachine.container).before(''); + } + } + // There are tweets + else { + // If there was an error before + if ( $('.twitter-error').length ) { + // Remove it + $('.twitter-error').remove(); + } + + // Reverse them so they are added in the correct order + tweets.reverse(); + + // Count the number of tweets displayed + tweetsDisplayed = 0; + + // Loop through each tweet + $.each(tweets, function () { + var tweet, tweetObj; + tweet = this; + + // If there is no filter, or this tweet passes the filter + if (!tweetMachine.settings.filter || tweetMachine.settings.filter(this)) { + // Build the tweet as a jQuery object + tweetObj = tweetMachine.buildTweet(tweet); + + // If there are already tweets on the screen + if (!firstLoad) { + + // If we are animating out the old tweets + if (tweetMachine.settings.animateOut) { + /* + * TODO Support this feature + */ + } else { // We are not animating the old tweets + // Remove them + $(tweetMachine.container).children(':last-child').remove(); + } + } + + // Prepend the new tweet + $(tweetMachine.container).prepend(tweetObj); + + // If we are animating in the new tweets + if (tweetMachine.settings.animateIn) { + // Fade in the new tweet + /* + * TODO Figure out why .fadeIn() doesn't work + */ + $(tweetMachine.container).children(':first-child').animate({ + opacity: 1 + }); + } + + // Increment the tweets diplayed + tweetsDisplayed++; + + // Save this tweet ID so we only get newer noes + tweetMachine.lastTweetID = tweet.id_str; + + // If we've reached the limit of tweets to display + if (tweetsDisplayed > tweetMachine.settings.limit) { + // Quit the loop + return false; + } + } + }); + } + } + //Callback function + if (typeof tweetMachine.callback === "function") { + if(typeof tweets === 'undefined' || typeof tweetsDisplayed === 'undefined' ) { + tweets = null; + tweetsDisplayed = 0; + } + tweetMachine.callback(tweets, tweetsDisplayed); + } + }); + } + /* TODO: Implement an "x new Tweets, click to refresh" link if auto refresh is turned off + else { + } + */ + }, + + // Start refreshing + start: function () { + var tweetMachine; + tweetMachine = this; + + // If there's no interval yet + if (!this.interval) { + // Create an interval to refresh after the rate has passed + this.interval = setInterval(function () { + tweetMachine.refresh(); + }, tweetMachine.settings.rate); + // Start refreshing with the firstLoad flag = true + this.refresh(true); + } + }, + + // Stop refreshing + stop: function () { + var tweetMachine; + tweetMachine = this; + + // If there is an interval + if (tweetMachine.interval) { + // Clear it + clearInterval(tweetMachine.interval); + + // Remove the reference to it + tweetMachine.interval = false; + } + }, + + // Clear all tweets + clear: function () { + var tweetMachine; + tweetMachine = this; + + // Remove all tweets + $(tweetMachine.container).find('.tweet').remove(); + + // Set the lastTweetID to null so we start clean next time + tweetMachine.lastTweetID = null; + } + }; + + // Save a global tweetMachine object + tweetMachine = this.tweetMachine; + + // Create an interval to update the timestamps + this.timeInterval = setInterval(function () { + tweetMachine.updateTimestamps(); + }, tweetMachine.settings.rate); + + // Start the Machine! + this.tweetMachine.start(); + } + }); + }; +})(jQuery); \ No newline at end of file From 8057318836a82d479e30e8434b3c0325e2e15f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Mon, 16 Jan 2017 16:56:04 +0100 Subject: [PATCH 004/120] Added new data to frontpage md and YAML data files --- _data/common.yml | 3 ++ _data/footer.yml | 44 ++++++++++++++++++++++++++ _data/nav-header.yml | 10 ++++++ _data/scala-supporters.yml | 24 ++++++++++++++ index.md | 64 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 145 insertions(+) create mode 100644 _data/common.yml create mode 100644 _data/footer.yml create mode 100644 _data/nav-header.yml create mode 100644 _data/scala-supporters.yml diff --git a/_data/common.yml b/_data/common.yml new file mode 100644 index 000000000..83db53426 --- /dev/null +++ b/_data/common.yml @@ -0,0 +1,3 @@ +# SNS URLs +githubUrl: http://github.com/scala/scala +twitter: http://twitter.com/scala_lang \ No newline at end of file diff --git a/_data/footer.yml b/_data/footer.yml new file mode 100644 index 000000000..a8b18028b --- /dev/null +++ b/_data/footer.yml @@ -0,0 +1,44 @@ +- title: Documentation + links: + - title: Getting Started + url: /documentation/getting-started/ + - title: API + url: "http://www.scala-lang.org/api/current/index.html?_ga=1.211088853.1310790544.1468501313#package" + - title: Overviews/Guides + url: "http://docs.scala-lang.org/overviews/?_ga=1.9844085.1310790544.1468501313" + - title: Tutorials + url: "http://docs.scala-lang.org/overviews/?_ga=1.211088853.1310790544.1468501313" + - title: Language Specification + url: "http://scala-lang.org/files/archive/spec/2.12/" +- title: Download + links: + - title: Current Version + url: "/download/" + - title: All versions + url: "/download/all/" +- title: Community + links: + - title: Community + url: "/community/" + - title: Mailing Lists + url: "/community/index.html#mailing-lists" + - title: Chat Rooms & More + url: "/community/index.html#chat-rooms" + - title: Libraries and Tools + url: "/community/index.html#community-libraries-and-tools" + - title: "The Scala Center" + url: https://scala.epfl.ch/ +- title: Contribute + links: + - title: How to help + url: "/contribute/" + - title: Report an Issue + url: "/contribute/bug-reporting-guide/" +- title: Scala + links: + - title: Blog + url: "/blog/" + - title: Code of Conduct + url: "/conduct/" + - title: License + url: "/license/" \ No newline at end of file diff --git a/_data/nav-header.yml b/_data/nav-header.yml new file mode 100644 index 000000000..5c8455ed2 --- /dev/null +++ b/_data/nav-header.yml @@ -0,0 +1,10 @@ +- title: Documentation + url: /documentation/ +- title: Download + url: /download/ +- title: Community + url: /community/ +- title: Contribute + url: /contribute/ +- title: Blog + url: /blog/ \ No newline at end of file diff --git a/_data/scala-supporters.yml b/_data/scala-supporters.yml new file mode 100644 index 000000000..e27df60c7 --- /dev/null +++ b/_data/scala-supporters.yml @@ -0,0 +1,24 @@ +supporters: + - logo: /epfl.png + url: https://www.epfl.ch + - logo: /ibm.png + url: http://www.ibm.com + - logo: /verizon.png + url: http://www.verizon.com + - logo: /goldman-sachs.png + url: http://www.goldmansachs.com + - logo: /nitro.png + url: https://www.gonitro.com + - logo: /47deg.png + url: http://www.47deg.com/ + - logo: /sap.png + url: http://www.sap.com + - logo: /tapad.png + url: http://www.tapad.com + - logo: /your-company.png + url: https://scala.epfl.ch/individual-membership.html +maintainers: + - logo: /scala-center.png + url: https://scala.epfl.ch/ + - logo: /lightbend.png + url: http://www.lightbend.com/ \ No newline at end of file diff --git a/index.md b/index.md index afde85030..24e6cbcea 100644 --- a/index.md +++ b/index.md @@ -1,4 +1,68 @@ --- layout: frontpage + +# Links of the Download / API Docs sections +gettingStarted: + - title: "Getting Started" + links: + - title: "Milestones, nightlies, etc." + url: "/download/" + - title: "All Previous Releases" + url: "/download/all/" +apiDocs: + - title: "Current API Docs" + links: + - title: "API Docs (other versions)" + url: "/documentation/api/" + - title: "Scala Documentation" + url: "/documentation/" + - title: "Language Specification" + url: "http://scala-lang.org/files/archive/spec/2.12/" + +# Scala IDEs +scalaIDEs: + - name: IntelliJ + icon: /resources/img/IDEs/intellij.png + ensime: false + - name: Sublime Text + icon: /resources/img/IDEs/sublime.png + ensime: true + - name: Atom + icon: /resources/img/IDEs/atom.png + ensime: true + - name: Eclipse + icon: /resources/img/IDEs/eclipse.png + ensime: false + - name: Ensime + icon: /resources/img/IDEs/ensime.png + ensime: false + +# Gitter channels +gitterChannels: + - name: scala + url: https://gitter.im/scala/scala + - name: center + url: https://gitter.im/scala/center + - name: contributors + url: https://gitter.im/scala/contributors + - name: pickling + url: https://gitter.im/scala/pickling + - name: scala-parser-combinator + url: https://gitter.im/scala/scala-parser-combinator + - name: collection-strawman + url: https://gitter.im/scala/collection-strawman + - name: scala-xml + url: https://gitter.im/scala/scala-xml + - name: scala-india + url: https://gitter.im/scala/scala-india + - name: community-builds + url: https://gitter.im/scala/community-builds + +# Communities +communities: + - icon: /resources/img/communities/typelevel.png + url: http://typelevel.org/ + - icon: /resources/img/communities/scalabridge.png + url: http://www.scalabridge.org/ --- From 2fd7afb92de4ed168f64011fbbacbf1b34bebf73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Tue, 17 Jan 2017 11:23:21 +0100 Subject: [PATCH 005/120] Added collection for frontpage bulletpoints --- _config.yml | 5 ++ _scala_items/1-seamless-java-interop.md | 62 ++++++++++++++++++++++ _scala_items/2-type-inference.md | 44 +++++++++++++++ _scala_items/3-concurrency-distribution.md | 25 +++++++++ _scala_items/4-traits.md | 46 ++++++++++++++++ _scala_items/5-pattern-matching.md | 32 +++++++++++ _scala_items/6-higher-order-functions.md | 45 ++++++++++++++++ 7 files changed, 259 insertions(+) create mode 100644 _scala_items/1-seamless-java-interop.md create mode 100644 _scala_items/2-type-inference.md create mode 100644 _scala_items/3-concurrency-distribution.md create mode 100644 _scala_items/4-traits.md create mode 100644 _scala_items/5-pattern-matching.md create mode 100644 _scala_items/6-higher-order-functions.md diff --git a/_config.yml b/_config.yml index 113c3d298..72010f477 100644 --- a/_config.yml +++ b/_config.yml @@ -14,3 +14,8 @@ exclude: - Gemfile - Gemfile.lock future: true + +# Custom collections +collections: + scala_items: + output: false \ No newline at end of file diff --git a/_scala_items/1-seamless-java-interop.md b/_scala_items/1-seamless-java-interop.md new file mode 100644 index 000000000..c459b93fb --- /dev/null +++ b/_scala_items/1-seamless-java-interop.md @@ -0,0 +1,62 @@ +--- +shortTitle: "Seamless Java Interop" +shortDescription: "Scala runs on the JVM, so Java and Scala stacks can be freely mixed for totally seamless integration." +scastieUrl: +--- + +
    +
    +
    Author.scala
    +
    class Author(val firstName: String,
    +    val lastName: String) extends Comparable[Author] {
    +
    +  override def compareTo(that: Author) = {
    +    val lastNameComp = this.lastName compareTo that.lastName
    +    if (lastNameComp != 0) lastNameComp
    +    else this.firstName compareTo that.firstName
    +  }
    +}
    +
    +object Author {
    +  def loadAuthorsFromFile(file: java.io.File): List[Author] = ???
    +}
    +
    +
    +
    App.java
    +
    import static scala.collection.JavaConversions.asJavaCollection;
    +
    +public class App {
    +    public List<Author> loadAuthorsFromFile(File file) {
    +        return new ArrayList<Author>(asJavaCollection(
    +            Author.loadAuthorsFromFile(file)));
    +    }
    +
    +    public void sortAuthors(List<Author> authors) {
    +        Collections.sort(authors);
    +    }
    +
    +    public void displaySortedAuthors(File file) {
    +        List<Author> authors = loadAuthorsFromFile(file);
    +        sortAuthors(authors);
    +        for (Author author : authors) {
    +            System.out.println(
    +                author.lastName() + ", " + author.firstName());
    +        }
    +    }
    +}
    +
    +
    + +
    +

    Combine Scala and Java seamlessly

    +

    Scala classes are ultimately JVM classes. You can create Java objects, call +their methods and inherit from Java classes transparently from Scala. +Similarly, Java code can reference Scala classes and objects.

    +

    +In this example, the Scala class Author implements the Java +interface Comparable<T> and works with Java +Files. The Java code uses a method from the companion object +Author, and accesses fields of the Author class. +It also uses JavaConversions to convert between Scala collections +and Java collections. +

    diff --git a/_scala_items/2-type-inference.md b/_scala_items/2-type-inference.md new file mode 100644 index 000000000..d2db42382 --- /dev/null +++ b/_scala_items/2-type-inference.md @@ -0,0 +1,44 @@ +--- +shortTitle: "Type Inference" +shortDescription: "So the type system doesn’t feel so static. Don’t work for the type system. Let the type system work for you!" +scastieUrl: +--- +
    +
    Type inference
    +
    scala> class Person(val name: String, val age: Int) {
    +     |   override def toString = s"$name ($age)"
    +     | }
    +defined class Person
    +
    +scala> def underagePeopleNames(persons: List[Person]) = {
    +     |   for (person <- persons; if person.age < 18)
    +     |     yield person.name
    +     | }
    +underagePeopleNames: (persons: List[Person])List[String]
    +
    +scala> def createRandomPeople() = {
    +     |   val names = List("Alice", "Bob", "Carol",
    +     |       "Dave", "Eve", "Frank")
    +     |   for (name <- names) yield {
    +     |     val age = (Random.nextGaussian()*8 + 20).toInt
    +     |     new Person(name, age)
    +     |   }
    +     | }
    +createRandomPeople: ()List[Person]
    +
    +scala> val people = createRandomPeople()
    +people: List[Person] = List(Alice (16), Bob (16), Carol (19), Dave (18), Eve (26), Frank (11))
    +
    +scala> underagePeopleNames(people)
    +res1: List[String] = List(Alice, Bob, Frank)
    +
    +
    +

    Let the compiler figure out the types for you

    +

    The Scala compiler is smart about static types. Most of the time, you need +not tell it the types of your variables. Instead, its powerful type inference +will figure them out for you.

    +

    +In this interactive REPL session (Read-Eval-Print-Loop), we define a +class and two functions. You can observe that the compiler infers the result +types of the functions automatically, as well as all the intermediate values. +

    diff --git a/_scala_items/3-concurrency-distribution.md b/_scala_items/3-concurrency-distribution.md new file mode 100644 index 000000000..1651dbc58 --- /dev/null +++ b/_scala_items/3-concurrency-distribution.md @@ -0,0 +1,25 @@ +--- +shortTitle: "Concurrency & Distribution" +shortDescription: "Use data-parallel operations on collections, use actors for concurrency and distribution, or futures for asynchronous programming." +scastieUrl: +--- +
    +
    Concurrent/Distributed
    +
    val x = future { someExpensiveComputation() }
    +val y = future { someOtherExpensiveComputation() }
    +val z = for (a <- x; b <- y) yield a*b
    +for (c <- z) println("Result: " + c)
    +println("Meanwhile, the main thread goes on!")
    +
    + +
    +

    Go Concurrent or Distributed with Futures & Promises

    +

    In Scala, futures and promises can be used to process data asynchronously, making it easier to parallelize or even distribute your application.

    +

    +In this example, the future{} construct evaluates its argument asynchronously, and returns +a handle to the asynchronous result as a Future[Int]. +For-comprehensions can be used to register new callbacks (to post new things to do) when the future is +completed, i.e., when the computation is finished. +And since all this is executed asynchronously, without blocking, the main +program thread can continue doing other work in the meantime. +

    \ No newline at end of file diff --git a/_scala_items/4-traits.md b/_scala_items/4-traits.md new file mode 100644 index 000000000..705d399fc --- /dev/null +++ b/_scala_items/4-traits.md @@ -0,0 +1,46 @@ +--- +shortTitle: "Traits" +shortDescription: "Combine the flexibility of Java-style interfaces with the power of classes. Think principled multiple-inheritance." +scastieUrl: +--- +{% comment %} +Borrowed from +http://gleichmann.wordpress.com/2009/10/21/scala-in-practice-composing-traits-lego-style/ +{% endcomment %} + +
    +
    Traits
    +
    abstract class Spacecraft {
    +  def engage(): Unit
    +}
    +trait CommandoBridge extends Spacecraft {
    +  def engage(): Unit = {
    +    for (_ <- 1 to 3)
    +      speedUp()
    +  }
    +  def speedUp(): Unit
    +}
    +trait PulseEngine extends Spacecraft {
    +  val maxPulse: Int
    +  var currentPulse: Int = 0
    +  def speedUp(): Unit = {
    +    if (currentPulse < maxPulse)
    +      currentPulse += 1
    +  }
    +}
    +class StarCruiser extends Spacecraft
    +                     with CommandoBridge
    +                     with PulseEngine {
    +  val maxPulse = 200
    +}
    +
    + +
    +

    Flexibly Combine Interface & Behavior

    +

    +In Scala, multiple traits can be mixed into a class to combine their interface and their +behavior.

    +

    Here, a StarCruiser is a Spacecraft with a CommandoBridge that knows how to +engage the ship (provided a means to speed up) and a PulseEngine that +specifies how to speed up. +

    diff --git a/_scala_items/5-pattern-matching.md b/_scala_items/5-pattern-matching.md new file mode 100644 index 000000000..e80e6edd0 --- /dev/null +++ b/_scala_items/5-pattern-matching.md @@ -0,0 +1,32 @@ +--- +shortTitle: "Pattern Matching" +shortDescription: "Think “switch” on steroids. Match against class hierarchies, sequences, and more." +scastieUrl: +--- +
    +
    Pattern matching
    +
    // Define a set of case classes for representing binary trees.
    +sealed abstract class Tree
    +case class Node(elem: Int, left: Tree, right: Tree) extends Tree
    +case object Leaf extends Tree
    +
    +// Return the in-order traversal sequence of a given tree.
    +def inOrder(t: Tree): List[Int] = t match {
    +  case Node(e, l, r) => inOrder(l) ::: List(e) ::: inOrder(r)
    +  case Leaf          => List()
    +}
    +
    + +
    +

    Switch on the structure of your data

    +

    In Scala, case classes are used to represent structural data +types. They implicitly equip the class with meaningful toString, +equals and hashCode methods, as well as the +ability to be deconstructed with pattern matching.

    +

    +In this example, we define a small set of case classes that represent binary +trees of integers (the generic version is omitted for simplicity here). +In inOrder, the match construct chooses the right +branch, depending on the type of t, and at the same time +deconstructs the arguments of a Node. +

    \ No newline at end of file diff --git a/_scala_items/6-higher-order-functions.md b/_scala_items/6-higher-order-functions.md new file mode 100644 index 000000000..c828c72ea --- /dev/null +++ b/_scala_items/6-higher-order-functions.md @@ -0,0 +1,45 @@ +--- +shortTitle: "Higher-order functions" +shortDescription: "Functions are first-class objects. Compose them with guaranteed type safety. Use them anywhere, pass them to anything." +scastieUrl: +--- +
    +

    Go Functional with Higher-Order Functions

    +

    In Scala, functions are values, and can be defined as anonymous functions + with a concise syntax.

    +
    + +
    +
    Scala
    +
    val people: Array[Person]
    +
    +// Partition `people` into two arrays `minors` and `adults`.
    +// Use the higher-order function `(_.age < 18)` as a predicate for partitioning.
    +val (minors, adults) = people partition (_.age < 18)
    +
    +
    +
    Java
    +
    List<Person> people;
    +
    +List<Person> minors = new ArrayList<Person>(people.size());
    +List<Person> adults = new ArrayList<Person>(people.size());
    +for (Person person : people) {
    +    if (person.getAge() < 18)
    +        minors.add(person);
    +    else
    +        adults.add(person);
    +}
    +
    + +
    +

    + In the Scala example on the left, the partition method, available on all + collection types (including Array), returns two new collections + of the same type. Elements from the original collection are partitioned + according to a predicate, which is given as a lambda, i.e., an anonymous + function. The _ stands for the parameter to the lambda, i.e., + the element that is being tested. This particular lambda can also be written + as (x => x.age < 18). +

    +

    The same program is implemented in Java on the right.

    +
    \ No newline at end of file From abd29893f935d8c17cbbe55f500c6a502ebb9b4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Tue, 17 Jan 2017 12:06:26 +0100 Subject: [PATCH 006/120] Fixing https addresses for twitter and github sns --- _data/common.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_data/common.yml b/_data/common.yml index 83db53426..fd315deab 100644 --- a/_data/common.yml +++ b/_data/common.yml @@ -1,3 +1,3 @@ # SNS URLs -githubUrl: http://github.com/scala/scala -twitter: http://twitter.com/scala_lang \ No newline at end of file +githubUrl: https://github.com/scala/scala +twitter: https://twitter.com/scala_lang \ No newline at end of file From 543b840e2802910ce97d76c83b00120f51bd4111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Tue, 17 Jan 2017 17:55:36 +0100 Subject: [PATCH 007/120] Added styles and dom modifications for the twitter feed (still WIP) --- _includes/footer.html | 3 + _includes/headertop.html | 7 +- _includes/twitter-feed.html | 17 + _layouts/frontpage.html | 60 +-- resources/css/style.css | 1 + resources/js/tweetMachine-update.js | 39 +- resources/js/vendor/unslider.js | 654 ++++++++++++++++++++++++++++ resources/php/getFromTwitter.php | 43 +- 8 files changed, 744 insertions(+), 80 deletions(-) create mode 100644 _includes/twitter-feed.html create mode 100644 resources/css/style.css create mode 100644 resources/js/vendor/unslider.js diff --git a/_includes/footer.html b/_includes/footer.html index bc511fd48..278aba65f 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -68,6 +68,9 @@ + + + {% unless page.layout == 'page-no-toc' %} diff --git a/_includes/headertop.html b/_includes/headertop.html index 09f61459f..a333abf22 100644 --- a/_includes/headertop.html +++ b/_includes/headertop.html @@ -12,15 +12,16 @@ - + - + - + + diff --git a/_includes/twitter-feed.html b/_includes/twitter-feed.html new file mode 100644 index 000000000..f50f07644 --- /dev/null +++ b/_includes/twitter-feed.html @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/_layouts/frontpage.html b/_layouts/frontpage.html index 4bee1e10f..cc6e93d90 100644 --- a/_layouts/frontpage.html +++ b/_layouts/frontpage.html @@ -4,6 +4,10 @@ {% include headertop.html %} {% include headerbottom.html %} +
    +{% include twitter-feed.html %} +
    +
     
    @@ -190,25 +194,6 @@

    Upcoming Training

    - -
    @@ -217,37 +202,30 @@

    Scala on Twitter

    {% include footer.html %} \ No newline at end of file diff --git a/resources/css/style.css b/resources/css/style.css new file mode 100644 index 000000000..80084964c --- /dev/null +++ b/resources/css/style.css @@ -0,0 +1 @@ +@import url("https://fonts.googleapis.com/css?family=Lato:400,400i,700");@import url("https://fonts.googleapis.com/css?family=Roboto+Slab:400,700");html{box-sizing:border-box}*,*::after,*::before{box-sizing:inherit}.unslider{overflow:auto;margin:0;padding:0}.unslider-wrap{position:relative}.unslider-wrap.unslider-carousel>li{float:left}.unslider-vertical>ul{height:100%}.unslider-vertical li{float:none;width:100%}.unslider-fade{position:relative}.unslider-fade .unslider-wrap li{position:absolute;left:0;top:0;right:0;z-index:8}.unslider-fade .unslider-wrap li.unslider-active{z-index:10}.unslider ul,.unslider ol,.unslider li{list-style:none;margin:0;padding:0;border:none}.unslider-arrow{position:absolute;left:20px;z-index:2;cursor:pointer}.unslider-arrow.next{left:auto;right:20px}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}html,body{height:100%;margin:0}.wrap{max-width:1200px;margin-left:auto;margin-right:auto;padding:0 20px}.wrap::after{clear:both;content:"";display:block}.dot{font-size:10px;color:rgba(137,146,149,0.6)}ul,ol{list-style-type:none;margin:0;padding:0}dl{margin:0}dt{font-weight:600;margin:0}dd{margin:0}figure{margin:0}img,picture{margin:0;max-width:100%}body{color:#4A5659;font-family:"Lato",sans-serif;font-size:16px;font-weight:400;line-height:1.6}h1,h2,h3,h4,h5,h6{font-family:"Roboto Slab",serif;line-height:1.4;font-weight:400;margin:0}p{margin:0}a{color:#23aad1;text-decoration:none;transition:all 350ms ease}a:active,a:focus,a:hover{color:#DC322F;text-decoration:underline}hr{border-bottom:1px solid #D0D9DA;border-left:0;border-right:0;border-top:0;margin:0}#site-header{background:#002B36}.inner-text{float:left;display:block;margin-right:2.35765%;width:65.88078%}.inner-text h1{font-family:"Lato",sans-serif;font-size:2.813rem;font-weight:700;color:#fff;margin:30px 0 15px 0}.inner-text p{font-size:1.25rem;color:#fff;margin-bottom:30px}.inner-text:last-child{margin-right:0}@media (max-width: 992px){.inner-text{float:left;display:block;margin-right:2.35765%;width:100%}.inner-text:last-child{margin-right:0}.inner-text h1{font-size:2.213rem;margin:0 0 15px 0}}.scala-main-resources{height:177px;background:#002B36;position:relative}.scala-main-resources .resources{margin-top:-30px;position:relative}.scala-main-resources .resources::after{clear:both;content:"";display:block}.scala-main-resources .resources .button{font-size:1.063rem;display:block;border-top-left-radius:200px;border-top-right-radius:200px;border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:200px;border-top-left-radius:200px;padding:20px 40px}.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-left:17.05961%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:31.76157%}.scala-main-resources .resources .api-docs:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button{text-align:right;border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:200px;border-top-right-radius:200px;border-bottom-left-radius:200px;border-bottom-right-radius:200px;border-bottom-left-radius:0;border-top-left-radius:0}#site-main section{padding:50px 0}#site-main section h2{position:relative;margin-bottom:40px;font-size:1.5rem;text-align:center}#site-main section h2 span{padding:0 30px;position:relative;z-index:5}#site-main section h2:before{content:"";display:block;height:1px;position:absolute;top:50%;width:100%}.navigation{padding:30px 0;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.navigation .navigation-bdand img{width:104px;height:43px}.navigation .navigation-panel-button{display:none;font-size:1.333rem;color:#fff;cursor:pointer}@media (max-width: 992px){.navigation .navigation-panel-button{order:3;display:block}}.navigation .navigation-menu .navigation-menu-item{display:inline-block}.navigation .navigation-menu .navigation-menu-item:last-child{margin-right:0}.navigation .navigation-menu .navigation-menu-item a{padding:5px 15px;text-transform:uppercase;color:#fff;border-radius:300px}.navigation .navigation-menu .navigation-menu-item a:active,.navigation .navigation-menu .navigation-menu-item a:focus,.navigation .navigation-menu .navigation-menu-item a:hover{background:#DC322F;text-decoration:none}@media (max-width: 992px){.navigation .navigation-menu{padding:20px;position:fixed;top:0;right:0;bottom:0;left:auto;height:100%;width:270px;-webkit-transform:translateX(270px);-moz-transform:translateX(270px);-ms-transform:translateX(270px);-o-transform:translateX(270px);transform:translateX(270px);-webkit-transition:all 0.25s linear;-moz-transition:all 0.25s linear;transition:all 0.25s linear;background:#fff;-webkit-overflow-scrolling:touch;overflow-y:auto;z-index:100;background:rgba(0,43,54,0.99)}.navigation .navigation-menu.is-visible{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}.navigation .navigation-menu .navigation-menu-item{margin-right:16px;padding:10px 0;display:block}}.navigation-fade-screen{position:fixed;top:0;right:0;bottom:0;left:0;-webkit-transition:all 0.15s ease-out 0s;-moz-transition:all 0.15s ease-out 0s;transition:all 0.15s ease-out 0s;background:#000;opacity:0;visibility:hidden;z-index:90}.navigation-fade-screen.is-visible{opacity:0.6;visibility:visible}.twitter-feed{background:#5CC6E4}.twitter-feed h2{color:#fff}.twitter-feed h2 span{background:#5CC6E4}.twitter-feed h2:before{background:rgba(255,255,255,0.5)}.twitter-feed .slider-twitter ul li{padding:0 15px}.twitter-feed .slider-twitter ul li .item-tweet{padding:20px;background:#fff;border-radius:3px;transition:all 350ms ease;float:left;display:block;margin-right:2.35765%;width:31.76157%}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}@media (max-width: 992px){.twitter-feed .slider-twitter ul li .item-tweet{float:left;display:block;margin-right:2.35765%;width:100%;margin-bottom:20px}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-bottom:0}}.twitter-feed .slider-twitter ul li .item-tweet img{border-radius:3px;width:44px;height:auto;float:left}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text{margin-left:64px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li{padding:0;margin-right:6px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user{font-size:1.063rem;font-weight:700;color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a{color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:hover{color:#DC322F;text-decoration:none}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.username{font-size:.875rem;color:#899295;font-weight:600}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet .date{font-size:.875rem;color:#899295}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p{font-size:.9375rem}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag{color:rgba(137,146,149,0.7)}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:hover{color:#899295}.twitter-feed .slider-twitter ul li .item-tweet:hover{background:rgba(255,255,255,0.88)}.twitter-feed .call-to-action p{color:#fff}.button{padding:8px 18px;font-size:.875rem;text-transform:uppercase;color:#fff;background:#859900;border-radius:3px;display:inline-block}.button:active,.button:focus,.button:hover{text-decoration:none;color:#fff;background:#DC322F}.call-to-action{text-align:center;margin-top:40px}.call-to-action.action-medium{margin-top:30px}.call-to-action.action-small{margin-top:20px}.call-to-action p{font-size:.875rem}.call-to-action p.align-top{margin-bottom:12px}.call-to-action p.align-bottom{margin-top:12px}.unslider ul li{padding:0 1px}.unslider .unslider-arrow{display:none}.unslider .unslider-nav{margin-top:10px}@media (max-width: 992px){.unslider .unslider-nav{margin-top:10px}}.unslider .unslider-nav ol li{width:7px;height:7px;border:none;background:rgba(255,255,255,0.3)}.unslider .unslider-nav ol li.unslider-active{pointer-events:none;background:#fff}#site-header.header-home{background:none}#site-header.header-home .header-background{background:rgba(0,43,54,0.45);position:relative;padding-bottom:150px}#site-header.header-home .header-background:before{content:"";position:absolute;background:url("../img/background-header-home.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1} diff --git a/resources/js/tweetMachine-update.js b/resources/js/tweetMachine-update.js index 9dfec6aa0..4bab6960f 100755 --- a/resources/js/tweetMachine-update.js +++ b/resources/js/tweetMachine-update.js @@ -157,22 +157,38 @@ tweetObj.find('.avatar') .attr('src', actualTweet.user.profile_image_url.replace("normal", "reasonably_small")); - // Set the username - tweetObj.find('.username') - .attr('href', "http://twitter.com/" + actualTweet.user.screen_name) - .attr('target', '_blank') - .html("" + actualTweet.user.screen_name); + // Set the user screen name + var usernameLink = "" + + "@" + + actualTweet.user.screen_name + + ""; + tweetObj.find('.username').html("" + usernameLink); + + // Set the username: + var userLink = "" + + actualTweet.user.name + + ""; + tweetObj.find('.user').html("" + userLink); // Set the timestamp - tweetObj.find('.time') - .attr('href', "http://twitter.com/" + actualTweet.user.screen_name + "/status/" + actualTweet.id_str) - .attr('target', '_blank') - .html(tweetMachine.relativeTime(actualTweet.created_at)) + var dateLink = "" + + tweetMachine.relativeTime(actualTweet.created_at) + + ""; + tweetObj.find('.date') + .html("" + dateLink) // Save the created_at time as jQuery data so we can update it later .data('timestamp', actualTweet.created_at); // Set the text - tweetObj.find('.content') + tweetObj.find('.main-tweet') .html(tweetMachine.parseText(actualTweet.text)); // If we are animating in the new tweets @@ -226,7 +242,7 @@ queryParams: queryParams }, function (tweets) { var tweetsDisplayed; - + console.log("No tweets! :("); // If we got a response from Twitter if ( tweets[0] ) { // If there is an error message @@ -243,6 +259,7 @@ } // There are tweets else { + console.log("There are tweets!"); // If there was an error before if ( $('.twitter-error').length ) { // Remove it diff --git a/resources/js/vendor/unslider.js b/resources/js/vendor/unslider.js new file mode 100644 index 000000000..c41609c9b --- /dev/null +++ b/resources/js/vendor/unslider.js @@ -0,0 +1,654 @@ +/** + * Unslider + * version 2.0 + * by @idiot and friends + */ + +(function(factory) { + if (typeof module === 'object' && typeof module.exports === 'object') { + factory(require('jquery')); + } else if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], factory(window.jQuery)); + } else { + factory(window.jQuery); + } +}(function($) { + // Don't throw any errors when jQuery + if(!$) { + return console.warn('Unslider needs jQuery'); + } + + $.Unslider = function(context, options) { + var self = this; + + // Create an Unslider reference we can use everywhere + self._ = 'unslider'; + + // Store our default options in here + // Everything will be overwritten by the jQuery plugin though + self.defaults = { + // Should the slider move on its own or only when + // you interact with the nav/arrows? + // Only accepts boolean true/false. + autoplay: false, + + // 3 second delay between slides moving, pass + // as a number in milliseconds. + delay: 3000, + + // Animation speed in millseconds + speed: 750, + + // An easing string to use. If you're using Velocity, use a + // Velocity string otherwise you can use jQuery/jQ UI options. + easing: 'swing', // [.42, 0, .58, 1], + + // Does it support keyboard arrows? + // Can pass either true or false - + // or an object with the keycodes, like so: + // { + // prev: 37, + // next: 39 + // } + // You can call any internal method name + // before the keycode and it'll be called. + keys: { + prev: 37, + next: 39 + }, + + // Do you want to generate clickable navigation + // to skip to each slide? Accepts boolean true/false or + // a callback function per item to generate. + nav: true, + + // Should there be left/right arrows to go back/forth? + // -> This isn't keyboard support. + // Either set true/false, or an object with the HTML + // elements for each arrow like below: + arrows: { + prev: '', + next: '' + }, + + // How should Unslider animate? + // It can do one of the following types: + // "fade": each slide fades in to each other + // "horizontal": each slide moves from left to right + // "vertical": each slide moves from top to bottom + animation: 'horizontal', + + // If you don't want to use a list to display your slides, + // you can change it here. Not recommended and you'll need + // to adjust the CSS accordingly. + selectors: { + container: 'ul:first', + slides: 'li' + }, + + // Do you want to animate the heights of each slide as + // it moves + animateHeight: false, + + // Active class for the nav + activeClass: self._ + '-active', + + // Have swipe support? + // You can set this here with a boolean and always use + // initSwipe/destroySwipe later on. + swipe: true, + // Swipe threshold - + // lower float for enabling short swipe + swipeThreshold: 0.2 + }; + + // Set defaults + self.$context = context; + self.options = {}; + + // Leave our elements blank for now + // Since they get changed by the options, we'll need to + // set them in the init method. + self.$parent = null; + self.$container = null; + self.$slides = null; + self.$nav = null; + self.$arrows = []; + + // Set our indexes and totals + self.total = 0; + self.current = 0; + + // Generate a specific random ID so we don't dupe events + self.prefix = self._ + '-'; + self.eventSuffix = '.' + self.prefix + ~~(Math.random() * 2e3); + + // In case we're going to use the autoplay + self.interval = null; + + // Get everything set up innit + self.init = function(options) { + // Set up our options inside here so we can re-init at + // any time + self.options = $.extend({}, self.defaults, options); + + // Our elements + self.$container = self.$context.find(self.options.selectors.container).addClass(self.prefix + 'wrap'); + self.$slides = self.$container.children(self.options.selectors.slides); + + // We'll manually init the container + self.setup(); + + // We want to keep this script as small as possible + // so we'll optimise some checks + $.each(['nav', 'arrows', 'keys', 'infinite'], function(index, module) { + self.options[module] && self['init' + $._ucfirst(module)](); + }); + + // Add swipe support + if(jQuery.event.special.swipe && self.options.swipe) { + self.initSwipe(); + } + + // If autoplay is set to true, call self.start() + // to start calling our timeouts + self.options.autoplay && self.start(); + + // We should be able to recalculate slides at will + self.calculateSlides(); + + // Listen to a ready event + self.$context.trigger(self._ + '.ready'); + + // Everyday I'm chainin' + return self.animate(self.options.index || self.current, 'init'); + }; + + self.setup = function() { + // Add a CSS hook to the main element + self.$context.addClass(self.prefix + self.options.animation).wrap('
    '); + self.$parent = self.$context.parent('.' + self._); + + // We need to manually check if the container is absolutely + // or relatively positioned + var position = self.$context.css('position'); + + // If we don't already have a position set, we'll + // automatically set it ourselves + if(position === 'static') { + self.$context.css('position', 'relative'); + } + + self.$context.css('overflow', 'hidden'); + }; + + // Set up the slide widths to animate with + // so the box doesn't float over + self.calculateSlides = function() { + // update slides before recalculating the total + self.$slides = self.$container.children(self.options.selectors.slides); + + self.total = self.$slides.length; + + // Set the total width + if(self.options.animation !== 'fade') { + var prop = 'width'; + + if(self.options.animation === 'vertical') { + prop = 'height'; + } + + self.$container.css(prop, (self.total * 100) + '%').addClass(self.prefix + 'carousel'); + self.$slides.css(prop, (100 / self.total) + '%'); + } + }; + + + // Start our autoplay + self.start = function() { + self.interval = setTimeout(function() { + // Move on to the next slide + self.next(); + + // If we've got autoplay set up + // we don't need to keep starting + // the slider from within our timeout + // as .animate() calls it for us + }, self.options.delay); + + return self; + }; + + // And pause our timeouts + // and force stop the slider if needed + self.stop = function() { + clearTimeout(self.interval); + + return self; + }; + + + // Set up our navigation + self.initNav = function() { + var $nav = $(''); + + // Build our click navigation item-by-item + self.$slides.each(function(key) { + // If we've already set a label, let's use that + // instead of generating one + var label = this.getAttribute('data-nav') || key + 1; + + // Listen to any callback functions + if($.isFunction(self.options.nav)) { + label = self.options.nav.call(self.$slides.eq(key), key, label); + } + + // And add it to our navigation item + $nav.children('ol').append('
  • ' + label + '
  • '); + }); + + // Keep a copy of the nav everywhere so we can use it + self.$nav = $nav.insertAfter(self.$context); + + // Now our nav is built, let's add it to the slider and bind + // for any click events on the generated links + self.$nav.find('li').on('click' + self.eventSuffix, function() { + // Cache our link and set it to be active + var $me = $(this).addClass(self.options.activeClass); + + // Set the right active class, remove any other ones + $me.siblings().removeClass(self.options.activeClass); + + // Move the slide + self.animate($me.attr('data-slide')); + }); + }; + + + // Set up our left-right arrow navigation + // (Not keyboard arrows, prev/next buttons) + self.initArrows = function() { + if(self.options.arrows === true) { + self.options.arrows = self.defaults.arrows; + } + + // Loop our options object and bind our events + $.each(self.options.arrows, function(key, val) { + // Add our arrow HTML and bind it + self.$arrows.push( + $(val).insertAfter(self.$context).on('click' + self.eventSuffix, self[key]) + ); + }); + }; + + + // Set up our keyboad navigation + // Allow binding to multiple keycodes + self.initKeys = function() { + if(self.options.keys === true) { + self.options.keys = self.defaults.keys; + } + + $(document).on('keyup' + self.eventSuffix, function(e) { + $.each(self.options.keys, function(key, val) { + if(e.which === val) { + $.isFunction(self[key]) && self[key].call(self); + } + }); + }); + }; + + // Requires jQuery.event.swipe + // -> stephband.info/jquery.event.swipe + self.initSwipe = function() { + var width = self.$slides.width(); + + // We don't want to have a tactile swipe in the slider + // in the fade animation, as it can cause some problems + // with layout, so we'll just disable it. + if(self.options.animation !== 'fade') { + + self.$container.on({ + + movestart: function(e) { + // If the movestart heads off in a upwards or downwards + // direction, prevent it so that the browser scrolls normally. + if((e.distX > e.distY && e.distX < -e.distY) || (e.distX < e.distY && e.distX > -e.distY)) { + return !!e.preventDefault(); + } + + self.$container.css('position', 'relative'); + }, + + move: function(e) { + self.$container.css('left', -(100 * self.current) + (100 * e.distX / width) + '%'); + }, + + moveend: function(e) { + // Check if swiped distance is greater than threshold. + // If yes slide to next/prev slide. If not animate to + // starting point. + + if((Math.abs(e.distX) / width) > self.options.swipeThreshold) { + + self[e.distX < 0 ? 'next' : 'prev'](); + } + else { + + self.$container.animate({left: -(100 * self.current) + '%' }, self.options.speed / 2 ); + } + } + }); + } + }; + + // Infinite scrolling is a massive pain in the arse + // so we need to create a whole bloody function to set + // it up. Argh. + self.initInfinite = function() { + var pos = ['first', 'last']; + + $.each(pos, function(index, item) { + self.$slides.push.apply( + self.$slides, + + // Exclude all cloned slides and call .first() or .last() + // depending on what `item` is. + self.$slides.filter(':not(".' + self._ + '-clone")')[item]() + + // Make a copy of it and identify it as a clone + .clone().addClass(self._ + '-clone') + + // Either insert before or after depending on whether we're + // the first or last clone + ['insert' + (index === 0 ? 'After' : 'Before')]( + // Return the other element in the position array + // if item = first, return "last" + self.$slides[pos[~~!index]]() + ) + ); + }); + }; + + // Remove any trace of arrows + // Loop our array of arrows and use jQuery to remove + // It'll unbind any event handlers for us + self.destroyArrows = function() { + $.each(self.$arrows, function(i, $arrow) { + $arrow.remove(); + }); + }; + + // Remove any swipe events and reset the position + self.destroySwipe = function() { + // We bind to 4 events, so we'll unbind those + self.$container.off('movestart move moveend'); + }; + + // Unset the keyboard navigation + // Remove the handler + self.destroyKeys = function() { + // Remove the event handler + $(document).off('keyup' + self.eventSuffix); + }; + + self.setIndex = function(to) { + if(to < 0) { + to = self.total - 1; + } + + self.current = Math.min(Math.max(0, to), self.total - 1); + + if(self.options.nav) { + self.$nav.find('[data-slide="' + self.current + '"]')._active(self.options.activeClass); + } + + self.$slides.eq(self.current)._active(self.options.activeClass); + + return self; + }; + + // Despite the name, this doesn't do any animation - since there's + // now three different types of animation, we let this method delegate + // to the right type, keeping the name for backwards compat. + self.animate = function(to, dir) { + // Animation shortcuts + // Instead of passing a number index, we can now + // use .data('unslider').animate('last'); + // or .unslider('animate:last') + // to go to the very last slide + if(to === 'first') to = 0; + if(to === 'last') to = self.total; + + // Don't animate if it's not a valid index + if(isNaN(to)) { + return self; + } + + if(self.options.autoplay) { + self.stop().start(); + } + + self.setIndex(to); + + // Add a callback method to do stuff with + self.$context.trigger(self._ + '.change', [to, self.$slides.eq(to)]); + + // Delegate the right method - everything's named consistently + // so we can assume it'll be called "animate" + + var fn = 'animate' + $._ucfirst(self.options.animation); + + // Make sure it's a valid animation method, otherwise we'll get + // a load of bug reports that'll be really hard to report + if($.isFunction(self[fn])) { + self[fn](self.current, dir); + } + + return self; + }; + + + // Shortcuts for animating if we don't know what the current + // index is (i.e back/forward) + // For moving forward we need to make sure we don't overshoot. + self.next = function() { + var target = self.current + 1; + + // If we're at the end, we need to move back to the start + if(target >= self.total) { + target = 0; + } + + return self.animate(target, 'next'); + }; + + // Previous is a bit simpler, we can just decrease the index + // by one and check if it's over 0. + self.prev = function() { + return self.animate(self.current - 1, 'prev'); + }; + + + // Our default animation method, the old-school left-to-right + // horizontal animation + self.animateHorizontal = function(to) { + var prop = 'left'; + + // Add RTL support, slide the slider + // the other way if the site is right-to-left + if(self.$context.attr('dir') === 'rtl') { + prop = 'right'; + } + + if(self.options.infinite) { + // So then we need to hide the first slide + self.$container.css('margin-' + prop, '-100%'); + } + + return self.slide(prop, to); + }; + + // The same animation methods, but vertical support + // RTL doesn't affect the vertical direction so we + // can just call as is + self.animateVertical = function(to) { + self.options.animateHeight = true; + + // Normal infinite CSS fix doesn't work for + // vertical animation so we need to manually set it + // with pixels. Ah well. + if(self.options.infinite) { + self.$container.css('margin-top', -self.$slides.outerHeight()); + } + + return self.slide('top', to); + }; + + // Actually move the slide now + // We have to pass a property to animate as there's + // a few different directions it can now move, but it's + // otherwise unchanged from before. + self.slide = function(prop, to) { + // If we want to change the height of the slider + // to match the current slide, you can set + // {animateHeight: true} + self.animateHeight(to); + + // For infinite sliding we add a dummy slide at the end and start + // of each slider to give the appearance of being infinite + if(self.options.infinite) { + var dummy; + + // Going backwards to last slide + if(to === self.total - 1) { + // We're setting a dummy position and an actual one + // the dummy is what the index looks like + // (and what we'll silently update to afterwards), + // and the actual is what makes it not go backwards + dummy = self.total - 3; + to = -1; + } + + // Going forwards to first slide + if(to === self.total - 2) { + dummy = 0; + to = self.total - 2; + } + + // If it's a number we can safely set it + if(typeof dummy === 'number') { + self.setIndex(dummy); + + // Listen for when the slide's finished transitioning so + // we can silently move it into the right place and clear + // this whole mess up. + self.$context.on(self._ + '.moved', function() { + if(self.current === dummy) { + self.$container.css(prop, -(100 * dummy) + '%').off(self._ + '.moved'); + } + }); + } + } + + // We need to create an object to store our property in + // since we don't know what it'll be. + var obj = {}; + + // Manually create it here + obj[prop] = -(100 * to) + '%'; + + // And animate using our newly-created object + return self._move(self.$container, obj); + }; + + + // Fade between slides rather than, uh, sliding it + self.animateFade = function(to) { + // If we want to change the height of the slider + // to match the current slide, you can set + // {animateHeight: true} + self.animateHeight(to); + + var $active = self.$slides.eq(to).addClass(self.options.activeClass); + + // Toggle our classes + self._move($active.siblings().removeClass(self.options.activeClass), {opacity: 0}); + self._move($active, {opacity: 1}, false); + }; + + // Animate height of slider + self.animateHeight = function(to) { + // If we want to change the height of the slider + // to match the current slide, you can set + // {animateHeight: true} + if (self.options.animateHeight) { + self._move(self.$context, {height: self.$slides.eq(to).outerHeight()}, false); + } + }; + + self._move = function($el, obj, callback, speed) { + if(callback !== false) { + callback = function() { + self.$context.trigger(self._ + '.moved'); + }; + } + + return $el._move(obj, speed || self.options.speed, self.options.easing, callback); + }; + + // Allow daisy-chaining of methods + return self.init(options); + }; + + // Internal (but global) jQuery methods + // They're both just helpful types of shorthand for + // anything that might take too long to write out or + // something that might be used more than once. + $.fn._active = function(className) { + return this.addClass(className).siblings().removeClass(className); + }; + + // The equivalent to PHP's ucfirst(). Take the first + // character of a string and make it uppercase. + // Simples. + $._ucfirst = function(str) { + // Take our variable, run a regex on the first letter + return (str + '').toLowerCase().replace(/^./, function(match) { + // And uppercase it. Simples. + return match.toUpperCase(); + }); + }; + + $.fn._move = function() { + this.stop(true, true); + return $.fn[$.fn.velocity ? 'velocity' : 'animate'].apply(this, arguments); + }; + + // And set up our jQuery plugin + $.fn.unslider = function(opts) { + return this.each(function(index,elem) { + var $this = $(elem); + var unslider = $(elem).data('unslider'); + if(unslider instanceof $.Unslider) { + return; + } + // Allow usage of .unslider('function_name') + // as well as using .data('unslider') to access the + // main Unslider object + if(typeof opts === 'string' && $this.data('unslider')) { + opts = opts.split(':'); + + var call = $this.data('unslider')[opts[0]]; + + // Do we have arguments to pass to the string-function? + if($.isFunction(call)) { + return call.apply($this, opts[1] ? opts[1].split(',') : null); + } + } + + return $this.data('unslider', new $.Unslider($this, opts)); + }); + }; + +})); diff --git a/resources/php/getFromTwitter.php b/resources/php/getFromTwitter.php index 3c598ecab..641397154 100644 --- a/resources/php/getFromTwitter.php +++ b/resources/php/getFromTwitter.php @@ -30,10 +30,10 @@ // NOTE: These keys are provided so the sample.html file can run. Don't use // them in a production environment because the rate limit will be lumped // in with everyone else testing the plugin - $consumerKey = 'Lcue9qrjJlLBzZXS0jYoQ'; - $consumerSecret = 'rkPTvgh8nwvCULeKeuB6wgET9isQrKeJdi2f0x3PnQU'; - $accessToken = '80357329-wUWqRGSgqGFxu6ozgFiGoE4Dz32tzqnMrENU3jcUf'; - $accessTokenSecret = '2EEPSyDHldG0fHRJbBeKVEmsLWAR3Y17YVTtHebozs'; + $consumerKey = 'D70VsCq4nFIniYLVqn6EYZaGw'; + $consumerSecret = 'CCToJ4yPrWF1XLcm0olMuD7vbctjrjow2Ua3rsSKDbbXLf6DXZ'; + $accessToken = '89575909-ZP6Xumslwfe8LcE2XaH3HhqKSmCCKZoYhTRRB9TJh'; + $accessTokenSecret = 'FZw7xQskRnVamNNyQuPec1Ul0rlWYKkE3BQaPvkuDGHjx'; /* END SETUP ==========================================================*/ @@ -59,31 +59,24 @@ */ $tweets = $connection->get($endpoint, $queryParams); - error_log(print_r($tweets, TRUE), 0); /* * If Twitter returned statuses, the request was successful */ - // Method if you are using endpoint "search/tweets" - if ($endpoint === "search/tweets") { - if ( isset($tweets->statuses) ) { - echo json_encode($tweets->statuses); - } - else { // There was a problem somewhere - // Return the error Twitter sent so Javascript can parse it and display the error - echo json_encode($tweets->errors); - } - } + // Method if you are using endpoint "search/tweets" + if ($endpoint === "search/tweets") { + if ( isset($tweets->statuses) ) { + echo json_encode($tweets->statuses); + } + else { // There was a problem somewhere + // Return the error Twitter sent so Javascript can parse it and display the error + echo json_encode($tweets->errors); + } + } - // Method if you are using endpoint "statuses/user_timeline" - if ($endpoint === "statuses/user_timeline") { - if ( isset($tweets[0]->user->id) ) { - echo json_encode($tweets); - } - else { // There was a problem somewhere - // Return the error Twitter sent so Javascript can parse it and display the error - echo json_encode($tweets->errors); - } - } \ No newline at end of file + // Method if you are using endpoint "statuses/user_timeline" + if ($endpoint === "statuses/user_timeline") { + echo json_encode($tweets); + } \ No newline at end of file From dbe8ceaf94d83d142025d17c3d16251c5e4773c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Wed, 18 Jan 2017 12:17:15 +0100 Subject: [PATCH 008/120] Fixed issues with tweetMachine and unslider to make the tweet feed work --- _includes/headertop.html | 4 +- _includes/twitter-feed.html | 12 +---- _layouts/frontpage.html | 10 ++++- resources/css/style.css | 2 +- resources/css/unslider-dots.css | 33 ++++++++++++++ resources/css/unslider.css | 1 + resources/js/tweetMachine-update.js | 69 ++++++++++++++++++----------- 7 files changed, 90 insertions(+), 41 deletions(-) create mode 100755 resources/css/unslider-dots.css create mode 100755 resources/css/unslider.css diff --git a/_includes/headertop.html b/_includes/headertop.html index a333abf22..25f086880 100644 --- a/_includes/headertop.html +++ b/_includes/headertop.html @@ -20,7 +20,9 @@ - + + + diff --git a/_includes/twitter-feed.html b/_includes/twitter-feed.html index f50f07644..fdc4b263b 100644 --- a/_includes/twitter-feed.html +++ b/_includes/twitter-feed.html @@ -1,16 +1,8 @@
    ` -}); +}, function(tweets, tweetsDisplayed) { + console.log("Finishing loading tweets"); + $('.slider-twitter').unslider({ + }); + }); + \ No newline at end of file diff --git a/resources/css/style.css b/resources/css/style.css index 80084964c..480e9d489 100644 --- a/resources/css/style.css +++ b/resources/css/style.css @@ -1 +1 @@ -@import url("https://fonts.googleapis.com/css?family=Lato:400,400i,700");@import url("https://fonts.googleapis.com/css?family=Roboto+Slab:400,700");html{box-sizing:border-box}*,*::after,*::before{box-sizing:inherit}.unslider{overflow:auto;margin:0;padding:0}.unslider-wrap{position:relative}.unslider-wrap.unslider-carousel>li{float:left}.unslider-vertical>ul{height:100%}.unslider-vertical li{float:none;width:100%}.unslider-fade{position:relative}.unslider-fade .unslider-wrap li{position:absolute;left:0;top:0;right:0;z-index:8}.unslider-fade .unslider-wrap li.unslider-active{z-index:10}.unslider ul,.unslider ol,.unslider li{list-style:none;margin:0;padding:0;border:none}.unslider-arrow{position:absolute;left:20px;z-index:2;cursor:pointer}.unslider-arrow.next{left:auto;right:20px}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}html,body{height:100%;margin:0}.wrap{max-width:1200px;margin-left:auto;margin-right:auto;padding:0 20px}.wrap::after{clear:both;content:"";display:block}.dot{font-size:10px;color:rgba(137,146,149,0.6)}ul,ol{list-style-type:none;margin:0;padding:0}dl{margin:0}dt{font-weight:600;margin:0}dd{margin:0}figure{margin:0}img,picture{margin:0;max-width:100%}body{color:#4A5659;font-family:"Lato",sans-serif;font-size:16px;font-weight:400;line-height:1.6}h1,h2,h3,h4,h5,h6{font-family:"Roboto Slab",serif;line-height:1.4;font-weight:400;margin:0}p{margin:0}a{color:#23aad1;text-decoration:none;transition:all 350ms ease}a:active,a:focus,a:hover{color:#DC322F;text-decoration:underline}hr{border-bottom:1px solid #D0D9DA;border-left:0;border-right:0;border-top:0;margin:0}#site-header{background:#002B36}.inner-text{float:left;display:block;margin-right:2.35765%;width:65.88078%}.inner-text h1{font-family:"Lato",sans-serif;font-size:2.813rem;font-weight:700;color:#fff;margin:30px 0 15px 0}.inner-text p{font-size:1.25rem;color:#fff;margin-bottom:30px}.inner-text:last-child{margin-right:0}@media (max-width: 992px){.inner-text{float:left;display:block;margin-right:2.35765%;width:100%}.inner-text:last-child{margin-right:0}.inner-text h1{font-size:2.213rem;margin:0 0 15px 0}}.scala-main-resources{height:177px;background:#002B36;position:relative}.scala-main-resources .resources{margin-top:-30px;position:relative}.scala-main-resources .resources::after{clear:both;content:"";display:block}.scala-main-resources .resources .button{font-size:1.063rem;display:block;border-top-left-radius:200px;border-top-right-radius:200px;border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:200px;border-top-left-radius:200px;padding:20px 40px}.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-left:17.05961%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:31.76157%}.scala-main-resources .resources .api-docs:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button{text-align:right;border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:200px;border-top-right-radius:200px;border-bottom-left-radius:200px;border-bottom-right-radius:200px;border-bottom-left-radius:0;border-top-left-radius:0}#site-main section{padding:50px 0}#site-main section h2{position:relative;margin-bottom:40px;font-size:1.5rem;text-align:center}#site-main section h2 span{padding:0 30px;position:relative;z-index:5}#site-main section h2:before{content:"";display:block;height:1px;position:absolute;top:50%;width:100%}.navigation{padding:30px 0;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.navigation .navigation-bdand img{width:104px;height:43px}.navigation .navigation-panel-button{display:none;font-size:1.333rem;color:#fff;cursor:pointer}@media (max-width: 992px){.navigation .navigation-panel-button{order:3;display:block}}.navigation .navigation-menu .navigation-menu-item{display:inline-block}.navigation .navigation-menu .navigation-menu-item:last-child{margin-right:0}.navigation .navigation-menu .navigation-menu-item a{padding:5px 15px;text-transform:uppercase;color:#fff;border-radius:300px}.navigation .navigation-menu .navigation-menu-item a:active,.navigation .navigation-menu .navigation-menu-item a:focus,.navigation .navigation-menu .navigation-menu-item a:hover{background:#DC322F;text-decoration:none}@media (max-width: 992px){.navigation .navigation-menu{padding:20px;position:fixed;top:0;right:0;bottom:0;left:auto;height:100%;width:270px;-webkit-transform:translateX(270px);-moz-transform:translateX(270px);-ms-transform:translateX(270px);-o-transform:translateX(270px);transform:translateX(270px);-webkit-transition:all 0.25s linear;-moz-transition:all 0.25s linear;transition:all 0.25s linear;background:#fff;-webkit-overflow-scrolling:touch;overflow-y:auto;z-index:100;background:rgba(0,43,54,0.99)}.navigation .navigation-menu.is-visible{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}.navigation .navigation-menu .navigation-menu-item{margin-right:16px;padding:10px 0;display:block}}.navigation-fade-screen{position:fixed;top:0;right:0;bottom:0;left:0;-webkit-transition:all 0.15s ease-out 0s;-moz-transition:all 0.15s ease-out 0s;transition:all 0.15s ease-out 0s;background:#000;opacity:0;visibility:hidden;z-index:90}.navigation-fade-screen.is-visible{opacity:0.6;visibility:visible}.twitter-feed{background:#5CC6E4}.twitter-feed h2{color:#fff}.twitter-feed h2 span{background:#5CC6E4}.twitter-feed h2:before{background:rgba(255,255,255,0.5)}.twitter-feed .slider-twitter ul li{padding:0 15px}.twitter-feed .slider-twitter ul li .item-tweet{padding:20px;background:#fff;border-radius:3px;transition:all 350ms ease;float:left;display:block;margin-right:2.35765%;width:31.76157%}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}@media (max-width: 992px){.twitter-feed .slider-twitter ul li .item-tweet{float:left;display:block;margin-right:2.35765%;width:100%;margin-bottom:20px}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-bottom:0}}.twitter-feed .slider-twitter ul li .item-tweet img{border-radius:3px;width:44px;height:auto;float:left}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text{margin-left:64px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li{padding:0;margin-right:6px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user{font-size:1.063rem;font-weight:700;color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a{color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:hover{color:#DC322F;text-decoration:none}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.username{font-size:.875rem;color:#899295;font-weight:600}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet .date{font-size:.875rem;color:#899295}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p{font-size:.9375rem}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag{color:rgba(137,146,149,0.7)}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:hover{color:#899295}.twitter-feed .slider-twitter ul li .item-tweet:hover{background:rgba(255,255,255,0.88)}.twitter-feed .call-to-action p{color:#fff}.button{padding:8px 18px;font-size:.875rem;text-transform:uppercase;color:#fff;background:#859900;border-radius:3px;display:inline-block}.button:active,.button:focus,.button:hover{text-decoration:none;color:#fff;background:#DC322F}.call-to-action{text-align:center;margin-top:40px}.call-to-action.action-medium{margin-top:30px}.call-to-action.action-small{margin-top:20px}.call-to-action p{font-size:.875rem}.call-to-action p.align-top{margin-bottom:12px}.call-to-action p.align-bottom{margin-top:12px}.unslider ul li{padding:0 1px}.unslider .unslider-arrow{display:none}.unslider .unslider-nav{margin-top:10px}@media (max-width: 992px){.unslider .unslider-nav{margin-top:10px}}.unslider .unslider-nav ol li{width:7px;height:7px;border:none;background:rgba(255,255,255,0.3)}.unslider .unslider-nav ol li.unslider-active{pointer-events:none;background:#fff}#site-header.header-home{background:none}#site-header.header-home .header-background{background:rgba(0,43,54,0.45);position:relative;padding-bottom:150px}#site-header.header-home .header-background:before{content:"";position:absolute;background:url("../img/background-header-home.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1} +@import url("https://fonts.googleapis.com/css?family=Lato:400,400i,700");@import url("https://fonts.googleapis.com/css?family=Roboto+Slab:400,700");html{box-sizing:border-box}*,*::after,*::before{box-sizing:inherit}.unslider{overflow:auto;margin:0;padding:0}.unslider-wrap{position:relative}.unslider-wrap.unslider-carousel>li{float:left}.unslider-vertical>ul{height:100%}.unslider-vertical li{float:none;width:100%}.unslider-fade{position:relative}.unslider-fade .unslider-wrap li{position:absolute;left:0;top:0;right:0;z-index:8}.unslider-fade .unslider-wrap li.unslider-active{z-index:10}.unslider ul,.unslider ol,.unslider li{list-style:none;margin:0;padding:0;border:none}.unslider-arrow{position:absolute;left:20px;z-index:2;cursor:pointer}.unslider-arrow.next{left:auto;right:20px}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}html,body{height:100%;margin:0}.wrap{max-width:1200px;margin-left:auto;margin-right:auto;padding:0 20px}.wrap::after{clear:both;content:"";display:block}.dot{font-size:10px;color:rgba(137,146,149,0.6)}ul,ol{list-style-type:none;margin:0;padding:0}dl{margin:0}dt{font-weight:600;margin:0}dd{margin:0}figure{margin:0}img,picture{margin:0;max-width:100%}body{color:#4A5659;font-family:"Lato",sans-serif;font-size:16px;font-weight:400;line-height:1.6}h1,h2,h3,h4,h5,h6{font-family:"Roboto Slab",serif;line-height:1.4;font-weight:400;margin:0}p{margin:0}a{color:#23aad1;text-decoration:none;transition:all 350ms ease}a:active,a:focus,a:hover{color:#DC322F;text-decoration:underline}hr{border-bottom:1px solid #D0D9DA;border-left:0;border-right:0;border-top:0;margin:0}#site-header{background:#002B36}#site-header.header-home{background:none}#site-header.header-home .header-background{background:rgba(0,43,54,0.45);position:relative;padding-bottom:150px}#site-header.header-home .header-background:before{content:"";position:absolute;background:url("../img/background-header-home.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.inner-text{float:left;display:block;margin-right:2.35765%;width:65.88078%}.inner-text h1{font-family:"Lato",sans-serif;font-size:2.813rem;font-weight:700;color:#fff;margin:30px 0 15px 0}.inner-text p{font-size:1.25rem;color:#fff;margin-bottom:30px}.inner-text:last-child{margin-right:0}@media (max-width: 992px){.inner-text{float:left;display:block;margin-right:2.35765%;width:100%}.inner-text:last-child{margin-right:0}.inner-text h1{font-size:2.213rem;margin:0 0 15px 0}}.scala-main-resources{height:177px;background:#002B36;position:relative}.scala-main-resources .resources .button{font-size:1.063rem;display:block;border-top-left-radius:200px;border-top-right-radius:200px;border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:200px;border-top-left-radius:200px;padding:20px 40px}.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-left:17.05961%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:31.76157%}.scala-main-resources .resources .api-docs:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button{text-align:right;border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:200px;border-top-right-radius:200px;border-bottom-left-radius:200px;border-bottom-right-radius:200px;border-bottom-left-radius:0;border-top-left-radius:0}@media (max-width: 992px){.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-left:0%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-right:0}.scala-main-resources .resources .api-docs:last-child{margin-right:0}}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{margin-top:-40px}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{margin-top:12px;max-width:180px;text-align:center}.scala-main-resources .resources .api-docs ul li:first-child,.scala-main-resources .resources .download ul li:first-child{border-bottom:1px solid rgba(255,255,255,0.14);font-family:"Roboto Slab",serif;padding-bottom:4px;margin-bottom:2px}.scala-main-resources .resources .api-docs ul li a,.scala-main-resources .resources .download ul li a{color:rgba(255,255,255,0.7);font-size:.875rem}.scala-main-resources .resources .api-docs ul li a:active,.scala-main-resources .resources .api-docs ul li a:focus,.scala-main-resources .resources .api-docs ul li a:hover,.scala-main-resources .resources .download ul li a:active,.scala-main-resources .resources .download ul li a:focus,.scala-main-resources .resources .download ul li a:hover{text-decoration:none;color:#fff}.scala-main-resources .resources .api-docs ul{float:right}.scala-main-resources .resources .scala-brand-circle{width:340px;height:340px;left:50%;top:-178px;margin-left:-170px;background:rgba(0,43,54,0.4);border-radius:100%;position:absolute;z-index:60;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center}.scala-main-resources .resources .scala-brand-circle .circle-solid{background:#002B36;width:224px;height:224px;border-radius:100%;text-align:center}.scala-main-resources .resources .scala-brand-circle .circle-solid img{width:152px;height:auto;margin-top:-28px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span{display:block;color:#fff;font-family:"Roboto Slab",serif}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:first-child{font-size:1.375rem;margin-top:-6px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:last-child{font-size:1.5rem;margin-top:-8px}@media (max-width: 768px){.scala-main-resources{height:auto;padding-bottom:50px}.scala-main-resources .resources .download{margin-top:140px}.scala-main-resources .resources .api-docs{margin-top:40px}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:100%}.scala-main-resources .resources .api-docs:last-child,.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button,.scala-main-resources .resources .download .button{border-radius:100px;padding:10px 20px;font-size:16px;text-align:center}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{max-width:100%;float:none}.scala-main-resources .resources .scala-brand-circle{transform:scale(0.8)}}#site-main section{padding:50px 0}#site-main section h2{color:#fff;position:relative;margin-bottom:40px;font-size:1.5rem;text-align:center}#site-main section h2 span{padding:0 30px;position:relative;z-index:5}#site-main section h2:before{content:"";display:block;height:1px;position:absolute;top:50%;width:100%}.navigation{padding:30px 0;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.navigation .navigation-bdand img{width:104px;height:43px}.navigation .navigation-panel-button{display:none;font-size:1.333rem;color:#fff;cursor:pointer}@media (max-width: 992px){.navigation .navigation-panel-button{order:3;display:block}}.navigation .navigation-menu .navigation-menu-item{display:inline-block}.navigation .navigation-menu .navigation-menu-item:last-child{margin-right:0}.navigation .navigation-menu .navigation-menu-item a{padding:5px 15px;text-transform:uppercase;color:#fff;border-radius:300px}.navigation .navigation-menu .navigation-menu-item a:active,.navigation .navigation-menu .navigation-menu-item a:focus,.navigation .navigation-menu .navigation-menu-item a:hover{background:#DC322F;text-decoration:none}@media (max-width: 992px){.navigation .navigation-menu{padding:20px;position:fixed;top:0;right:0;bottom:0;left:auto;height:100%;width:270px;-webkit-transform:translateX(270px);-moz-transform:translateX(270px);-ms-transform:translateX(270px);-o-transform:translateX(270px);transform:translateX(270px);-webkit-transition:all 0.25s linear;-moz-transition:all 0.25s linear;transition:all 0.25s linear;background:#fff;-webkit-overflow-scrolling:touch;overflow-y:auto;z-index:100;background:rgba(0,43,54,0.99)}.navigation .navigation-menu.is-visible{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}.navigation .navigation-menu .navigation-menu-item{margin-right:16px;padding:10px 0;display:block}}.navigation-fade-screen{position:fixed;top:0;right:0;bottom:0;left:0;-webkit-transition:all 0.15s ease-out 0s;-moz-transition:all 0.15s ease-out 0s;transition:all 0.15s ease-out 0s;background:#000;opacity:0;visibility:hidden;z-index:90}.navigation-fade-screen.is-visible{opacity:0.6;visibility:visible}.twitter-feed{background:#5CC6E4}.twitter-feed h2 span{background:#5CC6E4}.twitter-feed h2:before{background:rgba(255,255,255,0.5)}.twitter-feed .slider-twitter ul li{padding:0 15px}.twitter-feed .slider-twitter ul li .item-tweet{padding:20px;background:#fff;border-radius:3px;transition:all 350ms ease;float:left;display:block;margin-right:2.35765%;width:31.76157%}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}@media (max-width: 992px){.twitter-feed .slider-twitter ul li .item-tweet{float:left;display:block;margin-right:2.35765%;width:100%;margin-bottom:20px}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-bottom:0}}.twitter-feed .slider-twitter ul li .item-tweet img{border-radius:3px;width:44px;height:auto;float:left}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text{margin-left:64px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li{padding:0;margin-right:6px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user{font-size:1.063rem;font-weight:700;color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a{color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:hover{color:#DC322F;text-decoration:none}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.username{font-size:.875rem;color:#899295;font-weight:600}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet .date{font-size:.875rem;color:#899295}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p{font-size:.9375rem}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag{color:rgba(137,146,149,0.7)}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:hover{color:#899295}.twitter-feed .slider-twitter ul li .item-tweet:hover{background:rgba(255,255,255,0.88)}.twitter-feed .call-to-action p{color:#fff}.ides{background:#073642}.ides h2 span{background:#073642}.ides h2:before{background:rgba(255,255,255,0.14)}.ides ul{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:distribute;-moz-box-pack:distribute;box-pack:distribute;-webkit-justify-content:space-around;-moz-justify-content:space-around;-ms-justify-content:space-around;-o-justify-content:space-around;justify-content:space-around;-ms-flex-pack:distribute}.ides ul li{text-align:center}.ides ul li:nth-child(2n){width:1px;height:94px;background:rgba(255,255,255,0.14)}.ides ul li a{color:rgba(255,255,255,0.5);font-family:"Roboto Slab",serif}.ides ul li a img{height:56px;width:auto;margin-bottom:8px;opacity:0.4;transition:all 350ms ease}.ides ul li a span{display:block}.ides ul li a:hover{color:#fff;text-decoration:none}.ides ul li a:hover img{opacity:1}.button{padding:8px 18px;font-size:.875rem;text-transform:uppercase;color:#fff;background:#859900;border-radius:3px;display:inline-block}.button:active,.button:focus,.button:hover{text-decoration:none;color:#fff;background:#DC322F}.call-to-action{text-align:center;margin-top:40px}.call-to-action.action-medium{margin-top:30px}.call-to-action.action-small{margin-top:20px}.call-to-action p{font-size:.875rem}.call-to-action p.align-top{margin-bottom:12px}.call-to-action p.align-bottom{margin-top:12px}.unslider ul li{padding:0 1px}.unslider .unslider-arrow{display:none}.unslider .unslider-nav{margin-top:10px}@media (max-width: 992px){.unslider .unslider-nav{margin-top:10px}}.unslider .unslider-nav ol li{width:7px;height:7px;border:none;background:rgba(255,255,255,0.3)}.unslider .unslider-nav ol li.unslider-active{pointer-events:none;background:#fff} diff --git a/resources/css/unslider-dots.css b/resources/css/unslider-dots.css new file mode 100755 index 000000000..65327c007 --- /dev/null +++ b/resources/css/unslider-dots.css @@ -0,0 +1,33 @@ +/** + * Here's where everything gets included. You don't need + * to change anything here, and doing so might break + * stuff. Here be dragons and all that. + */ +/** + * Default variables + * + * While these can be set with JavaScript, it's probably + * better and faster to just set them here, compile to + * CSS and include that instead to use some of that + * hardware-accelerated goodness. + */ +.unslider-nav ol { + list-style: none; + text-align: center; +} +.unslider-nav ol li { + display: inline-block; + width: 6px; + height: 6px; + margin: 0 4px; + background: transparent; + border-radius: 5px; + overflow: hidden; + text-indent: -999em; + border: 2px solid #fff; + cursor: pointer; +} +.unslider-nav ol li.unslider-active { + background: #fff; + cursor: default; +} diff --git a/resources/css/unslider.css b/resources/css/unslider.css new file mode 100755 index 000000000..ef41084c0 --- /dev/null +++ b/resources/css/unslider.css @@ -0,0 +1 @@ +.unslider{overflow:auto;margin:0;padding:0}.unslider-wrap{position:relative}.unslider-wrap.unslider-carousel>li{float:left}.unslider-vertical>ul{height:100%}.unslider-vertical li{float:none;width:100%}.unslider-fade{position:relative}.unslider-fade .unslider-wrap li{position:absolute;left:0;top:0;right:0;z-index:8}.unslider-fade .unslider-wrap li.unslider-active{z-index:10}.unslider li,.unslider ol,.unslider ul{list-style:none;margin:0;padding:0;border:none}.unslider-arrow{position:absolute;left:20px;z-index:2;cursor:pointer}.unslider-arrow.next{left:auto;right:20px} \ No newline at end of file diff --git a/resources/js/tweetMachine-update.js b/resources/js/tweetMachine-update.js index 4bab6960f..3e7fbb552 100755 --- a/resources/js/tweetMachine-update.js +++ b/resources/js/tweetMachine-update.js @@ -42,6 +42,7 @@ autoRefresh: true, // CURRENTLY REQUIRED. Auto-refresh the tweets animateOut: false, // NOT YET SUPPORTED. Animate out old tweets. animateIn: true, // Fade in new tweets. + pageLimit: 0, // Number of tweets per page. If equals 0, tweets won't be paginated. tweetFormat: "
  • ", // Format for each tweet localization: { // Verbiage to use for timestamps seconds: 'seconds ago', @@ -164,7 +165,7 @@ + "\">" + "@" + actualTweet.user.screen_name - + ""; + + ""; tweetObj.find('.username').html("" + usernameLink); // Set the username: @@ -173,7 +174,7 @@ + actualTweet.user.screen_name + "\">" + actualTweet.user.name - + ""; + + ""; tweetObj.find('.user').html("" + userLink); // Set the timestamp @@ -181,7 +182,7 @@ + actualTweet.user.screen_name + "/status/" + actualTweet.id_str + "\">" + tweetMachine.relativeTime(actualTweet.created_at) - + ""; + + ""; tweetObj.find('.date') .html("" + dateLink) // Save the created_at time as jQuery data so we can update it later @@ -189,7 +190,7 @@ // Set the text tweetObj.find('.main-tweet') - .html(tweetMachine.parseText(actualTweet.text)); + .html("

    " + tweetMachine.parseText(actualTweet.text) + "

    "); // If we are animating in the new tweets if (tweetMachine.settings.animateIn) { @@ -242,7 +243,7 @@ queryParams: queryParams }, function (tweets) { var tweetsDisplayed; - console.log("No tweets! :("); + var pagesDisplayed; // If we got a response from Twitter if ( tweets[0] ) { // If there is an error message @@ -259,7 +260,6 @@ } // There are tweets else { - console.log("There are tweets!"); // If there was an error before if ( $('.twitter-error').length ) { // Remove it @@ -272,6 +272,9 @@ // Count the number of tweets displayed tweetsDisplayed = 0; + // Count the pages: + pagesDisplayed = 0; + // Loop through each tweet $.each(tweets, function () { var tweet, tweetObj; @@ -282,36 +285,48 @@ // Build the tweet as a jQuery object tweetObj = tweetMachine.buildTweet(tweet); - // If there are already tweets on the screen - if (!firstLoad) { - - // If we are animating out the old tweets - if (tweetMachine.settings.animateOut) { - /* - * TODO Support this feature - */ - } else { // We are not animating the old tweets - // Remove them - $(tweetMachine.container).children(':last-child').remove(); - } + if (tweetMachine.settings.pageLimit > 0) { + tweetObj.addClass("page" + pagesDisplayed); } + //// If there are already tweets on the screen + //if (!firstLoad) { + // + // // If we are animating out the old tweets + // if (tweetMachine.settings.animateOut) { + // /* + // * TODO Support this feature + // */ + // } else { // We are not animating the old tweets + // // Remove them + // $(tweetMachine.container).children(':last-child').remove(); + // } + //} + // Prepend the new tweet $(tweetMachine.container).prepend(tweetObj); + console.log("prepend tweet"); // If we are animating in the new tweets - if (tweetMachine.settings.animateIn) { - // Fade in the new tweet - /* - * TODO Figure out why .fadeIn() doesn't work - */ - $(tweetMachine.container).children(':first-child').animate({ - opacity: 1 - }); - } + //if (tweetMachine.settings.animateIn) { + // // Fade in the new tweet + // /* + // * TODO Figure out why .fadeIn() doesn't work + // */ + // $(tweetMachine.container).children(':first-child').animate({ + // opacity: 1 + // }); + //} // Increment the tweets diplayed tweetsDisplayed++; + + // Increase page number and wrap tweets if pagination is enabled and we're finishing a page: + if (tweetMachine.settings.pageLimit > 0 && tweetsDisplayed % tweetMachine.settings.pageLimit == 0) { + console.log("wrapping paged tweets with page: " + pagesDisplayed); + $(".page" + pagesDisplayed).wrapAll("
  • "); + pagesDisplayed++; + } // Save this tweet ID so we only get newer noes tweetMachine.lastTweetID = tweet.id_str; From f3e45e986813494b1012752909809e3d9cfec89f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Wed, 18 Jan 2017 12:22:04 +0100 Subject: [PATCH 009/120] Added call to action to twitter feed --- _data/common.yml | 2 +- _includes/twitter-feed.html | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/_data/common.yml b/_data/common.yml index fd315deab..9c9aca3d8 100644 --- a/_data/common.yml +++ b/_data/common.yml @@ -1,3 +1,3 @@ # SNS URLs githubUrl: https://github.com/scala/scala -twitter: https://twitter.com/scala_lang \ No newline at end of file +twitterUrl: https://twitter.com/scala_lang \ No newline at end of file diff --git a/_includes/twitter-feed.html b/_includes/twitter-feed.html index fdc4b263b..728b2e393 100644 --- a/_includes/twitter-feed.html +++ b/_includes/twitter-feed.html @@ -5,5 +5,9 @@

    Twitter Feed

    +
    +

    See more tweets, or

    + Follow Scala on twitter +
    \ No newline at end of file From 6d29ddc7ac6a8db23e21ca6bbae4dcdf92580242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Wed, 18 Jan 2017 12:38:20 +0100 Subject: [PATCH 010/120] Removing original tweetMachine plugin --- resources/js/vendor/tweetMachine.min.js | 5 ----- 1 file changed, 5 deletions(-) delete mode 100755 resources/js/vendor/tweetMachine.min.js diff --git a/resources/js/vendor/tweetMachine.min.js b/resources/js/vendor/tweetMachine.min.js deleted file mode 100755 index 45dc62f88..000000000 --- a/resources/js/vendor/tweetMachine.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/* - * jQuery TweetMachine v0.2.1b - * GitHub: https://github.com/ryangiglio/jquery-tweetMachine - * Copyright (c) 2013 Ryan Giglio (@ryangiglio) - */(function(e){e.fn.tweetMachine=function(t,n,r){e(this).each(function(){var i,s;if(this.tweetMachine){i=e.extend(this.tweetMachine.settings,n);this.tweetMachine.settings=i;t&&(this.tweetMachine.query=t);this.tweetMachine.interval&&this.tweetMachine.refresh();r&&(this.tweetMachine.callback=r)}else{i=e.extend({backendScript:"ajax/getFromTwitter.php",endpoint:"search/tweets",user_name:"jason_alvis",include_retweets:!0,exclude_replies:!1,rate:5e3,limit:5,autoRefresh:!0,animateOut:!1,animateIn:!0,tweetFormat:"
  • ",localization:{seconds:"seconds ago",minute:"a minute ago",minutes:"minutes ago",hour:"an hour ago",hours:"hours ago",day:"a day ago",days:"days ago"},filter:!1},n);this.tweetMachine={settings:i,query:t,interval:!1,container:this,lastTweetID:null,callback:r,relativeTime:function(e){var t,n,r;n=Date.parse(e);t=(Date.parse(Date())-n)/1e3;r="";t<60?r=t+" "+i.localization.seconds:t<120?r=i.localization.minute:t<2700?r=parseInt(t/60,10).toString()+" "+i.localization.minutes:t<5400?r=i.localization.hour:t<86400?r=""+parseInt(t/3600,10).toString()+" "+i.localization.hours:t<172800?r=i.localization.day:r=parseInt(t/86400,10).toString()+" "+i.localization.days;return r},updateTimestamps:function(){var t;t=this;e(t.container).find(".time").each(function(){var n,r;r=e(this);n=r.data("timestamp");r.html(t.relativeTime(n))})},parseText:function(e){e=e.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/g,function(e){return''+e+""});e=e.replace(/@[A-Za-z0-9_]+/g,function(e){return''+e+""});e=e.replace(/#[A-Za-z0-9_\-]+/g,function(e){return''+e+""});return e},buildTweet:function(t){var n,r;n=this;r=e(n.settings.tweetFormat);r.find(".avatar").attr("src",t.user.profile_image_url.replace("normal","reasonably_small"));r.find(".username").attr("href","http://twitter.com/"+t.user.screen_name).attr("target","_blank").html(""+t.user.screen_name);r.find(".time").attr("href","http://twitter.com/"+t.user.screen_name+"/status/"+t.id_str).attr("target","_blank").html(n.relativeTime(t.created_at)).data("timestamp",t.created_at);r.find(".content").html(n.parseText(t.text));n.settings.animateIn&&r.css("opacity","0");return r},refresh:function(t){var n,r;r=this;if(t||r.settings.autoRefresh){r.settings.endpoint==="search/tweets"&&(n={q:r.query,count:this.settings.requestLimit?this.settings.requestLimit:this.settings.limit,since_id:r.lastTweetID});r.settings.endpoint==="statuses/user_timeline"&&(n={screen_name:i.user_name,count:this.settings.requestLimit?this.settings.requestLimit:this.settings.limit,include_rts:i.include_retweets,exclude_replies:i.exclude_replies});e.getJSON(r.settings.backendScript,{endpoint:r.settings.endpoint,queryParams:n},function(n){var i;if(n[0])if(n[0].message)e(".twitter-error").length?e(".twitter-error").html('

    Error '+n[0].code+": "+n[0].message+"

    "):e(r.container).before('");else{e(".twitter-error").length&&e(".twitter-error").remove();n.reverse();i=0;e.each(n,function(){var n,s;n=this;if(!r.settings.filter||r.settings.filter(this)){s=r.buildTweet(n);t||r.settings.animateOut||e(r.container).children(":last-child").remove();e(r.container).prepend(s);r.settings.animateIn&&e(r.container).children(":first-child").animate({opacity:1});i++;r.lastTweetID=n.id_str;if(i>r.settings.limit)return!1}})}if(typeof r.callback=="function"){if(typeof n=="undefined"||typeof i=="undefined"){n=null;i=0}r.callback(n,i)}})}},start:function(){var e;e=this;if(!this.interval){this.interval=setInterval(function(){e.refresh()},e.settings.rate);this.refresh(!0)}},stop:function(){var e;e=this;if(e.interval){clearInterval(e.interval);e.interval=!1}},clear:function(){var t;t=this;e(t.container).find(".tweet").remove();t.lastTweetID=null}};s=this.tweetMachine;this.timeInterval=setInterval(function(){s.updateTimestamps()},s.settings.rate);this.tweetMachine.start()}})}})(jQuery); \ No newline at end of file From 2bdcd90f4f430f3b23fc2c4f6fcacae6a59f17e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Thu, 19 Jan 2017 12:42:11 +0100 Subject: [PATCH 011/120] Front page elements until Scala in the nutshell --- _includes/footer.html | 29 +- _includes/headerbottom.html | 2 +- _includes/headertop.html | 15 +- _layouts/frontpage.html | 452 ++++++++++-------- _scala_items/7-run-scala-in-the-browser.md | 5 + index.md | 57 ++- resources/css/style.css | 2 +- resources/img/frontpage/atom.png | Bin 0 -> 5024 bytes .../img/frontpage/avatar-twitter-feed.jpg | Bin 0 -> 9979 bytes .../img/frontpage/background-header-home.jpg | Bin 0 -> 273953 bytes .../frontpage/background-scala-ecosystem.png | Bin 0 -> 137264 bytes resources/img/frontpage/background.png | Bin 0 -> 559 bytes resources/img/frontpage/button-github.png | Bin 0 -> 3066 bytes resources/img/frontpage/coursera-icon.png | Bin 0 -> 1391 bytes resources/img/frontpage/eclipse.png | Bin 0 -> 3490 bytes resources/img/frontpage/edx-icon.png | Bin 0 -> 2015 bytes resources/img/frontpage/ensime.png | Bin 0 -> 3178 bytes resources/img/frontpage/icon-ensime.png | Bin 0 -> 786 bytes resources/img/frontpage/intelliJ.png | Bin 0 -> 1319 bytes resources/img/frontpage/scala-logo-white.png | Bin 0 -> 2361 bytes .../img/frontpage/scala-logo-white@2x.png | Bin 0 -> 5130 bytes resources/img/frontpage/scala-spiral.png | Bin 0 -> 80003 bytes resources/img/frontpage/scaladex-logo.png | Bin 0 -> 4886 bytes resources/img/frontpage/sublime.png | Bin 0 -> 2103 bytes resources/js/functions.js | 44 ++ 25 files changed, 350 insertions(+), 256 deletions(-) create mode 100644 _scala_items/7-run-scala-in-the-browser.md create mode 100644 resources/img/frontpage/atom.png create mode 100644 resources/img/frontpage/avatar-twitter-feed.jpg create mode 100644 resources/img/frontpage/background-header-home.jpg create mode 100644 resources/img/frontpage/background-scala-ecosystem.png create mode 100644 resources/img/frontpage/background.png create mode 100644 resources/img/frontpage/button-github.png create mode 100644 resources/img/frontpage/coursera-icon.png create mode 100644 resources/img/frontpage/eclipse.png create mode 100644 resources/img/frontpage/edx-icon.png create mode 100644 resources/img/frontpage/ensime.png create mode 100644 resources/img/frontpage/icon-ensime.png create mode 100644 resources/img/frontpage/intelliJ.png create mode 100644 resources/img/frontpage/scala-logo-white.png create mode 100644 resources/img/frontpage/scala-logo-white@2x.png create mode 100644 resources/img/frontpage/scala-spiral.png create mode 100644 resources/img/frontpage/scaladex-logo.png create mode 100644 resources/img/frontpage/sublime.png create mode 100644 resources/js/functions.js diff --git a/_includes/footer.html b/_includes/footer.html index 278aba65f..523f83826 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -47,32 +47,21 @@ - - - + + - - - + - - - - - - - - - - - - + + + + {% unless page.layout == 'page-no-toc' %} - + - + diff --git a/_includes/headerbottom.html b/_includes/headerbottom.html index d9e11dede..75ae52c26 100644 --- a/_includes/headerbottom.html +++ b/_includes/headerbottom.html @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/_includes/headertop.html b/_includes/headertop.html index 25f086880..eba51928f 100644 --- a/_includes/headertop.html +++ b/_includes/headertop.html @@ -11,23 +11,16 @@ - - + - - - - - - - + - - + diff --git a/_layouts/frontpage.html b/_layouts/frontpage.html index 065c5d518..457f67b80 100644 --- a/_layouts/frontpage.html +++ b/_layouts/frontpage.html @@ -4,234 +4,278 @@ {% include headertop.html %} {% include headerbottom.html %} -
    -{% include twitter-feed.html %} -
    - -
    -
     
    -
    -
    -
    - + +
    +
    +
    +

    Talk to us!

    +
    +
    +

    Mailing lists / forums

    + {% for forum in page.discourseForums %} + + +

    {{forum.title}}

    +

    {{forum.subtitle}}

    +
    + {% endfor %} +
    +
    +

    Real-time (topic-specialized) chat

    + {% assign modLimit = page.gitterChannels.size | modulo: 2 %} + {% capture channelLimit %} + {% if modLimit != 0 %} + {{page.gitterChannels.size | minus: 1}} + {% else %} + {{page.gitterChannels.size}} + {% endif %} + {% endcapture %} + {% for channel in page.gitterChannels limit: channelLimit %} + {% if forloop.first %} +
      + {% endif %} + +
    • + + + {{channel.name}} + +
    • + + {% assign halfLength = forloop.length | divided_by: 2 | floor %} + {% if forloop.index == halfLength %} +
    +
      + {% endif %} + + {% if forloop.last %} +
    + {% endif %} + {% endfor %} +
    +
    +

    Communities

    +
      +
    • + +
    • +
    • + +
    • +
    +
    + +
    +
    {% include twitter-feed.html %} diff --git a/index.md b/index.md index 73cc59cc6..453c40462 100644 --- a/index.md +++ b/index.md @@ -60,6 +60,17 @@ scalaIDEs: ecosystemTitle: "Scala ecosystem" ecosystemDescription: "The Scala Library Index (or Scaladex) is a representation of a map of all published Scala libraries. With Scaladex, a developer can now query more than 100,000 releases of Scala libraries. Scaladex is officially supported by Scala Center." +# Discourse forums +discourseForums: + - title: Scala Users Discourse + subtitle: for general Scala questions, discussion and library announcements + url: https://users.scala-lang.org/ + cssClass: scala-user-discourse + - title: Scala Contributors Discourse + subtitle: for Scala contributions, language evolution dicussions, standard library, Scala platform evolution discussions and more + url: https://contributors.scala-lang.org/ + cssClass: scala-contributors-discourse + # Gitter channels gitterChannels: - name: scala diff --git a/resources/css/style.css b/resources/css/style.css index cb04d5283..1bf993a65 100644 --- a/resources/css/style.css +++ b/resources/css/style.css @@ -1 +1 @@ -@import url("https://fonts.googleapis.com/css?family=Lato:400,400i,700");@import url("https://fonts.googleapis.com/css?family=Roboto+Slab:400,700");html{box-sizing:border-box}*,*::after,*::before{box-sizing:inherit}.unslider{overflow:auto;margin:0;padding:0}.unslider-wrap{position:relative}.unslider-wrap.unslider-carousel>li{float:left}.unslider-vertical>ul{height:100%}.unslider-vertical li{float:none;width:100%}.unslider-fade{position:relative}.unslider-fade .unslider-wrap li{position:absolute;left:0;top:0;right:0;z-index:8}.unslider-fade .unslider-wrap li.unslider-active{z-index:10}.unslider ul,.unslider ol,.unslider li{list-style:none;margin:0;padding:0;border:none}.unslider-arrow{position:absolute;left:20px;z-index:2;cursor:pointer}.unslider-arrow.next{left:auto;right:20px}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}html,body{height:100%;margin:0}input,select,textarea{font-family:"Lato",sans-serif;font-size:1.063rem;display:block;appearance:none;border:none}::-webkit-input-placeholder{color:#899295}:-moz-placeholder{color:#899295}::-moz-placeholder{color:#899295}:-ms-input-placeholder{color:#899295}.wrap{max-width:1200px;margin-left:auto;margin-right:auto;padding:0 20px}.wrap::after{clear:both;content:"";display:block}.dot{font-size:10px;color:rgba(137,146,149,0.6);margin:0 3px}ul,ol{list-style-type:none;margin:0;padding:0}dl{margin:0}dt{font-weight:600;margin:0}dd{margin:0}figure{margin:0}img,picture{margin:0;max-width:100%}body{color:#4A5659;font-family:"Lato",sans-serif;font-size:16px;font-weight:400;line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-family:"Roboto Slab",serif;line-height:1.4;font-weight:600;margin:0}h2{font-weight:400}p{margin:0}a{color:#23aad1;text-decoration:none;transition:all 350ms ease}a:active,a:focus,a:hover{color:#DC322F;text-decoration:underline}hr{border-bottom:1px solid #D0D9DA;border-left:0;border-right:0;border-top:0;margin:0}#site-header{background:#002B36}#site-header.header-home{background:none}#site-header.header-home .header-background{background:rgba(0,43,54,0.45);position:relative;padding-bottom:150px}#site-header.header-home .header-background:before{content:"";position:absolute;background:url("../img/background-header-home.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.inner-text{float:left;display:block;margin-right:2.35765%;width:65.88078%}.inner-text h1{font-family:"Lato",sans-serif;font-size:2.813rem;font-weight:700;color:#fff;margin:30px 0 15px 0}.inner-text p{font-size:1.25rem;color:#fff;margin-bottom:30px}.inner-text:last-child{margin-right:0}@media (max-width: 992px){.inner-text{float:left;display:block;margin-right:2.35765%;width:100%}.inner-text:last-child{margin-right:0}.inner-text h1{font-size:2.213rem;margin:0 0 15px 0}}.scala-main-resources{height:177px;background:#002B36;position:relative}.scala-main-resources .resources .button{font-size:1.063rem;display:block;border-top-left-radius:200px;border-top-right-radius:200px;border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:200px;border-top-left-radius:200px;padding:20px 40px}.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-left:17.05961%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:31.76157%}.scala-main-resources .resources .api-docs:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button{text-align:right;border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:200px;border-top-right-radius:200px;border-bottom-left-radius:200px;border-bottom-right-radius:200px;border-bottom-left-radius:0;border-top-left-radius:0}@media (max-width: 992px){.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-left:0%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-right:0}.scala-main-resources .resources .api-docs:last-child{margin-right:0}}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{margin-top:-40px}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{margin-top:12px;max-width:180px;text-align:center}.scala-main-resources .resources .api-docs ul li:first-child,.scala-main-resources .resources .download ul li:first-child{border-bottom:1px solid rgba(255,255,255,0.14);font-family:"Roboto Slab",serif;padding-bottom:4px;margin-bottom:2px}.scala-main-resources .resources .api-docs ul li a,.scala-main-resources .resources .download ul li a{color:rgba(255,255,255,0.7);font-size:.875rem}.scala-main-resources .resources .api-docs ul li a:active,.scala-main-resources .resources .api-docs ul li a:focus,.scala-main-resources .resources .api-docs ul li a:hover,.scala-main-resources .resources .download ul li a:active,.scala-main-resources .resources .download ul li a:focus,.scala-main-resources .resources .download ul li a:hover{text-decoration:none;color:#fff}.scala-main-resources .resources .api-docs ul{float:right}.scala-main-resources .resources .scala-brand-circle{width:340px;height:340px;left:50%;top:-178px;margin-left:-170px;background:rgba(0,43,54,0.4);border-radius:100%;position:absolute;z-index:60;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center}.scala-main-resources .resources .scala-brand-circle .circle-solid{background:#002B36;width:224px;height:224px;border-radius:100%;text-align:center}.scala-main-resources .resources .scala-brand-circle .circle-solid img{width:152px;height:auto;margin-top:-28px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span{display:block;color:#fff;font-family:"Roboto Slab",serif}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:first-child{font-size:1.375rem;margin-top:-6px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:last-child{font-size:1.5rem;margin-top:-8px}@media (max-width: 768px){.scala-main-resources{height:auto;padding-bottom:50px}.scala-main-resources .resources .download{margin-top:140px}.scala-main-resources .resources .api-docs{margin-top:40px}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:100%}.scala-main-resources .resources .api-docs:last-child,.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button,.scala-main-resources .resources .download .button{border-radius:100px;padding:10px 20px;font-size:16px;text-align:center}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{max-width:100%;float:none}.scala-main-resources .resources .scala-brand-circle{transform:scale(0.8)}}#site-main section{padding:50px 0}#site-main .spire{min-height:330px;background:rgba(0,43,54,0.4);position:relative;padding:0}#site-main .spire:before{content:"";position:absolute;background:url("../img/epfl-bc.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.navigation{padding:30px 0;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.navigation .navigation-bdand img{width:104px;height:43px}.navigation .navigation-panel-button{display:none;font-size:1.333rem;color:#fff;cursor:pointer}@media (max-width: 992px){.navigation .navigation-panel-button{order:3;display:block}}.navigation .navigation-menu .navigation-menu-item{display:inline-block}.navigation .navigation-menu .navigation-menu-item:last-child{margin-right:0}.navigation .navigation-menu .navigation-menu-item a{padding:5px 15px;text-transform:uppercase;color:#fff;border-radius:300px;font-weight:700}.navigation .navigation-menu .navigation-menu-item a:active,.navigation .navigation-menu .navigation-menu-item a:focus,.navigation .navigation-menu .navigation-menu-item a:hover{background:#DC322F;text-decoration:none}@media (max-width: 992px){.navigation .navigation-menu{padding:20px;position:fixed;top:0;right:0;bottom:0;left:auto;height:100%;width:270px;-webkit-transform:translateX(270px);-moz-transform:translateX(270px);-ms-transform:translateX(270px);-o-transform:translateX(270px);transform:translateX(270px);-webkit-transition:all 0.25s linear;-moz-transition:all 0.25s linear;transition:all 0.25s linear;background:#fff;-webkit-overflow-scrolling:touch;overflow-y:auto;z-index:100;background:rgba(0,43,54,0.99)}.navigation .navigation-menu.is-visible{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}.navigation .navigation-menu .navigation-menu-item{margin-right:16px;padding:10px 0;display:block}}.navigation-fade-screen{position:fixed;top:0;right:0;bottom:0;left:0;-webkit-transition:all 0.15s ease-out 0s;-moz-transition:all 0.15s ease-out 0s;transition:all 0.15s ease-out 0s;background:#000;opacity:0;visibility:hidden;z-index:90}.navigation-fade-screen.is-visible{opacity:0.6;visibility:visible}.twitter-feed{background:#5CC6E4}.twitter-feed .heading-line h2 span{background:#5CC6E4}.twitter-feed .heading-line h2:before{background:rgba(255,255,255,0.5)}.twitter-feed .slider-twitter ul li{padding:0 15px}.twitter-feed .slider-twitter ul li .item-tweet{padding:20px;background:#fff;border-radius:3px;transition:all 350ms ease;float:left;display:block;margin-right:2.35765%;width:31.76157%}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}@media (max-width: 992px){.twitter-feed .slider-twitter ul li .item-tweet{float:left;display:block;margin-right:2.35765%;width:100%;margin-bottom:20px}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-bottom:0}}.twitter-feed .slider-twitter ul li .item-tweet img{border-radius:3px;width:44px;height:auto;float:left}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text{margin-left:64px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li{padding:0;margin-right:6px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user{font-size:1.063rem;font-weight:700;color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a{color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:hover{color:#DC322F;text-decoration:none}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.username{font-size:.875rem;color:#899295;font-weight:600}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet .date{font-size:.875rem;color:#899295}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p{font-size:.9375rem}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag{color:rgba(137,146,149,0.7)}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:hover{color:#899295}.twitter-feed .slider-twitter ul li .item-tweet:hover{background:rgba(255,255,255,0.88)}.twitter-feed .call-to-action p{color:#fff}.ides{background:#073642}.ides ul{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:distribute;-moz-box-pack:distribute;box-pack:distribute;-webkit-justify-content:space-around;-moz-justify-content:space-around;-ms-justify-content:space-around;-o-justify-content:space-around;justify-content:space-around;-ms-flex-pack:distribute}.ides ul li{text-align:center;position:relative}.ides ul li:nth-child(2n){width:1px;height:94px;background:rgba(255,255,255,0.14)}.ides ul li a{display:inline-block;color:rgba(255,255,255,0.5);font-family:"Roboto Slab",serif}.ides ul li a .bullet{position:absolute;top:-12px;right:-14px;background:#15414C;border-radius:100%;width:24px;height:24px;z-index:10;transition:all 350ms ease;text-align:center}.ides ul li a .bullet img{width:16px;height:16px;margin-top:4px}.ides ul li a.sublime .bullet{top:-10px;right:0}.ides ul li a img{height:56px;width:auto;margin-bottom:6px;opacity:0.4;transition:all 350ms ease}.ides ul li a span{display:block;font-size:.875rem}.ides ul li a:hover{color:#fff;text-decoration:none}.ides ul li a:hover img{opacity:1}.ides ul li a:hover .bullet{background:#859900}.nutshell{background:#15414C}.nutshell .heading-line h2 span{background:#15414C}.nutshell .scala-items-list .scala-item{float:left;display:block;margin-right:2.35765%;width:31.76157%;padding:20px;text-align:center;transition:all 350ms ease}.nutshell .scala-items-list .scala-item:last-child{margin-right:0}.nutshell .scala-items-list .scala-item:nth-child(3n){margin-right:0}.nutshell .scala-items-list .scala-item:nth-child(3n+1){clear:left}@media (max-width: 768px){.nutshell .scala-items-list .scala-item{float:left;display:block;margin-right:2.35765%;width:100%}.nutshell .scala-items-list .scala-item:last-child{margin-right:0}}.nutshell .scala-items-list .scala-item h3{color:#fff;font-size:1.063rem;text-transform:uppercase;font-family:"Lato",sans-serif;margin-bottom:10px}.nutshell .scala-items-list .scala-item p{color:rgba(255,255,255,0.7);font-size:1.063rem}.nutshell .scala-items-list .scala-item:active,.nutshell .scala-items-list .scala-item:focus,.nutshell .scala-items-list .scala-item:hover{cursor:pointer;background:#073642}.nutshell .scala-items-list .scala-item.active{background:#073642}.nutshell .scala-item-expanded{display:none;height:400px;background:#073642}.courses{background:#244E58}.courses .heading-line h2 span{background:#244E58}.courses .online-courses,.courses .upcoming-training{float:left;display:block;margin-right:2.35765%;width:48.82117%}.courses .online-courses:last-child,.courses .upcoming-training:last-child{margin-right:0}@media (max-width: 992px){.courses .online-courses,.courses .upcoming-training{float:left;display:block;margin-right:2.35765%;width:100%}.courses .online-courses:last-child,.courses .upcoming-training:last-child{margin-right:0}}@media (max-width: 992px){.courses .online-courses{margin-bottom:40px}}.upcoming-events{background:#15414C}.upcoming-events .heading-line h2 span{background:#15414C}.upcoming-events .events-items-list::after{clear:both;content:"";display:block}.upcoming-events .events-items-list .event-item{float:left;display:block;margin-right:2.35765%;width:31.76157%}.upcoming-events .events-items-list .event-item:last-child{margin-right:0}.upcoming-events .events-items-list .event-item:nth-child(3n){margin-right:0}.upcoming-events .events-items-list .event-item:nth-child(3n+1){clear:left}@media (max-width: 992px){.upcoming-events .events-items-list .event-item{float:left;display:block;margin-right:2.35765%;width:100%}.upcoming-events .events-items-list .event-item:last-child{margin-right:0}}.upcoming-events .card{background:#073642}.upcoming-events .card:hover{background:#002B36}#site-main .scala-ecosystem{padding-bottom:0;background:url("../img/background-scala-ecosystem.png") no-repeat center bottom #244E58;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover}#site-main .scala-ecosystem .heading-line::after{clear:both;content:"";display:block}#site-main .scala-ecosystem .heading-line h2 span{background:#234D57}#site-main .scala-ecosystem .heading-line p{font-size:1.063rem;color:rgba(255,255,255,0.7);margin-top:10px;float:left;display:block;margin-right:2.35765%;width:65.88078%;margin-left:17.05961%}#site-main .scala-ecosystem .heading-line p:last-child{margin-right:0}@media (max-width: 768px){#site-main .scala-ecosystem .heading-line p{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}#site-main .scala-ecosystem .heading-line p:last-child{margin-right:0}}#site-main .scala-ecosystem .browser .header-browser{background:#073642;padding:14px 20px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}#site-main .scala-ecosystem .browser .header-browser img{width:116px;height:auto}#site-main .scala-ecosystem .browser .header-browser img:last-child{width:86px;height:auto}#site-main .scala-ecosystem .browser .main-browser{background:rgba(21,65,76,0.5);transition:all 350ms ease;text-align:center;padding:70px 0 85px 0}#site-main .scala-ecosystem .browser .main-browser h2{color:#fff;font-size:2.5rem;margin-bottom:24px}#site-main .scala-ecosystem .browser .main-browser .input-control{position:relative;background:#333;width:550px;margin-left:auto;margin-right:auto;color:#899295}#site-main .scala-ecosystem .browser .main-browser .input-control span{position:absolute;left:20px;top:8px}#site-main .scala-ecosystem .browser .main-browser .input-control input{padding:12px 18px 12px 50px;border-radius:2px;width:100%;font-weight:600}@media (max-width: 768px){#site-main .scala-ecosystem .browser .main-browser{padding-left:20px;padding-right:20px}#site-main .scala-ecosystem .browser .main-browser h2{font-size:1.4rem}#site-main .scala-ecosystem .browser .main-browser .input-control{width:100%}}#site-main .scala-ecosystem:hover .main-browser{background:#15414C}.new-blog{background:#F0F3F3}.new-blog .heading-line h2{color:#073642}.new-blog .heading-line h2 span{background:#F0F3F3}.new-blog .heading-line h2:before{background:#D0D9DA}.new-blog .new,.new-blog .recently{float:left;display:block;margin-right:2.35765%;width:48.82117%}.new-blog .new:last-child,.new-blog .recently:last-child{margin-right:0}@media (max-width: 992px){.new-blog .new,.new-blog .recently{float:left;display:block;margin-right:2.35765%;width:100%}.new-blog .new:last-child,.new-blog .recently:last-child{margin-right:0}}.new-blog .new h3,.new-blog .recently h3{font-family:"Lato",sans-serif;text-transform:uppercase;border-bottom:1px solid #D0D9DA;font-size:1.063rem}.new-blog .new .content-card,.new-blog .recently .content-card{background:#fff;padding:22px;display:block;border-radius:3px}@media (max-width: 992px){.new-blog .new{margin-bottom:40px}}.new-blog .new .tag-new{text-transform:uppercase;font-size:.9375rem;color:#DC322F;font-weight:700}.new-blog .new h3{font-size:1.5rem;color:#073642;padding-bottom:15px;margin-bottom:15px}.new-blog .new h3 a{color:#073642}.new-blog .new h3 a:active,.new-blog .new h3 a:focus,.new-blog .new h3 a:hover{text-decoration:none;color:#DC322F}.new-blog .new .date{color:#899295;display:block;margin-bottom:5px;font-style:italic}.new-blog .recently a{margin-bottom:16px}.new-blog .recently a h3{color:#073642;transition:all 350ms ease;padding-bottom:8px;margin-bottom:6px}.new-blog .recently a ul{position:relative;margin-bottom:4px}.new-blog .recently a ul li{color:#899295;font-size:.875rem;display:inline-block}.new-blog .recently a ul li.dot{font-size:10px}.new-blog .recently a ul li.tag{position:absolute;right:0;top:3px;background:#DC322F;color:#fff;text-transform:uppercase;font-size:11px;font-weight:700;padding:1px 5px}.new-blog .recently a p{color:#4A5659}.new-blog .recently a:active,.new-blog .recently a:focus,.new-blog .recently a:hover{text-decoration:none;box-shadow:rgba(0,43,54,0.2) 0 1px 12px}.new-blog .recently a:active h3,.new-blog .recently a:focus h3,.new-blog .recently a:hover h3{color:#765;color:#DC322F}.talk-to-us .heading-line h2{color:#073642}.talk-to-us .heading-line h2 span{background:#fff}.talk-to-us .heading-line h2:before{background:#D0D9DA}.talk-to-us h3{text-align:center;color:#073642;font-size:.9375rem;margin-bottom:40px}.talk-to-us .discourse,.talk-to-us .gitter{margin-bottom:50px}.talk-to-us .discourse::after,.talk-to-us .gitter::after{clear:both;content:"";display:block}.talk-to-us .discourse .scala-user-discourse{margin-left:17.05961%}.talk-to-us .discourse .scala-contributors-discourse,.talk-to-us .discourse .scala-user-discourse{padding:20px;text-align:center;float:left;display:block;margin-right:2.35765%;width:31.76157%}.talk-to-us .discourse .scala-contributors-discourse img,.talk-to-us .discourse .scala-user-discourse img{width:34px;height:auto}.talk-to-us .discourse .scala-contributors-discourse h4,.talk-to-us .discourse .scala-user-discourse h4{font-family:"Lato",sans-serif;font-size:1.063rem;text-transform:uppercase;color:#073642;margin:12px 0 8px}.talk-to-us .discourse .scala-contributors-discourse p,.talk-to-us .discourse .scala-user-discourse p{color:#4A5659}.talk-to-us .discourse .scala-contributors-discourse:active,.talk-to-us .discourse .scala-contributors-discourse:focus,.talk-to-us .discourse .scala-contributors-discourse:hover,.talk-to-us .discourse .scala-user-discourse:active,.talk-to-us .discourse .scala-user-discourse:focus,.talk-to-us .discourse .scala-user-discourse:hover{text-decoration:none;background:#F0F3F3;border-radius:2px}.talk-to-us .discourse .scala-contributors-discourse:active h4,.talk-to-us .discourse .scala-contributors-discourse:focus h4,.talk-to-us .discourse .scala-contributors-discourse:hover h4,.talk-to-us .discourse .scala-user-discourse:active h4,.talk-to-us .discourse .scala-user-discourse:focus h4,.talk-to-us .discourse .scala-user-discourse:hover h4{color:#DC322F}.talk-to-us .discourse .scala-contributors-discourse:last-child,.talk-to-us .discourse .scala-user-discourse:last-child{margin-right:0}@media (max-width: 992px){.talk-to-us .discourse .scala-contributors-discourse,.talk-to-us .discourse .scala-user-discourse{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}.talk-to-us .discourse .scala-contributors-discourse:last-child,.talk-to-us .discourse .scala-user-discourse:last-child{margin-right:0}}.talk-to-us .gitter ul.first{margin-left:17.05961%}.talk-to-us .gitter ul.first li:last-child{border-bottom:1px solid #D0D9DA}.talk-to-us .gitter ul,.talk-to-us .gitter ul.first{float:left;display:block;margin-right:2.35765%;width:31.76157%}.talk-to-us .gitter ul:last-child,.talk-to-us .gitter ul.first:last-child{margin-right:0}@media (max-width: 768px){.talk-to-us .gitter ul,.talk-to-us .gitter ul.first{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}.talk-to-us .gitter ul:last-child,.talk-to-us .gitter ul.first:last-child{margin-right:0}.talk-to-us .gitter ul li:last-child,.talk-to-us .gitter ul.first li:last-child{border-bottom:none}}.talk-to-us .gitter ul li{border-top:1px solid #D0D9DA}.talk-to-us .gitter ul li a{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center;padding:14px 0;color:#4A5659;font-weight:700}.talk-to-us .gitter ul li a:active,.talk-to-us .gitter ul li a:focus,.talk-to-us .gitter ul li a:hover{background:#F0F3F3;text-decoration:none}.talk-to-us .gitter ul li a img{width:28px;height:auto;margin-right:10px}.talk-to-us .gitter ul li:last-child{border-bottom:1px solid #D0D9DA}.talk-to-us .communities ul{text-align:center}.talk-to-us .communities ul li{display:inline-block}.talk-to-us .communities ul li:first-child{margin-right:20px}.talk-to-us .communities ul li:first-child img{width:127px;height:auto}.talk-to-us .communities ul li:last-child img{width:131px;height:auto}.talk-to-us .communities ul li a:active,.talk-to-us .communities ul li a:focus,.talk-to-us .communities ul li a:hover{opacity:0.7}.talk-to-us .social{margin-top:40px;text-align:center}.talk-to-us .social ul li{display:inline-block;font-size:1.75rem}.talk-to-us .social ul li:first-child{margin-right:14px}.talk-to-us .social ul li a{color:#15414C}.talk-to-us .social ul li a:active,.talk-to-us .social ul li a:focus,.talk-to-us .social ul li a:hover{color:#DC322F}#site-footer{padding:50px 0;background:#002B36;color:rgba(255,255,255,0.5)}#site-footer ul{float:left;display:block;margin-right:2.35765%;width:14.70196%}#site-footer ul:last-child{margin-right:0}@media (max-width: 992px){#site-footer ul{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-bottom:20px}#site-footer ul:last-child{margin-right:0}#site-footer ul:nth-child(3n){margin-right:0}#site-footer ul:nth-child(3n+1){clear:left}}@media (max-width: 480px){#site-footer ul{float:left;display:block;margin-right:2.35765%;width:100%}#site-footer ul:last-child{margin-right:0}}#site-footer ul li{margin-bottom:3px}#site-footer ul li h3{color:#fff;margin-bottom:10px;text-transform:uppercase;font-family:"Lato",sans-serif;font-weight:700;font-size:1.063rem}#site-footer ul li a{color:rgba(255,255,255,0.5);font-size:.9375rem}#site-footer ul li a:active,#site-footer ul li a:focus,#site-footer ul li a:hover{color:#fff;text-decoration:none}#site-footer .site-footer-top{margin-bottom:40px}#site-footer .site-footer-top::after{clear:both;content:"";display:block}#site-footer .site-footer-bottom{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}@media (max-width: 480px){#site-footer .site-footer-bottom{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;-o-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;flex-wrap:wrap}#site-footer .site-footer-bottom img{margin-top:18px}}#site-footer .site-footer-bottom img{opacity:0.4;margin-right:65px}.button{padding:8px 18px;font-size:.875rem;font-weight:700;text-transform:uppercase;color:#fff;background:#859900;border-radius:3px;display:inline-block}.button:active,.button:focus,.button:hover{text-decoration:none;color:#fff;background:#DC322F}.call-to-action{text-align:center;margin-top:40px}.call-to-action.action-medium{margin-top:30px}.call-to-action.action-small{margin-top:20px}.call-to-action p{font-size:.875rem;color:rgba(255,255,255,0.7)}.call-to-action p.align-top{margin-bottom:12px}.call-to-action p.align-bottom{margin-top:12px}.call-to-action p a{text-decoration:underline;color:rgba(255,255,255,0.7)}.call-to-action p a:active,.call-to-action p a:focus,.call-to-action p a:hover{color:#fff}.unslider ul li{padding:0 1px}.unslider .unslider-arrow{display:none}.unslider .unslider-nav{margin-top:10px}@media (max-width: 992px){.unslider .unslider-nav{margin-top:10px}}.unslider .unslider-nav ol li{width:7px;height:7px;border:none;background:rgba(255,255,255,0.3)}.unslider .unslider-nav ol li.unslider-active{pointer-events:none;background:#fff}.heading-line{margin-bottom:40px;text-align:center}.heading-line h2{color:#fff;position:relative;font-size:1.375rem}.heading-line h2 span{padding:0 30px;position:relative;background:#073642;z-index:5}.heading-line h2:before{content:"";display:block;height:1px;position:absolute;top:50%;width:100%;background:rgba(255,255,255,0.14)}.heading-line .sub-heading{font-size:.875rem;color:rgba(255,255,255,0.7);font-style:italic}.card{padding:18px;border-radius:3px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;background:#15414C;transition:all 350ms ease;margin-bottom:14px}.card:hover{background:#073642}.card img{width:28px;height:28px;border-radius:2px}.card .card-text{margin-left:14px}.card .card-text h4{font-family:"Lato",sans-serif;font-size:1.063rem;color:#fff}.card .card-text ul li{color:rgba(255,255,255,0.7);display:inline-block}.card .card-text ul li.online-courses-price,.card .card-text ul li.event-location{font-size:.75rem;text-transform:uppercase}.card .card-text ul li.online-courses-date,.card .card-text ul li.date-event{font-size:.875rem}.card .card-text ul li.dot{color:rgba(255,255,255,0.4)}.card:active,.card:focus,.card:hover{text-decoration:none}.calendar{width:28px;height:32px;background:#fff;border-radius:2px;overflow:hidden}.calendar span{display:block;font-size:10px;font-weight:700;text-align:center}.calendar span:first-child{background:#DC322F;color:#fff}a .calendar span:last-child{color:#073642;font-size:12px;margin-top:-1px} +@import url("https://fonts.googleapis.com/css?family=Lato:400,400i,700");@import url("https://fonts.googleapis.com/css?family=Roboto+Slab:400,700");html{box-sizing:border-box}*,*::after,*::before{box-sizing:inherit}.unslider{overflow:auto;margin:0;padding:0}.unslider-wrap{position:relative}.unslider-wrap.unslider-carousel>li{float:left}.unslider-vertical>ul{height:100%}.unslider-vertical li{float:none;width:100%}.unslider-fade{position:relative}.unslider-fade .unslider-wrap li{position:absolute;left:0;top:0;right:0;z-index:8}.unslider-fade .unslider-wrap li.unslider-active{z-index:10}.unslider ul,.unslider ol,.unslider li{list-style:none;margin:0;padding:0;border:none}.unslider-arrow{position:absolute;left:20px;z-index:2;cursor:pointer}.unslider-arrow.next{left:auto;right:20px}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}html,body{height:100%;margin:0}input,select,textarea{font-family:"Lato",sans-serif;font-size:1.063rem;display:block;appearance:none;border:none}::-webkit-input-placeholder{color:#899295}:-moz-placeholder{color:#899295}::-moz-placeholder{color:#899295}:-ms-input-placeholder{color:#899295}.wrap{max-width:1200px;margin-left:auto;margin-right:auto;padding:0 20px}.wrap::after{clear:both;content:"";display:block}.dot{font-size:10px;color:rgba(137,146,149,0.6);margin:0 3px}ul,ol{list-style-type:none;margin:0;padding:0}dl{margin:0}dt{font-weight:600;margin:0}dd{margin:0}figure{margin:0}img,picture{margin:0;max-width:100%}body{color:#4A5659;font-family:"Lato",sans-serif;font-size:16px;font-weight:400;line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-family:"Roboto Slab",serif;line-height:1.4;font-weight:600;margin:0}h2{font-weight:400}p{margin:0}a{color:#23aad1;text-decoration:none;transition:all 350ms ease}a:active,a:focus,a:hover{color:#DC322F;text-decoration:underline}hr{border-bottom:1px solid #D0D9DA;border-left:0;border-right:0;border-top:0;margin:0}#site-header{background:#002B36}#site-header.header-home{background:none}#site-header.header-home .header-background{background:rgba(0,43,54,0.45);position:relative;padding-bottom:150px}#site-header.header-home .header-background:before{content:"";position:absolute;background:url("../img/background-header-home.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.inner-text{float:left;display:block;margin-right:2.35765%;width:65.88078%}.inner-text h1{font-family:"Lato",sans-serif;font-size:2.813rem;font-weight:700;color:#fff;margin:30px 0 15px 0}.inner-text p{font-size:1.25rem;color:#fff;margin-bottom:30px}.inner-text:last-child{margin-right:0}@media (max-width: 992px){.inner-text{float:left;display:block;margin-right:2.35765%;width:100%}.inner-text:last-child{margin-right:0}.inner-text h1{font-size:2.213rem;margin:0 0 15px 0}}.scala-main-resources{height:177px;background:#002B36;position:relative}.scala-main-resources .resources .button{font-size:1.063rem;display:block;border-top-left-radius:200px;border-top-right-radius:200px;border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:200px;border-top-left-radius:200px;padding:20px 40px}.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-left:17.05961%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:31.76157%}.scala-main-resources .resources .api-docs:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button{text-align:right;border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:200px;border-top-right-radius:200px;border-bottom-left-radius:200px;border-bottom-right-radius:200px;border-bottom-left-radius:0;border-top-left-radius:0}@media (max-width: 992px){.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-left:0%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-right:0}.scala-main-resources .resources .api-docs:last-child{margin-right:0}}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{margin-top:-40px}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{margin-top:12px;max-width:180px;text-align:center}.scala-main-resources .resources .api-docs ul li:first-child,.scala-main-resources .resources .download ul li:first-child{border-bottom:1px solid rgba(255,255,255,0.14);font-family:"Roboto Slab",serif;padding-bottom:4px;margin-bottom:2px}.scala-main-resources .resources .api-docs ul li a,.scala-main-resources .resources .download ul li a{color:rgba(255,255,255,0.7);font-size:.875rem}.scala-main-resources .resources .api-docs ul li a:active,.scala-main-resources .resources .api-docs ul li a:focus,.scala-main-resources .resources .api-docs ul li a:hover,.scala-main-resources .resources .download ul li a:active,.scala-main-resources .resources .download ul li a:focus,.scala-main-resources .resources .download ul li a:hover{text-decoration:none;color:#fff}.scala-main-resources .resources .api-docs ul{float:right}.scala-main-resources .resources .scala-brand-circle{width:340px;height:340px;left:50%;top:-178px;margin-left:-170px;background:rgba(0,43,54,0.4);border-radius:100%;position:absolute;z-index:60;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center}.scala-main-resources .resources .scala-brand-circle .circle-solid{background:#002B36;width:224px;height:224px;border-radius:100%;text-align:center}.scala-main-resources .resources .scala-brand-circle .circle-solid img{width:152px;height:auto;margin-top:-28px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span{display:block;color:#fff;font-family:"Roboto Slab",serif}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:first-child{font-size:1.375rem;margin-top:-6px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:last-child{font-size:1.5rem;margin-top:-8px}@media (max-width: 768px){.scala-main-resources{height:auto;padding-bottom:50px}.scala-main-resources .resources .download{margin-top:140px}.scala-main-resources .resources .api-docs{margin-top:40px}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:100%}.scala-main-resources .resources .api-docs:last-child,.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button,.scala-main-resources .resources .download .button{border-radius:100px;padding:10px 20px;font-size:16px;text-align:center}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{max-width:100%;float:none}.scala-main-resources .resources .scala-brand-circle{transform:scale(0.8)}}#site-main section{padding:50px 0}#site-main .spire{min-height:330px;background:rgba(0,43,54,0.4);position:relative;padding:0}#site-main .spire:before{content:"";position:absolute;background:url("../img/epfl-bc.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.navigation{padding:30px 0;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.navigation .navigation-bdand img{width:104px;height:43px}.navigation .navigation-panel-button{display:none;font-size:1.333rem;color:#fff;cursor:pointer}@media (max-width: 992px){.navigation .navigation-panel-button{order:3;display:block}}.navigation .navigation-menu .navigation-menu-item{display:inline-block}.navigation .navigation-menu .navigation-menu-item:last-child{margin-right:0}.navigation .navigation-menu .navigation-menu-item a{padding:5px 15px;text-transform:uppercase;color:#fff;border-radius:300px;font-weight:700}.navigation .navigation-menu .navigation-menu-item a:active,.navigation .navigation-menu .navigation-menu-item a:focus,.navigation .navigation-menu .navigation-menu-item a:hover{background:#DC322F;text-decoration:none}@media (max-width: 992px){.navigation .navigation-menu{padding:20px;position:fixed;top:0;right:0;bottom:0;left:auto;height:100%;width:270px;-webkit-transform:translateX(270px);-moz-transform:translateX(270px);-ms-transform:translateX(270px);-o-transform:translateX(270px);transform:translateX(270px);-webkit-transition:all 0.25s linear;-moz-transition:all 0.25s linear;transition:all 0.25s linear;background:#fff;-webkit-overflow-scrolling:touch;overflow-y:auto;z-index:100;background:rgba(0,43,54,0.99)}.navigation .navigation-menu.is-visible{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}.navigation .navigation-menu .navigation-menu-item{margin-right:16px;padding:10px 0;display:block}}.navigation-fade-screen{position:fixed;top:0;right:0;bottom:0;left:0;-webkit-transition:all 0.15s ease-out 0s;-moz-transition:all 0.15s ease-out 0s;transition:all 0.15s ease-out 0s;background:#000;opacity:0;visibility:hidden;z-index:90}.navigation-fade-screen.is-visible{opacity:0.6;visibility:visible}.twitter-feed{background:#5CC6E4}.twitter-feed .heading-line h2 span{background:#5CC6E4}.twitter-feed .heading-line h2:before{background:rgba(255,255,255,0.5)}.twitter-feed .slider-twitter ul li{padding:0 15px}.twitter-feed .slider-twitter ul li .item-tweet{padding:20px;background:#fff;border-radius:3px;transition:all 350ms ease;float:left;display:block;margin-right:2.35765%;width:31.76157%}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}@media (max-width: 992px){.twitter-feed .slider-twitter ul li .item-tweet{float:left;display:block;margin-right:2.35765%;width:100%;margin-bottom:20px}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-bottom:0}}.twitter-feed .slider-twitter ul li .item-tweet img{border-radius:3px;width:44px;height:auto;float:left}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text{margin-left:64px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li{padding:0;margin-right:6px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user{font-size:1.063rem;font-weight:700;color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a{color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:hover{color:#DC322F;text-decoration:none}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.username{font-size:.875rem;color:#899295;font-weight:600}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet .date{font-size:.875rem;color:#899295}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p{font-size:.9375rem}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag{color:rgba(137,146,149,0.7)}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:hover{color:#899295}.twitter-feed .slider-twitter ul li .item-tweet:hover{background:rgba(255,255,255,0.88)}.twitter-feed .call-to-action p{color:#fff}.ides{background:#073642}.ides ul{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:distribute;-moz-box-pack:distribute;box-pack:distribute;-webkit-justify-content:space-around;-moz-justify-content:space-around;-ms-justify-content:space-around;-o-justify-content:space-around;justify-content:space-around;-ms-flex-pack:distribute}.ides ul li{text-align:center;position:relative}.ides ul li:nth-child(2n){width:1px;height:94px;background:rgba(255,255,255,0.14)}.ides ul li a{display:inline-block;color:rgba(255,255,255,0.5);font-family:"Roboto Slab",serif}.ides ul li a .bullet{position:absolute;top:-12px;right:-14px;background:#15414C;border-radius:100%;width:24px;height:24px;z-index:10;transition:all 350ms ease;text-align:center}.ides ul li a .bullet img{width:16px;height:16px;margin-top:4px}.ides ul li a.sublime .bullet{top:-10px;right:0}.ides ul li a img{height:56px;width:auto;margin-bottom:6px;opacity:0.4;transition:all 350ms ease}.ides ul li a span{display:block;font-size:.875rem}.ides ul li a:hover{color:#fff;text-decoration:none}.ides ul li a:hover img{opacity:1}.ides ul li a:hover .bullet{background:#859900}.nutshell{background:#15414C}.nutshell .heading-line h2 span{background:#15414C}.nutshell .scala-items-list .scala-item{float:left;display:block;margin-right:2.35765%;width:31.76157%;padding:20px;text-align:center;transition:all 350ms ease}.nutshell .scala-items-list .scala-item:last-child{margin-right:0}.nutshell .scala-items-list .scala-item:nth-child(3n){margin-right:0}.nutshell .scala-items-list .scala-item:nth-child(3n+1){clear:left}@media (max-width: 768px){.nutshell .scala-items-list .scala-item{float:left;display:block;margin-right:2.35765%;width:100%}.nutshell .scala-items-list .scala-item:last-child{margin-right:0}}.nutshell .scala-items-list .scala-item h3{color:#fff;font-size:1.063rem;text-transform:uppercase;font-family:"Lato",sans-serif;margin-bottom:10px}.nutshell .scala-items-list .scala-item p{color:rgba(255,255,255,0.7);font-size:1.063rem}.nutshell .scala-items-list .scala-item:active,.nutshell .scala-items-list .scala-item:focus,.nutshell .scala-items-list .scala-item:hover{cursor:pointer;background:#073642}.nutshell .scala-items-list .scala-item.active{background:#073642}.nutshell .scala-item-expanded{display:none;height:400px;background:#073642}.courses{background:#244E58}.courses .heading-line h2 span{background:#244E58}.courses .online-courses,.courses .upcoming-training{float:left;display:block;margin-right:2.35765%;width:48.82117%}.courses .online-courses:last-child,.courses .upcoming-training:last-child{margin-right:0}@media (max-width: 992px){.courses .online-courses,.courses .upcoming-training{float:left;display:block;margin-right:2.35765%;width:100%}.courses .online-courses:last-child,.courses .upcoming-training:last-child{margin-right:0}}@media (max-width: 992px){.courses .online-courses{margin-bottom:40px}}.upcoming-events{background:#15414C}.upcoming-events .heading-line h2 span{background:#15414C}.upcoming-events .events-items-list::after{clear:both;content:"";display:block}.upcoming-events .events-items-list .event-item{float:left;display:block;margin-right:2.35765%;width:31.76157%}.upcoming-events .events-items-list .event-item:last-child{margin-right:0}.upcoming-events .events-items-list .event-item:nth-child(3n){margin-right:0}.upcoming-events .events-items-list .event-item:nth-child(3n+1){clear:left}@media (max-width: 992px){.upcoming-events .events-items-list .event-item{float:left;display:block;margin-right:2.35765%;width:100%}.upcoming-events .events-items-list .event-item:last-child{margin-right:0}}.upcoming-events .card{background:#073642}.upcoming-events .card:hover{background:#002B36}#site-main .scala-ecosystem{padding-bottom:0;background:url("../img/background-scala-ecosystem.png") no-repeat center bottom #244E58;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover}#site-main .scala-ecosystem .heading-line::after{clear:both;content:"";display:block}#site-main .scala-ecosystem .heading-line h2 span{background:#234D57}#site-main .scala-ecosystem .heading-line p{font-size:1.063rem;color:rgba(255,255,255,0.7);margin-top:10px;float:left;display:block;margin-right:2.35765%;width:65.88078%;margin-left:17.05961%}#site-main .scala-ecosystem .heading-line p:last-child{margin-right:0}@media (max-width: 768px){#site-main .scala-ecosystem .heading-line p{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}#site-main .scala-ecosystem .heading-line p:last-child{margin-right:0}}#site-main .scala-ecosystem .browser .header-browser{background:#073642;padding:14px 20px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}#site-main .scala-ecosystem .browser .header-browser img{width:116px;height:auto}#site-main .scala-ecosystem .browser .header-browser img:last-child{width:86px;height:auto}#site-main .scala-ecosystem .browser .main-browser{background:rgba(21,65,76,0.5);transition:all 350ms ease;text-align:center;padding:70px 0 85px 0}#site-main .scala-ecosystem .browser .main-browser h2{color:#fff;font-size:2.5rem;margin-bottom:24px}#site-main .scala-ecosystem .browser .main-browser .input-control{position:relative;background:#333;width:550px;margin-left:auto;margin-right:auto;color:#899295}#site-main .scala-ecosystem .browser .main-browser .input-control span{position:absolute;left:20px;top:8px}#site-main .scala-ecosystem .browser .main-browser .input-control input{padding:12px 18px 12px 50px;border-radius:2px;width:100%;font-weight:600}@media (max-width: 768px){#site-main .scala-ecosystem .browser .main-browser{padding-left:20px;padding-right:20px}#site-main .scala-ecosystem .browser .main-browser h2{font-size:1.4rem}#site-main .scala-ecosystem .browser .main-browser .input-control{width:100%}}#site-main .scala-ecosystem:hover .main-browser{background:#15414C}.new-blog{background:#F0F3F3}.new-blog .heading-line h2{color:#073642}.new-blog .heading-line h2 span{background:#F0F3F3}.new-blog .heading-line h2:before{background:#D0D9DA}.new-blog .new,.new-blog .recently{float:left;display:block;margin-right:2.35765%;width:48.82117%}.new-blog .new:last-child,.new-blog .recently:last-child{margin-right:0}@media (max-width: 992px){.new-blog .new,.new-blog .recently{float:left;display:block;margin-right:2.35765%;width:100%}.new-blog .new:last-child,.new-blog .recently:last-child{margin-right:0}}.new-blog .new h3,.new-blog .recently h3{font-family:"Lato",sans-serif;text-transform:uppercase;border-bottom:1px solid #D0D9DA;font-size:1.063rem}.new-blog .new .content-card,.new-blog .recently .content-card{background:#fff;padding:22px;display:block;border-radius:3px}@media (max-width: 992px){.new-blog .new{margin-bottom:40px}}.new-blog .new .tag-new{text-transform:uppercase;font-size:.9375rem;color:#DC322F;font-weight:700}.new-blog .new h3{font-size:1.5rem;color:#073642;padding-bottom:15px;margin-bottom:15px}.new-blog .new h3 a{color:#073642}.new-blog .new h3 a:active,.new-blog .new h3 a:focus,.new-blog .new h3 a:hover{text-decoration:none;color:#DC322F}.new-blog .new .date{color:#899295;display:block;margin-bottom:5px;font-style:italic}.new-blog .recently a{margin-bottom:16px}.new-blog .recently a h3{color:#073642;transition:all 350ms ease;padding-bottom:8px;margin-bottom:6px}.new-blog .recently a ul{position:relative;margin-bottom:4px}.new-blog .recently a ul li{color:#899295;font-size:.875rem;display:inline-block}.new-blog .recently a ul li.dot{font-size:10px}.new-blog .recently a ul li.tag{position:absolute;right:0;top:3px;background:#DC322F;color:#fff;text-transform:uppercase;font-size:11px;font-weight:700;padding:1px 5px}.new-blog .recently a p{color:#4A5659}.new-blog .recently a:active,.new-blog .recently a:focus,.new-blog .recently a:hover{text-decoration:none;box-shadow:rgba(0,43,54,0.2) 0 1px 12px}.new-blog .recently a:active h3,.new-blog .recently a:focus h3,.new-blog .recently a:hover h3{color:#765;color:#DC322F}.talk-to-us .heading-line h2{color:#073642}.talk-to-us .heading-line h2 span{background:#fff}.talk-to-us .heading-line h2:before{background:#D0D9DA}.talk-to-us h3{text-align:center;color:#073642;font-size:.9375rem;margin-bottom:40px}.talk-to-us .discourse,.talk-to-us .gitter{margin-bottom:50px}.talk-to-us .discourse::after,.talk-to-us .gitter::after{clear:both;content:"";display:block}.talk-to-us .discourse .scala-user-discourse{margin-left:17.05961%}.talk-to-us .discourse .scala-contributors-discourse,.talk-to-us .discourse .scala-user-discourse{padding:20px;text-align:center;float:left;display:block;margin-right:2.35765%;width:31.76157%}.talk-to-us .discourse .scala-contributors-discourse img,.talk-to-us .discourse .scala-user-discourse img{width:34px;height:auto}.talk-to-us .discourse .scala-contributors-discourse h4,.talk-to-us .discourse .scala-user-discourse h4{font-family:"Lato",sans-serif;font-size:1.063rem;text-transform:uppercase;color:#073642;margin:12px 0 8px}.talk-to-us .discourse .scala-contributors-discourse p,.talk-to-us .discourse .scala-user-discourse p{color:#4A5659}.talk-to-us .discourse .scala-contributors-discourse:active,.talk-to-us .discourse .scala-contributors-discourse:focus,.talk-to-us .discourse .scala-contributors-discourse:hover,.talk-to-us .discourse .scala-user-discourse:active,.talk-to-us .discourse .scala-user-discourse:focus,.talk-to-us .discourse .scala-user-discourse:hover{text-decoration:none;background:#F0F3F3;border-radius:2px}.talk-to-us .discourse .scala-contributors-discourse:active h4,.talk-to-us .discourse .scala-contributors-discourse:focus h4,.talk-to-us .discourse .scala-contributors-discourse:hover h4,.talk-to-us .discourse .scala-user-discourse:active h4,.talk-to-us .discourse .scala-user-discourse:focus h4,.talk-to-us .discourse .scala-user-discourse:hover h4{color:#DC322F}.talk-to-us .discourse .scala-contributors-discourse:last-child,.talk-to-us .discourse .scala-user-discourse:last-child{margin-right:0}@media (max-width: 992px){.talk-to-us .discourse .scala-contributors-discourse,.talk-to-us .discourse .scala-user-discourse{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}.talk-to-us .discourse .scala-contributors-discourse:last-child,.talk-to-us .discourse .scala-user-discourse:last-child{margin-right:0}}.talk-to-us .gitter ul.first{margin-left:17.05961%}.talk-to-us .gitter ul.first li:last-child{border-bottom:1px solid #D0D9DA}.talk-to-us .gitter ul,.talk-to-us .gitter ul.first{float:left;display:block;margin-right:2.35765%;width:31.76157%}.talk-to-us .gitter ul:last-child,.talk-to-us .gitter ul.first:last-child{margin-right:0}@media (max-width: 768px){.talk-to-us .gitter ul,.talk-to-us .gitter ul.first{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}.talk-to-us .gitter ul:last-child,.talk-to-us .gitter ul.first:last-child{margin-right:0}.talk-to-us .gitter ul li:last-child,.talk-to-us .gitter ul.first li:last-child{border-bottom:none}}.talk-to-us .gitter ul li{border-top:1px solid #D0D9DA}.talk-to-us .gitter ul li a{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center;padding:14px 0;color:#4A5659;font-weight:700}.talk-to-us .gitter ul li a:active,.talk-to-us .gitter ul li a:focus,.talk-to-us .gitter ul li a:hover{background:#F0F3F3;text-decoration:none}.talk-to-us .gitter ul li a img{width:28px;height:auto;margin-right:10px}.talk-to-us .gitter ul li:last-child{border-bottom:1px solid #D0D9DA}.talk-to-us .communities ul{text-align:center}.talk-to-us .communities ul li{display:inline-block}.talk-to-us .communities ul li:first-child{margin-right:20px}.talk-to-us .communities ul li:first-child img{width:127px;height:auto}.talk-to-us .communities ul li:last-child img{width:131px;height:auto}.talk-to-us .communities ul li a:active,.talk-to-us .communities ul li a:focus,.talk-to-us .communities ul li a:hover{opacity:0.7}.talk-to-us .social{margin-top:40px;text-align:center}.talk-to-us .social ul li{display:inline-block;font-size:1.75rem}.talk-to-us .social ul li:first-child{margin-right:14px}.talk-to-us .social ul li a{color:#15414C}.talk-to-us .social ul li a:active,.talk-to-us .social ul li a:focus,.talk-to-us .social ul li a:hover{color:#DC322F}.maintenance{background:#002B36;border-bottom:1px solid rgba(255,255,255,0.14)}#site-footer{padding:50px 0;background:#002B36;color:rgba(255,255,255,0.5)}#site-footer ul{float:left;display:block;margin-right:2.35765%;width:14.70196%}#site-footer ul:last-child{margin-right:0}@media (max-width: 992px){#site-footer ul{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-bottom:20px}#site-footer ul:last-child{margin-right:0}#site-footer ul:nth-child(3n){margin-right:0}#site-footer ul:nth-child(3n+1){clear:left}}@media (max-width: 480px){#site-footer ul{float:left;display:block;margin-right:2.35765%;width:100%}#site-footer ul:last-child{margin-right:0}}#site-footer ul li{margin-bottom:3px}#site-footer ul li h3{color:#fff;margin-bottom:10px;text-transform:uppercase;font-family:"Lato",sans-serif;font-weight:700;font-size:1.063rem}#site-footer ul li a{color:rgba(255,255,255,0.5);font-size:.9375rem}#site-footer ul li a:active,#site-footer ul li a:focus,#site-footer ul li a:hover{color:#fff;text-decoration:none}#site-footer .site-footer-top{margin-bottom:40px}#site-footer .site-footer-top::after{clear:both;content:"";display:block}#site-footer .site-footer-bottom{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}@media (max-width: 480px){#site-footer .site-footer-bottom{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;-o-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;flex-wrap:wrap}#site-footer .site-footer-bottom img{margin-top:18px}}#site-footer .site-footer-bottom img{opacity:0.4;margin-right:65px}.button{padding:8px 18px;font-size:.875rem;font-weight:700;text-transform:uppercase;color:#fff;background:#859900;border-radius:3px;display:inline-block}.button:active,.button:focus,.button:hover{text-decoration:none;color:#fff;background:#DC322F}.call-to-action{text-align:center;margin-top:40px}.call-to-action.action-medium{margin-top:30px}.call-to-action.action-small{margin-top:20px}.call-to-action p{font-size:.875rem;color:rgba(255,255,255,0.7)}.call-to-action p.align-top{margin-bottom:12px}.call-to-action p.align-bottom{margin-top:12px}.call-to-action p a{text-decoration:underline;color:rgba(255,255,255,0.7)}.call-to-action p a:active,.call-to-action p a:focus,.call-to-action p a:hover{color:#fff}.unslider ul li{padding:0 1px}.unslider .unslider-arrow{display:none}.unslider .unslider-nav{margin-top:10px}@media (max-width: 992px){.unslider .unslider-nav{margin-top:10px}}.unslider .unslider-nav ol li{width:7px;height:7px;border:none;background:rgba(255,255,255,0.3)}.unslider .unslider-nav ol li.unslider-active{pointer-events:none;background:#fff}.heading-line{margin-bottom:40px;text-align:center}.heading-line h2{color:#fff;position:relative;font-size:1.375rem}.heading-line h2 span{padding:0 30px;position:relative;background:#073642;z-index:5}.heading-line h2:before{content:"";display:block;height:1px;position:absolute;top:50%;width:100%;background:rgba(255,255,255,0.14)}.heading-line .sub-heading{font-size:.875rem;color:rgba(255,255,255,0.7);font-style:italic}.card{padding:18px;border-radius:3px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;background:#15414C;transition:all 350ms ease;margin-bottom:14px}.card:hover{background:#073642}.card img{width:28px;height:28px;border-radius:2px}.card .card-text{margin-left:14px}.card .card-text h4{font-family:"Lato",sans-serif;font-size:1.063rem;color:#fff}.card .card-text ul li{color:rgba(255,255,255,0.7);display:inline-block}.card .card-text ul li.online-courses-price,.card .card-text ul li.event-location{font-size:.75rem;text-transform:uppercase}.card .card-text ul li.online-courses-date,.card .card-text ul li.date-event{font-size:.875rem}.card .card-text ul li.dot{color:rgba(255,255,255,0.4)}.card:active,.card:focus,.card:hover{text-decoration:none}.calendar{width:28px;height:32px;background:#fff;border-radius:2px;overflow:hidden}.calendar span{display:block;font-size:10px;font-weight:700;text-align:center}.calendar span:first-child{background:#DC322F;color:#fff}a .calendar span:last-child{color:#073642;font-size:12px;margin-top:-1px} From 3b4ac361eeac78c7260fe81d7e8a59e1b5810990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Thu, 19 Jan 2017 18:36:54 +0100 Subject: [PATCH 016/120] Footer section in front page --- _data/common.yml | 5 +-- _data/footer.yml | 14 ++++++++- _includes/footer.html | 62 ++++++++++--------------------------- _includes/twitter-feed.html | 4 ++- _layouts/frontpage.html | 28 +++++++++++------ index.md | 6 ++-- 6 files changed, 57 insertions(+), 62 deletions(-) diff --git a/_data/common.yml b/_data/common.yml index 0eff4cae9..d2cf596dc 100644 --- a/_data/common.yml +++ b/_data/common.yml @@ -2,8 +2,9 @@ githubUrl: https://github.com/scala/scala twitterUrl: https://twitter.com/scala_lang - texts: onlineCoursesFree: Free (without certificate) onlineCoursesPaid: Paid (with certificate) - courseraLaunchPeriod: New sessions starting every 2 weeks! \ No newline at end of file + courseraLaunchPeriod: New sessions starting every 2 weeks! + +copyrightText: "Copyright © 2002-2016 École Polytechnique Fédérale
    Lausanne (EPFL) Lausanne, Switzerland" \ No newline at end of file diff --git a/_data/footer.yml b/_data/footer.yml index a8b18028b..ee8043979 100644 --- a/_data/footer.yml +++ b/_data/footer.yml @@ -1,4 +1,5 @@ - title: Documentation + class: documentation links: - title: Getting Started url: /documentation/getting-started/ @@ -11,12 +12,14 @@ - title: Language Specification url: "http://scala-lang.org/files/archive/spec/2.12/" - title: Download + class: download links: - title: Current Version url: "/download/" - title: All versions url: "/download/all/" - title: Community + class: community links: - title: Community url: "/community/" @@ -29,16 +32,25 @@ - title: "The Scala Center" url: https://scala.epfl.ch/ - title: Contribute + class: contribute links: - title: How to help url: "/contribute/" - title: Report an Issue url: "/contribute/bug-reporting-guide/" - title: Scala + class: scala links: - title: Blog url: "/blog/" - title: Code of Conduct url: "/conduct/" - title: License - url: "/license/" \ No newline at end of file + url: "/license/" +- title: Social + class: social + links: + - title: GitHub + url: "https://github.com/scala/scala" + - title: Twitter + url: "https://twitter.com/scala_lang" \ No newline at end of file diff --git a/_includes/footer.html b/_includes/footer.html index 523f83826..1dbc143bc 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,51 +1,21 @@ - - +
    \ No newline at end of file diff --git a/_scala_items/2-type-inference.md b/_scala_items/2-type-inference.md index d2db42382..7e2edee38 100644 --- a/_scala_items/2-type-inference.md +++ b/_scala_items/2-type-inference.md @@ -3,9 +3,11 @@ shortTitle: "Type Inference" shortDescription: "So the type system doesn’t feel so static. Don’t work for the type system. Let the type system work for you!" scastieUrl: --- -
    -
    Type inference
    -
    scala> class Person(val name: String, val age: Int) {
    +
    +
    +
    +
    Type inference
    +
    scala> class Person(val name: String, val age: Int) {
          |   override def toString = s"$name ($age)"
          | }
     defined class Person
    @@ -31,14 +33,17 @@ people: List[Person] = List(Alice (16), Bob (16), Carol (19), Dave (18), Eve (26
     
     scala> underagePeopleNames(people)
     res1: List[String] = List(Alice, Bob, Frank)
    -
    -
    -

    Let the compiler figure out the types for you

    -

    The Scala compiler is smart about static types. Most of the time, you need +

    +
    +
    +

    Let the compiler figure out the types for you

    +

    The Scala compiler is smart about static types. Most of the time, you need not tell it the types of your variables. Instead, its powerful type inference will figure them out for you.

    In this interactive REPL session (Read-Eval-Print-Loop), we define a class and two functions. You can observe that the compiler infers the result types of the functions automatically, as well as all the intermediate values. -

    +

    +
    +
    \ No newline at end of file diff --git a/_scala_items/3-concurrency-distribution.md b/_scala_items/3-concurrency-distribution.md index 1651dbc58..74b2e7fc0 100644 --- a/_scala_items/3-concurrency-distribution.md +++ b/_scala_items/3-concurrency-distribution.md @@ -3,18 +3,20 @@ shortTitle: "Concurrency & Distribution" shortDescription: "Use data-parallel operations on collections, use actors for concurrency and distribution, or futures for asynchronous programming." scastieUrl: --- -
    -
    Concurrent/Distributed
    -
    val x = future { someExpensiveComputation() }
    +
    +
    +
    +
    Concurrent/Distributed
    +
    val x = future { someExpensiveComputation() }
     val y = future { someOtherExpensiveComputation() }
     val z = for (a <- x; b <- y) yield a*b
     for (c <- z) println("Result: " + c)
     println("Meanwhile, the main thread goes on!")
    -
    - -
    -

    Go Concurrent or Distributed with Futures & Promises

    -

    In Scala, futures and promises can be used to process data asynchronously, making it easier to parallelize or even distribute your application.

    +
    + +
    +

    Go Concurrent or Distributed with Futures & Promises

    +

    In Scala, futures and promises can be used to process data asynchronously, making it easier to parallelize or even distribute your application.

    In this example, the future{} construct evaluates its argument asynchronously, and returns a handle to the asynchronous result as a Future[Int]. @@ -22,4 +24,6 @@ For-comprehensions can be used to register new callbacks (to post new things to completed, i.e., when the computation is finished. And since all this is executed asynchronously, without blocking, the main program thread can continue doing other work in the meantime. -

    \ No newline at end of file +

    + + \ No newline at end of file diff --git a/_scala_items/4-traits.md b/_scala_items/4-traits.md index 705d399fc..0554aaa07 100644 --- a/_scala_items/4-traits.md +++ b/_scala_items/4-traits.md @@ -7,10 +7,11 @@ scastieUrl: Borrowed from http://gleichmann.wordpress.com/2009/10/21/scala-in-practice-composing-traits-lego-style/ {% endcomment %} - -
    -
    Traits
    -
    abstract class Spacecraft {
    +
    +
    +
    +
    Traits
    +
    abstract class Spacecraft {
       def engage(): Unit
     }
     trait CommandoBridge extends Spacecraft {
    @@ -33,14 +34,16 @@ class StarCruiser extends Spacecraft
                          with PulseEngine {
       val maxPulse = 200
     }
    -
    - -
    -

    Flexibly Combine Interface & Behavior

    -

    +

    + +
    +

    Flexibly Combine Interface & Behavior

    +

    In Scala, multiple traits can be mixed into a class to combine their interface and their behavior.

    Here, a StarCruiser is a Spacecraft with a CommandoBridge that knows how to engage the ship (provided a means to speed up) and a PulseEngine that specifies how to speed up. -

    +

    + + \ No newline at end of file diff --git a/_scala_items/5-pattern-matching.md b/_scala_items/5-pattern-matching.md index e80e6edd0..6a0f9e2e0 100644 --- a/_scala_items/5-pattern-matching.md +++ b/_scala_items/5-pattern-matching.md @@ -3,9 +3,26 @@ shortTitle: "Pattern Matching" shortDescription: "Think “switch” on steroids. Match against class hierarchies, sequences, and more." scastieUrl: --- -
    -
    Pattern matching
    -
    // Define a set of case classes for representing binary trees.
    +
    +
    +

    Switch on the structure of your data

    +

    In Scala, case classes are used to represent structural data +types. They implicitly equip the class with meaningful toString, +equals and hashCode methods, as well as the +ability to be deconstructed with pattern matching.

    +


    +In this example, we define a small set of case classes that represent binary +trees of integers (the generic version is omitted for simplicity here). +In inOrder, the match construct chooses the right +branch, depending on the type of t, and at the same time +deconstructs the arguments of a Node. +

    +
    + +
    +
    +
    Pattern matching
    +
    // Define a set of case classes for representing binary trees.
     sealed abstract class Tree
     case class Node(elem: Int, left: Tree, right: Tree) extends Tree
     case object Leaf extends Tree
    @@ -15,18 +32,7 @@ def inOrder(t: Tree): List[Int] = t match {
       case Node(e, l, r) => inOrder(l) ::: List(e) ::: inOrder(r)
       case Leaf          => List()
     }
    -
    - -
    -

    Switch on the structure of your data

    -

    In Scala, case classes are used to represent structural data -types. They implicitly equip the class with meaningful toString, -equals and hashCode methods, as well as the -ability to be deconstructed with pattern matching.

    -

    -In this example, we define a small set of case classes that represent binary -trees of integers (the generic version is omitted for simplicity here). -In inOrder, the match construct chooses the right -branch, depending on the type of t, and at the same time -deconstructs the arguments of a Node. -

    \ No newline at end of file + + + + \ No newline at end of file diff --git a/_scala_items/6-higher-order-functions.md b/_scala_items/6-higher-order-functions.md index c828c72ea..2dbe638db 100644 --- a/_scala_items/6-higher-order-functions.md +++ b/_scala_items/6-higher-order-functions.md @@ -3,23 +3,26 @@ shortTitle: "Higher-order functions" shortDescription: "Functions are first-class objects. Compose them with guaranteed type safety. Use them anywhere, pass them to anything." scastieUrl: --- -
    -

    Go Functional with Higher-Order Functions

    -

    In Scala, functions are values, and can be defined as anonymous functions +

    +
    +

    Go Functional with Higher-Order Functions

    +

    In Scala, functions are values, and can be defined as anonymous functions with a concise syntax.

    -
    - -
    -
    Scala
    -
    val people: Array[Person]
    +              
    +
    +
    +
    Scala
    +
    val people: Array[Person]
     
     // Partition `people` into two arrays `minors` and `adults`.
     // Use the higher-order function `(_.age < 18)` as a predicate for partitioning.
     val (minors, adults) = people partition (_.age < 18)
    - -
    -
    Java
    -
    List<Person> people;
    +                
    +
    +
    +
    +
    Java
    +
    List<Person> people;
     
     List<Person> minors = new ArrayList<Person>(people.size());
     List<Person> adults = new ArrayList<Person>(people.size());
    @@ -29,17 +32,6 @@ for (Person person : people) {
         else
             adults.add(person);
     }
    - - -
    -

    - In the Scala example on the left, the partition method, available on all - collection types (including Array), returns two new collections - of the same type. Elements from the original collection are partitioned - according to a predicate, which is given as a lambda, i.e., an anonymous - function. The _ stands for the parameter to the lambda, i.e., - the element that is being tested. This particular lambda can also be written - as (x => x.age < 18). -

    -

    The same program is implemented in Java on the right.

    -
    \ No newline at end of file +
    +
    +
    \ No newline at end of file diff --git a/_scala_items/7-run-scala-in-the-browser.md b/_scala_items/7-run-scala-in-the-browser.md index 0249d0d7a..1ecf0c3a4 100644 --- a/_scala_items/7-run-scala-in-the-browser.md +++ b/_scala_items/7-run-scala-in-the-browser.md @@ -2,4 +2,48 @@ shortTitle: "Run Scala in the browser" shortDescription: "Functions are first-class objects. Compose them with guaranteed type safety. Use them anywhere, pass them to anything." scastieUrl: ---- \ No newline at end of file +--- +
    +
    +
    +
    Type inference
    +
    scala> class Person(val name: String, val age: Int) {
    +     |   override def toString = s"$name ($age)"
    +     | }
    +defined class Person
    +
    +scala> def underagePeopleNames(persons: List[Person]) = {
    +     |   for (person <- persons; if person.age < 18)
    +     |     yield person.name
    +     | }
    +underagePeopleNames: (persons: List[Person])List[String]
    +
    +scala> def createRandomPeople() = {
    +     |   val names = List("Alice", "Bob", "Carol",
    +     |       "Dave", "Eve", "Frank")
    +     |   for (name <- names) yield {
    +     |     val age = (Random.nextGaussian()*8 + 20).toInt
    +     |     new Person(name, age)
    +     |   }
    +     | }
    +createRandomPeople: ()List[Person]
    +
    +scala> val people = createRandomPeople()
    +people: List[Person] = List(Alice (16), Bob (16), Carol (19), Dave (18), Eve (26), Frank (11))
    +
    +scala> underagePeopleNames(people)
    +res1: List[String] = List(Alice, Bob, Frank)
    +
    +
    +
    +

    Let the compiler figure out the types for you

    +

    The Scala compiler is smart about static types. Most of the time, you need +not tell it the types of your variables. Instead, its powerful type inference +will figure them out for you.

    +

    +In this interactive REPL session (Read-Eval-Print-Loop), we define a +class and two functions. You can observe that the compiler infers the result +types of the functions automatically, as well as all the intermediate values. +

    +
    +
    \ No newline at end of file diff --git a/resources/css/style.css b/resources/css/style.css index cc113c8e4..47be5c270 100644 --- a/resources/css/style.css +++ b/resources/css/style.css @@ -1 +1 @@ -@import url("https://fonts.googleapis.com/css?family=Lato:400,400i,700");@import url("https://fonts.googleapis.com/css?family=Roboto+Slab:400,700");html{box-sizing:border-box}*,*::after,*::before{box-sizing:inherit}.unslider{overflow:auto;margin:0;padding:0}.unslider-wrap{position:relative}.unslider-wrap.unslider-carousel>li{float:left}.unslider-vertical>ul{height:100%}.unslider-vertical li{float:none;width:100%}.unslider-fade{position:relative}.unslider-fade .unslider-wrap li{position:absolute;left:0;top:0;right:0;z-index:8}.unslider-fade .unslider-wrap li.unslider-active{z-index:10}.unslider ul,.unslider ol,.unslider li{list-style:none;margin:0;padding:0;border:none}.unslider-arrow{position:absolute;left:20px;z-index:2;cursor:pointer}.unslider-arrow.next{left:auto;right:20px}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}html,body{height:100%;margin:0}input,select,textarea{font-family:"Lato",sans-serif;font-size:1.063rem;display:block;appearance:none;border:none}::-webkit-input-placeholder{color:#899295}:-moz-placeholder{color:#899295}::-moz-placeholder{color:#899295}:-ms-input-placeholder{color:#899295}.wrap{max-width:1200px;margin-left:auto;margin-right:auto;padding:0 20px}.wrap::after{clear:both;content:"";display:block}.dot{font-size:10px;color:rgba(137,146,149,0.6);margin:0 3px}ul,ol{list-style-type:none;margin:0;padding:0}dl{margin:0}dt{font-weight:600;margin:0}dd{margin:0}figure{margin:0}img,picture{margin:0;max-width:100%}body{color:#4A5659;font-family:"Lato",sans-serif;font-size:16px;font-weight:400;line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-family:"Roboto Slab",serif;line-height:1.4;font-weight:600;margin:0}h2{font-weight:400}p{margin:0}a{color:#23aad1;text-decoration:none;transition:all 350ms ease}a:active,a:focus,a:hover{color:#DC322F;text-decoration:underline}hr{border-bottom:1px solid #D0D9DA;border-left:0;border-right:0;border-top:0;margin:0}#site-header{background:#002B36}#site-header .new-on-the-blog{background:rgba(0,43,54,0.8);text-align:center;padding:8px 0;color:#fff;transition:all 350ms ease;position:relative}#site-header .new-on-the-blog span{position:absolute;right:20px;top:3px;z-index:1;cursor:pointer;font-size:1.275rem;opacity:0.6;transition:all 350ms ease}#site-header .new-on-the-blog span:hover{opacity:1}#site-header .new-on-the-blog a{color:#fff;text-decoration:underline}#site-header .new-on-the-blog a:active,#site-header .new-on-the-blog a:focus,#site-header .new-on-the-blog a:hover{text-decoration:none}#site-header.header-home{background:none}#site-header.header-home .header-background{background:rgba(0,43,54,0.45);position:relative;padding-bottom:150px}#site-header.header-home .header-background:before{content:"";position:absolute;background:url("../img/frontpage/background-header-home.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.inner-text{position:relative;float:left;display:block;margin-right:2.35765%;width:65.88078%}.inner-text h1{font-family:"Lato",sans-serif;font-size:2.813rem;font-weight:700;color:#fff;margin:30px 0 15px 0}.inner-text p{font-size:1.25rem;color:#fff;margin-bottom:30px}.inner-text:last-child{margin-right:0}@media (max-width: 992px){.inner-text{float:left;display:block;margin-right:2.35765%;width:100%}.inner-text:last-child{margin-right:0}.inner-text h1{font-size:2.213rem;margin:0 0 15px 0}}.scala-main-resources{height:177px;background:#002B36;position:relative}.scala-main-resources .resources .button{font-size:1.063rem;display:block;border-top-left-radius:200px;border-top-right-radius:200px;border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:200px;border-top-left-radius:200px;padding:20px 40px}.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-left:17.05961%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:31.76157%}.scala-main-resources .resources .api-docs:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button{text-align:right;border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:200px;border-top-right-radius:200px;border-bottom-left-radius:200px;border-bottom-right-radius:200px;border-bottom-left-radius:0;border-top-left-radius:0}@media (max-width: 992px){.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-left:0%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-right:0}.scala-main-resources .resources .api-docs:last-child{margin-right:0}}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{margin-top:-40px}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{margin-top:12px;max-width:180px;text-align:center}.scala-main-resources .resources .api-docs ul li:first-child,.scala-main-resources .resources .download ul li:first-child{border-bottom:1px solid rgba(255,255,255,0.14);font-family:"Roboto Slab",serif;padding-bottom:4px;margin-bottom:2px}.scala-main-resources .resources .api-docs ul li a,.scala-main-resources .resources .download ul li a{color:rgba(255,255,255,0.7);font-size:.875rem}.scala-main-resources .resources .api-docs ul li a:active,.scala-main-resources .resources .api-docs ul li a:focus,.scala-main-resources .resources .api-docs ul li a:hover,.scala-main-resources .resources .download ul li a:active,.scala-main-resources .resources .download ul li a:focus,.scala-main-resources .resources .download ul li a:hover{text-decoration:none;color:#fff}.scala-main-resources .resources .api-docs ul{float:right}.scala-main-resources .resources .scala-brand-circle{width:340px;height:340px;left:50%;top:-178px;margin-left:-170px;background:rgba(0,43,54,0.4);border-radius:100%;position:absolute;z-index:60;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center}.scala-main-resources .resources .scala-brand-circle .circle-solid{background:#002B36;width:224px;height:224px;border-radius:100%;text-align:center}.scala-main-resources .resources .scala-brand-circle .circle-solid img{width:152px;height:auto;margin-top:-28px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span{display:block;color:#fff;font-family:"Roboto Slab",serif}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:first-child{font-size:1.375rem;margin-top:-9px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:last-child{font-size:1.9rem;margin-top:-10px}@media (max-width: 768px){.scala-main-resources{height:auto;padding-bottom:50px}.scala-main-resources .resources .download{margin-top:140px}.scala-main-resources .resources .api-docs{margin-top:40px}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:100%}.scala-main-resources .resources .api-docs:last-child,.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button,.scala-main-resources .resources .download .button{border-radius:100px;padding:10px 20px;font-size:16px;text-align:center}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{max-width:100%;float:none}.scala-main-resources .resources .scala-brand-circle{transform:scale(0.8)}}#site-main section{padding:50px 0}#site-main .spire{min-height:330px;background:rgba(0,43,54,0.4);position:relative;padding:0}#site-main .spire:before{content:"";position:absolute;background:url("../img/frontpage/epfl-bc.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.navigation{padding:30px 0;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.navigation .navigation-bdand img{width:104px;height:43px}.navigation .navigation-panel-button{display:none;font-size:1.333rem;color:#fff;cursor:pointer}@media (max-width: 992px){.navigation .navigation-panel-button{order:3;display:block}}.navigation .navigation-menu .navigation-menu-item{display:inline-block}.navigation .navigation-menu .navigation-menu-item:last-child{margin-right:0}.navigation .navigation-menu .navigation-menu-item a{padding:5px 15px;text-transform:uppercase;color:#fff;border-radius:300px;font-weight:700}.navigation .navigation-menu .navigation-menu-item a:active,.navigation .navigation-menu .navigation-menu-item a:focus,.navigation .navigation-menu .navigation-menu-item a:hover{background:#DC322F;text-decoration:none}@media (max-width: 992px){.navigation .navigation-menu{padding:20px;position:fixed;top:0;right:0;bottom:0;left:auto;height:100%;width:270px;-webkit-transform:translateX(270px);-moz-transform:translateX(270px);-ms-transform:translateX(270px);-o-transform:translateX(270px);transform:translateX(270px);-webkit-transition:all 0.25s linear;-moz-transition:all 0.25s linear;transition:all 0.25s linear;background:#fff;-webkit-overflow-scrolling:touch;overflow-y:auto;z-index:100;background:rgba(0,43,54,0.99)}.navigation .navigation-menu.is-visible{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}.navigation .navigation-menu .navigation-menu-item{margin-right:16px;padding:10px 0;display:block}}.navigation-fade-screen{position:fixed;top:0;right:0;bottom:0;left:0;-webkit-transition:all 0.15s ease-out 0s;-moz-transition:all 0.15s ease-out 0s;transition:all 0.15s ease-out 0s;background:#000;opacity:0;visibility:hidden;z-index:90}.navigation-fade-screen.is-visible{opacity:0.6;visibility:visible}.twitter-feed{background:#5CC6E4}.twitter-feed .heading-line h2 span{background:#5CC6E4}.twitter-feed .heading-line h2:before{background:rgba(255,255,255,0.5)}.twitter-feed .slider-twitter ul li{padding:0 15px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:stretch;-moz-box-align:stretch;box-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;-ms-align-items:stretch;-o-align-items:stretch;align-items:stretch;-ms-flex-align:stretch;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}@media (max-width: 992px){.twitter-feed .slider-twitter ul li{display:block}}.twitter-feed .slider-twitter ul li .item-tweet{padding:20px;background:#fff;border-radius:3px;transition:all 350ms ease;max-width:360px;margin-right:20px}@media (max-width: 992px){.twitter-feed .slider-twitter ul li .item-tweet{max-width:100%;margin-right:0;margin-bottom:20px}}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}.twitter-feed .slider-twitter ul li .item-tweet img{border-radius:3px;width:44px;height:auto;float:left}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text{margin-left:64px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li{padding:0;margin-right:6px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user{font-size:1.063rem;font-weight:700;color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a{color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:hover{color:#DC322F;text-decoration:none}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.username{font-size:.875rem;color:#899295;font-weight:600}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet .date{font-size:.875rem;color:#899295}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p{font-size:.9375rem}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag{color:rgba(137,146,149,0.7)}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:hover{color:#899295}.twitter-feed .slider-twitter ul li .item-tweet:hover{background:rgba(255,255,255,0.88)}.twitter-feed .call-to-action p{color:#fff}.ides{background:#073642}.ides ul{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:distribute;-moz-box-pack:distribute;box-pack:distribute;-webkit-justify-content:space-around;-moz-justify-content:space-around;-ms-justify-content:space-around;-o-justify-content:space-around;justify-content:space-around;-ms-flex-pack:distribute}.ides ul li{text-align:center;position:relative}.ides ul li:nth-child(2n){width:1px;height:94px;background:rgba(255,255,255,0.14)}.ides ul li a{display:inline-block;color:rgba(255,255,255,0.5);font-family:"Roboto Slab",serif}.ides ul li a .bullet{position:absolute;top:-12px;right:-14px;background:#15414C;border-radius:100%;width:24px;height:24px;z-index:10;transition:all 350ms ease;text-align:center}.ides ul li a .bullet img{width:16px;height:16px;margin-top:4px}.ides ul li a.sublime .bullet{top:-10px;right:0}.ides ul li a img{height:56px;width:auto;margin-bottom:6px;opacity:0.4;transition:all 350ms ease}.ides ul li a span{display:block;font-size:.875rem}.ides ul li a:hover{color:#fff;text-decoration:none}.ides ul li a:hover img{opacity:1}.ides ul li a:hover .bullet{background:#859900}.nutshell{background:#15414C}.nutshell .heading-line h2 span{background:#15414C}.nutshell .scala-items-list .scala-item{float:left;display:block;margin-right:2.35765%;width:31.76157%;padding:20px;text-align:center;transition:all 350ms ease}.nutshell .scala-items-list .scala-item:last-child{margin-right:0}.nutshell .scala-items-list .scala-item:nth-child(3n){margin-right:0}.nutshell .scala-items-list .scala-item:nth-child(3n+1){clear:left}@media (max-width: 768px){.nutshell .scala-items-list .scala-item{float:left;display:block;margin-right:2.35765%;width:100%}.nutshell .scala-items-list .scala-item:last-child{margin-right:0}}.nutshell .scala-items-list .scala-item h3{color:#fff;font-size:1.063rem;text-transform:uppercase;font-family:"Lato",sans-serif;margin-bottom:10px}.nutshell .scala-items-list .scala-item p{color:rgba(255,255,255,0.7);font-size:1.063rem}.nutshell .scala-items-list .scala-item:active,.nutshell .scala-items-list .scala-item:focus,.nutshell .scala-items-list .scala-item:hover{cursor:pointer;background:#073642}.nutshell .scala-items-list .scala-item.active{background:#073642}.nutshell .scala-item-expanded{display:none;height:400px;background:#073642}.courses{background:#244E58}.courses .heading-line h2 span{background:#244E58}.courses .online-courses,.courses .upcoming-training{float:left;display:block;margin-right:2.35765%;width:48.82117%}.courses .online-courses:last-child,.courses .upcoming-training:last-child{margin-right:0}@media (max-width: 992px){.courses .online-courses,.courses .upcoming-training{float:left;display:block;margin-right:2.35765%;width:100%}.courses .online-courses:last-child,.courses .upcoming-training:last-child{margin-right:0}}@media (max-width: 992px){.courses .online-courses{margin-bottom:40px}}.upcoming-events{background:#15414C}.upcoming-events .heading-line h2 span{background:#15414C}.upcoming-events .events-items-list::after{clear:both;content:"";display:block}.upcoming-events .events-items-list .event-item{float:left;display:block;margin-right:2.35765%;width:31.76157%}.upcoming-events .events-items-list .event-item:last-child{margin-right:0}.upcoming-events .events-items-list .event-item:nth-child(3n){margin-right:0}.upcoming-events .events-items-list .event-item:nth-child(3n+1){clear:left}@media (max-width: 992px){.upcoming-events .events-items-list .event-item{float:left;display:block;margin-right:2.35765%;width:100%}.upcoming-events .events-items-list .event-item:last-child{margin-right:0}}.upcoming-events .card{background:#073642}.upcoming-events .card:hover{background:#002B36}#site-main .scala-ecosystem{padding-bottom:0;background:url("../img/frontpage/background-scala-ecosystem.png") no-repeat center bottom #244E58;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover}#site-main .scala-ecosystem .heading-line::after{clear:both;content:"";display:block}#site-main .scala-ecosystem .heading-line h2 span{background:#234D57}#site-main .scala-ecosystem .heading-line p{font-size:1.063rem;color:rgba(255,255,255,0.7);margin-top:10px;float:left;display:block;margin-right:2.35765%;width:65.88078%;margin-left:17.05961%}#site-main .scala-ecosystem .heading-line p:last-child{margin-right:0}@media (max-width: 768px){#site-main .scala-ecosystem .heading-line p{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}#site-main .scala-ecosystem .heading-line p:last-child{margin-right:0}}#site-main .scala-ecosystem .browser .header-browser{background:#073642;padding:14px 20px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}#site-main .scala-ecosystem .browser .header-browser img{width:116px;height:auto}#site-main .scala-ecosystem .browser .header-browser img:last-child{width:86px;height:auto}#site-main .scala-ecosystem .browser .main-browser{background:rgba(21,65,76,0.5);transition:all 350ms ease;text-align:center;padding:70px 0 80px 0}#site-main .scala-ecosystem .browser .main-browser h2{color:#fff;font-size:2.5rem;margin-bottom:24px}#site-main .scala-ecosystem .browser .main-browser .input-control{position:relative;background:#333;width:550px;margin-left:auto;margin-right:auto;color:#899295}#site-main .scala-ecosystem .browser .main-browser .input-control span{position:absolute;left:20px;top:8px}#site-main .scala-ecosystem .browser .main-browser .input-control input{padding:12px 18px 12px 50px;border-radius:2px;width:100%;font-weight:600}@media (max-width: 768px){#site-main .scala-ecosystem .browser .main-browser{padding-left:20px;padding-right:20px}#site-main .scala-ecosystem .browser .main-browser h2{font-size:1.4rem}#site-main .scala-ecosystem .browser .main-browser .input-control{width:100%}}#site-main .scala-ecosystem:hover .main-browser{background:#15414C;padding-bottom:140px}.new-blog{background:#F0F3F3}.new-blog .heading-line h2{color:#073642}.new-blog .heading-line h2 span{background:#F0F3F3}.new-blog .heading-line h2:before{background:#D0D9DA}.new-blog .new,.new-blog .recently{float:left;display:block;margin-right:2.35765%;width:48.82117%}.new-blog .new:last-child,.new-blog .recently:last-child{margin-right:0}@media (max-width: 992px){.new-blog .new,.new-blog .recently{float:left;display:block;margin-right:2.35765%;width:100%}.new-blog .new:last-child,.new-blog .recently:last-child{margin-right:0}}.new-blog .new h3,.new-blog .recently h3{font-family:"Lato",sans-serif;text-transform:uppercase;border-bottom:1px solid #D0D9DA;font-size:1.063rem}.new-blog .new .content-card,.new-blog .recently .content-card{background:#fff;padding:22px;display:block;border-radius:3px}@media (max-width: 992px){.new-blog .new{margin-bottom:40px}}.new-blog .new .content-card{height:516px;overflow:hidden;position:relative}.new-blog .new .content-card:before{content:"";position:absolute;background:#fff;left:0;bottom:0;width:100%;height:20px;z-index:1}.new-blog .new .tag-new{text-transform:uppercase;font-size:.9375rem;color:#DC322F;font-weight:700}.new-blog .new h3{font-size:1.5rem;color:#073642;padding-bottom:15px;margin-bottom:15px}.new-blog .new h3 a{color:#073642}.new-blog .new h3 a:active,.new-blog .new h3 a:focus,.new-blog .new h3 a:hover{text-decoration:none;color:#DC322F}.new-blog .new .date{color:#899295;display:block;margin-bottom:5px;font-style:italic}.new-blog .recently a{margin-bottom:16px}.new-blog .recently a h3{color:#073642;transition:all 350ms ease;padding-bottom:8px;margin-bottom:6px}.new-blog .recently a ul{position:relative;margin-bottom:4px}.new-blog .recently a ul li{color:#899295;font-size:.875rem;display:inline-block}.new-blog .recently a ul li.dot{font-size:10px}.new-blog .recently a ul li.tag{position:absolute;right:0;top:3px;background:#DC322F;color:#fff;text-transform:uppercase;font-size:11px;font-weight:700;padding:1px 5px}.new-blog .recently a p{color:#4A5659}.new-blog .recently a:active,.new-blog .recently a:focus,.new-blog .recently a:hover{text-decoration:none;box-shadow:rgba(0,43,54,0.2) 0 1px 12px}.new-blog .recently a:active h3,.new-blog .recently a:focus h3,.new-blog .recently a:hover h3{color:#765;color:#DC322F}.talk-to-us .heading-line h2{color:#073642}.talk-to-us .heading-line h2 span{background:#fff}.talk-to-us .heading-line h2:before{background:#D0D9DA}.talk-to-us h3{text-align:center;color:#073642;font-size:.9375rem;margin-bottom:40px}.talk-to-us .discourse,.talk-to-us .gitter{margin-bottom:50px}.talk-to-us .discourse::after,.talk-to-us .gitter::after{clear:both;content:"";display:block}.talk-to-us .discourse .scala-user-discourse{margin-left:17.05961%}.talk-to-us .discourse .scala-contributors-discourse,.talk-to-us .discourse .scala-user-discourse{padding:20px;text-align:center;float:left;display:block;margin-right:2.35765%;width:31.76157%}.talk-to-us .discourse .scala-contributors-discourse img,.talk-to-us .discourse .scala-user-discourse img{width:34px;height:auto}.talk-to-us .discourse .scala-contributors-discourse h4,.talk-to-us .discourse .scala-user-discourse h4{font-family:"Lato",sans-serif;font-size:1.063rem;text-transform:uppercase;color:#073642;margin:12px 0 8px}.talk-to-us .discourse .scala-contributors-discourse p,.talk-to-us .discourse .scala-user-discourse p{color:#4A5659}.talk-to-us .discourse .scala-contributors-discourse:active,.talk-to-us .discourse .scala-contributors-discourse:focus,.talk-to-us .discourse .scala-contributors-discourse:hover,.talk-to-us .discourse .scala-user-discourse:active,.talk-to-us .discourse .scala-user-discourse:focus,.talk-to-us .discourse .scala-user-discourse:hover{text-decoration:none;background:#F0F3F3;border-radius:2px}.talk-to-us .discourse .scala-contributors-discourse:active h4,.talk-to-us .discourse .scala-contributors-discourse:focus h4,.talk-to-us .discourse .scala-contributors-discourse:hover h4,.talk-to-us .discourse .scala-user-discourse:active h4,.talk-to-us .discourse .scala-user-discourse:focus h4,.talk-to-us .discourse .scala-user-discourse:hover h4{color:#DC322F}.talk-to-us .discourse .scala-contributors-discourse:last-child,.talk-to-us .discourse .scala-user-discourse:last-child{margin-right:0}@media (max-width: 992px){.talk-to-us .discourse .scala-contributors-discourse,.talk-to-us .discourse .scala-user-discourse{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}.talk-to-us .discourse .scala-contributors-discourse:last-child,.talk-to-us .discourse .scala-user-discourse:last-child{margin-right:0}}.talk-to-us .gitter ul.first{margin-left:17.05961%}.talk-to-us .gitter ul.first li:last-child{border-bottom:1px solid #D0D9DA}.talk-to-us .gitter ul,.talk-to-us .gitter ul.first{float:left;display:block;margin-right:2.35765%;width:31.76157%}.talk-to-us .gitter ul:last-child,.talk-to-us .gitter ul.first:last-child{margin-right:0}@media (max-width: 768px){.talk-to-us .gitter ul,.talk-to-us .gitter ul.first{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}.talk-to-us .gitter ul:last-child,.talk-to-us .gitter ul.first:last-child{margin-right:0}.talk-to-us .gitter ul li:last-child,.talk-to-us .gitter ul.first li:last-child{border-bottom:none}}.talk-to-us .gitter ul li{border-top:1px solid #D0D9DA}.talk-to-us .gitter ul li a{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;-o-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;padding:14px 0;color:#4A5659;font-weight:700;padding-left:30px}.talk-to-us .gitter ul li a:active,.talk-to-us .gitter ul li a:focus,.talk-to-us .gitter ul li a:hover{background:#F0F3F3;text-decoration:none}.talk-to-us .gitter ul li a img{width:28px;height:auto;margin-right:10px}.talk-to-us .gitter ul li:last-child{border-bottom:1px solid #D0D9DA}.talk-to-us .communities ul{text-align:center}.talk-to-us .communities ul li{display:inline-block}.talk-to-us .communities ul li:first-child{margin-right:20px}.talk-to-us .communities ul li:first-child img{width:127px;height:auto}.talk-to-us .communities ul li:last-child img{width:131px;height:auto}.talk-to-us .communities ul li a:active,.talk-to-us .communities ul li a:focus,.talk-to-us .communities ul li a:hover{opacity:0.7}.talk-to-us .social{margin-top:40px;text-align:center}.talk-to-us .social ul li{display:inline-block;font-size:1.75rem}.talk-to-us .social ul li:first-child{margin-right:14px}.talk-to-us .social ul li a{color:#15414C}.talk-to-us .social ul li a:active,.talk-to-us .social ul li a:focus,.talk-to-us .social ul li a:hover{color:#DC322F}.maintenance{background:#073642}.maintenance .heading-line h2 span{background:#073642}.maintenance h3{color:#fff;text-align:center;font-size:0.9375rem}.maintenance .maintained{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center;flex-wrap:wrap;margin-bottom:40px}.maintenance .maintained li:first-child{margin-right:32px}.maintenance .maintained li a img{height:43px;width:auto;opacity:0.3;transition:all 350ms ease}.maintenance .maintained li a:hover img{opacity:1}@media (max-width: 480px){.maintenance .maintained li:first-child{margin-right:0}}.maintenance .supported{padding-top:30px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify;flex-wrap:wrap}.maintenance .supported a img{display:block;opacity:0.3;transition:all 350ms ease}@media (max-width: 992px){.maintenance .supported a img{margin:5px}}@media (max-width: 768px){.maintenance .supported a img{margin:10px}}.maintenance .supported a:hover img{opacity:1}#site-footer{padding:50px 0;background:#002B36;color:rgba(255,255,255,0.5)}#site-footer ul{float:left;display:block;margin-right:2.35765%;width:14.70196%}#site-footer ul:last-child{margin-right:0}@media (max-width: 992px){#site-footer ul{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-bottom:20px}#site-footer ul:last-child{margin-right:0}#site-footer ul:nth-child(3n){margin-right:0}#site-footer ul:nth-child(3n+1){clear:left}}@media (max-width: 480px){#site-footer ul{float:left;display:block;margin-right:2.35765%;width:100%;text-align:center}#site-footer ul:last-child{margin-right:0}}#site-footer ul li{margin-bottom:3px}#site-footer ul li h3{color:#fff;margin-bottom:10px;text-transform:uppercase;font-family:"Lato",sans-serif;font-weight:700;font-size:1.063rem}#site-footer ul li a{color:rgba(255,255,255,0.5);font-size:.9375rem}#site-footer ul li a:active,#site-footer ul li a:focus,#site-footer ul li a:hover{color:#fff;text-decoration:none}#site-footer .site-footer-top{margin-bottom:40px}#site-footer .site-footer-top::after{clear:both;content:"";display:block}#site-footer .site-footer-bottom{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}@media (max-width: 480px){#site-footer .site-footer-bottom{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;-o-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;flex-wrap:wrap}#site-footer .site-footer-bottom img{margin-top:18px}}#site-footer .site-footer-bottom img{opacity:0.4;margin-right:65px}.marker{position:absolute;width:16px;height:8px;background:#A4302E;right:-50px;top:100px;border-radius:100%;cursor:pointer}.marker:hover .info-marker,.marker:hover .arrow{visibility:visible;opacity:1;transition:all 350ms ease}.marker:before{content:"";position:absolute;background:rgba(164,48,46,0.3);left:-8px;top:-4px;width:32px;height:16px;border-radius:100%;z-index:1}.marker .info-marker{width:472px;position:absolute;left:-13px;top:30px;font-size:.875rem;color:#fff;font-family:"Roboto Slab",serif;background:rgba(7,54,66,0.8);padding:20px;visibility:hidden;opacity:0}.marker .info-marker .arrow{position:absolute;left:0;top:-16px;width:23px;height:13px;z-index:1}.button{padding:8px 18px;font-size:.875rem;font-weight:700;text-transform:uppercase;color:#fff;background:#859900;border-radius:3px;display:inline-block}.button:active,.button:focus,.button:hover{text-decoration:none;color:#fff;background:#DC322F}.call-to-action{text-align:center;margin-top:40px}.call-to-action.action-medium{margin-top:30px}.call-to-action.action-small{margin-top:20px}.call-to-action p{font-size:.875rem;color:rgba(255,255,255,0.7)}.call-to-action p.align-top{margin-bottom:12px}.call-to-action p.align-bottom{margin-top:12px}.call-to-action p a{text-decoration:underline;color:rgba(255,255,255,0.7)}.call-to-action p a:active,.call-to-action p a:focus,.call-to-action p a:hover{color:#fff}.unslider ul li{padding:0 1px}.unslider .unslider-arrow{display:none}.unslider .unslider-nav{margin-top:10px}@media (max-width: 992px){.unslider .unslider-nav{margin-top:10px}}.unslider .unslider-nav ol li{width:7px;height:7px;border:none;background:rgba(255,255,255,0.3)}.unslider .unslider-nav ol li.unslider-active{pointer-events:none;background:#fff}.heading-line{margin-bottom:40px;text-align:center}.heading-line h2{color:#fff;position:relative;font-size:1.375rem}.heading-line h2 span{padding:0 30px;position:relative;background:#073642;z-index:5}.heading-line h2:before{content:"";display:block;height:1px;position:absolute;top:50%;width:100%;background:rgba(255,255,255,0.14)}.heading-line .sub-heading{font-size:.875rem;color:rgba(255,255,255,0.7);font-style:italic}.card{padding:18px;border-radius:3px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;background:#15414C;transition:all 350ms ease;margin-bottom:14px}.card:hover{background:#073642}.card img{width:28px;height:28px;border-radius:2px}.card .card-text{margin-left:14px}.card .card-text h4{font-family:"Lato",sans-serif;font-size:1.063rem;color:#fff}.card .card-text ul li{color:rgba(255,255,255,0.7);display:inline-block}.card .card-text ul li.online-courses-price,.card .card-text ul li.event-location{font-size:.75rem;text-transform:uppercase}.card .card-text ul li.online-courses-date,.card .card-text ul li.date-event{font-size:.875rem}.card .card-text ul li.dot{color:rgba(255,255,255,0.4)}.card:active,.card:focus,.card:hover{text-decoration:none}.calendar{width:28px;height:32px;background:#fff;border-radius:2px;overflow:hidden}.calendar span{display:block;font-size:10px;font-weight:700;text-align:center}.calendar span:first-child{background:#DC322F;color:#fff}a .calendar span:last-child{color:#073642;font-size:12px;margin-top:-1px} +@import url("https://fonts.googleapis.com/css?family=Lato:400,400i,700");@import url("https://fonts.googleapis.com/css?family=Roboto+Slab:400,700");html{box-sizing:border-box}*,*::after,*::before{box-sizing:inherit}.unslider{overflow:auto;margin:0;padding:0}.unslider-wrap{position:relative}.unslider-wrap.unslider-carousel>li{float:left}.unslider-vertical>ul{height:100%}.unslider-vertical li{float:none;width:100%}.unslider-fade{position:relative}.unslider-fade .unslider-wrap li{position:absolute;left:0;top:0;right:0;z-index:8}.unslider-fade .unslider-wrap li.unslider-active{z-index:10}.unslider ul,.unslider ol,.unslider li{list-style:none;margin:0;padding:0;border:none}.unslider-arrow{position:absolute;left:20px;z-index:2;cursor:pointer}.unslider-arrow.next{left:auto;right:20px}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}html,body{height:100%;margin:0}input,select,textarea{font-family:"Lato",sans-serif;font-size:1.063rem;display:block;appearance:none;border:none}::-webkit-input-placeholder{color:#899295}:-moz-placeholder{color:#899295}::-moz-placeholder{color:#899295}:-ms-input-placeholder{color:#899295}.wrap{max-width:1200px;margin-left:auto;margin-right:auto;padding:0 20px}.wrap::after{clear:both;content:"";display:block}.dot{font-size:10px;color:rgba(137,146,149,0.6);margin:0 3px}ul,ol{list-style-type:none;margin:0;padding:0}dl{margin:0}dt{font-weight:600;margin:0}dd{margin:0}figure{margin:0}img,picture{margin:0;max-width:100%}body{color:#4A5659;font-family:"Lato",sans-serif;font-size:16px;font-weight:400;line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-family:"Roboto Slab",serif;line-height:1.4;font-weight:600;margin:0}h2{font-weight:400}p{margin:0}a{color:#23aad1;text-decoration:none;transition:all 350ms ease}a:active,a:focus,a:hover{color:#DC322F;text-decoration:underline}hr{border-bottom:1px solid #D0D9DA;border-left:0;border-right:0;border-top:0;margin:0}#site-header{background:#002B36}#site-header .new-on-the-blog{background:rgba(0,43,54,0.8);text-align:center;padding:8px 0;color:#fff;transition:all 350ms ease;position:relative}#site-header .new-on-the-blog span{position:absolute;right:20px;top:3px;z-index:1;cursor:pointer;font-size:1.275rem;opacity:0.6;transition:all 350ms ease}#site-header .new-on-the-blog span:hover{opacity:1}#site-header .new-on-the-blog a{color:#fff;text-decoration:underline}#site-header .new-on-the-blog a:active,#site-header .new-on-the-blog a:focus,#site-header .new-on-the-blog a:hover{text-decoration:none}#site-header.header-home{background:none}#site-header.header-home .header-background{background:rgba(0,43,54,0.45);position:relative;padding-bottom:150px}#site-header.header-home .header-background:before{content:"";position:absolute;background:url("../img/frontpage/background-header-home.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.inner-text{position:relative;float:left;display:block;margin-right:2.35765%;width:65.88078%}.inner-text h1{font-family:"Lato",sans-serif;font-size:2.813rem;font-weight:700;color:#fff;margin:30px 0 15px 0}.inner-text p{font-size:1.25rem;color:#fff;margin-bottom:30px}.inner-text:last-child{margin-right:0}@media (max-width: 992px){.inner-text{float:left;display:block;margin-right:2.35765%;width:100%}.inner-text:last-child{margin-right:0}.inner-text h1{font-size:2.213rem;margin:0 0 15px 0}}.scala-main-resources{height:177px;background:#002B36;position:relative}.scala-main-resources .resources .button{font-size:1.063rem;display:block;border-top-left-radius:200px;border-top-right-radius:200px;border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:200px;border-top-left-radius:200px;padding:20px 40px}.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-left:17.05961%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:31.76157%}.scala-main-resources .resources .api-docs:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button{text-align:right;border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:200px;border-top-right-radius:200px;border-bottom-left-radius:200px;border-bottom-right-radius:200px;border-bottom-left-radius:0;border-top-left-radius:0}@media (max-width: 992px){.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-left:0%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-right:0}.scala-main-resources .resources .api-docs:last-child{margin-right:0}}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{margin-top:-40px}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{margin-top:12px;max-width:180px;text-align:center}.scala-main-resources .resources .api-docs ul li:first-child,.scala-main-resources .resources .download ul li:first-child{border-bottom:1px solid rgba(255,255,255,0.14);font-family:"Roboto Slab",serif;padding-bottom:4px;margin-bottom:2px}.scala-main-resources .resources .api-docs ul li a,.scala-main-resources .resources .download ul li a{color:rgba(255,255,255,0.7);font-size:.875rem}.scala-main-resources .resources .api-docs ul li a:active,.scala-main-resources .resources .api-docs ul li a:focus,.scala-main-resources .resources .api-docs ul li a:hover,.scala-main-resources .resources .download ul li a:active,.scala-main-resources .resources .download ul li a:focus,.scala-main-resources .resources .download ul li a:hover{text-decoration:none;color:#fff}.scala-main-resources .resources .api-docs ul{float:right}.scala-main-resources .resources .scala-brand-circle{width:340px;height:340px;left:50%;top:-178px;margin-left:-170px;background:rgba(0,43,54,0.4);border-radius:100%;position:absolute;z-index:60;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center}.scala-main-resources .resources .scala-brand-circle .circle-solid{background:#002B36;width:224px;height:224px;border-radius:100%;text-align:center}.scala-main-resources .resources .scala-brand-circle .circle-solid img{width:152px;height:auto;margin-top:-28px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span{display:block;color:#fff;font-family:"Roboto Slab",serif}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:first-child{font-size:1.375rem;margin-top:-9px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:last-child{font-size:1.9rem;margin-top:-10px}@media (max-width: 768px){.scala-main-resources{height:auto;padding-bottom:50px}.scala-main-resources .resources .download{margin-top:140px}.scala-main-resources .resources .api-docs{margin-top:40px}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:100%}.scala-main-resources .resources .api-docs:last-child,.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button,.scala-main-resources .resources .download .button{border-radius:100px;padding:10px 20px;font-size:16px;text-align:center}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{max-width:100%;float:none}.scala-main-resources .resources .scala-brand-circle{transform:scale(0.8)}}#site-main section{padding:50px 0}#site-main .spire{min-height:330px;background:rgba(0,43,54,0.4);position:relative;padding:0}#site-main .spire:before{content:"";position:absolute;background:url("../img/frontpage/epfl-bc.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.navigation{padding:30px 0;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.navigation .navigation-bdand img{width:104px;height:43px}.navigation .navigation-panel-button{display:none;font-size:1.333rem;color:#fff;cursor:pointer}@media (max-width: 992px){.navigation .navigation-panel-button{order:3;display:block}}.navigation .navigation-menu .navigation-menu-item{display:inline-block}.navigation .navigation-menu .navigation-menu-item:last-child{margin-right:0}.navigation .navigation-menu .navigation-menu-item a{padding:5px 15px;text-transform:uppercase;color:#fff;border-radius:300px;font-weight:700}.navigation .navigation-menu .navigation-menu-item a:active,.navigation .navigation-menu .navigation-menu-item a:focus,.navigation .navigation-menu .navigation-menu-item a:hover{background:#DC322F;text-decoration:none}@media (max-width: 992px){.navigation .navigation-menu{padding:20px;position:fixed;top:0;right:0;bottom:0;left:auto;height:100%;width:270px;-webkit-transform:translateX(270px);-moz-transform:translateX(270px);-ms-transform:translateX(270px);-o-transform:translateX(270px);transform:translateX(270px);-webkit-transition:all 0.25s linear;-moz-transition:all 0.25s linear;transition:all 0.25s linear;background:#fff;-webkit-overflow-scrolling:touch;overflow-y:auto;z-index:100;background:rgba(0,43,54,0.99)}.navigation .navigation-menu.is-visible{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}.navigation .navigation-menu .navigation-menu-item{margin-right:16px;padding:10px 0;display:block}}.navigation-fade-screen{position:fixed;top:0;right:0;bottom:0;left:0;-webkit-transition:all 0.15s ease-out 0s;-moz-transition:all 0.15s ease-out 0s;transition:all 0.15s ease-out 0s;background:#000;opacity:0;visibility:hidden;z-index:90}.navigation-fade-screen.is-visible{opacity:0.6;visibility:visible}.twitter-feed{background:#5CC6E4}.twitter-feed .heading-line h2 span{background:#5CC6E4}.twitter-feed .heading-line h2:before{background:rgba(255,255,255,0.5)}.twitter-feed .slider-twitter ul li{padding:0 15px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:stretch;-moz-box-align:stretch;box-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;-ms-align-items:stretch;-o-align-items:stretch;align-items:stretch;-ms-flex-align:stretch;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}@media (max-width: 992px){.twitter-feed .slider-twitter ul li{display:block}}.twitter-feed .slider-twitter ul li .item-tweet{padding:20px;background:#fff;border-radius:3px;transition:all 350ms ease;max-width:360px;margin-right:20px}@media (max-width: 992px){.twitter-feed .slider-twitter ul li .item-tweet{max-width:100%;margin-right:0;margin-bottom:20px}}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}.twitter-feed .slider-twitter ul li .item-tweet img{border-radius:3px;width:44px;height:auto;float:left}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text{margin-left:64px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li{padding:0;margin-right:6px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user{font-size:1.063rem;font-weight:700;color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a{color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:hover{color:#DC322F;text-decoration:none}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.username{font-size:.875rem;color:#899295;font-weight:600}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet .date{font-size:.875rem;color:#899295}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p{font-size:.9375rem}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag{color:rgba(137,146,149,0.7)}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:hover{color:#899295}.twitter-feed .slider-twitter ul li .item-tweet:hover{background:rgba(255,255,255,0.88)}.twitter-feed .call-to-action p{color:#fff}.ides{background:#073642}.ides ul{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:distribute;-moz-box-pack:distribute;box-pack:distribute;-webkit-justify-content:space-around;-moz-justify-content:space-around;-ms-justify-content:space-around;-o-justify-content:space-around;justify-content:space-around;-ms-flex-pack:distribute}.ides ul li{text-align:center;position:relative}.ides ul li:nth-child(2n){width:1px;height:94px;background:rgba(255,255,255,0.14)}.ides ul li a{display:inline-block;color:rgba(255,255,255,0.5);font-family:"Roboto Slab",serif}.ides ul li a .bullet{position:absolute;top:-12px;right:-14px;background:#15414C;border-radius:100%;width:24px;height:24px;z-index:10;transition:all 350ms ease;text-align:center}.ides ul li a .bullet img{width:16px;height:16px;margin-top:4px}.ides ul li a.sublime .bullet{top:-10px;right:0}.ides ul li a img{height:56px;width:auto;margin-bottom:6px;opacity:0.4;transition:all 350ms ease}.ides ul li a span{display:block;font-size:.875rem}.ides ul li a:hover{color:#fff;text-decoration:none}.ides ul li a:hover img{opacity:1}.ides ul li a:hover .bullet{background:#859900}.nutshell{background:#15414C}.nutshell .heading-line h2 span{background:#15414C}.nutshell .scala-items-list .items-menu .scala-item{float:left;display:block;margin-right:2.35765%;width:31.76157%;padding:20px;text-align:center;transition:all 350ms ease;min-height:165px}.nutshell .scala-items-list .items-menu .scala-item:last-child{margin-right:0}.nutshell .scala-items-list .items-menu .scala-item:nth-child(3n){margin-right:0}.nutshell .scala-items-list .items-menu .scala-item:nth-child(3n+1){clear:left}@media (max-width: 768px){.nutshell .scala-items-list .items-menu .scala-item{float:left;display:block;margin-right:2.35765%;width:100%}.nutshell .scala-items-list .items-menu .scala-item:last-child{margin-right:0}}.nutshell .scala-items-list .items-menu .scala-item h3{color:#fff;font-size:1.063rem;text-transform:uppercase;font-family:"Lato",sans-serif;margin-bottom:10px}.nutshell .scala-items-list .items-menu .scala-item p{color:rgba(255,255,255,0.7);font-size:1.063rem}.nutshell .scala-items-list .items-menu .scala-item:active,.nutshell .scala-items-list .items-menu .scala-item:focus,.nutshell .scala-items-list .items-menu .scala-item:hover{cursor:pointer;background:#073642}.nutshell .scala-items-list .items-menu .scala-item.active{background:#073642}.nutshell .scala-items-list .items-menu .items-content{background:#073642;transition:all 350ms ease}.nutshell .scala-items-list .items-menu .items-content .items-code{display:none;background:#073642;padding:65px 0}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code{float:left;display:block;margin-right:2.35765%;width:48.82117%}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code:last-child{margin-right:0}@media (max-width: 992px){.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code{float:left;display:block;margin-right:2.35765%;width:100%}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code:last-child{margin-right:0}}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element{margin-bottom:20px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element pre{margin-top:0}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element code{padding:20px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element .bar-code{background:#B4BBBD;text-align:center;padding:2px 0;font-size:.875rem;font-weight:600;min-height:26px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element .hljs{background:rgba(0,43,54,0.8)}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text{float:left;display:block;margin-right:2.35765%;width:48.82117%}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text code{background:#002B36;padding:2px 8px;color:#859900;border-radius:2px;margin:0 3px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text:last-child{margin-right:0}@media (max-width: 992px){.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text{float:left;display:block;margin-right:2.35765%;width:100%}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text:last-child{margin-right:0}}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text h3{font-size:1.625rem;color:#fff;margin-bottom:20px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text p{color:rgba(255,255,255,0.7)}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text.scala-text-large{float:left;display:block;margin-right:2.35765%;width:100%;margin-bottom:30px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text.scala-text-large:last-child{margin-right:0}.nutshell .scala-item-expanded{display:none;height:400px;background:#073642}.courses{background:#244E58}.courses .heading-line h2 span{background:#244E58}.courses .online-courses,.courses .upcoming-training{float:left;display:block;margin-right:2.35765%;width:48.82117%}.courses .online-courses:last-child,.courses .upcoming-training:last-child{margin-right:0}@media (max-width: 992px){.courses .online-courses,.courses .upcoming-training{float:left;display:block;margin-right:2.35765%;width:100%}.courses .online-courses:last-child,.courses .upcoming-training:last-child{margin-right:0}}@media (max-width: 992px){.courses .online-courses{margin-bottom:40px}}.upcoming-events{background:#15414C}.upcoming-events .heading-line h2 span{background:#15414C}.upcoming-events .events-items-list::after{clear:both;content:"";display:block}.upcoming-events .events-items-list .event-item{float:left;display:block;margin-right:2.35765%;width:31.76157%}.upcoming-events .events-items-list .event-item:last-child{margin-right:0}.upcoming-events .events-items-list .event-item:nth-child(3n){margin-right:0}.upcoming-events .events-items-list .event-item:nth-child(3n+1){clear:left}@media (max-width: 992px){.upcoming-events .events-items-list .event-item{float:left;display:block;margin-right:2.35765%;width:100%}.upcoming-events .events-items-list .event-item:last-child{margin-right:0}}.upcoming-events .card{background:#073642}.upcoming-events .card:hover{background:#002B36}#site-main .scala-ecosystem{padding-bottom:0;background:url("../img/frontpage/background-scala-ecosystem.png") no-repeat center bottom #244E58;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover}#site-main .scala-ecosystem .heading-line::after{clear:both;content:"";display:block}#site-main .scala-ecosystem .heading-line h2 span{background:#234D57}#site-main .scala-ecosystem .heading-line p{font-size:1.063rem;color:rgba(255,255,255,0.7);margin-top:10px;float:left;display:block;margin-right:2.35765%;width:65.88078%;margin-left:17.05961%}#site-main .scala-ecosystem .heading-line p:last-child{margin-right:0}@media (max-width: 768px){#site-main .scala-ecosystem .heading-line p{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}#site-main .scala-ecosystem .heading-line p:last-child{margin-right:0}}#site-main .scala-ecosystem .browser .header-browser{background:#073642;padding:14px 20px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}#site-main .scala-ecosystem .browser .header-browser img{width:116px;height:auto}#site-main .scala-ecosystem .browser .header-browser img:last-child{width:86px;height:auto}#site-main .scala-ecosystem .browser .main-browser{background:rgba(21,65,76,0.5);transition:all 350ms ease;text-align:center;padding:70px 0 80px 0}#site-main .scala-ecosystem .browser .main-browser h2{color:#fff;font-size:2.5rem;margin-bottom:24px}#site-main .scala-ecosystem .browser .main-browser .input-control{position:relative;background:#333;width:550px;margin-left:auto;margin-right:auto;color:#899295}#site-main .scala-ecosystem .browser .main-browser .input-control span{position:absolute;left:20px;top:8px}#site-main .scala-ecosystem .browser .main-browser .input-control input{padding:12px 18px 12px 50px;border-radius:2px;width:100%;font-weight:600}@media (max-width: 768px){#site-main .scala-ecosystem .browser .main-browser{padding-left:20px;padding-right:20px}#site-main .scala-ecosystem .browser .main-browser h2{font-size:1.4rem}#site-main .scala-ecosystem .browser .main-browser .input-control{width:100%}}#site-main .scala-ecosystem:hover .main-browser{background:#15414C;padding-bottom:140px}.new-blog{background:#F0F3F3}.new-blog .heading-line h2{color:#073642}.new-blog .heading-line h2 span{background:#F0F3F3}.new-blog .heading-line h2:before{background:#D0D9DA}.new-blog .new,.new-blog .recently{float:left;display:block;margin-right:2.35765%;width:48.82117%}.new-blog .new:last-child,.new-blog .recently:last-child{margin-right:0}@media (max-width: 992px){.new-blog .new,.new-blog .recently{float:left;display:block;margin-right:2.35765%;width:100%}.new-blog .new:last-child,.new-blog .recently:last-child{margin-right:0}}.new-blog .new h3,.new-blog .recently h3{font-family:"Lato",sans-serif;text-transform:uppercase;border-bottom:1px solid #D0D9DA;font-size:1.063rem}.new-blog .new .content-card,.new-blog .recently .content-card{background:#fff;padding:22px;display:block;border-radius:3px}@media (max-width: 992px){.new-blog .new{margin-bottom:40px}}.new-blog .new .content-card{height:516px;overflow:hidden;position:relative}.new-blog .new .content-card:before{content:"";position:absolute;background:#fff;left:0;bottom:0;width:100%;height:20px;z-index:1}.new-blog .new .tag-new{text-transform:uppercase;font-size:.9375rem;color:#DC322F;font-weight:700}.new-blog .new h3{font-size:1.5rem;color:#073642;padding-bottom:15px;margin-bottom:15px}.new-blog .new h3 a{color:#073642}.new-blog .new h3 a:active,.new-blog .new h3 a:focus,.new-blog .new h3 a:hover{text-decoration:none;color:#DC322F}.new-blog .new .date{color:#899295;display:block;margin-bottom:5px;font-style:italic}.new-blog .recently a{margin-bottom:16px}.new-blog .recently a h3{color:#073642;transition:all 350ms ease;padding-bottom:8px;margin-bottom:6px}.new-blog .recently a ul{position:relative;margin-bottom:4px}.new-blog .recently a ul li{color:#899295;font-size:.875rem;display:inline-block}.new-blog .recently a ul li.dot{font-size:10px}.new-blog .recently a ul li.tag{position:absolute;right:0;top:3px;background:#DC322F;color:#fff;text-transform:uppercase;font-size:11px;font-weight:700;padding:1px 5px}.new-blog .recently a p{color:#4A5659}.new-blog .recently a:active,.new-blog .recently a:focus,.new-blog .recently a:hover{text-decoration:none;box-shadow:rgba(0,43,54,0.2) 0 1px 12px}.new-blog .recently a:active h3,.new-blog .recently a:focus h3,.new-blog .recently a:hover h3{color:#765;color:#DC322F}.talk-to-us .heading-line h2{color:#073642}.talk-to-us .heading-line h2 span{background:#fff}.talk-to-us .heading-line h2:before{background:#D0D9DA}.talk-to-us h3{text-align:center;color:#073642;font-size:.9375rem;margin-bottom:40px}.talk-to-us .discourse,.talk-to-us .gitter{margin-bottom:50px}.talk-to-us .discourse::after,.talk-to-us .gitter::after{clear:both;content:"";display:block}.talk-to-us .discourse .scala-user-discourse{margin-left:17.05961%}.talk-to-us .discourse .scala-contributors-discourse,.talk-to-us .discourse .scala-user-discourse{padding:20px;text-align:center;float:left;display:block;margin-right:2.35765%;width:31.76157%}.talk-to-us .discourse .scala-contributors-discourse img,.talk-to-us .discourse .scala-user-discourse img{width:34px;height:auto}.talk-to-us .discourse .scala-contributors-discourse h4,.talk-to-us .discourse .scala-user-discourse h4{font-family:"Lato",sans-serif;font-size:1.063rem;text-transform:uppercase;color:#073642;margin:12px 0 8px}.talk-to-us .discourse .scala-contributors-discourse p,.talk-to-us .discourse .scala-user-discourse p{color:#4A5659}.talk-to-us .discourse .scala-contributors-discourse:active,.talk-to-us .discourse .scala-contributors-discourse:focus,.talk-to-us .discourse .scala-contributors-discourse:hover,.talk-to-us .discourse .scala-user-discourse:active,.talk-to-us .discourse .scala-user-discourse:focus,.talk-to-us .discourse .scala-user-discourse:hover{text-decoration:none;background:#F0F3F3;border-radius:2px}.talk-to-us .discourse .scala-contributors-discourse:active h4,.talk-to-us .discourse .scala-contributors-discourse:focus h4,.talk-to-us .discourse .scala-contributors-discourse:hover h4,.talk-to-us .discourse .scala-user-discourse:active h4,.talk-to-us .discourse .scala-user-discourse:focus h4,.talk-to-us .discourse .scala-user-discourse:hover h4{color:#DC322F}.talk-to-us .discourse .scala-contributors-discourse:last-child,.talk-to-us .discourse .scala-user-discourse:last-child{margin-right:0}@media (max-width: 992px){.talk-to-us .discourse .scala-contributors-discourse,.talk-to-us .discourse .scala-user-discourse{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}.talk-to-us .discourse .scala-contributors-discourse:last-child,.talk-to-us .discourse .scala-user-discourse:last-child{margin-right:0}}.talk-to-us .gitter ul.first{margin-left:17.05961%}.talk-to-us .gitter ul.first li:last-child{border-bottom:1px solid #D0D9DA}.talk-to-us .gitter ul,.talk-to-us .gitter ul.first{float:left;display:block;margin-right:2.35765%;width:31.76157%}.talk-to-us .gitter ul:last-child,.talk-to-us .gitter ul.first:last-child{margin-right:0}@media (max-width: 768px){.talk-to-us .gitter ul,.talk-to-us .gitter ul.first{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}.talk-to-us .gitter ul:last-child,.talk-to-us .gitter ul.first:last-child{margin-right:0}.talk-to-us .gitter ul li:last-child,.talk-to-us .gitter ul.first li:last-child{border-bottom:none}}.talk-to-us .gitter ul li{border-top:1px solid #D0D9DA}.talk-to-us .gitter ul li a{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;-o-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;padding:14px 0;color:#4A5659;font-weight:700;padding-left:30px}.talk-to-us .gitter ul li a:active,.talk-to-us .gitter ul li a:focus,.talk-to-us .gitter ul li a:hover{background:#F0F3F3;text-decoration:none}.talk-to-us .gitter ul li a img{width:28px;height:auto;margin-right:10px}.talk-to-us .gitter ul li:last-child{border-bottom:1px solid #D0D9DA}.talk-to-us .communities ul{text-align:center}.talk-to-us .communities ul li{display:inline-block}.talk-to-us .communities ul li:first-child{margin-right:20px}.talk-to-us .communities ul li:first-child img{width:127px;height:auto}.talk-to-us .communities ul li:last-child img{width:131px;height:auto}.talk-to-us .communities ul li a:active,.talk-to-us .communities ul li a:focus,.talk-to-us .communities ul li a:hover{opacity:0.7}.talk-to-us .social{margin-top:40px;text-align:center}.talk-to-us .social ul li{display:inline-block;font-size:1.75rem}.talk-to-us .social ul li:first-child{margin-right:14px}.talk-to-us .social ul li a{color:#15414C}.talk-to-us .social ul li a:active,.talk-to-us .social ul li a:focus,.talk-to-us .social ul li a:hover{color:#DC322F}.maintenance{background:#073642}.maintenance .heading-line h2 span{background:#073642}.maintenance h3{color:#fff;text-align:center;font-size:0.9375rem}.maintenance .maintained{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center;flex-wrap:wrap;margin-bottom:40px}.maintenance .maintained li:first-child{margin-right:32px}.maintenance .maintained li a img{height:43px;width:auto;opacity:0.3;transition:all 350ms ease}.maintenance .maintained li a:hover img{opacity:1}@media (max-width: 480px){.maintenance .maintained li:first-child{margin-right:0}}.maintenance .supported{padding-top:30px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify;flex-wrap:wrap}.maintenance .supported a img{display:block;opacity:0.3;transition:all 350ms ease}@media (max-width: 992px){.maintenance .supported a img{margin:5px}}@media (max-width: 768px){.maintenance .supported a img{margin:10px}}.maintenance .supported a:hover img{opacity:1}#site-footer{padding:50px 0;background:#002B36;color:rgba(255,255,255,0.5)}#site-footer ul{float:left;display:block;margin-right:2.35765%;width:14.70196%}#site-footer ul:last-child{margin-right:0}@media (max-width: 992px){#site-footer ul{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-bottom:20px}#site-footer ul:last-child{margin-right:0}#site-footer ul:nth-child(3n){margin-right:0}#site-footer ul:nth-child(3n+1){clear:left}}@media (max-width: 480px){#site-footer ul{float:left;display:block;margin-right:2.35765%;width:100%;text-align:center}#site-footer ul:last-child{margin-right:0}}#site-footer ul li{margin-bottom:3px}#site-footer ul li h3{color:#fff;margin-bottom:10px;text-transform:uppercase;font-family:"Lato",sans-serif;font-weight:700;font-size:1.063rem}#site-footer ul li a{color:rgba(255,255,255,0.5);font-size:.9375rem}#site-footer ul li a:active,#site-footer ul li a:focus,#site-footer ul li a:hover{color:#fff;text-decoration:none}#site-footer .site-footer-top{margin-bottom:40px}#site-footer .site-footer-top::after{clear:both;content:"";display:block}#site-footer .site-footer-bottom{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}@media (max-width: 480px){#site-footer .site-footer-bottom{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;-o-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;flex-wrap:wrap}#site-footer .site-footer-bottom img{margin-top:18px}}#site-footer .site-footer-bottom img{opacity:0.4;margin-right:65px}.marker{position:absolute;width:16px;height:8px;background:#A4302E;right:-50px;top:100px;border-radius:100%;cursor:pointer}.marker:hover .info-marker,.marker:hover .arrow{visibility:visible;opacity:1;transition:all 350ms ease}.marker:before{content:"";position:absolute;background:rgba(164,48,46,0.3);left:-8px;top:-4px;width:32px;height:16px;border-radius:100%;z-index:1}.marker .info-marker{width:472px;position:absolute;left:-13px;top:30px;font-size:.875rem;color:#fff;font-family:"Roboto Slab",serif;background:rgba(7,54,66,0.8);padding:20px;visibility:hidden;opacity:0}.marker .info-marker .arrow{position:absolute;left:0;top:-16px;width:23px;height:13px;z-index:1}.button{padding:8px 18px;font-size:.875rem;font-weight:700;text-transform:uppercase;color:#fff;background:#859900;border-radius:3px;display:inline-block}.button:active,.button:focus,.button:hover{text-decoration:none;color:#fff;background:#DC322F}.call-to-action{text-align:center;margin-top:40px}.call-to-action.action-medium{margin-top:30px}.call-to-action.action-small{margin-top:20px}.call-to-action p{font-size:.875rem;color:rgba(255,255,255,0.7)}.call-to-action p.align-top{margin-bottom:12px}.call-to-action p.align-bottom{margin-top:12px}.call-to-action p a{text-decoration:underline;color:rgba(255,255,255,0.7)}.call-to-action p a:active,.call-to-action p a:focus,.call-to-action p a:hover{color:#fff}.unslider ul li{padding:0 1px}.unslider .unslider-arrow{display:none}.unslider .unslider-nav{margin-top:10px}@media (max-width: 992px){.unslider .unslider-nav{margin-top:10px}}.unslider .unslider-nav ol li{width:7px;height:7px;border:none;background:rgba(255,255,255,0.3)}.unslider .unslider-nav ol li.unslider-active{pointer-events:none;background:#fff}.heading-line{margin-bottom:40px;text-align:center}.heading-line h2{color:#fff;position:relative;font-size:1.375rem}.heading-line h2 span{padding:0 30px;position:relative;background:#073642;z-index:5}.heading-line h2:before{content:"";display:block;height:1px;position:absolute;top:50%;width:100%;background:rgba(255,255,255,0.14)}.heading-line .sub-heading{font-size:.875rem;color:rgba(255,255,255,0.7);font-style:italic}.card{padding:18px;border-radius:3px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;background:#15414C;transition:all 350ms ease;margin-bottom:14px}.card:hover{background:#073642}.card img{width:28px;height:28px;border-radius:2px}.card .card-text{margin-left:14px}.card .card-text h4{font-family:"Lato",sans-serif;font-size:1.063rem;color:#fff}.card .card-text ul li{color:rgba(255,255,255,0.7);display:inline-block}.card .card-text ul li.online-courses-price,.card .card-text ul li.event-location{font-size:.75rem;text-transform:uppercase}.card .card-text ul li.online-courses-date,.card .card-text ul li.date-event{font-size:.875rem}.card .card-text ul li.dot{color:rgba(255,255,255,0.4)}.card:active,.card:focus,.card:hover{text-decoration:none}.calendar{width:28px;height:32px;background:#fff;border-radius:2px;overflow:hidden}.calendar span{display:block;font-size:10px;font-weight:700;text-align:center}.calendar span:first-child{background:#DC322F;color:#fff}a .calendar span:last-child{color:#073642;font-size:12px;margin-top:-1px} diff --git a/resources/js/functions.js b/resources/js/functions.js index 94a9bf8c5..bf457039d 100644 --- a/resources/js/functions.js +++ b/resources/js/functions.js @@ -1,23 +1,49 @@ -// Sliding Panel -$(document).ready(function () { - $('.navigation-panel-button,.navigation-fade-screen,.navigation-panel-close').on('click touchstart', function (e) { - $('.navigation-menu,.navigation-fade-screen').toggleClass('is-visible'); - e.preventDefault(); - }); -}); +// Sliding Panel and scala in a nutshell +$(document).ready(function() { + $('.navigation-panel-button,.navigation-fade-screen,.navigation-panel-close').on('click touchstart', function(e) { + $('.navigation-menu,.navigation-fade-screen').toggleClass('is-visible'); + e.preventDefault(); + }); + var menus = $('.items-menu'); + var allContents = $('.items-code'); + var allButtons = $('.scala-item'); + menus.each(function(index1, row) { + var row = $(row); + var items = row.find('.scala-item'); + var content = row.children('.items-content'); + var contents = content.children('.items-code'); -$(".hide").click(function(){ - $(".new-on-the-blog").hide(); + items.each(function(index2, button) { + var jButton = $(button); + jButton.click(function(event) { + var activeCode = contents.eq(index2); + var others = allContents.not(activeCode); + allButtons.removeClass('active'); + others.hide(); + + if (activeCode.is(":visible")) { + activeCode.hide(); + } else { + jButton.addClass('active') + activeCode.show(); + } + + }); + }); + }); }); -// Expanded -$('.open-scala-expanded').click(function(){ - $('.scala-item-expanded').slideToggle('slow'); +// Highlight +hljs.initHighlightingOnLoad(); + +// Show Blog +$(".hide").click(function() { + $(".new-on-the-blog").hide(); }); -// Tweet feed in frontpage +//Tweet feed in frontpage $('#tweet-feed').tweetMachine('', { backendScript: '/resources/php/getFromTwitter.php', endpoint: 'statuses/user_timeline', @@ -44,12 +70,11 @@ $('#tweet-feed').tweetMachine('', { ` }, function(tweets, tweetsDisplayed) { - $('.slider-twitter').unslider({ - }); - }); + $('.slider-twitter').unslider({}); +}); + -// Scaladex search autocomplete -$('#scaladex-search').autocomplete({ +/*$('#scaladex-search').autocomplete({ paramName: 'q', serviceUrl: 'https://scaladex.scala-lang.org/api/autocomplete', dataType: 'json', @@ -60,4 +85,4 @@ $('#scaladex-search').autocomplete({ }) }; } -}) \ No newline at end of file +})*/ From 923bae6eb97632bda18d716b03a3e64369303a50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Mon, 23 Jan 2017 10:46:35 +0100 Subject: [PATCH 032/120] Updated CSS to fix a problem with the scala-in-a-nutshell section while in responsive mode --- resources/css/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/css/style.css b/resources/css/style.css index 47be5c270..036c1a054 100644 --- a/resources/css/style.css +++ b/resources/css/style.css @@ -1 +1 @@ -@import url("https://fonts.googleapis.com/css?family=Lato:400,400i,700");@import url("https://fonts.googleapis.com/css?family=Roboto+Slab:400,700");html{box-sizing:border-box}*,*::after,*::before{box-sizing:inherit}.unslider{overflow:auto;margin:0;padding:0}.unslider-wrap{position:relative}.unslider-wrap.unslider-carousel>li{float:left}.unslider-vertical>ul{height:100%}.unslider-vertical li{float:none;width:100%}.unslider-fade{position:relative}.unslider-fade .unslider-wrap li{position:absolute;left:0;top:0;right:0;z-index:8}.unslider-fade .unslider-wrap li.unslider-active{z-index:10}.unslider ul,.unslider ol,.unslider li{list-style:none;margin:0;padding:0;border:none}.unslider-arrow{position:absolute;left:20px;z-index:2;cursor:pointer}.unslider-arrow.next{left:auto;right:20px}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}html,body{height:100%;margin:0}input,select,textarea{font-family:"Lato",sans-serif;font-size:1.063rem;display:block;appearance:none;border:none}::-webkit-input-placeholder{color:#899295}:-moz-placeholder{color:#899295}::-moz-placeholder{color:#899295}:-ms-input-placeholder{color:#899295}.wrap{max-width:1200px;margin-left:auto;margin-right:auto;padding:0 20px}.wrap::after{clear:both;content:"";display:block}.dot{font-size:10px;color:rgba(137,146,149,0.6);margin:0 3px}ul,ol{list-style-type:none;margin:0;padding:0}dl{margin:0}dt{font-weight:600;margin:0}dd{margin:0}figure{margin:0}img,picture{margin:0;max-width:100%}body{color:#4A5659;font-family:"Lato",sans-serif;font-size:16px;font-weight:400;line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-family:"Roboto Slab",serif;line-height:1.4;font-weight:600;margin:0}h2{font-weight:400}p{margin:0}a{color:#23aad1;text-decoration:none;transition:all 350ms ease}a:active,a:focus,a:hover{color:#DC322F;text-decoration:underline}hr{border-bottom:1px solid #D0D9DA;border-left:0;border-right:0;border-top:0;margin:0}#site-header{background:#002B36}#site-header .new-on-the-blog{background:rgba(0,43,54,0.8);text-align:center;padding:8px 0;color:#fff;transition:all 350ms ease;position:relative}#site-header .new-on-the-blog span{position:absolute;right:20px;top:3px;z-index:1;cursor:pointer;font-size:1.275rem;opacity:0.6;transition:all 350ms ease}#site-header .new-on-the-blog span:hover{opacity:1}#site-header .new-on-the-blog a{color:#fff;text-decoration:underline}#site-header .new-on-the-blog a:active,#site-header .new-on-the-blog a:focus,#site-header .new-on-the-blog a:hover{text-decoration:none}#site-header.header-home{background:none}#site-header.header-home .header-background{background:rgba(0,43,54,0.45);position:relative;padding-bottom:150px}#site-header.header-home .header-background:before{content:"";position:absolute;background:url("../img/frontpage/background-header-home.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.inner-text{position:relative;float:left;display:block;margin-right:2.35765%;width:65.88078%}.inner-text h1{font-family:"Lato",sans-serif;font-size:2.813rem;font-weight:700;color:#fff;margin:30px 0 15px 0}.inner-text p{font-size:1.25rem;color:#fff;margin-bottom:30px}.inner-text:last-child{margin-right:0}@media (max-width: 992px){.inner-text{float:left;display:block;margin-right:2.35765%;width:100%}.inner-text:last-child{margin-right:0}.inner-text h1{font-size:2.213rem;margin:0 0 15px 0}}.scala-main-resources{height:177px;background:#002B36;position:relative}.scala-main-resources .resources .button{font-size:1.063rem;display:block;border-top-left-radius:200px;border-top-right-radius:200px;border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:200px;border-top-left-radius:200px;padding:20px 40px}.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-left:17.05961%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:31.76157%}.scala-main-resources .resources .api-docs:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button{text-align:right;border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:200px;border-top-right-radius:200px;border-bottom-left-radius:200px;border-bottom-right-radius:200px;border-bottom-left-radius:0;border-top-left-radius:0}@media (max-width: 992px){.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-left:0%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-right:0}.scala-main-resources .resources .api-docs:last-child{margin-right:0}}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{margin-top:-40px}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{margin-top:12px;max-width:180px;text-align:center}.scala-main-resources .resources .api-docs ul li:first-child,.scala-main-resources .resources .download ul li:first-child{border-bottom:1px solid rgba(255,255,255,0.14);font-family:"Roboto Slab",serif;padding-bottom:4px;margin-bottom:2px}.scala-main-resources .resources .api-docs ul li a,.scala-main-resources .resources .download ul li a{color:rgba(255,255,255,0.7);font-size:.875rem}.scala-main-resources .resources .api-docs ul li a:active,.scala-main-resources .resources .api-docs ul li a:focus,.scala-main-resources .resources .api-docs ul li a:hover,.scala-main-resources .resources .download ul li a:active,.scala-main-resources .resources .download ul li a:focus,.scala-main-resources .resources .download ul li a:hover{text-decoration:none;color:#fff}.scala-main-resources .resources .api-docs ul{float:right}.scala-main-resources .resources .scala-brand-circle{width:340px;height:340px;left:50%;top:-178px;margin-left:-170px;background:rgba(0,43,54,0.4);border-radius:100%;position:absolute;z-index:60;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center}.scala-main-resources .resources .scala-brand-circle .circle-solid{background:#002B36;width:224px;height:224px;border-radius:100%;text-align:center}.scala-main-resources .resources .scala-brand-circle .circle-solid img{width:152px;height:auto;margin-top:-28px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span{display:block;color:#fff;font-family:"Roboto Slab",serif}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:first-child{font-size:1.375rem;margin-top:-9px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:last-child{font-size:1.9rem;margin-top:-10px}@media (max-width: 768px){.scala-main-resources{height:auto;padding-bottom:50px}.scala-main-resources .resources .download{margin-top:140px}.scala-main-resources .resources .api-docs{margin-top:40px}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:100%}.scala-main-resources .resources .api-docs:last-child,.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button,.scala-main-resources .resources .download .button{border-radius:100px;padding:10px 20px;font-size:16px;text-align:center}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{max-width:100%;float:none}.scala-main-resources .resources .scala-brand-circle{transform:scale(0.8)}}#site-main section{padding:50px 0}#site-main .spire{min-height:330px;background:rgba(0,43,54,0.4);position:relative;padding:0}#site-main .spire:before{content:"";position:absolute;background:url("../img/frontpage/epfl-bc.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.navigation{padding:30px 0;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.navigation .navigation-bdand img{width:104px;height:43px}.navigation .navigation-panel-button{display:none;font-size:1.333rem;color:#fff;cursor:pointer}@media (max-width: 992px){.navigation .navigation-panel-button{order:3;display:block}}.navigation .navigation-menu .navigation-menu-item{display:inline-block}.navigation .navigation-menu .navigation-menu-item:last-child{margin-right:0}.navigation .navigation-menu .navigation-menu-item a{padding:5px 15px;text-transform:uppercase;color:#fff;border-radius:300px;font-weight:700}.navigation .navigation-menu .navigation-menu-item a:active,.navigation .navigation-menu .navigation-menu-item a:focus,.navigation .navigation-menu .navigation-menu-item a:hover{background:#DC322F;text-decoration:none}@media (max-width: 992px){.navigation .navigation-menu{padding:20px;position:fixed;top:0;right:0;bottom:0;left:auto;height:100%;width:270px;-webkit-transform:translateX(270px);-moz-transform:translateX(270px);-ms-transform:translateX(270px);-o-transform:translateX(270px);transform:translateX(270px);-webkit-transition:all 0.25s linear;-moz-transition:all 0.25s linear;transition:all 0.25s linear;background:#fff;-webkit-overflow-scrolling:touch;overflow-y:auto;z-index:100;background:rgba(0,43,54,0.99)}.navigation .navigation-menu.is-visible{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}.navigation .navigation-menu .navigation-menu-item{margin-right:16px;padding:10px 0;display:block}}.navigation-fade-screen{position:fixed;top:0;right:0;bottom:0;left:0;-webkit-transition:all 0.15s ease-out 0s;-moz-transition:all 0.15s ease-out 0s;transition:all 0.15s ease-out 0s;background:#000;opacity:0;visibility:hidden;z-index:90}.navigation-fade-screen.is-visible{opacity:0.6;visibility:visible}.twitter-feed{background:#5CC6E4}.twitter-feed .heading-line h2 span{background:#5CC6E4}.twitter-feed .heading-line h2:before{background:rgba(255,255,255,0.5)}.twitter-feed .slider-twitter ul li{padding:0 15px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:stretch;-moz-box-align:stretch;box-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;-ms-align-items:stretch;-o-align-items:stretch;align-items:stretch;-ms-flex-align:stretch;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}@media (max-width: 992px){.twitter-feed .slider-twitter ul li{display:block}}.twitter-feed .slider-twitter ul li .item-tweet{padding:20px;background:#fff;border-radius:3px;transition:all 350ms ease;max-width:360px;margin-right:20px}@media (max-width: 992px){.twitter-feed .slider-twitter ul li .item-tweet{max-width:100%;margin-right:0;margin-bottom:20px}}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}.twitter-feed .slider-twitter ul li .item-tweet img{border-radius:3px;width:44px;height:auto;float:left}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text{margin-left:64px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li{padding:0;margin-right:6px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user{font-size:1.063rem;font-weight:700;color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a{color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:hover{color:#DC322F;text-decoration:none}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.username{font-size:.875rem;color:#899295;font-weight:600}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet .date{font-size:.875rem;color:#899295}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p{font-size:.9375rem}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag{color:rgba(137,146,149,0.7)}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:hover{color:#899295}.twitter-feed .slider-twitter ul li .item-tweet:hover{background:rgba(255,255,255,0.88)}.twitter-feed .call-to-action p{color:#fff}.ides{background:#073642}.ides ul{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:distribute;-moz-box-pack:distribute;box-pack:distribute;-webkit-justify-content:space-around;-moz-justify-content:space-around;-ms-justify-content:space-around;-o-justify-content:space-around;justify-content:space-around;-ms-flex-pack:distribute}.ides ul li{text-align:center;position:relative}.ides ul li:nth-child(2n){width:1px;height:94px;background:rgba(255,255,255,0.14)}.ides ul li a{display:inline-block;color:rgba(255,255,255,0.5);font-family:"Roboto Slab",serif}.ides ul li a .bullet{position:absolute;top:-12px;right:-14px;background:#15414C;border-radius:100%;width:24px;height:24px;z-index:10;transition:all 350ms ease;text-align:center}.ides ul li a .bullet img{width:16px;height:16px;margin-top:4px}.ides ul li a.sublime .bullet{top:-10px;right:0}.ides ul li a img{height:56px;width:auto;margin-bottom:6px;opacity:0.4;transition:all 350ms ease}.ides ul li a span{display:block;font-size:.875rem}.ides ul li a:hover{color:#fff;text-decoration:none}.ides ul li a:hover img{opacity:1}.ides ul li a:hover .bullet{background:#859900}.nutshell{background:#15414C}.nutshell .heading-line h2 span{background:#15414C}.nutshell .scala-items-list .items-menu .scala-item{float:left;display:block;margin-right:2.35765%;width:31.76157%;padding:20px;text-align:center;transition:all 350ms ease;min-height:165px}.nutshell .scala-items-list .items-menu .scala-item:last-child{margin-right:0}.nutshell .scala-items-list .items-menu .scala-item:nth-child(3n){margin-right:0}.nutshell .scala-items-list .items-menu .scala-item:nth-child(3n+1){clear:left}@media (max-width: 768px){.nutshell .scala-items-list .items-menu .scala-item{float:left;display:block;margin-right:2.35765%;width:100%}.nutshell .scala-items-list .items-menu .scala-item:last-child{margin-right:0}}.nutshell .scala-items-list .items-menu .scala-item h3{color:#fff;font-size:1.063rem;text-transform:uppercase;font-family:"Lato",sans-serif;margin-bottom:10px}.nutshell .scala-items-list .items-menu .scala-item p{color:rgba(255,255,255,0.7);font-size:1.063rem}.nutshell .scala-items-list .items-menu .scala-item:active,.nutshell .scala-items-list .items-menu .scala-item:focus,.nutshell .scala-items-list .items-menu .scala-item:hover{cursor:pointer;background:#073642}.nutshell .scala-items-list .items-menu .scala-item.active{background:#073642}.nutshell .scala-items-list .items-menu .items-content{background:#073642;transition:all 350ms ease}.nutshell .scala-items-list .items-menu .items-content .items-code{display:none;background:#073642;padding:65px 0}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code{float:left;display:block;margin-right:2.35765%;width:48.82117%}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code:last-child{margin-right:0}@media (max-width: 992px){.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code{float:left;display:block;margin-right:2.35765%;width:100%}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code:last-child{margin-right:0}}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element{margin-bottom:20px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element pre{margin-top:0}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element code{padding:20px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element .bar-code{background:#B4BBBD;text-align:center;padding:2px 0;font-size:.875rem;font-weight:600;min-height:26px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element .hljs{background:rgba(0,43,54,0.8)}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text{float:left;display:block;margin-right:2.35765%;width:48.82117%}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text code{background:#002B36;padding:2px 8px;color:#859900;border-radius:2px;margin:0 3px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text:last-child{margin-right:0}@media (max-width: 992px){.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text{float:left;display:block;margin-right:2.35765%;width:100%}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text:last-child{margin-right:0}}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text h3{font-size:1.625rem;color:#fff;margin-bottom:20px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text p{color:rgba(255,255,255,0.7)}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text.scala-text-large{float:left;display:block;margin-right:2.35765%;width:100%;margin-bottom:30px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text.scala-text-large:last-child{margin-right:0}.nutshell .scala-item-expanded{display:none;height:400px;background:#073642}.courses{background:#244E58}.courses .heading-line h2 span{background:#244E58}.courses .online-courses,.courses .upcoming-training{float:left;display:block;margin-right:2.35765%;width:48.82117%}.courses .online-courses:last-child,.courses .upcoming-training:last-child{margin-right:0}@media (max-width: 992px){.courses .online-courses,.courses .upcoming-training{float:left;display:block;margin-right:2.35765%;width:100%}.courses .online-courses:last-child,.courses .upcoming-training:last-child{margin-right:0}}@media (max-width: 992px){.courses .online-courses{margin-bottom:40px}}.upcoming-events{background:#15414C}.upcoming-events .heading-line h2 span{background:#15414C}.upcoming-events .events-items-list::after{clear:both;content:"";display:block}.upcoming-events .events-items-list .event-item{float:left;display:block;margin-right:2.35765%;width:31.76157%}.upcoming-events .events-items-list .event-item:last-child{margin-right:0}.upcoming-events .events-items-list .event-item:nth-child(3n){margin-right:0}.upcoming-events .events-items-list .event-item:nth-child(3n+1){clear:left}@media (max-width: 992px){.upcoming-events .events-items-list .event-item{float:left;display:block;margin-right:2.35765%;width:100%}.upcoming-events .events-items-list .event-item:last-child{margin-right:0}}.upcoming-events .card{background:#073642}.upcoming-events .card:hover{background:#002B36}#site-main .scala-ecosystem{padding-bottom:0;background:url("../img/frontpage/background-scala-ecosystem.png") no-repeat center bottom #244E58;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover}#site-main .scala-ecosystem .heading-line::after{clear:both;content:"";display:block}#site-main .scala-ecosystem .heading-line h2 span{background:#234D57}#site-main .scala-ecosystem .heading-line p{font-size:1.063rem;color:rgba(255,255,255,0.7);margin-top:10px;float:left;display:block;margin-right:2.35765%;width:65.88078%;margin-left:17.05961%}#site-main .scala-ecosystem .heading-line p:last-child{margin-right:0}@media (max-width: 768px){#site-main .scala-ecosystem .heading-line p{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}#site-main .scala-ecosystem .heading-line p:last-child{margin-right:0}}#site-main .scala-ecosystem .browser .header-browser{background:#073642;padding:14px 20px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}#site-main .scala-ecosystem .browser .header-browser img{width:116px;height:auto}#site-main .scala-ecosystem .browser .header-browser img:last-child{width:86px;height:auto}#site-main .scala-ecosystem .browser .main-browser{background:rgba(21,65,76,0.5);transition:all 350ms ease;text-align:center;padding:70px 0 80px 0}#site-main .scala-ecosystem .browser .main-browser h2{color:#fff;font-size:2.5rem;margin-bottom:24px}#site-main .scala-ecosystem .browser .main-browser .input-control{position:relative;background:#333;width:550px;margin-left:auto;margin-right:auto;color:#899295}#site-main .scala-ecosystem .browser .main-browser .input-control span{position:absolute;left:20px;top:8px}#site-main .scala-ecosystem .browser .main-browser .input-control input{padding:12px 18px 12px 50px;border-radius:2px;width:100%;font-weight:600}@media (max-width: 768px){#site-main .scala-ecosystem .browser .main-browser{padding-left:20px;padding-right:20px}#site-main .scala-ecosystem .browser .main-browser h2{font-size:1.4rem}#site-main .scala-ecosystem .browser .main-browser .input-control{width:100%}}#site-main .scala-ecosystem:hover .main-browser{background:#15414C;padding-bottom:140px}.new-blog{background:#F0F3F3}.new-blog .heading-line h2{color:#073642}.new-blog .heading-line h2 span{background:#F0F3F3}.new-blog .heading-line h2:before{background:#D0D9DA}.new-blog .new,.new-blog .recently{float:left;display:block;margin-right:2.35765%;width:48.82117%}.new-blog .new:last-child,.new-blog .recently:last-child{margin-right:0}@media (max-width: 992px){.new-blog .new,.new-blog .recently{float:left;display:block;margin-right:2.35765%;width:100%}.new-blog .new:last-child,.new-blog .recently:last-child{margin-right:0}}.new-blog .new h3,.new-blog .recently h3{font-family:"Lato",sans-serif;text-transform:uppercase;border-bottom:1px solid #D0D9DA;font-size:1.063rem}.new-blog .new .content-card,.new-blog .recently .content-card{background:#fff;padding:22px;display:block;border-radius:3px}@media (max-width: 992px){.new-blog .new{margin-bottom:40px}}.new-blog .new .content-card{height:516px;overflow:hidden;position:relative}.new-blog .new .content-card:before{content:"";position:absolute;background:#fff;left:0;bottom:0;width:100%;height:20px;z-index:1}.new-blog .new .tag-new{text-transform:uppercase;font-size:.9375rem;color:#DC322F;font-weight:700}.new-blog .new h3{font-size:1.5rem;color:#073642;padding-bottom:15px;margin-bottom:15px}.new-blog .new h3 a{color:#073642}.new-blog .new h3 a:active,.new-blog .new h3 a:focus,.new-blog .new h3 a:hover{text-decoration:none;color:#DC322F}.new-blog .new .date{color:#899295;display:block;margin-bottom:5px;font-style:italic}.new-blog .recently a{margin-bottom:16px}.new-blog .recently a h3{color:#073642;transition:all 350ms ease;padding-bottom:8px;margin-bottom:6px}.new-blog .recently a ul{position:relative;margin-bottom:4px}.new-blog .recently a ul li{color:#899295;font-size:.875rem;display:inline-block}.new-blog .recently a ul li.dot{font-size:10px}.new-blog .recently a ul li.tag{position:absolute;right:0;top:3px;background:#DC322F;color:#fff;text-transform:uppercase;font-size:11px;font-weight:700;padding:1px 5px}.new-blog .recently a p{color:#4A5659}.new-blog .recently a:active,.new-blog .recently a:focus,.new-blog .recently a:hover{text-decoration:none;box-shadow:rgba(0,43,54,0.2) 0 1px 12px}.new-blog .recently a:active h3,.new-blog .recently a:focus h3,.new-blog .recently a:hover h3{color:#765;color:#DC322F}.talk-to-us .heading-line h2{color:#073642}.talk-to-us .heading-line h2 span{background:#fff}.talk-to-us .heading-line h2:before{background:#D0D9DA}.talk-to-us h3{text-align:center;color:#073642;font-size:.9375rem;margin-bottom:40px}.talk-to-us .discourse,.talk-to-us .gitter{margin-bottom:50px}.talk-to-us .discourse::after,.talk-to-us .gitter::after{clear:both;content:"";display:block}.talk-to-us .discourse .scala-user-discourse{margin-left:17.05961%}.talk-to-us .discourse .scala-contributors-discourse,.talk-to-us .discourse .scala-user-discourse{padding:20px;text-align:center;float:left;display:block;margin-right:2.35765%;width:31.76157%}.talk-to-us .discourse .scala-contributors-discourse img,.talk-to-us .discourse .scala-user-discourse img{width:34px;height:auto}.talk-to-us .discourse .scala-contributors-discourse h4,.talk-to-us .discourse .scala-user-discourse h4{font-family:"Lato",sans-serif;font-size:1.063rem;text-transform:uppercase;color:#073642;margin:12px 0 8px}.talk-to-us .discourse .scala-contributors-discourse p,.talk-to-us .discourse .scala-user-discourse p{color:#4A5659}.talk-to-us .discourse .scala-contributors-discourse:active,.talk-to-us .discourse .scala-contributors-discourse:focus,.talk-to-us .discourse .scala-contributors-discourse:hover,.talk-to-us .discourse .scala-user-discourse:active,.talk-to-us .discourse .scala-user-discourse:focus,.talk-to-us .discourse .scala-user-discourse:hover{text-decoration:none;background:#F0F3F3;border-radius:2px}.talk-to-us .discourse .scala-contributors-discourse:active h4,.talk-to-us .discourse .scala-contributors-discourse:focus h4,.talk-to-us .discourse .scala-contributors-discourse:hover h4,.talk-to-us .discourse .scala-user-discourse:active h4,.talk-to-us .discourse .scala-user-discourse:focus h4,.talk-to-us .discourse .scala-user-discourse:hover h4{color:#DC322F}.talk-to-us .discourse .scala-contributors-discourse:last-child,.talk-to-us .discourse .scala-user-discourse:last-child{margin-right:0}@media (max-width: 992px){.talk-to-us .discourse .scala-contributors-discourse,.talk-to-us .discourse .scala-user-discourse{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}.talk-to-us .discourse .scala-contributors-discourse:last-child,.talk-to-us .discourse .scala-user-discourse:last-child{margin-right:0}}.talk-to-us .gitter ul.first{margin-left:17.05961%}.talk-to-us .gitter ul.first li:last-child{border-bottom:1px solid #D0D9DA}.talk-to-us .gitter ul,.talk-to-us .gitter ul.first{float:left;display:block;margin-right:2.35765%;width:31.76157%}.talk-to-us .gitter ul:last-child,.talk-to-us .gitter ul.first:last-child{margin-right:0}@media (max-width: 768px){.talk-to-us .gitter ul,.talk-to-us .gitter ul.first{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}.talk-to-us .gitter ul:last-child,.talk-to-us .gitter ul.first:last-child{margin-right:0}.talk-to-us .gitter ul li:last-child,.talk-to-us .gitter ul.first li:last-child{border-bottom:none}}.talk-to-us .gitter ul li{border-top:1px solid #D0D9DA}.talk-to-us .gitter ul li a{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;-o-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;padding:14px 0;color:#4A5659;font-weight:700;padding-left:30px}.talk-to-us .gitter ul li a:active,.talk-to-us .gitter ul li a:focus,.talk-to-us .gitter ul li a:hover{background:#F0F3F3;text-decoration:none}.talk-to-us .gitter ul li a img{width:28px;height:auto;margin-right:10px}.talk-to-us .gitter ul li:last-child{border-bottom:1px solid #D0D9DA}.talk-to-us .communities ul{text-align:center}.talk-to-us .communities ul li{display:inline-block}.talk-to-us .communities ul li:first-child{margin-right:20px}.talk-to-us .communities ul li:first-child img{width:127px;height:auto}.talk-to-us .communities ul li:last-child img{width:131px;height:auto}.talk-to-us .communities ul li a:active,.talk-to-us .communities ul li a:focus,.talk-to-us .communities ul li a:hover{opacity:0.7}.talk-to-us .social{margin-top:40px;text-align:center}.talk-to-us .social ul li{display:inline-block;font-size:1.75rem}.talk-to-us .social ul li:first-child{margin-right:14px}.talk-to-us .social ul li a{color:#15414C}.talk-to-us .social ul li a:active,.talk-to-us .social ul li a:focus,.talk-to-us .social ul li a:hover{color:#DC322F}.maintenance{background:#073642}.maintenance .heading-line h2 span{background:#073642}.maintenance h3{color:#fff;text-align:center;font-size:0.9375rem}.maintenance .maintained{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center;flex-wrap:wrap;margin-bottom:40px}.maintenance .maintained li:first-child{margin-right:32px}.maintenance .maintained li a img{height:43px;width:auto;opacity:0.3;transition:all 350ms ease}.maintenance .maintained li a:hover img{opacity:1}@media (max-width: 480px){.maintenance .maintained li:first-child{margin-right:0}}.maintenance .supported{padding-top:30px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify;flex-wrap:wrap}.maintenance .supported a img{display:block;opacity:0.3;transition:all 350ms ease}@media (max-width: 992px){.maintenance .supported a img{margin:5px}}@media (max-width: 768px){.maintenance .supported a img{margin:10px}}.maintenance .supported a:hover img{opacity:1}#site-footer{padding:50px 0;background:#002B36;color:rgba(255,255,255,0.5)}#site-footer ul{float:left;display:block;margin-right:2.35765%;width:14.70196%}#site-footer ul:last-child{margin-right:0}@media (max-width: 992px){#site-footer ul{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-bottom:20px}#site-footer ul:last-child{margin-right:0}#site-footer ul:nth-child(3n){margin-right:0}#site-footer ul:nth-child(3n+1){clear:left}}@media (max-width: 480px){#site-footer ul{float:left;display:block;margin-right:2.35765%;width:100%;text-align:center}#site-footer ul:last-child{margin-right:0}}#site-footer ul li{margin-bottom:3px}#site-footer ul li h3{color:#fff;margin-bottom:10px;text-transform:uppercase;font-family:"Lato",sans-serif;font-weight:700;font-size:1.063rem}#site-footer ul li a{color:rgba(255,255,255,0.5);font-size:.9375rem}#site-footer ul li a:active,#site-footer ul li a:focus,#site-footer ul li a:hover{color:#fff;text-decoration:none}#site-footer .site-footer-top{margin-bottom:40px}#site-footer .site-footer-top::after{clear:both;content:"";display:block}#site-footer .site-footer-bottom{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}@media (max-width: 480px){#site-footer .site-footer-bottom{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;-o-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;flex-wrap:wrap}#site-footer .site-footer-bottom img{margin-top:18px}}#site-footer .site-footer-bottom img{opacity:0.4;margin-right:65px}.marker{position:absolute;width:16px;height:8px;background:#A4302E;right:-50px;top:100px;border-radius:100%;cursor:pointer}.marker:hover .info-marker,.marker:hover .arrow{visibility:visible;opacity:1;transition:all 350ms ease}.marker:before{content:"";position:absolute;background:rgba(164,48,46,0.3);left:-8px;top:-4px;width:32px;height:16px;border-radius:100%;z-index:1}.marker .info-marker{width:472px;position:absolute;left:-13px;top:30px;font-size:.875rem;color:#fff;font-family:"Roboto Slab",serif;background:rgba(7,54,66,0.8);padding:20px;visibility:hidden;opacity:0}.marker .info-marker .arrow{position:absolute;left:0;top:-16px;width:23px;height:13px;z-index:1}.button{padding:8px 18px;font-size:.875rem;font-weight:700;text-transform:uppercase;color:#fff;background:#859900;border-radius:3px;display:inline-block}.button:active,.button:focus,.button:hover{text-decoration:none;color:#fff;background:#DC322F}.call-to-action{text-align:center;margin-top:40px}.call-to-action.action-medium{margin-top:30px}.call-to-action.action-small{margin-top:20px}.call-to-action p{font-size:.875rem;color:rgba(255,255,255,0.7)}.call-to-action p.align-top{margin-bottom:12px}.call-to-action p.align-bottom{margin-top:12px}.call-to-action p a{text-decoration:underline;color:rgba(255,255,255,0.7)}.call-to-action p a:active,.call-to-action p a:focus,.call-to-action p a:hover{color:#fff}.unslider ul li{padding:0 1px}.unslider .unslider-arrow{display:none}.unslider .unslider-nav{margin-top:10px}@media (max-width: 992px){.unslider .unslider-nav{margin-top:10px}}.unslider .unslider-nav ol li{width:7px;height:7px;border:none;background:rgba(255,255,255,0.3)}.unslider .unslider-nav ol li.unslider-active{pointer-events:none;background:#fff}.heading-line{margin-bottom:40px;text-align:center}.heading-line h2{color:#fff;position:relative;font-size:1.375rem}.heading-line h2 span{padding:0 30px;position:relative;background:#073642;z-index:5}.heading-line h2:before{content:"";display:block;height:1px;position:absolute;top:50%;width:100%;background:rgba(255,255,255,0.14)}.heading-line .sub-heading{font-size:.875rem;color:rgba(255,255,255,0.7);font-style:italic}.card{padding:18px;border-radius:3px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;background:#15414C;transition:all 350ms ease;margin-bottom:14px}.card:hover{background:#073642}.card img{width:28px;height:28px;border-radius:2px}.card .card-text{margin-left:14px}.card .card-text h4{font-family:"Lato",sans-serif;font-size:1.063rem;color:#fff}.card .card-text ul li{color:rgba(255,255,255,0.7);display:inline-block}.card .card-text ul li.online-courses-price,.card .card-text ul li.event-location{font-size:.75rem;text-transform:uppercase}.card .card-text ul li.online-courses-date,.card .card-text ul li.date-event{font-size:.875rem}.card .card-text ul li.dot{color:rgba(255,255,255,0.4)}.card:active,.card:focus,.card:hover{text-decoration:none}.calendar{width:28px;height:32px;background:#fff;border-radius:2px;overflow:hidden}.calendar span{display:block;font-size:10px;font-weight:700;text-align:center}.calendar span:first-child{background:#DC322F;color:#fff}a .calendar span:last-child{color:#073642;font-size:12px;margin-top:-1px} +@import url("https://fonts.googleapis.com/css?family=Lato:400,400i,700");@import url("https://fonts.googleapis.com/css?family=Roboto+Slab:400,700");html{box-sizing:border-box}*,*::after,*::before{box-sizing:inherit}.unslider{overflow:auto;margin:0;padding:0}.unslider-wrap{position:relative}.unslider-wrap.unslider-carousel>li{float:left}.unslider-vertical>ul{height:100%}.unslider-vertical li{float:none;width:100%}.unslider-fade{position:relative}.unslider-fade .unslider-wrap li{position:absolute;left:0;top:0;right:0;z-index:8}.unslider-fade .unslider-wrap li.unslider-active{z-index:10}.unslider ul,.unslider ol,.unslider li{list-style:none;margin:0;padding:0;border:none}.unslider-arrow{position:absolute;left:20px;z-index:2;cursor:pointer}.unslider-arrow.next{left:auto;right:20px}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}html,body{height:100%;margin:0}input,select,textarea{font-family:"Lato",sans-serif;font-size:1.063rem;display:block;appearance:none;border:none}::-webkit-input-placeholder{color:#899295}:-moz-placeholder{color:#899295}::-moz-placeholder{color:#899295}:-ms-input-placeholder{color:#899295}.wrap{max-width:1200px;margin-left:auto;margin-right:auto;padding:0 20px}.wrap::after{clear:both;content:"";display:block}.dot{font-size:10px;color:rgba(137,146,149,0.6);margin:0 3px}ul,ol{list-style-type:none;margin:0;padding:0}dl{margin:0}dt{font-weight:600;margin:0}dd{margin:0}figure{margin:0}img,picture{margin:0;max-width:100%}body{color:#4A5659;font-family:"Lato",sans-serif;font-size:16px;font-weight:400;line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-family:"Roboto Slab",serif;line-height:1.4;font-weight:600;margin:0}h2{font-weight:400}p{margin:0}a{color:#23aad1;text-decoration:none;transition:all 350ms ease}a:active,a:focus,a:hover{color:#DC322F;text-decoration:underline}hr{border-bottom:1px solid #D0D9DA;border-left:0;border-right:0;border-top:0;margin:0}#site-header{background:#002B36}#site-header .new-on-the-blog{background:rgba(0,43,54,0.8);text-align:center;padding:8px 0;color:#fff;transition:all 350ms ease;position:relative}#site-header .new-on-the-blog span{position:absolute;right:20px;top:3px;z-index:1;cursor:pointer;font-size:1.275rem;opacity:0.6;transition:all 350ms ease}#site-header .new-on-the-blog span:hover{opacity:1}#site-header .new-on-the-blog a{color:#fff;text-decoration:underline}#site-header .new-on-the-blog a:active,#site-header .new-on-the-blog a:focus,#site-header .new-on-the-blog a:hover{text-decoration:none}#site-header.header-home{background:none}#site-header.header-home .header-background{background:rgba(0,43,54,0.45);position:relative;padding-bottom:150px}#site-header.header-home .header-background:before{content:"";position:absolute;background:url("../img/frontpage/background-header-home.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.inner-text{position:relative;float:left;display:block;margin-right:2.35765%;width:65.88078%}.inner-text h1{font-family:"Lato",sans-serif;font-size:2.813rem;font-weight:700;color:#fff;margin:30px 0 15px 0}.inner-text p{font-size:1.25rem;color:#fff;margin-bottom:30px}.inner-text:last-child{margin-right:0}@media (max-width: 992px){.inner-text{float:left;display:block;margin-right:2.35765%;width:100%}.inner-text:last-child{margin-right:0}.inner-text h1{font-size:2.213rem;margin:0 0 15px 0}}.scala-main-resources{height:177px;background:#002B36;position:relative}.scala-main-resources .resources .button{font-size:1.063rem;display:block;border-top-left-radius:200px;border-top-right-radius:200px;border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:200px;border-top-left-radius:200px;padding:20px 40px}.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-left:17.05961%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:31.76157%}.scala-main-resources .resources .api-docs:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button{text-align:right;border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:200px;border-top-right-radius:200px;border-bottom-left-radius:200px;border-bottom-right-radius:200px;border-bottom-left-radius:0;border-top-left-radius:0}@media (max-width: 992px){.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-left:0%}.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs{float:left;display:block;margin-right:2.35765%;width:48.82117%;margin-right:0}.scala-main-resources .resources .api-docs:last-child{margin-right:0}}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{margin-top:-40px}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{margin-top:12px;max-width:180px;text-align:center}.scala-main-resources .resources .api-docs ul li:first-child,.scala-main-resources .resources .download ul li:first-child{border-bottom:1px solid rgba(255,255,255,0.14);font-family:"Roboto Slab",serif;padding-bottom:4px;margin-bottom:2px}.scala-main-resources .resources .api-docs ul li a,.scala-main-resources .resources .download ul li a{color:rgba(255,255,255,0.7);font-size:.875rem}.scala-main-resources .resources .api-docs ul li a:active,.scala-main-resources .resources .api-docs ul li a:focus,.scala-main-resources .resources .api-docs ul li a:hover,.scala-main-resources .resources .download ul li a:active,.scala-main-resources .resources .download ul li a:focus,.scala-main-resources .resources .download ul li a:hover{text-decoration:none;color:#fff}.scala-main-resources .resources .api-docs ul{float:right}.scala-main-resources .resources .scala-brand-circle{width:340px;height:340px;left:50%;top:-178px;margin-left:-170px;background:rgba(0,43,54,0.4);border-radius:100%;position:absolute;z-index:60;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center}.scala-main-resources .resources .scala-brand-circle .circle-solid{background:#002B36;width:224px;height:224px;border-radius:100%;text-align:center}.scala-main-resources .resources .scala-brand-circle .circle-solid img{width:152px;height:auto;margin-top:-28px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span{display:block;color:#fff;font-family:"Roboto Slab",serif}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:first-child{font-size:1.375rem;margin-top:-9px}.scala-main-resources .resources .scala-brand-circle .circle-solid .scala-version span:last-child{font-size:1.9rem;margin-top:-10px}@media (max-width: 768px){.scala-main-resources{height:auto;padding-bottom:50px}.scala-main-resources .resources .download{margin-top:140px}.scala-main-resources .resources .api-docs{margin-top:40px}.scala-main-resources .resources .api-docs,.scala-main-resources .resources .download{float:left;display:block;margin-right:2.35765%;width:100%}.scala-main-resources .resources .api-docs:last-child,.scala-main-resources .resources .download:last-child{margin-right:0}.scala-main-resources .resources .api-docs .button,.scala-main-resources .resources .download .button{border-radius:100px;padding:10px 20px;font-size:16px;text-align:center}.scala-main-resources .resources .api-docs ul,.scala-main-resources .resources .download ul{max-width:100%;float:none}.scala-main-resources .resources .scala-brand-circle{transform:scale(0.8)}}#site-main section{padding:50px 0}#site-main .spire{min-height:330px;background:rgba(0,43,54,0.4);position:relative;padding:0}#site-main .spire:before{content:"";position:absolute;background:url("../img/frontpage/epfl-bc.jpg") no-repeat center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;left:0;width:100%;height:100%;z-index:-1}.navigation{padding:30px 0;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.navigation .navigation-bdand img{width:104px;height:43px}.navigation .navigation-panel-button{display:none;font-size:1.333rem;color:#fff;cursor:pointer}@media (max-width: 992px){.navigation .navigation-panel-button{order:3;display:block}}.navigation .navigation-menu .navigation-menu-item{display:inline-block}.navigation .navigation-menu .navigation-menu-item:last-child{margin-right:0}.navigation .navigation-menu .navigation-menu-item a{padding:5px 15px;text-transform:uppercase;color:#fff;border-radius:300px;font-weight:700}.navigation .navigation-menu .navigation-menu-item a:active,.navigation .navigation-menu .navigation-menu-item a:focus,.navigation .navigation-menu .navigation-menu-item a:hover{background:#DC322F;text-decoration:none}@media (max-width: 992px){.navigation .navigation-menu{padding:20px;position:fixed;top:0;right:0;bottom:0;left:auto;height:100%;width:270px;-webkit-transform:translateX(270px);-moz-transform:translateX(270px);-ms-transform:translateX(270px);-o-transform:translateX(270px);transform:translateX(270px);-webkit-transition:all 0.25s linear;-moz-transition:all 0.25s linear;transition:all 0.25s linear;background:#fff;-webkit-overflow-scrolling:touch;overflow-y:auto;z-index:100;background:rgba(0,43,54,0.99)}.navigation .navigation-menu.is-visible{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}.navigation .navigation-menu .navigation-menu-item{margin-right:16px;padding:10px 0;display:block}}.navigation-fade-screen{position:fixed;top:0;right:0;bottom:0;left:0;-webkit-transition:all 0.15s ease-out 0s;-moz-transition:all 0.15s ease-out 0s;transition:all 0.15s ease-out 0s;background:#000;opacity:0;visibility:hidden;z-index:90}.navigation-fade-screen.is-visible{opacity:0.6;visibility:visible}.twitter-feed{background:#5CC6E4}.twitter-feed .heading-line h2 span{background:#5CC6E4}.twitter-feed .heading-line h2:before{background:rgba(255,255,255,0.5)}.twitter-feed .slider-twitter ul li{padding:0 15px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:stretch;-moz-box-align:stretch;box-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;-ms-align-items:stretch;-o-align-items:stretch;align-items:stretch;-ms-flex-align:stretch;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}@media (max-width: 992px){.twitter-feed .slider-twitter ul li{display:block}}.twitter-feed .slider-twitter ul li .item-tweet{padding:20px;background:#fff;border-radius:3px;transition:all 350ms ease;max-width:360px;margin-right:20px}@media (max-width: 992px){.twitter-feed .slider-twitter ul li .item-tweet{max-width:100%;margin-right:0;margin-bottom:20px}}.twitter-feed .slider-twitter ul li .item-tweet:last-child{margin-right:0}.twitter-feed .slider-twitter ul li .item-tweet img{border-radius:3px;width:44px;height:auto;float:left}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text{margin-left:64px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li{padding:0;margin-right:6px}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user{font-size:1.063rem;font-weight:700;color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a{color:#002B36}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.user a:hover{color:#DC322F;text-decoration:none}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet ul li.username{font-size:.875rem;color:#899295;font-weight:600}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .header-tweet .date{font-size:.875rem;color:#899295}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p{font-size:.9375rem}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag{color:rgba(137,146,149,0.7)}.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:active,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:focus,.twitter-feed .slider-twitter ul li .item-tweet .tweet-text .main-tweet p .hastag:hover{color:#899295}.twitter-feed .slider-twitter ul li .item-tweet:hover{background:rgba(255,255,255,0.88)}.twitter-feed .call-to-action p{color:#fff}.ides{background:#073642}.ides ul{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:top;-moz-box-align:top;box-align:top;-webkit-align-items:top;-moz-align-items:top;-ms-align-items:top;-o-align-items:top;align-items:top;-ms-flex-align:top;-webkit-box-pack:distribute;-moz-box-pack:distribute;box-pack:distribute;-webkit-justify-content:space-around;-moz-justify-content:space-around;-ms-justify-content:space-around;-o-justify-content:space-around;justify-content:space-around;-ms-flex-pack:distribute}.ides ul li{text-align:center;position:relative}.ides ul li:nth-child(2n){width:1px;height:94px;background:rgba(255,255,255,0.14)}.ides ul li a{display:inline-block;color:rgba(255,255,255,0.5);font-family:"Roboto Slab",serif}.ides ul li a .bullet{position:absolute;top:-12px;right:-14px;background:#15414C;border-radius:100%;width:24px;height:24px;z-index:10;transition:all 350ms ease;text-align:center}.ides ul li a .bullet img{width:16px;height:16px;margin-top:4px}.ides ul li a.sublime .bullet{top:-10px;right:0}.ides ul li a img{height:56px;width:auto;margin-bottom:6px;opacity:0.4;transition:all 350ms ease}.ides ul li a span{display:block;font-size:.875rem}.ides ul li a:hover{color:#fff;text-decoration:none}.ides ul li a:hover img{opacity:1}.ides ul li a:hover .bullet{background:#859900}.nutshell{background:#15414C}.nutshell .heading-line h2 span{background:#15414C}.nutshell .scala-items-list .items-menu .scala-item{float:left;display:block;margin-right:2.35765%;width:31.76157%;padding:20px;text-align:center;transition:all 350ms ease;min-height:165px}.nutshell .scala-items-list .items-menu .scala-item:last-child{margin-right:0}.nutshell .scala-items-list .items-menu .scala-item:nth-child(3n){margin-right:0}.nutshell .scala-items-list .items-menu .scala-item:nth-child(3n+1){clear:left}@media (max-width: 768px){.nutshell .scala-items-list .items-menu .scala-item{float:left;display:block;margin-right:2.35765%;width:100%}.nutshell .scala-items-list .items-menu .scala-item:last-child{margin-right:0}}.nutshell .scala-items-list .items-menu .scala-item h3{color:#fff;font-size:1.063rem;text-transform:uppercase;font-family:"Lato",sans-serif;margin-bottom:10px}.nutshell .scala-items-list .items-menu .scala-item p{color:rgba(255,255,255,0.7);font-size:1.063rem}.nutshell .scala-items-list .items-menu .scala-item:active,.nutshell .scala-items-list .items-menu .scala-item:focus,.nutshell .scala-items-list .items-menu .scala-item:hover{cursor:pointer;background:#073642}.nutshell .scala-items-list .items-menu .scala-item.active{background:#073642}.nutshell .scala-items-list .items-menu .items-content{background:#073642;transition:all 350ms ease}.nutshell .scala-items-list .items-menu .items-content .items-code{display:none;background:#073642;padding:65px 0}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code{float:left;display:block;margin-right:2.35765%;width:48.82117%}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code:last-child{margin-right:0}@media (max-width: 992px){.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code{float:left;display:block;margin-right:2.35765%;width:100%}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code:last-child{margin-right:0}}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element{margin-bottom:20px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element pre{margin-top:0}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element code{padding:20px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element .bar-code{background:#B4BBBD;text-align:center;padding:2px 0;font-size:.875rem;font-weight:600;min-height:26px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-code .code-element .hljs{background:rgba(0,43,54,0.8)}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text{float:left;display:block;margin-right:2.35765%;width:48.82117%}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text code{background:#002B36;padding:2px 8px;color:#859900;border-radius:2px;margin:0 3px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text:last-child{margin-right:0}@media (max-width: 992px){.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text{float:left;display:block;margin-right:2.35765%;width:100%}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text:last-child{margin-right:0}}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text h3{font-size:1.625rem;color:#fff;margin-bottom:20px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text p{color:rgba(255,255,255,0.7)}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text.scala-text-large{float:left;display:block;margin-right:2.35765%;width:100%;margin-bottom:30px}.nutshell .scala-items-list .items-menu .items-content .items-code .scala-text.scala-text-large:last-child{margin-right:0}.nutshell .scala-item-expanded{display:none;height:400px;background:#073642}.courses{background:#244E58}.courses .heading-line h2 span{background:#244E58}.courses .online-courses,.courses .upcoming-training{float:left;display:block;margin-right:2.35765%;width:48.82117%}.courses .online-courses:last-child,.courses .upcoming-training:last-child{margin-right:0}@media (max-width: 992px){.courses .online-courses,.courses .upcoming-training{float:left;display:block;margin-right:2.35765%;width:100%}.courses .online-courses:last-child,.courses .upcoming-training:last-child{margin-right:0}}@media (max-width: 992px){.courses .online-courses{margin-bottom:40px}}.upcoming-events{background:#15414C}.upcoming-events .heading-line h2 span{background:#15414C}.upcoming-events .events-items-list::after{clear:both;content:"";display:block}.upcoming-events .events-items-list .event-item{float:left;display:block;margin-right:2.35765%;width:31.76157%}.upcoming-events .events-items-list .event-item:last-child{margin-right:0}.upcoming-events .events-items-list .event-item:nth-child(3n){margin-right:0}.upcoming-events .events-items-list .event-item:nth-child(3n+1){clear:left}@media (max-width: 992px){.upcoming-events .events-items-list .event-item{float:left;display:block;margin-right:2.35765%;width:100%}.upcoming-events .events-items-list .event-item:last-child{margin-right:0}}.upcoming-events .card{background:#073642}.upcoming-events .card:hover{background:#002B36}#site-main .scala-ecosystem{padding-bottom:0;background:url("../img/frontpage/background-scala-ecosystem.png") no-repeat center bottom #244E58;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover}#site-main .scala-ecosystem .heading-line::after{clear:both;content:"";display:block}#site-main .scala-ecosystem .heading-line h2 span{background:#234D57}#site-main .scala-ecosystem .heading-line p{font-size:1.063rem;color:rgba(255,255,255,0.7);margin-top:10px;float:left;display:block;margin-right:2.35765%;width:65.88078%;margin-left:17.05961%}#site-main .scala-ecosystem .heading-line p:last-child{margin-right:0}@media (max-width: 768px){#site-main .scala-ecosystem .heading-line p{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}#site-main .scala-ecosystem .heading-line p:last-child{margin-right:0}}#site-main .scala-ecosystem .browser .header-browser{background:#073642;padding:14px 20px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}#site-main .scala-ecosystem .browser .header-browser img{width:116px;height:auto}#site-main .scala-ecosystem .browser .header-browser img:last-child{width:86px;height:auto}#site-main .scala-ecosystem .browser .main-browser{background:rgba(21,65,76,0.5);transition:all 350ms ease;text-align:center;padding:70px 0 80px 0}#site-main .scala-ecosystem .browser .main-browser h2{color:#fff;font-size:2.5rem;margin-bottom:24px}#site-main .scala-ecosystem .browser .main-browser .input-control{position:relative;background:#333;width:550px;margin-left:auto;margin-right:auto;color:#899295}#site-main .scala-ecosystem .browser .main-browser .input-control span{position:absolute;left:20px;top:8px}#site-main .scala-ecosystem .browser .main-browser .input-control input{padding:12px 18px 12px 50px;border-radius:2px;width:100%;font-weight:600}@media (max-width: 768px){#site-main .scala-ecosystem .browser .main-browser{padding-left:20px;padding-right:20px}#site-main .scala-ecosystem .browser .main-browser h2{font-size:1.4rem}#site-main .scala-ecosystem .browser .main-browser .input-control{width:100%}}#site-main .scala-ecosystem:hover .main-browser{background:#15414C;padding-bottom:140px}.new-blog{background:#F0F3F3}.new-blog .heading-line h2{color:#073642}.new-blog .heading-line h2 span{background:#F0F3F3}.new-blog .heading-line h2:before{background:#D0D9DA}.new-blog .new,.new-blog .recently{float:left;display:block;margin-right:2.35765%;width:48.82117%}.new-blog .new:last-child,.new-blog .recently:last-child{margin-right:0}@media (max-width: 992px){.new-blog .new,.new-blog .recently{float:left;display:block;margin-right:2.35765%;width:100%}.new-blog .new:last-child,.new-blog .recently:last-child{margin-right:0}}.new-blog .new h3,.new-blog .recently h3{font-family:"Lato",sans-serif;text-transform:uppercase;border-bottom:1px solid #D0D9DA;font-size:1.063rem}.new-blog .new .content-card,.new-blog .recently .content-card{background:#fff;padding:22px;display:block;border-radius:3px}@media (max-width: 992px){.new-blog .new{margin-bottom:40px}}.new-blog .new .content-card{height:516px;overflow:hidden;position:relative}.new-blog .new .content-card:before{content:"";position:absolute;background:#fff;left:0;bottom:0;width:100%;height:20px;z-index:1}.new-blog .new .tag-new{text-transform:uppercase;font-size:.9375rem;color:#DC322F;font-weight:700}.new-blog .new h3{font-size:1.5rem;color:#073642;padding-bottom:15px;margin-bottom:15px}.new-blog .new h3 a{color:#073642}.new-blog .new h3 a:active,.new-blog .new h3 a:focus,.new-blog .new h3 a:hover{text-decoration:none;color:#DC322F}.new-blog .new .date{color:#899295;display:block;margin-bottom:5px;font-style:italic}.new-blog .recently a{margin-bottom:16px}.new-blog .recently a h3{color:#073642;transition:all 350ms ease;padding-bottom:8px;margin-bottom:6px}.new-blog .recently a ul{position:relative;margin-bottom:4px}.new-blog .recently a ul li{color:#899295;font-size:.875rem;display:inline-block}.new-blog .recently a ul li.dot{font-size:10px}.new-blog .recently a ul li.tag{position:absolute;right:0;top:3px;background:#DC322F;color:#fff;text-transform:uppercase;font-size:11px;font-weight:700;padding:1px 5px}.new-blog .recently a p{color:#4A5659}.new-blog .recently a:active,.new-blog .recently a:focus,.new-blog .recently a:hover{text-decoration:none;box-shadow:rgba(0,43,54,0.2) 0 1px 12px}.new-blog .recently a:active h3,.new-blog .recently a:focus h3,.new-blog .recently a:hover h3{color:#765;color:#DC322F}.talk-to-us .heading-line h2{color:#073642}.talk-to-us .heading-line h2 span{background:#fff}.talk-to-us .heading-line h2:before{background:#D0D9DA}.talk-to-us h3{text-align:center;color:#073642;font-size:.9375rem;margin-bottom:40px}.talk-to-us .discourse,.talk-to-us .gitter{margin-bottom:50px}.talk-to-us .discourse::after,.talk-to-us .gitter::after{clear:both;content:"";display:block}.talk-to-us .discourse .scala-user-discourse{margin-left:17.05961%}.talk-to-us .discourse .scala-contributors-discourse,.talk-to-us .discourse .scala-user-discourse{padding:20px;text-align:center;float:left;display:block;margin-right:2.35765%;width:31.76157%}.talk-to-us .discourse .scala-contributors-discourse img,.talk-to-us .discourse .scala-user-discourse img{width:34px;height:auto}.talk-to-us .discourse .scala-contributors-discourse h4,.talk-to-us .discourse .scala-user-discourse h4{font-family:"Lato",sans-serif;font-size:1.063rem;text-transform:uppercase;color:#073642;margin:12px 0 8px}.talk-to-us .discourse .scala-contributors-discourse p,.talk-to-us .discourse .scala-user-discourse p{color:#4A5659}.talk-to-us .discourse .scala-contributors-discourse:active,.talk-to-us .discourse .scala-contributors-discourse:focus,.talk-to-us .discourse .scala-contributors-discourse:hover,.talk-to-us .discourse .scala-user-discourse:active,.talk-to-us .discourse .scala-user-discourse:focus,.talk-to-us .discourse .scala-user-discourse:hover{text-decoration:none;background:#F0F3F3;border-radius:2px}.talk-to-us .discourse .scala-contributors-discourse:active h4,.talk-to-us .discourse .scala-contributors-discourse:focus h4,.talk-to-us .discourse .scala-contributors-discourse:hover h4,.talk-to-us .discourse .scala-user-discourse:active h4,.talk-to-us .discourse .scala-user-discourse:focus h4,.talk-to-us .discourse .scala-user-discourse:hover h4{color:#DC322F}.talk-to-us .discourse .scala-contributors-discourse:last-child,.talk-to-us .discourse .scala-user-discourse:last-child{margin-right:0}@media (max-width: 992px){.talk-to-us .discourse .scala-contributors-discourse,.talk-to-us .discourse .scala-user-discourse{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}.talk-to-us .discourse .scala-contributors-discourse:last-child,.talk-to-us .discourse .scala-user-discourse:last-child{margin-right:0}}.talk-to-us .gitter ul.first{margin-left:17.05961%}.talk-to-us .gitter ul.first li:last-child{border-bottom:1px solid #D0D9DA}.talk-to-us .gitter ul,.talk-to-us .gitter ul.first{float:left;display:block;margin-right:2.35765%;width:31.76157%}.talk-to-us .gitter ul:last-child,.talk-to-us .gitter ul.first:last-child{margin-right:0}@media (max-width: 768px){.talk-to-us .gitter ul,.talk-to-us .gitter ul.first{float:left;display:block;margin-right:2.35765%;width:100%;margin-left:0%}.talk-to-us .gitter ul:last-child,.talk-to-us .gitter ul.first:last-child{margin-right:0}.talk-to-us .gitter ul li:last-child,.talk-to-us .gitter ul.first li:last-child{border-bottom:none}}.talk-to-us .gitter ul li{border-top:1px solid #D0D9DA}.talk-to-us .gitter ul li a{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;-o-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;padding:14px 0;color:#4A5659;font-weight:700;padding-left:30px}.talk-to-us .gitter ul li a:active,.talk-to-us .gitter ul li a:focus,.talk-to-us .gitter ul li a:hover{background:#F0F3F3;text-decoration:none}.talk-to-us .gitter ul li a img{width:28px;height:auto;margin-right:10px}.talk-to-us .gitter ul li:last-child{border-bottom:1px solid #D0D9DA}.talk-to-us .communities ul{text-align:center}.talk-to-us .communities ul li{display:inline-block}.talk-to-us .communities ul li:first-child{margin-right:20px}.talk-to-us .communities ul li:first-child img{width:127px;height:auto}.talk-to-us .communities ul li:last-child img{width:131px;height:auto}.talk-to-us .communities ul li a:active,.talk-to-us .communities ul li a:focus,.talk-to-us .communities ul li a:hover{opacity:0.7}.talk-to-us .social{margin-top:40px;text-align:center}.talk-to-us .social ul li{display:inline-block;font-size:1.75rem}.talk-to-us .social ul li:first-child{margin-right:14px}.talk-to-us .social ul li a{color:#15414C}.talk-to-us .social ul li a:active,.talk-to-us .social ul li a:focus,.talk-to-us .social ul li a:hover{color:#DC322F}.maintenance{background:#073642}.maintenance .heading-line h2 span{background:#073642}.maintenance h3{color:#fff;text-align:center;font-size:0.9375rem}.maintenance .maintained{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-ms-flex-pack:center;flex-wrap:wrap;margin-bottom:40px}.maintenance .maintained li:first-child{margin-right:32px}.maintenance .maintained li a img{height:43px;width:auto;opacity:0.3;transition:all 350ms ease}.maintenance .maintained li a:hover img{opacity:1}@media (max-width: 480px){.maintenance .maintained li:first-child{margin-right:0}}.maintenance .supported{padding-top:30px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify;flex-wrap:wrap}.maintenance .supported a img{display:block;opacity:0.3;transition:all 350ms ease}@media (max-width: 992px){.maintenance .supported a img{margin:5px}}@media (max-width: 768px){.maintenance .supported a img{margin:10px}}.maintenance .supported a:hover img{opacity:1}#site-footer{padding:50px 0;background:#002B36;color:rgba(255,255,255,0.5)}#site-footer ul{float:left;display:block;margin-right:2.35765%;width:14.70196%}#site-footer ul:last-child{margin-right:0}@media (max-width: 992px){#site-footer ul{float:left;display:block;margin-right:2.35765%;width:31.76157%;margin-bottom:20px}#site-footer ul:last-child{margin-right:0}#site-footer ul:nth-child(3n){margin-right:0}#site-footer ul:nth-child(3n+1){clear:left}}@media (max-width: 480px){#site-footer ul{float:left;display:block;margin-right:2.35765%;width:100%;text-align:center}#site-footer ul:last-child{margin-right:0}}#site-footer ul li{margin-bottom:3px}#site-footer ul li h3{color:#fff;margin-bottom:10px;text-transform:uppercase;font-family:"Lato",sans-serif;font-weight:700;font-size:1.063rem}#site-footer ul li a{color:rgba(255,255,255,0.5);font-size:.9375rem}#site-footer ul li a:active,#site-footer ul li a:focus,#site-footer ul li a:hover{color:#fff;text-decoration:none}#site-footer .site-footer-top{margin-bottom:40px}#site-footer .site-footer-top::after{clear:both;content:"";display:block}#site-footer .site-footer-bottom{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:justify;-moz-box-pack:justify;box-pack:justify;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;-o-justify-content:space-between;justify-content:space-between;-ms-flex-pack:justify}@media (max-width: 480px){#site-footer .site-footer-bottom{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;-o-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;flex-wrap:wrap}#site-footer .site-footer-bottom img{margin-top:18px}}#site-footer .site-footer-bottom img{opacity:0.4;margin-right:65px}.marker{position:absolute;width:16px;height:8px;background:#A4302E;right:-50px;top:100px;border-radius:100%;cursor:pointer}@media (max-width: 992px){.marker{display:none}}.marker:hover .info-marker,.marker:hover .arrow{visibility:visible;opacity:1;transition:all 350ms ease}.marker:before{content:"";position:absolute;background:rgba(164,48,46,0.3);left:-8px;top:-4px;width:32px;height:16px;border-radius:100%;z-index:1}.marker .info-marker{width:472px;position:absolute;left:-13px;top:30px;font-size:.875rem;color:#fff;font-family:"Roboto Slab",serif;background:rgba(7,54,66,0.8);padding:20px;visibility:hidden;opacity:0}.marker .info-marker .arrow{position:absolute;left:0;top:-16px;width:23px;height:13px;z-index:1}.button{padding:8px 18px;font-size:.875rem;font-weight:700;text-transform:uppercase;color:#fff;background:#859900;border-radius:3px;display:inline-block}.button:active,.button:focus,.button:hover{text-decoration:none;color:#fff;background:#DC322F}.call-to-action{text-align:center;margin-top:40px}.call-to-action.action-medium{margin-top:30px}.call-to-action.action-small{margin-top:20px}.call-to-action p{font-size:.875rem;color:rgba(255,255,255,0.7)}.call-to-action p.align-top{margin-bottom:12px}.call-to-action p.align-bottom{margin-top:12px}.call-to-action p a{text-decoration:underline;color:rgba(255,255,255,0.7)}.call-to-action p a:active,.call-to-action p a:focus,.call-to-action p a:hover{color:#fff}.unslider ul li{padding:0 1px}.unslider .unslider-arrow{display:none}.unslider .unslider-nav{margin-top:10px}@media (max-width: 992px){.unslider .unslider-nav{margin-top:10px}}.unslider .unslider-nav ol li{width:7px;height:7px;border:none;background:rgba(255,255,255,0.3)}.unslider .unslider-nav ol li.unslider-active{pointer-events:none;background:#fff}.heading-line{margin-bottom:40px;text-align:center}.heading-line h2{color:#fff;position:relative;font-size:1.375rem}.heading-line h2 span{padding:0 30px;position:relative;background:#073642;z-index:5}.heading-line h2:before{content:"";display:block;height:1px;position:absolute;top:50%;width:100%;background:rgba(255,255,255,0.14)}.heading-line .sub-heading{font-size:.875rem;color:rgba(255,255,255,0.7);font-style:italic}.card{padding:18px;border-radius:3px;display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal;box-direction:normal;-webkit-flex-direction:row;-moz-flex-direction:row;flex-direction:row;-ms-flex-direction:row;background:#15414C;transition:all 350ms ease;margin-bottom:14px}.card:hover{background:#073642}.card img{width:28px;height:28px;border-radius:2px}.card .card-text{margin-left:14px}.card .card-text h4{font-family:"Lato",sans-serif;font-size:1.063rem;color:#fff}.card .card-text ul li{color:rgba(255,255,255,0.7);display:inline-block}.card .card-text ul li.online-courses-price,.card .card-text ul li.event-location{font-size:.75rem;text-transform:uppercase}.card .card-text ul li.online-courses-date,.card .card-text ul li.date-event{font-size:.875rem}.card .card-text ul li.dot{color:rgba(255,255,255,0.4)}.card:active,.card:focus,.card:hover{text-decoration:none}.calendar{width:28px;height:32px;background:#fff;border-radius:2px;overflow:hidden}.calendar span{display:block;font-size:10px;font-weight:700;text-align:center}.calendar span:first-child{background:#DC322F;color:#fff}a .calendar span:last-child{color:#073642;font-size:12px;margin-top:-1px} From 9d0bac87f5f609ec9e0ffb67862dd8a0e39197b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20de=20Sil=C3=B3niz=20Sandino?= Date: Mon, 23 Jan 2017 12:05:02 +0100 Subject: [PATCH 033/120] Fix issue that prevented closing the menu in mobile mode - Fix extra separator line in IDE list --- _layouts/frontpage.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/_layouts/frontpage.html b/_layouts/frontpage.html index 4a820b336..2870c230d 100644 --- a/_layouts/frontpage.html +++ b/_layouts/frontpage.html @@ -4,6 +4,7 @@ {% include headertop.html %} {% include headerbottom.html %} +