diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..c13c5f6 --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["es2015"] +} diff --git a/.bowerrc b/.bowerrc deleted file mode 100644 index 1f7e1f4..0000000 --- a/.bowerrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "directory": "app/scripts/src" -} \ No newline at end of file diff --git a/README.md b/README.md index 405510b..3f310db 100644 --- a/README.md +++ b/README.md @@ -1,110 +1,4 @@ Front End Gulp Boilerplate ========================== -Front-end boilerplate for Gulp with everything you need to get started. - -* First download or clone this repo :) -* Then run `npm install` to install dev dependencies. Use sudo if needed. - -You'll need to have Gulp installed. If you already have Gulp installed, you can skip the following line. It is as simple as running: -* `npm install -g gulp` - -During development mode, run the default task so you'll have watchers and browser sync. Simply do the following: -* Run `gulp` to start it up -* Try to modify html, scss and javascript files and see how the page gets updated with BrowserSync - -When you're ready to deploy, simply do the following: -* Run `gulp deploy` -* All of the files you need will be in /dist with your images optimized, css compressed and js compressed - -Version -========================== -1.3.2 - -More Information -========================== -Check out the website http://www.ryanbensonmedia.com/harvest for more information. - -Revision History -========================== -June 24, 2015 -* Fixed missing images folder in app when I removed placeholder - -May 8, 2015 -* Fixed install instructions on README -* Minor revisions to README - -April 15, 2015 -* Merged PR from @telephant00 -* Adds SCSS Source Maps - -April 13, 2015 -* Merged PR from @telephant00 -* Fixed image dev task, it wasn't pushing images to a dest -* Removed README from images folder, causing segfault errors - -April 9, 2015 -* Removed LiveReload in favor of BrowserSync - -March 6, 2015 -* Removed del lib, it was causing issues with deployments -* Added sequence and shell libraries -* Moved deployment task to use sequence -* Using CLI to remove and setup dist folders on deployment, resolved bugs - -February 11, 2015 -* Updated npm dependency versions -* Updated to latest HTML5 Boilerplate (slightly modified) -* Updated CSS and JS vendors -* Removed a couple unused modules -* Started using version numbers and git flow - -January 16, 2014 -* Merge pull request from @quakenul fixing concat order issue with JS - -November 20, 2014 -* Added auto-prefixer support - -October 17, 2014 -* Removed recently deprecated `gulp-clean` module -* Using `del` module instead -* Updated gulpfile to use del method to cleanse the dist folder prior to the deployment task - -September 25, 2014 -* Merged pull request form @hhff - * Improved gitignore for sass cache - * Improved font-face mixing - * Updated images and fonts gulp task for nested files - -August 14, 2014: -* Finally figured out how to get all of the dependencies into dev, not production - -June 20, 2014: -* Updated dependencies -* Completely changed how webserver and livereload works -* Refactored a lot of the build task, it is much more modular and flexible -* Added some extra boilerplate -* Removed a lot of the footprint styles, including the entire Skeleton framework -* Fixed SASS crashing on syntax/coding error -* Using default port number now (8080) for web server - -February 03, 2014: -* Added caching of images so the deploy feature won't compress the same images multiple times -* Added cleaning of the `dist` folder in case things got deleted at some point -* Made the dev & dist scripts and css compressed file in the same place so no edits to the href/src needs to be done anymore -* Added graceful errors during watch, so SCSS or JS errors no longe break the `watch` -* Updated `gulpfile.js` since gulp.run() is deprecated now -* Added fonts to the `deploy` - -February 04, 2014: -* Removed coffee dependency -* Removed some fingerprinted CSS -* Fixed some CSS/HTML references -* Cleaned up the builder and watcher and fixed watcher bugs, namely issue compression w/ SVGs -* Merged pull request from @Contra who added some best practices, thanks! :) - -February 25, 2014 -* I've been using this more in development and production, so this has been fine tuned a bit -* I added fonts and other misc assets that should be moved from `dev` to `dist` upon deployment -* I removed image caching because there was an issue where it would randomly break all of the images. I'll figure this but out later though. -* Updated npm dependencies accordingly +Version 2.0.0 Coming Soon diff --git a/app/.htaccess b/app/.htaccess deleted file mode 100644 index 760ccd3..0000000 --- a/app/.htaccess +++ /dev/null @@ -1,935 +0,0 @@ -# Apache Server Configs v2.11.0 | MIT License -# https://github.com/h5bp/server-configs-apache - -# (!) Using `.htaccess` files slows down Apache, therefore, if you have -# access to the main server configuration file (which is usually called -# `httpd.conf`), you should add this logic there. -# -# https://httpd.apache.org/docs/current/howto/htaccess.html. - -# ###################################################################### -# # CROSS-ORIGIN # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Cross-origin requests | -# ---------------------------------------------------------------------- - -# Allow cross-origin requests. -# -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS -# http://enable-cors.org/ -# http://www.w3.org/TR/cors/ - -# -# Header set Access-Control-Allow-Origin "*" -# - -# ---------------------------------------------------------------------- -# | Cross-origin images | -# ---------------------------------------------------------------------- - -# Send the CORS header for images when browsers request it. -# -# https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image -# https://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html - - - - - SetEnvIf Origin ":" IS_CORS - Header set Access-Control-Allow-Origin "*" env=IS_CORS - - - - -# ---------------------------------------------------------------------- -# | Cross-origin web fonts | -# ---------------------------------------------------------------------- - -# Allow cross-origin access to web fonts. - - - - Header set Access-Control-Allow-Origin "*" - - - -# ---------------------------------------------------------------------- -# | Cross-origin resource timing | -# ---------------------------------------------------------------------- - -# Allow cross-origin access to the timing information for all resources. -# -# If a resource isn't served with a `Timing-Allow-Origin` header that -# would allow its timing information to be shared with the document, -# some of the attributes of the `PerformanceResourceTiming` object will -# be set to zero. -# -# http://www.w3.org/TR/resource-timing/ -# http://www.stevesouders.com/blog/2014/08/21/resource-timing-practical-tips/ - -# -# Header set Timing-Allow-Origin: "*" -# - - -# ###################################################################### -# # ERRORS # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Custom error messages/pages | -# ---------------------------------------------------------------------- - -# Customize what Apache returns to the client in case of an error. -# https://httpd.apache.org/docs/current/mod/core.html#errordocument - -ErrorDocument 404 /404.html - -# ---------------------------------------------------------------------- -# | Error prevention | -# ---------------------------------------------------------------------- - -# Disable the pattern matching based on filenames. -# -# This setting prevents Apache from returning a 404 error as the result -# of a rewrite when the directory with the same name does not exist. -# -# https://httpd.apache.org/docs/current/content-negotiation.html#multiviews - -Options -MultiViews - - -# ###################################################################### -# # INTERNET EXPLORER # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Document modes | -# ---------------------------------------------------------------------- - -# Force Internet Explorer 8/9/10 to render pages in the highest mode -# available in the various cases when it may not. -# -# https://hsivonen.fi/doctype/#ie8 -# -# (!) Starting with Internet Explorer 11, document modes are deprecated. -# If your business still relies on older web apps and services that were -# designed for older versions of Internet Explorer, you might want to -# consider enabling `Enterprise Mode` throughout your company. -# -# http://msdn.microsoft.com/en-us/library/ie/bg182625.aspx#docmode -# http://blogs.msdn.com/b/ie/archive/2014/04/02/stay-up-to-date-with-enterprise-mode-for-internet-explorer-11.aspx - - - Header set X-UA-Compatible "IE=edge" - # `mod_headers` cannot match based on the content-type, however, - # the `X-UA-Compatible` response header should be send only for - # HTML documents and not for the other resources. - - Header unset X-UA-Compatible - - - -# ---------------------------------------------------------------------- -# | Iframes cookies | -# ---------------------------------------------------------------------- - -# Allow cookies to be set from iframes in Internet Explorer. -# -# http://msdn.microsoft.com/en-us/library/ms537343.aspx -# http://www.w3.org/TR/2000/CR-P3P-20001215/ - -# -# Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"" -# - - -# ###################################################################### -# # MEDIA TYPES AND CHARACTER ENCODINGS # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Media types | -# ---------------------------------------------------------------------- - -# Serve resources with the proper media types (f.k.a. MIME types). -# -# https://www.iana.org/assignments/media-types/media-types.xhtml -# https://httpd.apache.org/docs/current/mod/mod_mime.html#addtype - - - - # Data interchange - - AddType application/json json map topojson - AddType application/ld+json jsonld - AddType application/vnd.geo+json geojson - AddType application/xml atom rdf rss xml - - - # JavaScript - - # Normalize to standard type. - # https://tools.ietf.org/html/rfc4329#section-7.2 - - AddType application/javascript js - - - # Manifest files - - # If you are providing a web application manifest file (see - # the specification: https://w3c.github.io/manifest/), it is - # recommended that you serve it with the `application/manifest+json` - # media type. - # - # Because the web application manifest file doesn't have its - # own unique file extension, you can set its media type either - # by matching: - # - # 1) the exact location of the file (this can be done using a - # directive such as ``, but it will NOT work in - # the `.htaccess` file, so you will have to do it in the main - # server configuration file or inside of a `` - # container) - # - # e.g.: - # - # - # AddType application/manifest+json json - # - # - # 2) the filename (this can be problematic as you will need to - # ensure that you don't have any other file with the same name - # as the one you gave to your web application manifest file) - # - # e.g.: - # - # - # AddType application/manifest+json json - # - - AddType application/x-web-app-manifest+json webapp - AddType text/cache-manifest appcache manifest - - - # Media files - - AddType audio/mp4 f4a f4b m4a - AddType audio/ogg oga ogg opus - AddType image/bmp bmp - AddType image/webp webp - AddType video/mp4 f4v f4p m4v mp4 - AddType video/ogg ogv - AddType video/webm webm - AddType video/x-flv flv - AddType image/svg+xml svg svgz - - # Serving `.ico` image files with a different media type - # prevents Internet Explorer from displaying then as images: - # https://github.com/h5bp/html5-boilerplate/commit/37b5fec090d00f38de64b591bcddcb205aadf8ee - - AddType image/x-icon cur ico - - - # Web fonts - - AddType application/font-woff woff - AddType application/font-woff2 woff2 - AddType application/vnd.ms-fontobject eot - - # Browsers usually ignore the font media types and simply sniff - # the bytes to figure out the font type. - # https://mimesniff.spec.whatwg.org/#matching-a-font-type-pattern - # - # However, Blink and WebKit based browsers will show a warning - # in the console if the following font types are served with any - # other media types. - - AddType application/x-font-ttf ttc ttf - AddType font/opentype otf - - - # Other - - AddType application/octet-stream safariextz - AddType application/x-bb-appworld bbaw - AddType application/x-chrome-extension crx - AddType application/x-opera-extension oex - AddType application/x-xpinstall xpi - AddType text/vcard vcard vcf - AddType text/vnd.rim.location.xloc xloc - AddType text/vtt vtt - AddType text/x-component htc - - - -# ---------------------------------------------------------------------- -# | Character encodings | -# ---------------------------------------------------------------------- - -# Serve all resources labeled as `text/html` or `text/plain` -# with the media type `charset` parameter set to `UTF-8`. -# -# https://httpd.apache.org/docs/current/mod/core.html#adddefaultcharset - -AddDefaultCharset utf-8 - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Serve the following file types with the media type `charset` -# parameter set to `UTF-8`. -# -# https://httpd.apache.org/docs/current/mod/mod_mime.html#addcharset - - - AddCharset utf-8 .atom \ - .bbaw \ - .css \ - .geojson \ - .js \ - .json \ - .jsonld \ - .rdf \ - .rss \ - .topojson \ - .vtt \ - .webapp \ - .xloc \ - .xml - - - -# ###################################################################### -# # REWRITES # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Rewrite engine | -# ---------------------------------------------------------------------- - -# (1) Turn on the rewrite engine (this is necessary in order for -# the `RewriteRule` directives to work). -# -# https://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteEngine -# -# (2) Enable the `FollowSymLinks` option if it isn't already. -# -# https://httpd.apache.org/docs/current/mod/core.html#options -# -# (3) If your web host doesn't allow the `FollowSymlinks` option, -# you need to comment it out or remove it, and then uncomment -# the `Options +SymLinksIfOwnerMatch` line (4), but be aware -# of the performance impact. -# -# https://httpd.apache.org/docs/current/misc/perf-tuning.html#symlinks -# -# (4) Some cloud hosting services will require you set `RewriteBase`. -# -# http://www.rackspace.com/knowledge_center/frequently-asked-question/why-is-modrewrite-not-working-on-my-site -# https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase -# -# (5) Depending on how your server is set up, you may also need to -# use the `RewriteOptions` directive to enable some options for -# the rewrite engine. -# -# https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions - - - - # (1) - RewriteEngine On - - # (2) - Options +FollowSymlinks - - # (3) - # Options +SymLinksIfOwnerMatch - - # (4) - # RewriteBase / - - # (5) - # RewriteOptions - - - -# ---------------------------------------------------------------------- -# | Forcing `https://` | -# ---------------------------------------------------------------------- - -# Redirect from the `http://` to the `https://` version of the URL. -# https://wiki.apache.org/httpd/RewriteHTTPToHTTPS - -# -# RewriteEngine On -# RewriteCond %{HTTPS} !=on -# RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] -# - -# ---------------------------------------------------------------------- -# | Suppressing / Forcing the `www.` at the beginning of URLs | -# ---------------------------------------------------------------------- - -# The same content should never be available under two different -# URLs, especially not with and without `www.` at the beginning. -# This can cause SEO problems (duplicate content), and therefore, -# you should choose one of the alternatives and redirect the other -# one. -# -# By default `Option 1` (no `www.`) is activated. -# http://no-www.org/faq.php?q=class_b -# -# If you would prefer to use `Option 2`, just comment out all the -# lines from `Option 1` and uncomment the ones from `Option 2`. -# -# (!) NEVER USE BOTH RULES AT THE SAME TIME! - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Option 1: rewrite www.example.com → example.com - - - RewriteEngine On - RewriteCond %{HTTPS} !=on - RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] - RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L] - - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Option 2: rewrite example.com → www.example.com -# -# Be aware that the following might not be a good idea if you use "real" -# subdomains for certain parts of your website. - -# -# RewriteEngine On -# RewriteCond %{HTTPS} !=on -# RewriteCond %{HTTP_HOST} !^www\. [NC] -# RewriteCond %{SERVER_ADDR} !=127.0.0.1 -# RewriteCond %{SERVER_ADDR} !=::1 -# RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] -# - - -# ###################################################################### -# # SECURITY # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Clickjacking | -# ---------------------------------------------------------------------- - -# Protect website against clickjacking. -# -# The example below sends the `X-Frame-Options` response header with -# the value `DENY`, informing browsers not to display the content of -# the web page in any frame. -# -# This might not be the best setting for everyone. You should read -# about the other two possible values the `X-Frame-Options` header -# field can have: `SAMEORIGIN` and `ALLOW-FROM`. -# https://tools.ietf.org/html/rfc7034#section-2.1. -# -# Keep in mind that while you could send the `X-Frame-Options` header -# for all of your website’s pages, this has the potential downside that -# it forbids even non-malicious framing of your content (e.g.: when -# users visit your website using a Google Image Search results page). -# -# Nonetheless, you should ensure that you send the `X-Frame-Options` -# header for all pages that allow a user to make a state changing -# operation (e.g: pages that contain one-click purchase links, checkout -# or bank-transfer confirmation pages, pages that make permanent -# configuration changes, etc.). -# -# Sending the `X-Frame-Options` header can also protect your website -# against more than just clickjacking attacks: -# https://cure53.de/xfo-clickjacking.pdf. -# -# https://tools.ietf.org/html/rfc7034 -# http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx -# https://www.owasp.org/index.php/Clickjacking - -# -# Header set X-Frame-Options "DENY" -# # `mod_headers` cannot match based on the content-type, however, -# # the `X-Frame-Options` response header should be send only for -# # HTML documents and not for the other resources. -# -# Header unset X-Frame-Options -# -# - -# ---------------------------------------------------------------------- -# | Content Security Policy (CSP) | -# ---------------------------------------------------------------------- - -# Mitigate the risk of cross-site scripting and other content-injection -# attacks. -# -# This can be done by setting a `Content Security Policy` which -# whitelists trusted sources of content for your website. -# -# The example header below allows ONLY scripts that are loaded from the -# current website's origin (no inline scripts, no CDN, etc). That almost -# certainly won't work as-is for your website! -# -# For more details on how to craft a reasonable policy for your website, -# read: http://www.html5rocks.com/en/tutorials/security/content-security-policy/ -# (or the specification: http://www.w3.org/TR/CSP11/). Also, to make -# things easier, you can use an online CSP header generator such as: -# http://cspisawesome.com/. - -# -# Header set Content-Security-Policy "script-src 'self'; object-src 'self'" -# # `mod_headers` cannot match based on the content-type, however, -# # the `Content-Security-Policy` response header should be send -# # only for HTML documents and not for the other resources. -# -# Header unset Content-Security-Policy -# -# - -# ---------------------------------------------------------------------- -# | File access | -# ---------------------------------------------------------------------- - -# Block access to directories without a default document. -# -# You should leave the following uncommented, as you shouldn't allow -# anyone to surf through every directory on your server (which may -# includes rather private places such as the CMS's directories). - - - Options -Indexes - - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Block access to all hidden files and directories with the exception of -# the visible content from within the `/.well-known/` hidden directory. -# -# These types of files usually contain user preferences or the preserved -# state of an utility, and can include rather private places like, for -# example, the `.git` or `.svn` directories. -# -# The `/.well-known/` directory represents the standard (RFC 5785) path -# prefix for "well-known locations" (e.g.: `/.well-known/manifest.json`, -# `/.well-known/keybase.txt`), and therefore, access to its visible -# content should not be blocked. -# -# https://www.mnot.net/blog/2010/04/07/well-known -# https://tools.ietf.org/html/rfc5785 - - - RewriteEngine On - RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC] - RewriteCond %{SCRIPT_FILENAME} -d [OR] - RewriteCond %{SCRIPT_FILENAME} -f - RewriteRule "(^|/)\." - [F] - - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Block access to files that can expose sensitive information. -# -# By default, block access to backup and source files that may be -# left by some text editors and can pose a security risk when anyone -# has access to them. -# -# http://feross.org/cmsploit/ -# -# (!) Update the `` regular expression from below to -# include any files that might end up on your production server and -# can expose sensitive information about your website. These files may -# include: configuration files, files that contain metadata about the -# project (e.g.: project dependencies), build scripts, etc.. - - - - # Apache < 2.3 - - Order allow,deny - Deny from all - Satisfy All - - - # Apache ≥ 2.3 - - Require all denied - - - - -# ---------------------------------------------------------------------- -# | HTTP Strict Transport Security (HSTS) | -# ---------------------------------------------------------------------- - -# Force client-side SSL redirection. -# -# If a user types `example.com` in their browser, even if the server -# redirects them to the secure version of the website, that still leaves -# a window of opportunity (the initial HTTP connection) for an attacker -# to downgrade or redirect the request. -# -# The following header ensures that browser will ONLY connect to your -# server via HTTPS, regardless of what the users type in the browser's -# address bar. -# -# (!) Remove the `includeSubDomains` optional directive if the website's -# subdomains are not using HTTPS. -# -# http://www.html5rocks.com/en/tutorials/security/transport-layer-security/ -# https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14#section-6.1 -# http://blogs.msdn.com/b/ieinternals/archive/2014/08/18/hsts-strict-transport-security-attacks-mitigations-deployment-https.aspx - -# -# Header set Strict-Transport-Security "max-age=16070400; includeSubDomains" -# - -# ---------------------------------------------------------------------- -# | Reducing MIME type security risks | -# ---------------------------------------------------------------------- - -# Prevent some browsers from MIME-sniffing the response. -# -# This reduces exposure to drive-by download attacks and cross-origin -# data leaks, and should be left uncommented, especially if the server -# is serving user-uploaded content or content that could potentially be -# treated as executable by the browser. -# -# http://www.slideshare.net/hasegawayosuke/owasp-hasegawa -# http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx -# http://msdn.microsoft.com/en-us/library/ie/gg622941.aspx -# https://mimesniff.spec.whatwg.org/ - - - Header set X-Content-Type-Options "nosniff" - - -# ---------------------------------------------------------------------- -# | Reflected Cross-Site Scripting (XSS) attacks | -# ---------------------------------------------------------------------- - -# (1) Try to re-enable the cross-site scripting (XSS) filter built -# into most web browsers. -# -# The filter is usually enabled by default, but in some cases it -# may be disabled by the user. However, in Internet Explorer for -# example, it can be re-enabled just by sending the -# `X-XSS-Protection` header with the value of `1`. -# -# (2) Prevent web browsers from rendering the web page if a potential -# reflected (a.k.a non-persistent) XSS attack is detected by the -# filter. -# -# By default, if the filter is enabled and browsers detect a -# reflected XSS attack, they will attempt to block the attack -# by making the smallest possible modifications to the returned -# web page. -# -# Unfortunately, in some browsers (e.g.: Internet Explorer), -# this default behavior may allow the XSS filter to be exploited, -# thereby, it's better to inform browsers to prevent the rendering -# of the page altogether, instead of attempting to modify it. -# -# http://hackademix.net/2009/11/21/ies-xss-filter-creates-xss-vulnerabilities -# -# (!) Do not rely on the XSS filter to prevent XSS attacks! Ensure that -# you are taking all possible measures to prevent XSS attacks, the -# most obvious being: validating and sanitizing your website's inputs. -# -# http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-iv-the-xss-filter.aspx -# http://blogs.msdn.com/b/ieinternals/archive/2011/01/31/controlling-the-internet-explorer-xss-filter-with-the-x-xss-protection-http-header.aspx -# https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29 - -# -# # (1) (2) -# Header set X-XSS-Protection "1; mode=block" -# # `mod_headers` cannot match based on the content-type, however, -# # the `X-XSS-Protection` response header should be send only for -# # HTML documents and not for the other resources. -# -# Header unset X-XSS-Protection -# -# - -# ---------------------------------------------------------------------- -# | Server software information | -# ---------------------------------------------------------------------- - -# Prevent Apache from sending in the `Server` response header its -# exact version number, the description of the generic OS-type or -# information about its compiled-in modules. -# -# (!) The `ServerTokens` directive will only work in the main server -# configuration file, so don't try to enable it in the `.htaccess` file! -# -# https://httpd.apache.org/docs/current/mod/core.html#servertokens - -# ServerTokens Prod - - -# ###################################################################### -# # WEB PERFORMANCE # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Compression | -# ---------------------------------------------------------------------- - - - - # Force compression for mangled `Accept-Encoding` request headers - # https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html - - - - SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding - RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding - - - - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Compress all output labeled with one of the following media types. - # - # (!) For Apache versions below version 2.3.7 you don't need to - # enable `mod_filter` and can remove the `` - # and `` lines as `AddOutputFilterByType` is still in - # the core directives. - # - # https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype - - - AddOutputFilterByType DEFLATE "application/atom+xml" \ - "application/javascript" \ - "application/json" \ - "application/ld+json" \ - "application/manifest+json" \ - "application/rdf+xml" \ - "application/rss+xml" \ - "application/schema+json" \ - "application/vnd.geo+json" \ - "application/vnd.ms-fontobject" \ - "application/x-font-ttf" \ - "application/x-javascript" \ - "application/x-web-app-manifest+json" \ - "application/xhtml+xml" \ - "application/xml" \ - "font/eot" \ - "font/opentype" \ - "image/bmp" \ - "image/svg+xml" \ - "image/vnd.microsoft.icon" \ - "image/x-icon" \ - "text/cache-manifest" \ - "text/css" \ - "text/html" \ - "text/javascript" \ - "text/plain" \ - "text/vcard" \ - "text/vnd.rim.location.xloc" \ - "text/vtt" \ - "text/x-component" \ - "text/x-cross-domain-policy" \ - "text/xml" - - - - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Map the following filename extensions to the specified - # encoding type in order to make Apache serve the file types - # with the appropriate `Content-Encoding` response header - # (do note that this will NOT make Apache compress them!). - # - # If these files types would be served without an appropriate - # `Content-Enable` response header, client applications (e.g.: - # browsers) wouldn't know that they first need to uncompress - # the response, and thus, wouldn't be able to understand the - # content. - # - # https://httpd.apache.org/docs/current/mod/mod_mime.html#addencoding - - - AddEncoding gzip svgz - - - - -# ---------------------------------------------------------------------- -# | Content transformation | -# ---------------------------------------------------------------------- - -# Prevent intermediate caches or proxies (e.g.: such as the ones -# used by mobile network providers) from modifying the website's -# content. -# -# https://tools.ietf.org/html/rfc2616#section-14.9.5 -# -# (!) If you are using `mod_pagespeed`, please note that setting -# the `Cache-Control: no-transform` response header will prevent -# `PageSpeed` from rewriting `HTML` files, and, if the -# `ModPagespeedDisableRewriteOnNoTransform` directive isn't set -# to `off`, also from rewriting other resources. -# -# https://developers.google.com/speed/pagespeed/module/configuration#notransform - -# -# Header merge Cache-Control "no-transform" -# - -# ---------------------------------------------------------------------- -# | ETags | -# ---------------------------------------------------------------------- - -# Remove `ETags` as resources are sent with far-future expires headers. -# -# https://developer.yahoo.com/performance/rules.html#etags -# https://tools.ietf.org/html/rfc7232#section-2.3 - -# `FileETag None` doesn't work in all cases. - - Header unset ETag - - -FileETag None - -# ---------------------------------------------------------------------- -# | Expires headers | -# ---------------------------------------------------------------------- - -# Serve resources with far-future expires headers. -# -# (!) If you don't control versioning with filename-based -# cache busting, you should consider lowering the cache times -# to something like one week. -# -# https://httpd.apache.org/docs/current/mod/mod_expires.html - - - - ExpiresActive on - ExpiresDefault "access plus 1 month" - - # CSS - ExpiresByType text/css "access plus 1 year" - - # Data interchange - ExpiresByType application/atom+xml "access plus 1 hour" - ExpiresByType application/rdf+xml "access plus 1 hour" - ExpiresByType application/rss+xml "access plus 1 hour" - - ExpiresByType application/json "access plus 0 seconds" - ExpiresByType application/ld+json "access plus 0 seconds" - ExpiresByType application/schema+json "access plus 0 seconds" - ExpiresByType application/vnd.geo+json "access plus 0 seconds" - ExpiresByType application/xml "access plus 0 seconds" - ExpiresByType text/xml "access plus 0 seconds" - - # Favicon (cannot be renamed!) and cursor images - ExpiresByType image/vnd.microsoft.icon "access plus 1 week" - ExpiresByType image/x-icon "access plus 1 week" - - # HTML - ExpiresByType text/html "access plus 0 seconds" - - # JavaScript - ExpiresByType application/javascript "access plus 1 year" - ExpiresByType application/x-javascript "access plus 1 year" - ExpiresByType text/javascript "access plus 1 year" - - # Manifest files - ExpiresByType application/manifest+json "access plus 1 year" - - ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" - ExpiresByType text/cache-manifest "access plus 0 seconds" - - # Media files - ExpiresByType audio/ogg "access plus 1 month" - ExpiresByType image/bmp "access plus 1 month" - ExpiresByType image/gif "access plus 1 month" - ExpiresByType image/jpeg "access plus 1 month" - ExpiresByType image/png "access plus 1 month" - ExpiresByType image/svg+xml "access plus 1 month" - ExpiresByType video/mp4 "access plus 1 month" - ExpiresByType video/ogg "access plus 1 month" - ExpiresByType video/webm "access plus 1 month" - - # Web fonts - - # Embedded OpenType (EOT) - ExpiresByType application/vnd.ms-fontobject "access plus 1 month" - ExpiresByType font/eot "access plus 1 month" - - # OpenType - ExpiresByType font/opentype "access plus 1 month" - - # TrueType - ExpiresByType application/x-font-ttf "access plus 1 month" - - # Web Open Font Format (WOFF) 1.0 - ExpiresByType application/font-woff "access plus 1 month" - ExpiresByType application/x-font-woff "access plus 1 month" - ExpiresByType font/woff "access plus 1 month" - - # Web Open Font Format (WOFF) 2.0 - ExpiresByType application/font-woff2 "access plus 1 month" - - # Other - ExpiresByType text/x-cross-domain-policy "access plus 1 week" - - - -# ---------------------------------------------------------------------- -# | File concatenation | -# ---------------------------------------------------------------------- - -# Allow concatenation from within specific files. -# -# e.g.: -# -# If you have the following lines in a file called, for -# example, `main.combined.js`: -# -# -# -# -# Apache will replace those lines with the content of the -# specified files. - -# -# -# Options +Includes -# AddOutputFilterByType INCLUDES application/javascript \ -# application/x-javascript \ -# text/javascript -# SetOutputFilter INCLUDES -# -# -# Options +Includes -# AddOutputFilterByType INCLUDES text/css -# SetOutputFilter INCLUDES -# -# - -# ---------------------------------------------------------------------- -# | Filename-based cache busting | -# ---------------------------------------------------------------------- - -# If you're not using a build process to manage your filename version -# revving, you might want to consider enabling the following directives -# to route all requests such as `/style.12345.css` to `/style.css`. -# -# To understand why this is important and even a better solution than -# using something like `*.css?v231`, please see: -# http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/ - -# -# RewriteEngine On -# RewriteCond %{REQUEST_FILENAME} !-f -# RewriteRule ^(.+)\.(\d+)\.(bmp|css|cur|gif|ico|jpe?g|js|png|svgz?|webp)$ $1.$3 [L] -# diff --git a/app/crossdomain.xml b/app/crossdomain.xml deleted file mode 100644 index 818b822..0000000 --- a/app/crossdomain.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/app/fonts/README b/app/fonts/README deleted file mode 100644 index 5e78ddd..0000000 --- a/app/fonts/README +++ /dev/null @@ -1 +0,0 @@ -Add your custom fonts here :) \ No newline at end of file diff --git a/app/humans.txt b/app/humans.txt deleted file mode 100644 index 8d2330f..0000000 --- a/app/humans.txt +++ /dev/null @@ -1,15 +0,0 @@ -# humanstxt.org/ -# The humans responsible & technology colophon - -# TEAM - - -- -- - -# THANKS - - - -# TECHNOLOGY COLOPHON - - CSS3, HTML5 - Apache Server Configs, jQuery, Modernizr, Normalize.css diff --git a/app/images/README b/app/images/README deleted file mode 100644 index 3a9fc60..0000000 --- a/app/images/README +++ /dev/null @@ -1 +0,0 @@ -Place to put your images :) diff --git a/app/index.html b/app/index.html deleted file mode 100755 index 7847d09..0000000 --- a/app/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Website Title - - - - - - - - -

Content

- - - - - - - diff --git a/app/robots.txt b/app/robots.txt deleted file mode 100644 index d0e5f1b..0000000 --- a/app/robots.txt +++ /dev/null @@ -1,5 +0,0 @@ -# www.robotstxt.org/ - -# Allow crawling of all content -User-agent: * -Disallow: diff --git a/app/scripts/app.js b/app/scripts/app.js deleted file mode 100644 index 1458c71..0000000 --- a/app/scripts/app.js +++ /dev/null @@ -1 +0,0 @@ -window.Modernizr=function(e,t,n){function r(e){b.cssText=e}function o(e,t){return r(S.join(e+";")+(t||""))}function a(e,t){return typeof e===t}function i(e,t){return!!~(""+e).indexOf(t)}function s(e,t){for(var r in e){var o=e[r];if(!i(o,"-")&&b[o]!==n)return"pfx"==t?o:!0}return!1}function c(e,t,r){for(var o in e){var i=t[e[o]];if(i!==n)return r===!1?e[o]:a(i,"function")?i.bind(r||t):i}return!1}function l(e,t,n){var r=e.charAt(0).toUpperCase()+e.slice(1),o=(e+" "+T.join(r+" ")+r).split(" ");return a(t,"string")||a(t,"undefined")?s(o,t):(o=(e+" "+k.join(r+" ")+r).split(" "),c(o,t,n))}function u(){m.input=function(n){for(var r=0,o=n.length;o>r;r++)$[n[r]]=n[r]in x;return $.list&&($.list=!!t.createElement("datalist")&&!!e.HTMLDataListElement),$}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),m.inputtypes=function(e){for(var r,o,a,i=0,s=e.length;s>i;i++)x.setAttribute("type",o=e[i]),r="text"!==x.type,r&&(x.value=E,x.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(o)&&x.style.WebkitAppearance!==n?(g.appendChild(x),a=t.defaultView,r=a.getComputedStyle&&"textfield"!==a.getComputedStyle(x,null).WebkitAppearance&&0!==x.offsetHeight,g.removeChild(x)):/^(search|tel)$/.test(o)||(r=/^(url|email)$/.test(o)?x.checkValidity&&x.checkValidity()===!1:x.value!=E)),N[e[i]]=!!r;return N}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var d,f,p="2.8.3",m={},h=!0,g=t.documentElement,y="modernizr",v=t.createElement(y),b=v.style,x=t.createElement("input"),E=":)",w={}.toString,S=" -webkit- -moz- -o- -ms- ".split(" "),C="Webkit Moz O ms",T=C.split(" "),k=C.toLowerCase().split(" "),j={svg:"http://www.w3.org/2000/svg"},M={},N={},$={},z=[],P=z.slice,L=function(e,n,r,o){var a,i,s,c,l=t.createElement("div"),u=t.body,d=u||t.createElement("body");if(parseInt(r,10))for(;r--;)s=t.createElement("div"),s.id=o?o[r]:y+(r+1),l.appendChild(s);return a=["­",'"].join(""),l.id=y,(u?l:d).innerHTML+=a,d.appendChild(l),u||(d.style.background="",d.style.overflow="hidden",c=g.style.overflow,g.style.overflow="hidden",g.appendChild(d)),i=n(l,e),u?l.parentNode.removeChild(l):(d.parentNode.removeChild(d),g.style.overflow=c),!!i},O=function(t){var n=e.matchMedia||e.msMatchMedia;if(n)return n(t)&&n(t).matches||!1;var r;return L("@media "+t+" { #"+y+" { position: absolute; } }",function(t){r="absolute"==(e.getComputedStyle?getComputedStyle(t,null):t.currentStyle).position}),r},A=function(){function e(e,o){o=o||t.createElement(r[e]||"div"),e="on"+e;var i=e in o;return i||(o.setAttribute||(o=t.createElement("div")),o.setAttribute&&o.removeAttribute&&(o.setAttribute(e,""),i=a(o[e],"function"),a(o[e],"undefined")||(o[e]=n),o.removeAttribute(e))),o=null,i}var r={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return e}(),F={}.hasOwnProperty;f=a(F,"undefined")||a(F.call,"undefined")?function(e,t){return t in e&&a(e.constructor.prototype[t],"undefined")}:function(e,t){return F.call(e,t)},Function.prototype.bind||(Function.prototype.bind=function(e){var t=this;if("function"!=typeof t)throw new TypeError;var n=P.call(arguments,1),r=function(){if(this instanceof r){var o=function(){};o.prototype=t.prototype;var a=new o,i=t.apply(a,n.concat(P.call(arguments)));return Object(i)===i?i:a}return t.apply(e,n.concat(P.call(arguments)))};return r}),M.flexbox=function(){return l("flexWrap")},M.canvas=function(){var e=t.createElement("canvas");return!!e.getContext&&!!e.getContext("2d")},M.canvastext=function(){return!!m.canvas&&!!a(t.createElement("canvas").getContext("2d").fillText,"function")},M.webgl=function(){return!!e.WebGLRenderingContext},M.touch=function(){var n;return"ontouchstart"in e||e.DocumentTouch&&t instanceof DocumentTouch?n=!0:L(["@media (",S.join("touch-enabled),("),y,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(e){n=9===e.offsetTop}),n},M.geolocation=function(){return"geolocation"in navigator},M.postmessage=function(){return!!e.postMessage},M.websqldatabase=function(){return!!e.openDatabase},M.indexedDB=function(){return!!l("indexedDB",e)},M.hashchange=function(){return A("hashchange",e)&&(t.documentMode===n||t.documentMode>7)},M.history=function(){return!!e.history&&!!history.pushState},M.draganddrop=function(){var e=t.createElement("div");return"draggable"in e||"ondragstart"in e&&"ondrop"in e},M.websockets=function(){return"WebSocket"in e||"MozWebSocket"in e},M.rgba=function(){return r("background-color:rgba(150,255,150,.5)"),i(b.backgroundColor,"rgba")},M.hsla=function(){return r("background-color:hsla(120,40%,100%,.5)"),i(b.backgroundColor,"rgba")||i(b.backgroundColor,"hsla")},M.multiplebgs=function(){return r("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(b.background)},M.backgroundsize=function(){return l("backgroundSize")},M.borderimage=function(){return l("borderImage")},M.borderradius=function(){return l("borderRadius")},M.boxshadow=function(){return l("boxShadow")},M.textshadow=function(){return""===t.createElement("div").style.textShadow},M.opacity=function(){return o("opacity:.55"),/^0.55$/.test(b.opacity)},M.cssanimations=function(){return l("animationName")},M.csscolumns=function(){return l("columnCount")},M.cssgradients=function(){var e="background-image:",t="gradient(linear,left top,right bottom,from(#9f9),to(white));",n="linear-gradient(left top,#9f9, white);";return r((e+"-webkit- ".split(" ").join(t+e)+S.join(n+e)).slice(0,-e.length)),i(b.backgroundImage,"gradient")},M.cssreflections=function(){return l("boxReflect")},M.csstransforms=function(){return!!l("transform")},M.csstransforms3d=function(){var e=!!l("perspective");return e&&"webkitPerspective"in g.style&&L("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(t,n){e=9===t.offsetLeft&&3===t.offsetHeight}),e},M.csstransitions=function(){return l("transition")},M.fontface=function(){var e;return L('@font-face {font-family:"font";src:url("https://")}',function(n,r){var o=t.getElementById("smodernizr"),a=o.sheet||o.styleSheet,i=a?a.cssRules&&a.cssRules[0]?a.cssRules[0].cssText:a.cssText||"":"";e=/src/i.test(i)&&0===i.indexOf(r.split(" ")[0])}),e},M.generatedcontent=function(){var e;return L(["#",y,"{font:0/0 a}#",y,':after{content:"',E,'";visibility:hidden;font:3px/1 a}'].join(""),function(t){e=t.offsetHeight>=3}),e},M.video=function(){var e=t.createElement("video"),n=!1;try{(n=!!e.canPlayType)&&(n=new Boolean(n),n.ogg=e.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),n.h264=e.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),n.webm=e.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,""))}catch(r){}return n},M.audio=function(){var e=t.createElement("audio"),n=!1;try{(n=!!e.canPlayType)&&(n=new Boolean(n),n.ogg=e.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),n.mp3=e.canPlayType("audio/mpeg;").replace(/^no$/,""),n.wav=e.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),n.m4a=(e.canPlayType("audio/x-m4a;")||e.canPlayType("audio/aac;")).replace(/^no$/,""))}catch(r){}return n},M.localstorage=function(){try{return localStorage.setItem(y,y),localStorage.removeItem(y),!0}catch(e){return!1}},M.sessionstorage=function(){try{return sessionStorage.setItem(y,y),sessionStorage.removeItem(y),!0}catch(e){return!1}},M.webworkers=function(){return!!e.Worker},M.applicationcache=function(){return!!e.applicationCache},M.svg=function(){return!!t.createElementNS&&!!t.createElementNS(j.svg,"svg").createSVGRect},M.inlinesvg=function(){var e=t.createElement("div");return e.innerHTML="",(e.firstChild&&e.firstChild.namespaceURI)==j.svg},M.smil=function(){return!!t.createElementNS&&/SVGAnimate/.test(w.call(t.createElementNS(j.svg,"animate")))},M.svgclippaths=function(){return!!t.createElementNS&&/SVGClipPath/.test(w.call(t.createElementNS(j.svg,"clipPath")))};for(var R in M)f(M,R)&&(d=R.toLowerCase(),m[d]=M[R](),z.push((m[d]?"":"no-")+d));return m.input||u(),m.addTest=function(e,t){if("object"==typeof e)for(var r in e)f(e,r)&&m.addTest(r,e[r]);else{if(e=e.toLowerCase(),m[e]!==n)return m;t="function"==typeof t?t():t,"undefined"!=typeof h&&h&&(g.className+=" "+(t?"":"no-")+e),m[e]=t}return m},r(""),v=x=null,function(e,t){function n(e,t){var n=e.createElement("p"),r=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x",r.insertBefore(n.lastChild,r.firstChild)}function r(){var e=v.elements;return"string"==typeof e?e.split(" "):e}function o(e){var t=y[e[h]];return t||(t={},g++,e[h]=g,y[g]=t),t}function a(e,n,r){if(n||(n=t),u)return n.createElement(e);r||(r=o(n));var a;return a=r.cache[e]?r.cache[e].cloneNode():m.test(e)?(r.cache[e]=r.createElem(e)).cloneNode():r.createElem(e),!a.canHaveChildren||p.test(e)||a.tagUrn?a:r.frag.appendChild(a)}function i(e,n){if(e||(e=t),u)return e.createDocumentFragment();n=n||o(e);for(var a=n.frag.cloneNode(),i=0,s=r(),c=s.length;c>i;i++)a.createElement(s[i]);return a}function s(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return v.shivMethods?a(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-]+/g,function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'})+");return n}")(v,t.frag)}function c(e){e||(e=t);var r=o(e);return v.shivCSS&&!l&&!r.hasCSS&&(r.hasCSS=!!n(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),u||s(e,r),e}var l,u,d="3.7.0",f=e.html5||{},p=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,m=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,h="_html5shiv",g=0,y={};!function(){try{var e=t.createElement("a");e.innerHTML="",l="hidden"in e,u=1==e.childNodes.length||function(){t.createElement("a");var e=t.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(n){l=!0,u=!0}}();var v={elements:f.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:d,shivCSS:f.shivCSS!==!1,supportsUnknownElements:u,shivMethods:f.shivMethods!==!1,type:"default",shivDocument:c,createElement:a,createDocumentFragment:i};e.html5=v,c(t)}(this,t),m._version=p,m._prefixes=S,m._domPrefixes=k,m._cssomPrefixes=T,m.mq=O,m.hasEvent=A,m.testProp=function(e){return s([e])},m.testAllProps=l,m.testStyles=L,m.prefixed=function(e,t,n){return t?l(e,t,n):l(e,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(h?" js "+z.join(" "):""),m}(this,this.document),function(e,t,n){function r(e){return"[object Function]"==g.call(e)}function o(e){return"string"==typeof e}function a(){}function i(e){return!e||"loaded"==e||"complete"==e||"uninitialized"==e}function s(){var e=y.shift();v=1,e?e.t?m(function(){("c"==e.t?f.injectCss:f.injectJs)(e.s,0,e.a,e.x,e.e,1)},0):(e(),s()):v=0}function c(e,n,r,o,a,c,l){function u(t){if(!p&&i(d.readyState)&&(b.r=p=1,!v&&s(),d.onload=d.onreadystatechange=null,t)){"img"!=e&&m(function(){E.removeChild(d)},50);for(var r in k[n])k[n].hasOwnProperty(r)&&k[n][r].onload()}}var l=l||f.errorTimeout,d=t.createElement(e),p=0,g=0,b={t:r,s:n,e:a,a:c,x:l};1===k[n]&&(g=1,k[n]=[]),"object"==e?d.data=n:(d.src=n,d.type=e),d.width=d.height="0",d.onerror=d.onload=d.onreadystatechange=function(){u.call(this,g)},y.splice(o,0,b),"img"!=e&&(g||2===k[n]?(E.insertBefore(d,x?null:h),m(u,l)):k[n].push(d))}function l(e,t,n,r,a){return v=0,t=t||"j",o(e)?c("c"==t?S:w,e,t,this.i++,n,r,a):(y.splice(this.i++,0,e),1==y.length&&s()),this}function u(){var e=f;return e.loader={load:l,i:0},e}var d,f,p=t.documentElement,m=e.setTimeout,h=t.getElementsByTagName("script")[0],g={}.toString,y=[],v=0,b="MozAppearance"in p.style,x=b&&!!t.createRange().compareNode,E=x?p:h.parentNode,p=e.opera&&"[object Opera]"==g.call(e.opera),p=!!t.attachEvent&&!p,w=b?"object":p?"script":"img",S=p?"script":w,C=Array.isArray||function(e){return"[object Array]"==g.call(e)},T=[],k={},j={timeout:function(e,t){return t.length&&(e.timeout=t[0]),e}};f=function(e){function t(e){var t,n,r,e=e.split("!"),o=T.length,a=e.pop(),i=e.length,a={url:a,origUrl:a,prefixes:e};for(n=0;i>n;n++)r=e[n].split("="),(t=j[r.shift()])&&(a=t(a,r));for(n=0;o>n;n++)a=T[n](a);return a}function i(e,o,a,i,s){var c=t(e),l=c.autoCallback;c.url.split(".").pop().split("?").shift(),c.bypass||(o&&(o=r(o)?o:o[e]||o[i]||o[e.split("/").pop().split("?")[0]]),c.instead?c.instead(e,o,a,i,s):(k[c.url]?c.noexec=!0:k[c.url]=1,a.load(c.url,c.forceCSS||!c.forceJS&&"css"==c.url.split(".").pop().split("?").shift()?"c":n,c.noexec,c.attrs,c.timeout),(r(o)||r(l))&&a.load(function(){u(),o&&o(c.origUrl,s,i),l&&l(c.origUrl,s,i),k[c.url]=2})))}function s(e,t){function n(e,n){if(e){if(o(e))n||(d=function(){var e=[].slice.call(arguments);f.apply(this,e),p()}),i(e,d,t,0,l);else if(Object(e)===e)for(c in s=function(){var t,n=0;for(t in e)e.hasOwnProperty(t)&&n++;return n}(),e)e.hasOwnProperty(c)&&(!n&&!--s&&(r(d)?d=function(){var e=[].slice.call(arguments);f.apply(this,e),p()}:d[c]=function(e){return function(){var t=[].slice.call(arguments);e&&e.apply(this,t),p()}}(f[c])),i(e[c],d,t,c,l))}else!n&&p()}var s,c,l=!!e.test,u=e.load||e.both,d=e.callback||a,f=d,p=e.complete||a;n(l?e.yep:e.nope,!!u),u&&n(u)}var c,l,d=this.yepnope.loader;if(o(e))i(e,0,d,0);else if(C(e))for(c=0;c #mq-test-1 { width: 42px; }',r.insertBefore(a,o),n=42===i.offsetWidth,r.removeChild(a),{matches:n,media:e}}}(e.document)}(this),function(e){"use strict";function t(){E(!0)}var n={};e.respond=n,n.update=function(){};var r=[],o=function(){var t=!1;try{t=new e.XMLHttpRequest}catch(n){t=new e.ActiveXObject("Microsoft.XMLHTTP")}return function(){return t}}(),a=function(e,t){var n=o();n&&(n.open("GET",e,!0),n.onreadystatechange=function(){4!==n.readyState||200!==n.status&&304!==n.status||t(n.responseText)},4!==n.readyState&&n.send(null))},i=function(e){return e.replace(n.regex.minmaxwh,"").match(n.regex.other)};if(n.ajax=a,n.queue=r,n.unsupportedmq=i,n.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^\/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},n.mediaQueriesSupported=e.matchMedia&&null!==e.matchMedia("only all")&&e.matchMedia("only all").matches,!n.mediaQueriesSupported){var s,c,l,u=e.document,d=u.documentElement,f=[],p=[],m=[],h={},g=30,y=u.getElementsByTagName("head")[0]||d,v=u.getElementsByTagName("base")[0],b=y.getElementsByTagName("link"),x=function(){var e,t=u.createElement("div"),n=u.body,r=d.style.fontSize,o=n&&n.style.fontSize,a=!1;return t.style.cssText="position:absolute;font-size:1em;width:1em",n||(n=a=u.createElement("body"),n.style.background="none"),d.style.fontSize="100%",n.style.fontSize="100%",n.appendChild(t),a&&d.insertBefore(n,d.firstChild),e=t.offsetWidth,a?d.removeChild(n):n.removeChild(t),d.style.fontSize=r,o&&(n.style.fontSize=o),e=l=parseFloat(e)},E=function(t){var n="clientWidth",r=d[n],o="CSS1Compat"===u.compatMode&&r||u.body[n]||r,a={},i=b[b.length-1],h=(new Date).getTime();if(t&&s&&g>h-s)return e.clearTimeout(c),void(c=e.setTimeout(E,g));s=h;for(var v in f)if(f.hasOwnProperty(v)){var w=f[v],S=w.minw,C=w.maxw,T=null===S,k=null===C,j="em";S&&(S=parseFloat(S)*(S.indexOf(j)>-1?l||x():1)),C&&(C=parseFloat(C)*(C.indexOf(j)>-1?l||x():1)),w.hasquery&&(T&&k||!(T||o>=S)||!(k||C>=o))||(a[w.media]||(a[w.media]=[]),a[w.media].push(p[w.rules]))}for(var M in m)m.hasOwnProperty(M)&&m[M]&&m[M].parentNode===y&&y.removeChild(m[M]);m.length=0;for(var N in a)if(a.hasOwnProperty(N)){var $=u.createElement("style"),z=a[N].join("\n");$.type="text/css",$.media=N,y.insertBefore($,i.nextSibling),$.styleSheet?$.styleSheet.cssText=z:$.appendChild(u.createTextNode(z)),m.push($)}},w=function(e,t,r){var o=e.replace(n.regex.comments,"").replace(n.regex.keyframes,"").match(n.regex.media),a=o&&o.length||0;t=t.substring(0,t.lastIndexOf("/"));var s=function(e){return e.replace(n.regex.urls,"$1"+t+"$2$3")},c=!a&&r;t.length&&(t+="/"),c&&(a=1);for(var l=0;a>l;l++){var u,d,m,h;c?(u=r,p.push(s(e))):(u=o[l].match(n.regex.findStyles)&&RegExp.$1,p.push(RegExp.$2&&s(RegExp.$2))),m=u.split(","),h=m.length;for(var g=0;h>g;g++)d=m[g],i(d)||f.push({media:d.split("(")[0].match(n.regex.only)&&RegExp.$2||"all",rules:p.length-1,hasquery:d.indexOf("(")>-1,minw:d.match(n.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:d.match(n.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}E()},S=function(){if(r.length){var t=r.shift();a(t.href,function(n){w(n,t.href,t.media),h[t.href]=!0,e.setTimeout(function(){S()},0)})}},C=function(){for(var t=0;t',a,""].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b)&&c(b).matches||!1;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function l(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function m(){var a=s.elements;return typeof a=="string"?a.split(" "):a}function n(a){var b=j[a[h]];return b||(b={},i++,a[h]=i,j[i]=b),b}function o(a,c,d){c||(c=b);if(k)return c.createElement(a);d||(d=n(c));var g;return d.cache[a]?g=d.cache[a].cloneNode():f.test(a)?g=(d.cache[a]=d.createElem(a)).cloneNode():g=d.createElem(a),g.canHaveChildren&&!e.test(a)&&!g.tagUrn?d.frag.appendChild(g):g}function p(a,c){a||(a=b);if(k)return a.createDocumentFragment();c=c||n(a);var d=c.frag.cloneNode(),e=0,f=m(),g=f.length;for(;e",g="hidden"in a,k=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){g=!0,k=!0}})();var s={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:c,shivCSS:d.shivCSS!==!1,supportsUnknownElements:k,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:r,createElement:o,createDocumentFragment:p};a.html5=s,r(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f #mq-test-1 { width: 42px; }'; - docElem.insertBefore(fakeBody, refNode); - bool = div.offsetWidth === 42; - docElem.removeChild(fakeBody); - return { - matches: bool, - media: q - }; - }; - }(w.document); -})(this); - -(function(w) { - "use strict"; - var respond = {}; - w.respond = respond; - respond.update = function() {}; - var requestQueue = [], xmlHttp = function() { - var xmlhttpmethod = false; - try { - xmlhttpmethod = new w.XMLHttpRequest(); - } catch (e) { - xmlhttpmethod = new w.ActiveXObject("Microsoft.XMLHTTP"); - } - return function() { - return xmlhttpmethod; - }; - }(), ajax = function(url, callback) { - var req = xmlHttp(); - if (!req) { - return; - } - req.open("GET", url, true); - req.onreadystatechange = function() { - if (req.readyState !== 4 || req.status !== 200 && req.status !== 304) { - return; - } - callback(req.responseText); - }; - if (req.readyState === 4) { - return; - } - req.send(null); - }, isUnsupportedMediaQuery = function(query) { - return query.replace(respond.regex.minmaxwh, "").match(respond.regex.other); - }; - respond.ajax = ajax; - respond.queue = requestQueue; - respond.unsupportedmq = isUnsupportedMediaQuery; - respond.regex = { - media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi, - keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi, - comments: /\/\*[^*]*\*+([^/][^*]*\*+)*\//gi, - urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g, - findStyles: /@media *([^\{]+)\{([\S\s]+?)$/, - only: /(only\s+)?([a-zA-Z]+)\s?/, - minw: /\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/, - maxw: /\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/, - minmaxwh: /\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi, - other: /\([^\)]*\)/g - }; - respond.mediaQueriesSupported = w.matchMedia && w.matchMedia("only all") !== null && w.matchMedia("only all").matches; - if (respond.mediaQueriesSupported) { - return; - } - var doc = w.document, docElem = doc.documentElement, mediastyles = [], rules = [], appendedEls = [], parsedSheets = {}, resizeThrottle = 30, head = doc.getElementsByTagName("head")[0] || docElem, base = doc.getElementsByTagName("base")[0], links = head.getElementsByTagName("link"), lastCall, resizeDefer, eminpx, getEmValue = function() { - var ret, div = doc.createElement("div"), body = doc.body, originalHTMLFontSize = docElem.style.fontSize, originalBodyFontSize = body && body.style.fontSize, fakeUsed = false; - div.style.cssText = "position:absolute;font-size:1em;width:1em"; - if (!body) { - body = fakeUsed = doc.createElement("body"); - body.style.background = "none"; - } - docElem.style.fontSize = "100%"; - body.style.fontSize = "100%"; - body.appendChild(div); - if (fakeUsed) { - docElem.insertBefore(body, docElem.firstChild); - } - ret = div.offsetWidth; - if (fakeUsed) { - docElem.removeChild(body); - } else { - body.removeChild(div); - } - docElem.style.fontSize = originalHTMLFontSize; - if (originalBodyFontSize) { - body.style.fontSize = originalBodyFontSize; - } - ret = eminpx = parseFloat(ret); - return ret; - }, applyMedia = function(fromResize) { - var name = "clientWidth", docElemProp = docElem[name], currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[name] || docElemProp, styleBlocks = {}, lastLink = links[links.length - 1], now = new Date().getTime(); - if (fromResize && lastCall && now - lastCall < resizeThrottle) { - w.clearTimeout(resizeDefer); - resizeDefer = w.setTimeout(applyMedia, resizeThrottle); - return; - } else { - lastCall = now; - } - for (var i in mediastyles) { - if (mediastyles.hasOwnProperty(i)) { - var thisstyle = mediastyles[i], min = thisstyle.minw, max = thisstyle.maxw, minnull = min === null, maxnull = max === null, em = "em"; - if (!!min) { - min = parseFloat(min) * (min.indexOf(em) > -1 ? eminpx || getEmValue() : 1); - } - if (!!max) { - max = parseFloat(max) * (max.indexOf(em) > -1 ? eminpx || getEmValue() : 1); - } - if (!thisstyle.hasquery || (!minnull || !maxnull) && (minnull || currWidth >= min) && (maxnull || currWidth <= max)) { - if (!styleBlocks[thisstyle.media]) { - styleBlocks[thisstyle.media] = []; - } - styleBlocks[thisstyle.media].push(rules[thisstyle.rules]); - } - } - } - for (var j in appendedEls) { - if (appendedEls.hasOwnProperty(j)) { - if (appendedEls[j] && appendedEls[j].parentNode === head) { - head.removeChild(appendedEls[j]); - } - } - } - appendedEls.length = 0; - for (var k in styleBlocks) { - if (styleBlocks.hasOwnProperty(k)) { - var ss = doc.createElement("style"), css = styleBlocks[k].join("\n"); - ss.type = "text/css"; - ss.media = k; - head.insertBefore(ss, lastLink.nextSibling); - if (ss.styleSheet) { - ss.styleSheet.cssText = css; - } else { - ss.appendChild(doc.createTextNode(css)); - } - appendedEls.push(ss); - } - } - }, translate = function(styles, href, media) { - var qs = styles.replace(respond.regex.comments, "").replace(respond.regex.keyframes, "").match(respond.regex.media), ql = qs && qs.length || 0; - href = href.substring(0, href.lastIndexOf("/")); - var repUrls = function(css) { - return css.replace(respond.regex.urls, "$1" + href + "$2$3"); - }, useMedia = !ql && media; - if (href.length) { - href += "/"; - } - if (useMedia) { - ql = 1; - } - for (var i = 0; i < ql; i++) { - var fullq, thisq, eachq, eql; - if (useMedia) { - fullq = media; - rules.push(repUrls(styles)); - } else { - fullq = qs[i].match(respond.regex.findStyles) && RegExp.$1; - rules.push(RegExp.$2 && repUrls(RegExp.$2)); - } - eachq = fullq.split(","); - eql = eachq.length; - for (var j = 0; j < eql; j++) { - thisq = eachq[j]; - if (isUnsupportedMediaQuery(thisq)) { - continue; - } - mediastyles.push({ - media: thisq.split("(")[0].match(respond.regex.only) && RegExp.$2 || "all", - rules: rules.length - 1, - hasquery: thisq.indexOf("(") > -1, - minw: thisq.match(respond.regex.minw) && parseFloat(RegExp.$1) + (RegExp.$2 || ""), - maxw: thisq.match(respond.regex.maxw) && parseFloat(RegExp.$1) + (RegExp.$2 || "") - }); - } - } - applyMedia(); - }, makeRequests = function() { - if (requestQueue.length) { - var thisRequest = requestQueue.shift(); - ajax(thisRequest.href, function(styles) { - translate(styles, thisRequest.href, thisRequest.media); - parsedSheets[thisRequest.href] = true; - w.setTimeout(function() { - makeRequests(); - }, 0); - }); - } - }, ripCSS = function() { - for (var i = 0; i < links.length; i++) { - var sheet = links[i], href = sheet.href, media = sheet.media, isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet"; - if (!!href && isCSS && !parsedSheets[href]) { - if (sheet.styleSheet && sheet.styleSheet.rawCssText) { - translate(sheet.styleSheet.rawCssText, href, media); - parsedSheets[href] = true; - } else { - if (!/^([a-zA-Z:]*\/\/)/.test(href) && !base || href.replace(RegExp.$1, "").split("/")[0] === w.location.host) { - if (href.substring(0, 2) === "//") { - href = w.location.protocol + href; - } - requestQueue.push({ - href: href, - media: media - }); - } - } - } - } - makeRequests(); - }; - ripCSS(); - respond.update = ripCSS; - respond.getEmValue = getEmValue; - function callMedia() { - applyMedia(true); - } - if (w.addEventListener) { - w.addEventListener("resize", callMedia, false); - } else if (w.attachEvent) { - w.attachEvent("onresize", callMedia); - } -})(this); \ No newline at end of file diff --git a/app/scripts/src/_includes/selectivizr.js b/app/scripts/src/_includes/selectivizr.js deleted file mode 100644 index cdb9350..0000000 --- a/app/scripts/src/_includes/selectivizr.js +++ /dev/null @@ -1,561 +0,0 @@ -/* -selectivizr v1.0.2 - (c) Keith Clark, freely distributable under the terms -of the MIT license. - -selectivizr.com -*/ -/* - -Notes about this source ------------------------ - - * The #DEBUG_START and #DEBUG_END comments are used to mark blocks of code - that will be removed prior to building a final release version (using a - pre-compression script) - - -References: ------------ - - * CSS Syntax : http://www.w3.org/TR/2003/WD-css3-syntax-20030813/#style - * Selectors : http://www.w3.org/TR/css3-selectors/#selectors - * IE Compatability : http://msdn.microsoft.com/en-us/library/cc351024(VS.85).aspx - * W3C Selector Tests : http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/ - -*/ - -(function(win) { - - // If browser isn't IE, then stop execution! This handles the script - // being loaded by non IE browsers because the developer didn't use - // conditional comments. - if (/*@cc_on!@*/true) return; - - // =========================== Init Objects ============================ - - var doc = document; - var root = doc.documentElement; - var xhr = getXHRObject(); - var ieVersion = /MSIE (\d+)/.exec(navigator.userAgent)[1]; - - // If were not in standards mode, IE is too old / new or we can't create - // an XMLHttpRequest object then we should get out now. - if (doc.compatMode != 'CSS1Compat' || ieVersion<6 || ieVersion>8 || !xhr) { - return; - } - - - // ========================= Common Objects ============================ - - // Compatiable selector engines in order of CSS3 support. Note: '*' is - // a placholder for the object key name. (basically, crude compression) - var selectorEngines = { - "NW" : "*.Dom.select", - "MooTools" : "$$", - "DOMAssistant" : "*.$", - "Prototype" : "$$", - "YAHOO" : "*.util.Selector.query", - "Sizzle" : "*", - "jQuery" : "*", - "dojo" : "*.query" - }; - - var selectorMethod; - var enabledWatchers = []; // array of :enabled/:disabled elements to poll - var ie6PatchID = 0; // used to solve ie6's multiple class bug - var patchIE6MultipleClasses = true; // if true adds class bloat to ie6 - var namespace = "slvzr"; - - // Stylesheet parsing regexp's - var RE_COMMENT = /(\/\*[^*]*\*+([^\/][^*]*\*+)*\/)\s*/g; - var RE_IMPORT = /@import\s*(?:(?:(?:url\(\s*(['"]?)(.*)\1)\s*\))|(?:(['"])(.*)\3))[^;]*;/g; - var RE_ASSET_URL = /\burl\(\s*(["']?)(?!data:)([^"')]+)\1\s*\)/g; - var RE_PSEUDO_STRUCTURAL = /^:(empty|(first|last|only|nth(-last)?)-(child|of-type))$/; - var RE_PSEUDO_ELEMENTS = /:(:first-(?:line|letter))/g; - var RE_SELECTOR_GROUP = /(^|})\s*([^\{]*?[\[:][^{]+)/g; - var RE_SELECTOR_PARSE = /([ +~>])|(:[a-z-]+(?:\(.*?\)+)?)|(\[.*?\])/g; - var RE_LIBRARY_INCOMPATIBLE_PSEUDOS = /(:not\()?:(hover|enabled|disabled|focus|checked|target|active|visited|first-line|first-letter)\)?/g; - var RE_PATCH_CLASS_NAME_REPLACE = /[^\w-]/g; - - // HTML UI element regexp's - var RE_INPUT_ELEMENTS = /^(INPUT|SELECT|TEXTAREA|BUTTON)$/; - var RE_INPUT_CHECKABLE_TYPES = /^(checkbox|radio)$/; - - // Broken attribute selector implementations (IE7/8 native [^=""], [$=""] and [*=""]) - var BROKEN_ATTR_IMPLEMENTATIONS = ieVersion>6 ? /[\$\^*]=(['"])\1/ : null; - - // Whitespace normalization regexp's - var RE_TIDY_TRAILING_WHITESPACE = /([(\[+~])\s+/g; - var RE_TIDY_LEADING_WHITESPACE = /\s+([)\]+~])/g; - var RE_TIDY_CONSECUTIVE_WHITESPACE = /\s+/g; - var RE_TIDY_TRIM_WHITESPACE = /^\s*((?:[\S\s]*\S)?)\s*$/; - - // String constants - var EMPTY_STRING = ""; - var SPACE_STRING = " "; - var PLACEHOLDER_STRING = "$1"; - - // =========================== Patching ================================ - - // --[ patchStyleSheet() ]---------------------------------------------- - // Scans the passed cssText for selectors that require emulation and - // creates one or more patches for each matched selector. - function patchStyleSheet( cssText ) { - return cssText.replace(RE_PSEUDO_ELEMENTS, PLACEHOLDER_STRING). - replace(RE_SELECTOR_GROUP, function(m, prefix, selectorText) { - var selectorGroups = selectorText.split(","); - for (var c = 0, cs = selectorGroups.length; c < cs; c++) { - var selector = normalizeSelectorWhitespace(selectorGroups[c]) + SPACE_STRING; - var patches = []; - selectorGroups[c] = selector.replace(RE_SELECTOR_PARSE, - function(match, combinator, pseudo, attribute, index) { - if (combinator) { - if (patches.length>0) { - applyPatches( selector.substring(0, index), patches ); - patches = []; - } - return combinator; - } - else { - var patch = (pseudo) ? patchPseudoClass( pseudo ) : patchAttribute( attribute ); - if (patch) { - patches.push(patch); - return "." + patch.className; - } - return match; - } - } - ); - } - return prefix + selectorGroups.join(","); - }); - }; - - // --[ patchAttribute() ]----------------------------------------------- - // returns a patch for an attribute selector. - function patchAttribute( attr ) { - return (!BROKEN_ATTR_IMPLEMENTATIONS || BROKEN_ATTR_IMPLEMENTATIONS.test(attr)) ? - { className: createClassName(attr), applyClass: true } : null; - }; - - // --[ patchPseudoClass() ]--------------------------------------------- - // returns a patch for a pseudo-class - function patchPseudoClass( pseudo ) { - - var applyClass = true; - var className = createClassName(pseudo.slice(1)); - var isNegated = pseudo.substring(0, 5) == ":not("; - var activateEventName; - var deactivateEventName; - - // if negated, remove :not() - if (isNegated) { - pseudo = pseudo.slice(5, -1); - } - - // bracket contents are irrelevant - remove them - var bracketIndex = pseudo.indexOf("(") - if (bracketIndex > -1) { - pseudo = pseudo.substring(0, bracketIndex); - } - - // check we're still dealing with a pseudo-class - if (pseudo.charAt(0) == ":") { - switch (pseudo.slice(1)) { - - case "root": - applyClass = function(e) { - return isNegated ? e != root : e == root; - } - break; - - case "target": - // :target is only supported in IE8 - if (ieVersion == 8) { - applyClass = function(e) { - var handler = function() { - var hash = location.hash; - var hashID = hash.slice(1); - return isNegated ? (hash == EMPTY_STRING || e.id != hashID) : (hash != EMPTY_STRING && e.id == hashID); - }; - addEvent( win, "hashchange", function() { - toggleElementClass(e, className, handler()); - }) - return handler(); - } - break; - } - return false; - - case "checked": - applyClass = function(e) { - if (RE_INPUT_CHECKABLE_TYPES.test(e.type)) { - addEvent( e, "propertychange", function() { - if (event.propertyName == "checked") { - toggleElementClass( e, className, e.checked !== isNegated ); - } - }) - } - return e.checked !== isNegated; - } - break; - - case "disabled": - isNegated = !isNegated; - - case "enabled": - applyClass = function(e) { - if (RE_INPUT_ELEMENTS.test(e.tagName)) { - addEvent( e, "propertychange", function() { - if (event.propertyName == "$disabled") { - toggleElementClass( e, className, e.$disabled === isNegated ); - } - }); - enabledWatchers.push(e); - e.$disabled = e.disabled; - return e.disabled === isNegated; - } - return pseudo == ":enabled" ? isNegated : !isNegated; - } - break; - - case "focus": - activateEventName = "focus"; - deactivateEventName = "blur"; - - case "hover": - if (!activateEventName) { - activateEventName = "mouseenter"; - deactivateEventName = "mouseleave"; - } - applyClass = function(e) { - addEvent( e, isNegated ? deactivateEventName : activateEventName, function() { - toggleElementClass( e, className, true ); - }) - addEvent( e, isNegated ? activateEventName : deactivateEventName, function() { - toggleElementClass( e, className, false ); - }) - return isNegated; - } - break; - - // everything else - default: - // If we don't support this pseudo-class don't create - // a patch for it - if (!RE_PSEUDO_STRUCTURAL.test(pseudo)) { - return false; - } - break; - } - } - return { className: className, applyClass: applyClass }; - }; - - // --[ applyPatches() ]------------------------------------------------- - // uses the passed selector text to find DOM nodes and patch them - function applyPatches(selectorText, patches) { - var elms; - - // Although some selector libraries can find :checked :enabled etc. - // we need to find all elements that could have that state because - // it can be changed by the user. - var domSelectorText = selectorText.replace(RE_LIBRARY_INCOMPATIBLE_PSEUDOS, EMPTY_STRING); - - // If the dom selector equates to an empty string or ends with - // whitespace then we need to append a universal selector (*) to it. - if (domSelectorText == EMPTY_STRING || domSelectorText.charAt(domSelectorText.length - 1) == SPACE_STRING) { - domSelectorText += "*"; - } - - // Ensure we catch errors from the selector library - try { - elms = selectorMethod( domSelectorText ); - } catch (ex) { - // #DEBUG_START - log( "Selector '" + selectorText + "' threw exception '" + ex + "'" ); - // #DEBUG_END - } - - - if (elms) { - for (var d = 0, dl = elms.length; d < dl; d++) { - var elm = elms[d]; - var cssClasses = elm.className; - for (var f = 0, fl = patches.length; f < fl; f++) { - var patch = patches[f]; - - if (!hasPatch(elm, patch)) { - if (patch.applyClass && (patch.applyClass === true || patch.applyClass(elm) === true)) { - cssClasses = toggleClass(cssClasses, patch.className, true ); - } - } - } - elm.className = cssClasses; - } - } - }; - - // --[ hasPatch() ]----------------------------------------------------- - // checks for the exsistence of a patch on an element - function hasPatch( elm, patch ) { - return new RegExp("(^|\\s)" + patch.className + "(\\s|$)").test(elm.className); - }; - - - // =========================== Utility ================================= - - function createClassName( className ) { - return namespace + "-" + ((ieVersion == 6 && patchIE6MultipleClasses) ? - ie6PatchID++ - : - className.replace(RE_PATCH_CLASS_NAME_REPLACE, function(a) { return a.charCodeAt(0) })); - }; - - // --[ log() ]---------------------------------------------------------- - // #DEBUG_START - function log( message ) { - if (win.console) { - win.console.log(message); - } - }; - // #DEBUG_END - - // --[ trim() ]--------------------------------------------------------- - // removes leading, trailing whitespace from a string - function trim( text ) { - return text.replace(RE_TIDY_TRIM_WHITESPACE, PLACEHOLDER_STRING); - }; - - // --[ normalizeWhitespace() ]------------------------------------------ - // removes leading, trailing and consecutive whitespace from a string - function normalizeWhitespace( text ) { - return trim(text).replace(RE_TIDY_CONSECUTIVE_WHITESPACE, SPACE_STRING); - }; - - // --[ normalizeSelectorWhitespace() ]---------------------------------- - // tidies whitespace around selector brackets and combinators - function normalizeSelectorWhitespace( selectorText ) { - return normalizeWhitespace(selectorText. - replace(RE_TIDY_TRAILING_WHITESPACE, PLACEHOLDER_STRING). - replace(RE_TIDY_LEADING_WHITESPACE, PLACEHOLDER_STRING) - ); - }; - - // --[ toggleElementClass() ]------------------------------------------- - // toggles a single className on an element - function toggleElementClass( elm, className, on ) { - var oldClassName = elm.className; - var newClassName = toggleClass(oldClassName, className, on); - if (newClassName != oldClassName) { - elm.className = newClassName; - elm.parentNode.className += EMPTY_STRING; - } - }; - - // --[ toggleClass() ]-------------------------------------------------- - // adds / removes a className from a string of classNames. Used to - // manage multiple class changes without forcing a DOM redraw - function toggleClass( classList, className, on ) { - var re = RegExp("(^|\\s)" + className + "(\\s|$)"); - var classExists = re.test(classList); - if (on) { - return classExists ? classList : classList + SPACE_STRING + className; - } else { - return classExists ? trim(classList.replace(re, PLACEHOLDER_STRING)) : classList; - } - }; - - // --[ addEvent() ]----------------------------------------------------- - function addEvent(elm, eventName, eventHandler) { - elm.attachEvent("on" + eventName, eventHandler); - }; - - // --[ getXHRObject() ]------------------------------------------------- - function getXHRObject() - { - if (win.XMLHttpRequest) { - return new XMLHttpRequest; - } - try { - return new ActiveXObject('Microsoft.XMLHTTP'); - } catch(e) { - return null; - } - }; - - // --[ loadStyleSheet() ]----------------------------------------------- - function loadStyleSheet( url ) { - xhr.open("GET", url, false); - xhr.send(); - return (xhr.status==200) ? xhr.responseText : EMPTY_STRING; - }; - - // --[ resolveUrl() ]--------------------------------------------------- - // Converts a URL fragment to a fully qualified URL using the specified - // context URL. Returns null if same-origin policy is broken - function resolveUrl( url, contextUrl ) { - - function getProtocolAndHost( url ) { - return url.substring(0, url.indexOf("/", 8)); - }; - - // absolute path - if (/^https?:\/\//i.test(url)) { - return getProtocolAndHost(contextUrl) == getProtocolAndHost(url) ? url : null; - } - - // root-relative path - if (url.charAt(0)=="/") { - return getProtocolAndHost(contextUrl) + url; - } - - // relative path - var contextUrlPath = contextUrl.split(/[?#]/)[0]; // ignore query string in the contextUrl - if (url.charAt(0) != "?" && contextUrlPath.charAt(contextUrlPath.length - 1) != "/") { - contextUrlPath = contextUrlPath.substring(0, contextUrlPath.lastIndexOf("/") + 1); - } - - return contextUrlPath + url; - }; - - // --[ parseStyleSheet() ]---------------------------------------------- - // Downloads the stylesheet specified by the URL, removes it's comments - // and recursivly replaces @import rules with their contents, ultimately - // returning the full cssText. - function parseStyleSheet( url ) { - if (url) { - return loadStyleSheet(url).replace(RE_COMMENT, EMPTY_STRING). - replace(RE_IMPORT, function( match, quoteChar, importUrl, quoteChar2, importUrl2 ) { - return parseStyleSheet(resolveUrl(importUrl || importUrl2, url)); - }). - replace(RE_ASSET_URL, function( match, quoteChar, assetUrl ) { - quoteChar = quoteChar || EMPTY_STRING; - return " url(" + quoteChar + resolveUrl(assetUrl, url) + quoteChar + ") "; - }); - } - return EMPTY_STRING; - }; - - // --[ init() ]--------------------------------------------------------- - function init() { - // honour the tag - var url, stylesheet; - var baseTags = doc.getElementsByTagName("BASE"); - var baseUrl = (baseTags.length > 0) ? baseTags[0].href : doc.location.href; - - /* Note: This code prevents IE from freezing / crashing when using - @font-face .eot files but it modifies the tag and could - trigger the IE stylesheet limit. It will also cause FOUC issues. - If you choose to use it, make sure you comment out the for loop - directly below this comment. - - var head = doc.getElementsByTagName("head")[0]; - for (var c=doc.styleSheets.length-1; c>=0; c--) { - stylesheet = doc.styleSheets[c] - head.appendChild(doc.createElement("style")) - var patchedStylesheet = doc.styleSheets[doc.styleSheets.length-1]; - - if (stylesheet.href != EMPTY_STRING) { - url = resolveUrl(stylesheet.href, baseUrl) - if (url) { - patchedStylesheet.cssText = patchStyleSheet( parseStyleSheet( url ) ) - stylesheet.disabled = true - setTimeout( function () { - stylesheet.owningElement.parentNode.removeChild(stylesheet.owningElement) - }) - } - } - } - */ - - for (var c = 0; c < doc.styleSheets.length; c++) { - stylesheet = doc.styleSheets[c] - if (stylesheet.href != EMPTY_STRING) { - url = resolveUrl(stylesheet.href, baseUrl); - if (url) { - stylesheet.cssText = patchStyleSheet( parseStyleSheet( url ) ); - } - } - } - - // :enabled & :disabled polling script (since we can't hook - // onpropertychange event when an element is disabled) - if (enabledWatchers.length > 0) { - setInterval( function() { - for (var c = 0, cl = enabledWatchers.length; c < cl; c++) { - var e = enabledWatchers[c]; - if (e.disabled !== e.$disabled) { - if (e.disabled) { - e.disabled = false; - e.$disabled = true; - e.disabled = true; - } - else { - e.$disabled = e.disabled; - } - } - } - },250) - } - }; - - // Bind selectivizr to the ContentLoaded event. - ContentLoaded(win, function() { - // Determine the "best fit" selector engine - for (var engine in selectorEngines) { - var members, member, context = win; - if (win[engine]) { - members = selectorEngines[engine].replace("*", engine).split("."); - while ((member = members.shift()) && (context = context[member])) {} - if (typeof context == "function") { - selectorMethod = context; - init(); - return; - } - } - } - }); - - - /*! - * ContentLoaded.js by Diego Perini, modified for IE<9 only (to save space) - * - * Author: Diego Perini (diego.perini at gmail.com) - * Summary: cross-browser wrapper for DOMContentLoaded - * Updated: 20101020 - * License: MIT - * Version: 1.2 - * - * URL: - * http://javascript.nwbox.com/ContentLoaded/ - * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE - * - */ - - // @w window reference - // @f function reference - function ContentLoaded(win, fn) { - - var done = false, top = true, - init = function(e) { - if (e.type == "readystatechange" && doc.readyState != "complete") return; - (e.type == "load" ? win : doc).detachEvent("on" + e.type, init, false); - if (!done && (done = true)) fn.call(win, e.type || e); - }, - poll = function() { - try { root.doScroll("left"); } catch(e) { setTimeout(poll, 50); return; } - init('poll'); - }; - - if (doc.readyState == "complete") fn.call(win, EMPTY_STRING); - else { - if (doc.createEventObject && root.doScroll) { - try { top = !win.frameElement; } catch(e) { } - if (top) poll(); - } - addEvent(doc,"readystatechange", init); - addEvent(win,"load", init); - } - }; -})(this); \ No newline at end of file diff --git a/app/sitemap.xml b/app/sitemap.xml deleted file mode 100644 index 0f8724e..0000000 --- a/app/sitemap.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/app/styles/scss/config/README b/app/styles/scss/config/README deleted file mode 100644 index 0d93213..0000000 --- a/app/styles/scss/config/README +++ /dev/null @@ -1 +0,0 @@ -Add your variables, mixins, etc here. \ No newline at end of file diff --git a/app/styles/scss/config/_mixins.scss b/app/styles/scss/config/_mixins.scss deleted file mode 100644 index 63b0035..0000000 --- a/app/styles/scss/config/_mixins.scss +++ /dev/null @@ -1,191 +0,0 @@ -@mixin clearfix { - zoom:1; - &:before, &:after { - content: "\0020"; - display: block; - height: 0; - overflow: hidden; - } - &:after { - clear: both; - } -} - -@mixin background-gradient($startColor: #3C3C3C, $endColor: #999999) { - background-color: $startColor; - background-image: -webkit-gradient(linear, left top, left bottom, from($startColor), to($endColor)); - background-image: -webkit-linear-gradient(top, $startColor, $endColor); - background-image: -moz-linear-gradient(top, $startColor, $endColor); - background-image: -ms-linear-gradient(top, $startColor, $endColor); - background-image: -o-linear-gradient(top, $startColor, $endColor); - background-image: linear-gradient(top, $startColor, $endColor); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#{$startColor}', endColorStr='#{$endColor}'); -} - -@mixin background-size($width: 100%, $height: 100%) { - -moz-background-size: $width $height; - -webkit-background-size: $width $height; - background-size: $width $height; -} - -@mixin border-radius($radius: 5px) { - -moz-border-radius: $radius; - -webkit-border-radius: $radius; - border-radius: $radius; -} - -@mixin border-radius-separate($topLeftRadius: 5px, $topRightRadius: 5px, $bottomLeftRadius: 5px, $bottomRightRadius: 5px) { - -webkit-border-top-left-radius: $topLeftRadius; - -webkit-border-top-right-radius: $topRightRadius; - -webkit-border-bottom-right-radius: $bottomRightRadius; - -webkit-border-bottom-left-radius: $bottomLeftRadius; - - -moz-border-radius-topleft: $topLeftRadius; - -moz-border-radius-topright: $topRightRadius; - -moz-border-radius-bottomright: $bottomRightRadius; - -moz-border-radius-bottomleft: $bottomLeftRadius; - - border-top-left-radius: $topLeftRadius; - border-top-right-radius: $topRightRadius; - border-bottom-right-radius: $bottomRightRadius; - border-bottom-left-radius: $bottomLeftRadius; -} - -@mixin box($orient: horizontal, $pack: center, $align: center) { - display: -webkit-box; - display: -moz-box; - display: box; - - -webkit-box-orient: $orient; - -moz-box-orient: $orient; - box-orient: $orient; - - -webkit-box-pack: $pack; - -moz-box-pack: $pack; - box-pack: $pack; - - -webkit-box-align: $align; - -moz-box-align: $align; - box-align: $align; -} - -@mixin box-rgba($r: 60, $g: 3, $b: 12, $opacity: 0.23, $color: #3C3C3C) { - background-color: transparent; - background-color: rgba($r, $g, $b, $opacity); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{$color}',endColorstr='#{$color}'); - zoom: 1; -} - -@mixin box-shadow($x: 2px, $y: 2px, $blur: 5px, $color: rgba(0,0,0,.4), $inset: "") { - @if $inset != "" { - -webkit-box-shadow: $inset $x $y $blur $color; - -moz-box-shadow: $inset $x $y $blur $color; - box-shadow: $inset $x $y $blur $color; - } @else { - -webkit-box-shadow: $x $y $blur $color; - -moz-box-shadow: $x $y $blur $color; - box-shadow: $x $y $blur $color; - } -} - -@mixin box-sizing($type: border-box) { - -webkit-box-sizing: $type; - -moz-box-sizing: $type; - box-sizing: $type; -} - -@mixin columns($count: 3, $gap: 10) { - -webkit-column-count: $count; - -moz-column-count: $count; - column-count: $count; - - -webkit-column-gap: $gap; - -moz-column-gap: $gap; - column-gap: $gap; -} - -@mixin double-borders($colorOne: #3C3C3C, $colorTwo: #999999, $radius: 0) { - border: 1px solid $colorOne; - - -webkit-box-shadow: 0 0 0 1px $colorTwo; - -moz-box-shadow: 0 0 0 1px $colorTwo; - box-shadow: 0 0 0 1px $colorTwo; - - @include border-radius( $radius ); -} - -@mixin flex($value: 1) { - -webkit-box-flex: $value; - -moz-box-flex: $value; - box-flex: $value; -} - -@mixin flip($scaleX: -1) { - -moz-transform: scaleX($scaleX); - -o-transform: scaleX($scaleX); - -webkit-transform: scaleX($scaleX); - transform: scaleX($scaleX); - filter: FlipH; - -ms-filter: "FlipH"; -} - -@mixin font-face($style-name, $file, $family) { - $filepath: "../fonts/" + $family + "/" + $file; - @font-face { - font-family: $style-name; - src: url('#{$filepath}.eot'); - src: url('#{$filepath}.eot?#iefix') format('embedded-opentype'), - url('#{$filepath}.woff') format('woff'), - url('#{$filepath}.ttf') format('truetype'), - url('#{$filepath}.svg##{$style-name}') format('svg'); - } -} - -@mixin outline-radius($radius: 5px) { - -webkit-outline-radius: $radius; - -moz-outline-radius: $radius; - outline-radius: $radius; -} - -@mixin resize($direction: both) { - -webkit-resize: $direction; - -moz-resize: $direction; - resize: $direction; -} - -@mixin rotate($deg: 0, $m11: 0, $m12: 0, $m21: 0, $m22: 0) { - -moz-transform: rotate($deg + deg); - -o-transform: rotate($deg + deg); - -webkit-transform: rotate($deg + deg); - -ms-transform: rotate($deg + deg); - transform: rotate($deg + deg); - filter: progid:DXImageTransform.Microsoft.Matrix( - M11=#{$m11}, M12=#{$m12}, M21=#{$m21}, M22=#{$m22}, sizingMethod='auto expand'); - zoom: 1; -} - -@mixin text-shadow($x: 2px, $y: 2px, $blur: 5px, $color: rgba(0,0,0,.4)) { - text-shadow: $x $y $blur $color; -} - -@mixin transform($params) { - -webkit-transform: $params; - -moz-transform: $params; - transform: $params; -} - -@mixin transition($declarations...) { - @each $prefix in '-webkit-', '-moz-', '-ms-', '-o-', '' { - #{$prefix}transition: $declarations; - } -} - -@mixin triple-borders($colorOne: #3C3C3C, $colorTwo: #999999, $colorThree: #000000, $radius: 0) { - border: 1px solid $colorOne; - - @include border-radius($radius); - - -webkit-box-shadow: 0 0 0 1px $colorTwo, 0 0 0 2px $colorThree; - -moz-box-shadow: 0 0 0 1px $colorTwo, 0 0 0 2px $colorThree; - box-shadow: 0 0 0 1px $colorTwo, 0 0 0 2px $colorThree; -} diff --git a/app/styles/scss/config/_settings.scss b/app/styles/scss/config/_settings.scss deleted file mode 100644 index 7ecbb83..0000000 --- a/app/styles/scss/config/_settings.scss +++ /dev/null @@ -1 +0,0 @@ -// Add your settings here diff --git a/app/styles/scss/general/README b/app/styles/scss/general/README deleted file mode 100644 index 9b44b85..0000000 --- a/app/styles/scss/general/README +++ /dev/null @@ -1 +0,0 @@ -Add generic SCSS files here (type, resets, etc) \ No newline at end of file diff --git a/app/styles/scss/general/_normalize.scss b/app/styles/scss/general/_normalize.scss deleted file mode 100644 index 81c6f31..0000000 --- a/app/styles/scss/general/_normalize.scss +++ /dev/null @@ -1,427 +0,0 @@ -/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ - -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS text size adjust after orientation change, without disabling - * user zoom. - */ - -html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Remove default margin. - */ - -body { - margin: 0; -} - -/* HTML5 display definitions - ========================================================================== */ - -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ - -audio, -canvas, -progress, -video { - display: inline-block; /* 1 */ - vertical-align: baseline; /* 2 */ -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. - */ - -[hidden], -template { - display: none; -} - -/* Links - ========================================================================== */ - -/** - * Remove the gray background color from active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * Improve readability when focused and also mouse hovered in all browsers. - */ - -a:active, -a:hover { - outline: 0; -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/** - * Address styling not present in Safari and Chrome. - */ - -dfn { - font-style: italic; -} - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Address styling not present in IE 8/9. - */ - -mark { - background: #ff0; - color: #000; -} - -/** - * Address inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove border when inside `a` element in IE 8/9/10. - */ - -img { - border: 0; -} - -/** - * Correct overflow not hidden in IE 9/10/11. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* Grouping content - ========================================================================== */ - -/** - * Address margin not present in IE 8/9 and Safari. - */ - -figure { - margin: 1em 40px; -} - -/** - * Address differences between Firefox and other browsers. - */ - -hr { - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} - -/** - * Contain overflow in all browsers. - */ - -pre { - overflow: auto; -} - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -/* Forms - ========================================================================== */ - -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ - -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ - -button, -input, -optgroup, -select, -textarea { - color: inherit; /* 1 */ - font: inherit; /* 2 */ - margin: 0; /* 3 */ -} - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ - -button { - overflow: visible; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ - -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * Remove inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -input { - line-height: normal; -} - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome - * (include `-moz` to future-proof). - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ - -textarea { - overflow: auto; -} - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ - -optgroup { - font-weight: bold; -} - -/* Tables - ========================================================================== */ - -/** - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - padding: 0; -} \ No newline at end of file diff --git a/app/styles/scss/general/_reset.scss b/app/styles/scss/general/_reset.scss deleted file mode 100644 index dbdfc9e..0000000 --- a/app/styles/scss/general/_reset.scss +++ /dev/null @@ -1,51 +0,0 @@ -html { - margin: 0; - padding: 0; - border: 0; -} -body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section { - margin: 0; - padding: 0; - border: 0; - font-weight: inherit; - font-style: inherit; - font-size: 100%; - font-family: inherit; - vertical-align: baseline; -} - -article, aside, dialog, figure, footer, header, hgroup, nav, section { - display: block; -} - -body { - line-height: 1.5; - background: white; -} - -table { - border-collapse: separate; - border-spacing: 0; -} - -caption, th, td { - text-align: left; - font-weight: normal; - float: none !important; -} - -table, th, td { - vertical-align: middle; -} - -blockquote before, blockquote after, q before, q after { - content: ''; -} - -a img { - border: none; -} - -b, i { - display: none; -} \ No newline at end of file diff --git a/app/styles/scss/init.scss b/app/styles/scss/init.scss deleted file mode 100644 index 1ac57c3..0000000 --- a/app/styles/scss/init.scss +++ /dev/null @@ -1,11 +0,0 @@ -//misc settings -@import 'config/_settings'; -@import 'config/_mixins'; - -//frameworks - -//global things -@import 'general/_reset'; -@import 'layout/_main'; - -//pages \ No newline at end of file diff --git a/app/styles/scss/layout/README b/app/styles/scss/layout/README deleted file mode 100644 index ad5908c..0000000 --- a/app/styles/scss/layout/README +++ /dev/null @@ -1 +0,0 @@ -Add your layouts here \ No newline at end of file diff --git a/app/styles/scss/pages/README b/app/styles/scss/pages/README deleted file mode 100644 index 97d3dfa..0000000 --- a/app/styles/scss/pages/README +++ /dev/null @@ -1 +0,0 @@ -Add your individual page files here \ No newline at end of file diff --git a/app/styles/styles.css b/app/styles/styles.css deleted file mode 100644 index 9a541e1..0000000 --- a/app/styles/styles.css +++ /dev/null @@ -1,45 +0,0 @@ -html { - margin: 0; - padding: 0; - border: 0; } - -body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section { - margin: 0; - padding: 0; - border: 0; - font-weight: inherit; - font-style: inherit; - font-size: 100%; - font-family: inherit; - vertical-align: baseline; } - -article, aside, dialog, figure, footer, header, hgroup, nav, section { - display: block; } - -body { - line-height: 1.5; - background: white; } - -table { - border-collapse: separate; - border-spacing: 0; } - -caption, th, td { - text-align: left; - font-weight: normal; - float: none !important; } - -table, th, td { - vertical-align: middle; } - -blockquote before, blockquote after, q before, q after { - content: ''; } - -a img { - border: none; } - -b, i { - display: none; } - - -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdlbmVyYWwvX3Jlc2V0LnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSxVQUFRO0VBQ1IsV0FBUztFQUNULFVBQVEsRUFBQTs7QUFFMEg7RUFDMUgsVUFBQTtFQUNDLFdBQUE7RUFDRCxVQUFBO0VBQ0sscUJBQUE7RUFDRCxvQkFBQTtFQUNELGdCQUFBO0VBQ0UscUJBQUE7RUFDRyx5QkFBQSxFQUFBOztBQUdzQjtFQUN0QyxlQUFTLEVBQUE7O0FBR1g7RUFDZSxpQkFBQTtFQUNELGtCQUFBLEVBQUE7O0FBR2Q7RUFDRSwwQkFBaUI7RUFDakIsa0JBQWdCLEVBQUE7O0FBR2xCO0VBQ2MsaUJBQUE7RUFDQyxvQkFBQTtFQUNOLHVCQUFBLEVBQUE7O0FBR0Y7RUFDTCx1QkFBZ0IsRUFBQTs7QUFHQztFQUNqQixZQUFTLEVBQUE7O0FBR1g7RUFDRSxhQUFRLEVBQUE7O0FBR1Y7RUFDSSxjQUFTLEVBQUEiLCJmaWxlIjoic3R5bGVzLmNzcyIsInNvdXJjZVJvb3QiOiIvc291cmNlLyIsInNvdXJjZXNDb250ZW50IjpbImh0bWwge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogMDtcbn1cbmJvZHksIGRpdiwgc3Bhbiwgb2JqZWN0LCBpZnJhbWUsIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHAsIGJsb2NrcXVvdGUsIHByZSwgYSwgYWJiciwgYWNyb255bSwgYWRkcmVzcywgY29kZSwgZGVsLCBkZm4sIGVtLCBpbWcsIHEsIGRsLCBkdCwgZGQsIG9sLCB1bCwgbGksIGZpZWxkc2V0LCBmb3JtLCBsYWJlbCwgbGVnZW5kLCB0YWJsZSwgY2FwdGlvbiwgdGJvZHksIHRmb290LCB0aGVhZCwgdHIsIHRoLCB0ZCwgYXJ0aWNsZSwgYXNpZGUsIGRpYWxvZywgZmlndXJlLCBmb290ZXIsIGhlYWRlciwgaGdyb3VwLCBuYXYsIHNlY3Rpb24ge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogMDtcbiAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7XG4gIGZvbnQtc3R5bGU6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTAwJTtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cblxuYXJ0aWNsZSwgYXNpZGUsIGRpYWxvZywgZmlndXJlLCBmb290ZXIsIGhlYWRlciwgaGdyb3VwLCBuYXYsIHNlY3Rpb24ge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuYm9keSB7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xufVxuXG50YWJsZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XG4gIGJvcmRlci1zcGFjaW5nOiAwO1xufVxuXG5jYXB0aW9uLCB0aCwgdGQge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBmbG9hdDogbm9uZSAhaW1wb3J0YW50O1xufVxuXG50YWJsZSwgdGgsIHRkIHtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuYmxvY2txdW90ZSBiZWZvcmUsIGJsb2NrcXVvdGUgYWZ0ZXIsIHEgYmVmb3JlLCBxIGFmdGVyIHtcbiAgY29udGVudDogJyc7XG59XG5cbmEgaW1nIHtcbiAgYm9yZGVyOiBub25lO1xufVxuXG5iLCBpIHtcbiAgICBkaXNwbGF5OiBub25lO1xufSJdfQ== */ diff --git a/dist/.htaccess b/dist/.htaccess deleted file mode 100644 index 760ccd3..0000000 --- a/dist/.htaccess +++ /dev/null @@ -1,935 +0,0 @@ -# Apache Server Configs v2.11.0 | MIT License -# https://github.com/h5bp/server-configs-apache - -# (!) Using `.htaccess` files slows down Apache, therefore, if you have -# access to the main server configuration file (which is usually called -# `httpd.conf`), you should add this logic there. -# -# https://httpd.apache.org/docs/current/howto/htaccess.html. - -# ###################################################################### -# # CROSS-ORIGIN # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Cross-origin requests | -# ---------------------------------------------------------------------- - -# Allow cross-origin requests. -# -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS -# http://enable-cors.org/ -# http://www.w3.org/TR/cors/ - -# -# Header set Access-Control-Allow-Origin "*" -# - -# ---------------------------------------------------------------------- -# | Cross-origin images | -# ---------------------------------------------------------------------- - -# Send the CORS header for images when browsers request it. -# -# https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image -# https://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html - - - - - SetEnvIf Origin ":" IS_CORS - Header set Access-Control-Allow-Origin "*" env=IS_CORS - - - - -# ---------------------------------------------------------------------- -# | Cross-origin web fonts | -# ---------------------------------------------------------------------- - -# Allow cross-origin access to web fonts. - - - - Header set Access-Control-Allow-Origin "*" - - - -# ---------------------------------------------------------------------- -# | Cross-origin resource timing | -# ---------------------------------------------------------------------- - -# Allow cross-origin access to the timing information for all resources. -# -# If a resource isn't served with a `Timing-Allow-Origin` header that -# would allow its timing information to be shared with the document, -# some of the attributes of the `PerformanceResourceTiming` object will -# be set to zero. -# -# http://www.w3.org/TR/resource-timing/ -# http://www.stevesouders.com/blog/2014/08/21/resource-timing-practical-tips/ - -# -# Header set Timing-Allow-Origin: "*" -# - - -# ###################################################################### -# # ERRORS # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Custom error messages/pages | -# ---------------------------------------------------------------------- - -# Customize what Apache returns to the client in case of an error. -# https://httpd.apache.org/docs/current/mod/core.html#errordocument - -ErrorDocument 404 /404.html - -# ---------------------------------------------------------------------- -# | Error prevention | -# ---------------------------------------------------------------------- - -# Disable the pattern matching based on filenames. -# -# This setting prevents Apache from returning a 404 error as the result -# of a rewrite when the directory with the same name does not exist. -# -# https://httpd.apache.org/docs/current/content-negotiation.html#multiviews - -Options -MultiViews - - -# ###################################################################### -# # INTERNET EXPLORER # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Document modes | -# ---------------------------------------------------------------------- - -# Force Internet Explorer 8/9/10 to render pages in the highest mode -# available in the various cases when it may not. -# -# https://hsivonen.fi/doctype/#ie8 -# -# (!) Starting with Internet Explorer 11, document modes are deprecated. -# If your business still relies on older web apps and services that were -# designed for older versions of Internet Explorer, you might want to -# consider enabling `Enterprise Mode` throughout your company. -# -# http://msdn.microsoft.com/en-us/library/ie/bg182625.aspx#docmode -# http://blogs.msdn.com/b/ie/archive/2014/04/02/stay-up-to-date-with-enterprise-mode-for-internet-explorer-11.aspx - - - Header set X-UA-Compatible "IE=edge" - # `mod_headers` cannot match based on the content-type, however, - # the `X-UA-Compatible` response header should be send only for - # HTML documents and not for the other resources. - - Header unset X-UA-Compatible - - - -# ---------------------------------------------------------------------- -# | Iframes cookies | -# ---------------------------------------------------------------------- - -# Allow cookies to be set from iframes in Internet Explorer. -# -# http://msdn.microsoft.com/en-us/library/ms537343.aspx -# http://www.w3.org/TR/2000/CR-P3P-20001215/ - -# -# Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"" -# - - -# ###################################################################### -# # MEDIA TYPES AND CHARACTER ENCODINGS # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Media types | -# ---------------------------------------------------------------------- - -# Serve resources with the proper media types (f.k.a. MIME types). -# -# https://www.iana.org/assignments/media-types/media-types.xhtml -# https://httpd.apache.org/docs/current/mod/mod_mime.html#addtype - - - - # Data interchange - - AddType application/json json map topojson - AddType application/ld+json jsonld - AddType application/vnd.geo+json geojson - AddType application/xml atom rdf rss xml - - - # JavaScript - - # Normalize to standard type. - # https://tools.ietf.org/html/rfc4329#section-7.2 - - AddType application/javascript js - - - # Manifest files - - # If you are providing a web application manifest file (see - # the specification: https://w3c.github.io/manifest/), it is - # recommended that you serve it with the `application/manifest+json` - # media type. - # - # Because the web application manifest file doesn't have its - # own unique file extension, you can set its media type either - # by matching: - # - # 1) the exact location of the file (this can be done using a - # directive such as ``, but it will NOT work in - # the `.htaccess` file, so you will have to do it in the main - # server configuration file or inside of a `` - # container) - # - # e.g.: - # - # - # AddType application/manifest+json json - # - # - # 2) the filename (this can be problematic as you will need to - # ensure that you don't have any other file with the same name - # as the one you gave to your web application manifest file) - # - # e.g.: - # - # - # AddType application/manifest+json json - # - - AddType application/x-web-app-manifest+json webapp - AddType text/cache-manifest appcache manifest - - - # Media files - - AddType audio/mp4 f4a f4b m4a - AddType audio/ogg oga ogg opus - AddType image/bmp bmp - AddType image/webp webp - AddType video/mp4 f4v f4p m4v mp4 - AddType video/ogg ogv - AddType video/webm webm - AddType video/x-flv flv - AddType image/svg+xml svg svgz - - # Serving `.ico` image files with a different media type - # prevents Internet Explorer from displaying then as images: - # https://github.com/h5bp/html5-boilerplate/commit/37b5fec090d00f38de64b591bcddcb205aadf8ee - - AddType image/x-icon cur ico - - - # Web fonts - - AddType application/font-woff woff - AddType application/font-woff2 woff2 - AddType application/vnd.ms-fontobject eot - - # Browsers usually ignore the font media types and simply sniff - # the bytes to figure out the font type. - # https://mimesniff.spec.whatwg.org/#matching-a-font-type-pattern - # - # However, Blink and WebKit based browsers will show a warning - # in the console if the following font types are served with any - # other media types. - - AddType application/x-font-ttf ttc ttf - AddType font/opentype otf - - - # Other - - AddType application/octet-stream safariextz - AddType application/x-bb-appworld bbaw - AddType application/x-chrome-extension crx - AddType application/x-opera-extension oex - AddType application/x-xpinstall xpi - AddType text/vcard vcard vcf - AddType text/vnd.rim.location.xloc xloc - AddType text/vtt vtt - AddType text/x-component htc - - - -# ---------------------------------------------------------------------- -# | Character encodings | -# ---------------------------------------------------------------------- - -# Serve all resources labeled as `text/html` or `text/plain` -# with the media type `charset` parameter set to `UTF-8`. -# -# https://httpd.apache.org/docs/current/mod/core.html#adddefaultcharset - -AddDefaultCharset utf-8 - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Serve the following file types with the media type `charset` -# parameter set to `UTF-8`. -# -# https://httpd.apache.org/docs/current/mod/mod_mime.html#addcharset - - - AddCharset utf-8 .atom \ - .bbaw \ - .css \ - .geojson \ - .js \ - .json \ - .jsonld \ - .rdf \ - .rss \ - .topojson \ - .vtt \ - .webapp \ - .xloc \ - .xml - - - -# ###################################################################### -# # REWRITES # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Rewrite engine | -# ---------------------------------------------------------------------- - -# (1) Turn on the rewrite engine (this is necessary in order for -# the `RewriteRule` directives to work). -# -# https://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteEngine -# -# (2) Enable the `FollowSymLinks` option if it isn't already. -# -# https://httpd.apache.org/docs/current/mod/core.html#options -# -# (3) If your web host doesn't allow the `FollowSymlinks` option, -# you need to comment it out or remove it, and then uncomment -# the `Options +SymLinksIfOwnerMatch` line (4), but be aware -# of the performance impact. -# -# https://httpd.apache.org/docs/current/misc/perf-tuning.html#symlinks -# -# (4) Some cloud hosting services will require you set `RewriteBase`. -# -# http://www.rackspace.com/knowledge_center/frequently-asked-question/why-is-modrewrite-not-working-on-my-site -# https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase -# -# (5) Depending on how your server is set up, you may also need to -# use the `RewriteOptions` directive to enable some options for -# the rewrite engine. -# -# https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions - - - - # (1) - RewriteEngine On - - # (2) - Options +FollowSymlinks - - # (3) - # Options +SymLinksIfOwnerMatch - - # (4) - # RewriteBase / - - # (5) - # RewriteOptions - - - -# ---------------------------------------------------------------------- -# | Forcing `https://` | -# ---------------------------------------------------------------------- - -# Redirect from the `http://` to the `https://` version of the URL. -# https://wiki.apache.org/httpd/RewriteHTTPToHTTPS - -# -# RewriteEngine On -# RewriteCond %{HTTPS} !=on -# RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] -# - -# ---------------------------------------------------------------------- -# | Suppressing / Forcing the `www.` at the beginning of URLs | -# ---------------------------------------------------------------------- - -# The same content should never be available under two different -# URLs, especially not with and without `www.` at the beginning. -# This can cause SEO problems (duplicate content), and therefore, -# you should choose one of the alternatives and redirect the other -# one. -# -# By default `Option 1` (no `www.`) is activated. -# http://no-www.org/faq.php?q=class_b -# -# If you would prefer to use `Option 2`, just comment out all the -# lines from `Option 1` and uncomment the ones from `Option 2`. -# -# (!) NEVER USE BOTH RULES AT THE SAME TIME! - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Option 1: rewrite www.example.com → example.com - - - RewriteEngine On - RewriteCond %{HTTPS} !=on - RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] - RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L] - - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Option 2: rewrite example.com → www.example.com -# -# Be aware that the following might not be a good idea if you use "real" -# subdomains for certain parts of your website. - -# -# RewriteEngine On -# RewriteCond %{HTTPS} !=on -# RewriteCond %{HTTP_HOST} !^www\. [NC] -# RewriteCond %{SERVER_ADDR} !=127.0.0.1 -# RewriteCond %{SERVER_ADDR} !=::1 -# RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] -# - - -# ###################################################################### -# # SECURITY # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Clickjacking | -# ---------------------------------------------------------------------- - -# Protect website against clickjacking. -# -# The example below sends the `X-Frame-Options` response header with -# the value `DENY`, informing browsers not to display the content of -# the web page in any frame. -# -# This might not be the best setting for everyone. You should read -# about the other two possible values the `X-Frame-Options` header -# field can have: `SAMEORIGIN` and `ALLOW-FROM`. -# https://tools.ietf.org/html/rfc7034#section-2.1. -# -# Keep in mind that while you could send the `X-Frame-Options` header -# for all of your website’s pages, this has the potential downside that -# it forbids even non-malicious framing of your content (e.g.: when -# users visit your website using a Google Image Search results page). -# -# Nonetheless, you should ensure that you send the `X-Frame-Options` -# header for all pages that allow a user to make a state changing -# operation (e.g: pages that contain one-click purchase links, checkout -# or bank-transfer confirmation pages, pages that make permanent -# configuration changes, etc.). -# -# Sending the `X-Frame-Options` header can also protect your website -# against more than just clickjacking attacks: -# https://cure53.de/xfo-clickjacking.pdf. -# -# https://tools.ietf.org/html/rfc7034 -# http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx -# https://www.owasp.org/index.php/Clickjacking - -# -# Header set X-Frame-Options "DENY" -# # `mod_headers` cannot match based on the content-type, however, -# # the `X-Frame-Options` response header should be send only for -# # HTML documents and not for the other resources. -# -# Header unset X-Frame-Options -# -# - -# ---------------------------------------------------------------------- -# | Content Security Policy (CSP) | -# ---------------------------------------------------------------------- - -# Mitigate the risk of cross-site scripting and other content-injection -# attacks. -# -# This can be done by setting a `Content Security Policy` which -# whitelists trusted sources of content for your website. -# -# The example header below allows ONLY scripts that are loaded from the -# current website's origin (no inline scripts, no CDN, etc). That almost -# certainly won't work as-is for your website! -# -# For more details on how to craft a reasonable policy for your website, -# read: http://www.html5rocks.com/en/tutorials/security/content-security-policy/ -# (or the specification: http://www.w3.org/TR/CSP11/). Also, to make -# things easier, you can use an online CSP header generator such as: -# http://cspisawesome.com/. - -# -# Header set Content-Security-Policy "script-src 'self'; object-src 'self'" -# # `mod_headers` cannot match based on the content-type, however, -# # the `Content-Security-Policy` response header should be send -# # only for HTML documents and not for the other resources. -# -# Header unset Content-Security-Policy -# -# - -# ---------------------------------------------------------------------- -# | File access | -# ---------------------------------------------------------------------- - -# Block access to directories without a default document. -# -# You should leave the following uncommented, as you shouldn't allow -# anyone to surf through every directory on your server (which may -# includes rather private places such as the CMS's directories). - - - Options -Indexes - - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Block access to all hidden files and directories with the exception of -# the visible content from within the `/.well-known/` hidden directory. -# -# These types of files usually contain user preferences or the preserved -# state of an utility, and can include rather private places like, for -# example, the `.git` or `.svn` directories. -# -# The `/.well-known/` directory represents the standard (RFC 5785) path -# prefix for "well-known locations" (e.g.: `/.well-known/manifest.json`, -# `/.well-known/keybase.txt`), and therefore, access to its visible -# content should not be blocked. -# -# https://www.mnot.net/blog/2010/04/07/well-known -# https://tools.ietf.org/html/rfc5785 - - - RewriteEngine On - RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC] - RewriteCond %{SCRIPT_FILENAME} -d [OR] - RewriteCond %{SCRIPT_FILENAME} -f - RewriteRule "(^|/)\." - [F] - - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Block access to files that can expose sensitive information. -# -# By default, block access to backup and source files that may be -# left by some text editors and can pose a security risk when anyone -# has access to them. -# -# http://feross.org/cmsploit/ -# -# (!) Update the `` regular expression from below to -# include any files that might end up on your production server and -# can expose sensitive information about your website. These files may -# include: configuration files, files that contain metadata about the -# project (e.g.: project dependencies), build scripts, etc.. - - - - # Apache < 2.3 - - Order allow,deny - Deny from all - Satisfy All - - - # Apache ≥ 2.3 - - Require all denied - - - - -# ---------------------------------------------------------------------- -# | HTTP Strict Transport Security (HSTS) | -# ---------------------------------------------------------------------- - -# Force client-side SSL redirection. -# -# If a user types `example.com` in their browser, even if the server -# redirects them to the secure version of the website, that still leaves -# a window of opportunity (the initial HTTP connection) for an attacker -# to downgrade or redirect the request. -# -# The following header ensures that browser will ONLY connect to your -# server via HTTPS, regardless of what the users type in the browser's -# address bar. -# -# (!) Remove the `includeSubDomains` optional directive if the website's -# subdomains are not using HTTPS. -# -# http://www.html5rocks.com/en/tutorials/security/transport-layer-security/ -# https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14#section-6.1 -# http://blogs.msdn.com/b/ieinternals/archive/2014/08/18/hsts-strict-transport-security-attacks-mitigations-deployment-https.aspx - -# -# Header set Strict-Transport-Security "max-age=16070400; includeSubDomains" -# - -# ---------------------------------------------------------------------- -# | Reducing MIME type security risks | -# ---------------------------------------------------------------------- - -# Prevent some browsers from MIME-sniffing the response. -# -# This reduces exposure to drive-by download attacks and cross-origin -# data leaks, and should be left uncommented, especially if the server -# is serving user-uploaded content or content that could potentially be -# treated as executable by the browser. -# -# http://www.slideshare.net/hasegawayosuke/owasp-hasegawa -# http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx -# http://msdn.microsoft.com/en-us/library/ie/gg622941.aspx -# https://mimesniff.spec.whatwg.org/ - - - Header set X-Content-Type-Options "nosniff" - - -# ---------------------------------------------------------------------- -# | Reflected Cross-Site Scripting (XSS) attacks | -# ---------------------------------------------------------------------- - -# (1) Try to re-enable the cross-site scripting (XSS) filter built -# into most web browsers. -# -# The filter is usually enabled by default, but in some cases it -# may be disabled by the user. However, in Internet Explorer for -# example, it can be re-enabled just by sending the -# `X-XSS-Protection` header with the value of `1`. -# -# (2) Prevent web browsers from rendering the web page if a potential -# reflected (a.k.a non-persistent) XSS attack is detected by the -# filter. -# -# By default, if the filter is enabled and browsers detect a -# reflected XSS attack, they will attempt to block the attack -# by making the smallest possible modifications to the returned -# web page. -# -# Unfortunately, in some browsers (e.g.: Internet Explorer), -# this default behavior may allow the XSS filter to be exploited, -# thereby, it's better to inform browsers to prevent the rendering -# of the page altogether, instead of attempting to modify it. -# -# http://hackademix.net/2009/11/21/ies-xss-filter-creates-xss-vulnerabilities -# -# (!) Do not rely on the XSS filter to prevent XSS attacks! Ensure that -# you are taking all possible measures to prevent XSS attacks, the -# most obvious being: validating and sanitizing your website's inputs. -# -# http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-iv-the-xss-filter.aspx -# http://blogs.msdn.com/b/ieinternals/archive/2011/01/31/controlling-the-internet-explorer-xss-filter-with-the-x-xss-protection-http-header.aspx -# https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29 - -# -# # (1) (2) -# Header set X-XSS-Protection "1; mode=block" -# # `mod_headers` cannot match based on the content-type, however, -# # the `X-XSS-Protection` response header should be send only for -# # HTML documents and not for the other resources. -# -# Header unset X-XSS-Protection -# -# - -# ---------------------------------------------------------------------- -# | Server software information | -# ---------------------------------------------------------------------- - -# Prevent Apache from sending in the `Server` response header its -# exact version number, the description of the generic OS-type or -# information about its compiled-in modules. -# -# (!) The `ServerTokens` directive will only work in the main server -# configuration file, so don't try to enable it in the `.htaccess` file! -# -# https://httpd.apache.org/docs/current/mod/core.html#servertokens - -# ServerTokens Prod - - -# ###################################################################### -# # WEB PERFORMANCE # -# ###################################################################### - -# ---------------------------------------------------------------------- -# | Compression | -# ---------------------------------------------------------------------- - - - - # Force compression for mangled `Accept-Encoding` request headers - # https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html - - - - SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding - RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding - - - - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Compress all output labeled with one of the following media types. - # - # (!) For Apache versions below version 2.3.7 you don't need to - # enable `mod_filter` and can remove the `` - # and `` lines as `AddOutputFilterByType` is still in - # the core directives. - # - # https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype - - - AddOutputFilterByType DEFLATE "application/atom+xml" \ - "application/javascript" \ - "application/json" \ - "application/ld+json" \ - "application/manifest+json" \ - "application/rdf+xml" \ - "application/rss+xml" \ - "application/schema+json" \ - "application/vnd.geo+json" \ - "application/vnd.ms-fontobject" \ - "application/x-font-ttf" \ - "application/x-javascript" \ - "application/x-web-app-manifest+json" \ - "application/xhtml+xml" \ - "application/xml" \ - "font/eot" \ - "font/opentype" \ - "image/bmp" \ - "image/svg+xml" \ - "image/vnd.microsoft.icon" \ - "image/x-icon" \ - "text/cache-manifest" \ - "text/css" \ - "text/html" \ - "text/javascript" \ - "text/plain" \ - "text/vcard" \ - "text/vnd.rim.location.xloc" \ - "text/vtt" \ - "text/x-component" \ - "text/x-cross-domain-policy" \ - "text/xml" - - - - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Map the following filename extensions to the specified - # encoding type in order to make Apache serve the file types - # with the appropriate `Content-Encoding` response header - # (do note that this will NOT make Apache compress them!). - # - # If these files types would be served without an appropriate - # `Content-Enable` response header, client applications (e.g.: - # browsers) wouldn't know that they first need to uncompress - # the response, and thus, wouldn't be able to understand the - # content. - # - # https://httpd.apache.org/docs/current/mod/mod_mime.html#addencoding - - - AddEncoding gzip svgz - - - - -# ---------------------------------------------------------------------- -# | Content transformation | -# ---------------------------------------------------------------------- - -# Prevent intermediate caches or proxies (e.g.: such as the ones -# used by mobile network providers) from modifying the website's -# content. -# -# https://tools.ietf.org/html/rfc2616#section-14.9.5 -# -# (!) If you are using `mod_pagespeed`, please note that setting -# the `Cache-Control: no-transform` response header will prevent -# `PageSpeed` from rewriting `HTML` files, and, if the -# `ModPagespeedDisableRewriteOnNoTransform` directive isn't set -# to `off`, also from rewriting other resources. -# -# https://developers.google.com/speed/pagespeed/module/configuration#notransform - -# -# Header merge Cache-Control "no-transform" -# - -# ---------------------------------------------------------------------- -# | ETags | -# ---------------------------------------------------------------------- - -# Remove `ETags` as resources are sent with far-future expires headers. -# -# https://developer.yahoo.com/performance/rules.html#etags -# https://tools.ietf.org/html/rfc7232#section-2.3 - -# `FileETag None` doesn't work in all cases. - - Header unset ETag - - -FileETag None - -# ---------------------------------------------------------------------- -# | Expires headers | -# ---------------------------------------------------------------------- - -# Serve resources with far-future expires headers. -# -# (!) If you don't control versioning with filename-based -# cache busting, you should consider lowering the cache times -# to something like one week. -# -# https://httpd.apache.org/docs/current/mod/mod_expires.html - - - - ExpiresActive on - ExpiresDefault "access plus 1 month" - - # CSS - ExpiresByType text/css "access plus 1 year" - - # Data interchange - ExpiresByType application/atom+xml "access plus 1 hour" - ExpiresByType application/rdf+xml "access plus 1 hour" - ExpiresByType application/rss+xml "access plus 1 hour" - - ExpiresByType application/json "access plus 0 seconds" - ExpiresByType application/ld+json "access plus 0 seconds" - ExpiresByType application/schema+json "access plus 0 seconds" - ExpiresByType application/vnd.geo+json "access plus 0 seconds" - ExpiresByType application/xml "access plus 0 seconds" - ExpiresByType text/xml "access plus 0 seconds" - - # Favicon (cannot be renamed!) and cursor images - ExpiresByType image/vnd.microsoft.icon "access plus 1 week" - ExpiresByType image/x-icon "access plus 1 week" - - # HTML - ExpiresByType text/html "access plus 0 seconds" - - # JavaScript - ExpiresByType application/javascript "access plus 1 year" - ExpiresByType application/x-javascript "access plus 1 year" - ExpiresByType text/javascript "access plus 1 year" - - # Manifest files - ExpiresByType application/manifest+json "access plus 1 year" - - ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" - ExpiresByType text/cache-manifest "access plus 0 seconds" - - # Media files - ExpiresByType audio/ogg "access plus 1 month" - ExpiresByType image/bmp "access plus 1 month" - ExpiresByType image/gif "access plus 1 month" - ExpiresByType image/jpeg "access plus 1 month" - ExpiresByType image/png "access plus 1 month" - ExpiresByType image/svg+xml "access plus 1 month" - ExpiresByType video/mp4 "access plus 1 month" - ExpiresByType video/ogg "access plus 1 month" - ExpiresByType video/webm "access plus 1 month" - - # Web fonts - - # Embedded OpenType (EOT) - ExpiresByType application/vnd.ms-fontobject "access plus 1 month" - ExpiresByType font/eot "access plus 1 month" - - # OpenType - ExpiresByType font/opentype "access plus 1 month" - - # TrueType - ExpiresByType application/x-font-ttf "access plus 1 month" - - # Web Open Font Format (WOFF) 1.0 - ExpiresByType application/font-woff "access plus 1 month" - ExpiresByType application/x-font-woff "access plus 1 month" - ExpiresByType font/woff "access plus 1 month" - - # Web Open Font Format (WOFF) 2.0 - ExpiresByType application/font-woff2 "access plus 1 month" - - # Other - ExpiresByType text/x-cross-domain-policy "access plus 1 week" - - - -# ---------------------------------------------------------------------- -# | File concatenation | -# ---------------------------------------------------------------------- - -# Allow concatenation from within specific files. -# -# e.g.: -# -# If you have the following lines in a file called, for -# example, `main.combined.js`: -# -# -# -# -# Apache will replace those lines with the content of the -# specified files. - -# -# -# Options +Includes -# AddOutputFilterByType INCLUDES application/javascript \ -# application/x-javascript \ -# text/javascript -# SetOutputFilter INCLUDES -# -# -# Options +Includes -# AddOutputFilterByType INCLUDES text/css -# SetOutputFilter INCLUDES -# -# - -# ---------------------------------------------------------------------- -# | Filename-based cache busting | -# ---------------------------------------------------------------------- - -# If you're not using a build process to manage your filename version -# revving, you might want to consider enabling the following directives -# to route all requests such as `/style.12345.css` to `/style.css`. -# -# To understand why this is important and even a better solution than -# using something like `*.css?v231`, please see: -# http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/ - -# -# RewriteEngine On -# RewriteCond %{REQUEST_FILENAME} !-f -# RewriteRule ^(.+)\.(\d+)\.(bmp|css|cur|gif|ico|jpe?g|js|png|svgz?|webp)$ $1.$3 [L] -# diff --git a/dist/crossdomain.xml b/dist/crossdomain.xml deleted file mode 100644 index 818b822..0000000 --- a/dist/crossdomain.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/dist/fonts/README b/dist/fonts/README deleted file mode 100644 index 5e78ddd..0000000 --- a/dist/fonts/README +++ /dev/null @@ -1 +0,0 @@ -Add your custom fonts here :) \ No newline at end of file diff --git a/dist/humans.txt b/dist/humans.txt deleted file mode 100644 index 8d2330f..0000000 --- a/dist/humans.txt +++ /dev/null @@ -1,15 +0,0 @@ -# humanstxt.org/ -# The humans responsible & technology colophon - -# TEAM - - -- -- - -# THANKS - - - -# TECHNOLOGY COLOPHON - - CSS3, HTML5 - Apache Server Configs, jQuery, Modernizr, Normalize.css diff --git a/dist/index.html b/dist/index.html deleted file mode 100755 index 7847d09..0000000 --- a/dist/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Website Title - - - - - - - - -

Content

- - - - - - - diff --git a/dist/robots.txt b/dist/robots.txt deleted file mode 100644 index d0e5f1b..0000000 --- a/dist/robots.txt +++ /dev/null @@ -1,5 +0,0 @@ -# www.robotstxt.org/ - -# Allow crawling of all content -User-agent: * -Disallow: diff --git a/dist/scripts/app.js b/dist/scripts/app.js deleted file mode 100644 index 1458c71..0000000 --- a/dist/scripts/app.js +++ /dev/null @@ -1 +0,0 @@ -window.Modernizr=function(e,t,n){function r(e){b.cssText=e}function o(e,t){return r(S.join(e+";")+(t||""))}function a(e,t){return typeof e===t}function i(e,t){return!!~(""+e).indexOf(t)}function s(e,t){for(var r in e){var o=e[r];if(!i(o,"-")&&b[o]!==n)return"pfx"==t?o:!0}return!1}function c(e,t,r){for(var o in e){var i=t[e[o]];if(i!==n)return r===!1?e[o]:a(i,"function")?i.bind(r||t):i}return!1}function l(e,t,n){var r=e.charAt(0).toUpperCase()+e.slice(1),o=(e+" "+T.join(r+" ")+r).split(" ");return a(t,"string")||a(t,"undefined")?s(o,t):(o=(e+" "+k.join(r+" ")+r).split(" "),c(o,t,n))}function u(){m.input=function(n){for(var r=0,o=n.length;o>r;r++)$[n[r]]=n[r]in x;return $.list&&($.list=!!t.createElement("datalist")&&!!e.HTMLDataListElement),$}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),m.inputtypes=function(e){for(var r,o,a,i=0,s=e.length;s>i;i++)x.setAttribute("type",o=e[i]),r="text"!==x.type,r&&(x.value=E,x.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(o)&&x.style.WebkitAppearance!==n?(g.appendChild(x),a=t.defaultView,r=a.getComputedStyle&&"textfield"!==a.getComputedStyle(x,null).WebkitAppearance&&0!==x.offsetHeight,g.removeChild(x)):/^(search|tel)$/.test(o)||(r=/^(url|email)$/.test(o)?x.checkValidity&&x.checkValidity()===!1:x.value!=E)),N[e[i]]=!!r;return N}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var d,f,p="2.8.3",m={},h=!0,g=t.documentElement,y="modernizr",v=t.createElement(y),b=v.style,x=t.createElement("input"),E=":)",w={}.toString,S=" -webkit- -moz- -o- -ms- ".split(" "),C="Webkit Moz O ms",T=C.split(" "),k=C.toLowerCase().split(" "),j={svg:"http://www.w3.org/2000/svg"},M={},N={},$={},z=[],P=z.slice,L=function(e,n,r,o){var a,i,s,c,l=t.createElement("div"),u=t.body,d=u||t.createElement("body");if(parseInt(r,10))for(;r--;)s=t.createElement("div"),s.id=o?o[r]:y+(r+1),l.appendChild(s);return a=["­",'"].join(""),l.id=y,(u?l:d).innerHTML+=a,d.appendChild(l),u||(d.style.background="",d.style.overflow="hidden",c=g.style.overflow,g.style.overflow="hidden",g.appendChild(d)),i=n(l,e),u?l.parentNode.removeChild(l):(d.parentNode.removeChild(d),g.style.overflow=c),!!i},O=function(t){var n=e.matchMedia||e.msMatchMedia;if(n)return n(t)&&n(t).matches||!1;var r;return L("@media "+t+" { #"+y+" { position: absolute; } }",function(t){r="absolute"==(e.getComputedStyle?getComputedStyle(t,null):t.currentStyle).position}),r},A=function(){function e(e,o){o=o||t.createElement(r[e]||"div"),e="on"+e;var i=e in o;return i||(o.setAttribute||(o=t.createElement("div")),o.setAttribute&&o.removeAttribute&&(o.setAttribute(e,""),i=a(o[e],"function"),a(o[e],"undefined")||(o[e]=n),o.removeAttribute(e))),o=null,i}var r={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return e}(),F={}.hasOwnProperty;f=a(F,"undefined")||a(F.call,"undefined")?function(e,t){return t in e&&a(e.constructor.prototype[t],"undefined")}:function(e,t){return F.call(e,t)},Function.prototype.bind||(Function.prototype.bind=function(e){var t=this;if("function"!=typeof t)throw new TypeError;var n=P.call(arguments,1),r=function(){if(this instanceof r){var o=function(){};o.prototype=t.prototype;var a=new o,i=t.apply(a,n.concat(P.call(arguments)));return Object(i)===i?i:a}return t.apply(e,n.concat(P.call(arguments)))};return r}),M.flexbox=function(){return l("flexWrap")},M.canvas=function(){var e=t.createElement("canvas");return!!e.getContext&&!!e.getContext("2d")},M.canvastext=function(){return!!m.canvas&&!!a(t.createElement("canvas").getContext("2d").fillText,"function")},M.webgl=function(){return!!e.WebGLRenderingContext},M.touch=function(){var n;return"ontouchstart"in e||e.DocumentTouch&&t instanceof DocumentTouch?n=!0:L(["@media (",S.join("touch-enabled),("),y,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(e){n=9===e.offsetTop}),n},M.geolocation=function(){return"geolocation"in navigator},M.postmessage=function(){return!!e.postMessage},M.websqldatabase=function(){return!!e.openDatabase},M.indexedDB=function(){return!!l("indexedDB",e)},M.hashchange=function(){return A("hashchange",e)&&(t.documentMode===n||t.documentMode>7)},M.history=function(){return!!e.history&&!!history.pushState},M.draganddrop=function(){var e=t.createElement("div");return"draggable"in e||"ondragstart"in e&&"ondrop"in e},M.websockets=function(){return"WebSocket"in e||"MozWebSocket"in e},M.rgba=function(){return r("background-color:rgba(150,255,150,.5)"),i(b.backgroundColor,"rgba")},M.hsla=function(){return r("background-color:hsla(120,40%,100%,.5)"),i(b.backgroundColor,"rgba")||i(b.backgroundColor,"hsla")},M.multiplebgs=function(){return r("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(b.background)},M.backgroundsize=function(){return l("backgroundSize")},M.borderimage=function(){return l("borderImage")},M.borderradius=function(){return l("borderRadius")},M.boxshadow=function(){return l("boxShadow")},M.textshadow=function(){return""===t.createElement("div").style.textShadow},M.opacity=function(){return o("opacity:.55"),/^0.55$/.test(b.opacity)},M.cssanimations=function(){return l("animationName")},M.csscolumns=function(){return l("columnCount")},M.cssgradients=function(){var e="background-image:",t="gradient(linear,left top,right bottom,from(#9f9),to(white));",n="linear-gradient(left top,#9f9, white);";return r((e+"-webkit- ".split(" ").join(t+e)+S.join(n+e)).slice(0,-e.length)),i(b.backgroundImage,"gradient")},M.cssreflections=function(){return l("boxReflect")},M.csstransforms=function(){return!!l("transform")},M.csstransforms3d=function(){var e=!!l("perspective");return e&&"webkitPerspective"in g.style&&L("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(t,n){e=9===t.offsetLeft&&3===t.offsetHeight}),e},M.csstransitions=function(){return l("transition")},M.fontface=function(){var e;return L('@font-face {font-family:"font";src:url("https://")}',function(n,r){var o=t.getElementById("smodernizr"),a=o.sheet||o.styleSheet,i=a?a.cssRules&&a.cssRules[0]?a.cssRules[0].cssText:a.cssText||"":"";e=/src/i.test(i)&&0===i.indexOf(r.split(" ")[0])}),e},M.generatedcontent=function(){var e;return L(["#",y,"{font:0/0 a}#",y,':after{content:"',E,'";visibility:hidden;font:3px/1 a}'].join(""),function(t){e=t.offsetHeight>=3}),e},M.video=function(){var e=t.createElement("video"),n=!1;try{(n=!!e.canPlayType)&&(n=new Boolean(n),n.ogg=e.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),n.h264=e.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),n.webm=e.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,""))}catch(r){}return n},M.audio=function(){var e=t.createElement("audio"),n=!1;try{(n=!!e.canPlayType)&&(n=new Boolean(n),n.ogg=e.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),n.mp3=e.canPlayType("audio/mpeg;").replace(/^no$/,""),n.wav=e.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),n.m4a=(e.canPlayType("audio/x-m4a;")||e.canPlayType("audio/aac;")).replace(/^no$/,""))}catch(r){}return n},M.localstorage=function(){try{return localStorage.setItem(y,y),localStorage.removeItem(y),!0}catch(e){return!1}},M.sessionstorage=function(){try{return sessionStorage.setItem(y,y),sessionStorage.removeItem(y),!0}catch(e){return!1}},M.webworkers=function(){return!!e.Worker},M.applicationcache=function(){return!!e.applicationCache},M.svg=function(){return!!t.createElementNS&&!!t.createElementNS(j.svg,"svg").createSVGRect},M.inlinesvg=function(){var e=t.createElement("div");return e.innerHTML="",(e.firstChild&&e.firstChild.namespaceURI)==j.svg},M.smil=function(){return!!t.createElementNS&&/SVGAnimate/.test(w.call(t.createElementNS(j.svg,"animate")))},M.svgclippaths=function(){return!!t.createElementNS&&/SVGClipPath/.test(w.call(t.createElementNS(j.svg,"clipPath")))};for(var R in M)f(M,R)&&(d=R.toLowerCase(),m[d]=M[R](),z.push((m[d]?"":"no-")+d));return m.input||u(),m.addTest=function(e,t){if("object"==typeof e)for(var r in e)f(e,r)&&m.addTest(r,e[r]);else{if(e=e.toLowerCase(),m[e]!==n)return m;t="function"==typeof t?t():t,"undefined"!=typeof h&&h&&(g.className+=" "+(t?"":"no-")+e),m[e]=t}return m},r(""),v=x=null,function(e,t){function n(e,t){var n=e.createElement("p"),r=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x",r.insertBefore(n.lastChild,r.firstChild)}function r(){var e=v.elements;return"string"==typeof e?e.split(" "):e}function o(e){var t=y[e[h]];return t||(t={},g++,e[h]=g,y[g]=t),t}function a(e,n,r){if(n||(n=t),u)return n.createElement(e);r||(r=o(n));var a;return a=r.cache[e]?r.cache[e].cloneNode():m.test(e)?(r.cache[e]=r.createElem(e)).cloneNode():r.createElem(e),!a.canHaveChildren||p.test(e)||a.tagUrn?a:r.frag.appendChild(a)}function i(e,n){if(e||(e=t),u)return e.createDocumentFragment();n=n||o(e);for(var a=n.frag.cloneNode(),i=0,s=r(),c=s.length;c>i;i++)a.createElement(s[i]);return a}function s(e,t){t.cache||(t.cache={},t.createElem=e.createElement,t.createFrag=e.createDocumentFragment,t.frag=t.createFrag()),e.createElement=function(n){return v.shivMethods?a(n,e,t):t.createElem(n)},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-]+/g,function(e){return t.createElem(e),t.frag.createElement(e),'c("'+e+'")'})+");return n}")(v,t.frag)}function c(e){e||(e=t);var r=o(e);return v.shivCSS&&!l&&!r.hasCSS&&(r.hasCSS=!!n(e,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),u||s(e,r),e}var l,u,d="3.7.0",f=e.html5||{},p=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,m=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,h="_html5shiv",g=0,y={};!function(){try{var e=t.createElement("a");e.innerHTML="",l="hidden"in e,u=1==e.childNodes.length||function(){t.createElement("a");var e=t.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(n){l=!0,u=!0}}();var v={elements:f.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:d,shivCSS:f.shivCSS!==!1,supportsUnknownElements:u,shivMethods:f.shivMethods!==!1,type:"default",shivDocument:c,createElement:a,createDocumentFragment:i};e.html5=v,c(t)}(this,t),m._version=p,m._prefixes=S,m._domPrefixes=k,m._cssomPrefixes=T,m.mq=O,m.hasEvent=A,m.testProp=function(e){return s([e])},m.testAllProps=l,m.testStyles=L,m.prefixed=function(e,t,n){return t?l(e,t,n):l(e,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(h?" js "+z.join(" "):""),m}(this,this.document),function(e,t,n){function r(e){return"[object Function]"==g.call(e)}function o(e){return"string"==typeof e}function a(){}function i(e){return!e||"loaded"==e||"complete"==e||"uninitialized"==e}function s(){var e=y.shift();v=1,e?e.t?m(function(){("c"==e.t?f.injectCss:f.injectJs)(e.s,0,e.a,e.x,e.e,1)},0):(e(),s()):v=0}function c(e,n,r,o,a,c,l){function u(t){if(!p&&i(d.readyState)&&(b.r=p=1,!v&&s(),d.onload=d.onreadystatechange=null,t)){"img"!=e&&m(function(){E.removeChild(d)},50);for(var r in k[n])k[n].hasOwnProperty(r)&&k[n][r].onload()}}var l=l||f.errorTimeout,d=t.createElement(e),p=0,g=0,b={t:r,s:n,e:a,a:c,x:l};1===k[n]&&(g=1,k[n]=[]),"object"==e?d.data=n:(d.src=n,d.type=e),d.width=d.height="0",d.onerror=d.onload=d.onreadystatechange=function(){u.call(this,g)},y.splice(o,0,b),"img"!=e&&(g||2===k[n]?(E.insertBefore(d,x?null:h),m(u,l)):k[n].push(d))}function l(e,t,n,r,a){return v=0,t=t||"j",o(e)?c("c"==t?S:w,e,t,this.i++,n,r,a):(y.splice(this.i++,0,e),1==y.length&&s()),this}function u(){var e=f;return e.loader={load:l,i:0},e}var d,f,p=t.documentElement,m=e.setTimeout,h=t.getElementsByTagName("script")[0],g={}.toString,y=[],v=0,b="MozAppearance"in p.style,x=b&&!!t.createRange().compareNode,E=x?p:h.parentNode,p=e.opera&&"[object Opera]"==g.call(e.opera),p=!!t.attachEvent&&!p,w=b?"object":p?"script":"img",S=p?"script":w,C=Array.isArray||function(e){return"[object Array]"==g.call(e)},T=[],k={},j={timeout:function(e,t){return t.length&&(e.timeout=t[0]),e}};f=function(e){function t(e){var t,n,r,e=e.split("!"),o=T.length,a=e.pop(),i=e.length,a={url:a,origUrl:a,prefixes:e};for(n=0;i>n;n++)r=e[n].split("="),(t=j[r.shift()])&&(a=t(a,r));for(n=0;o>n;n++)a=T[n](a);return a}function i(e,o,a,i,s){var c=t(e),l=c.autoCallback;c.url.split(".").pop().split("?").shift(),c.bypass||(o&&(o=r(o)?o:o[e]||o[i]||o[e.split("/").pop().split("?")[0]]),c.instead?c.instead(e,o,a,i,s):(k[c.url]?c.noexec=!0:k[c.url]=1,a.load(c.url,c.forceCSS||!c.forceJS&&"css"==c.url.split(".").pop().split("?").shift()?"c":n,c.noexec,c.attrs,c.timeout),(r(o)||r(l))&&a.load(function(){u(),o&&o(c.origUrl,s,i),l&&l(c.origUrl,s,i),k[c.url]=2})))}function s(e,t){function n(e,n){if(e){if(o(e))n||(d=function(){var e=[].slice.call(arguments);f.apply(this,e),p()}),i(e,d,t,0,l);else if(Object(e)===e)for(c in s=function(){var t,n=0;for(t in e)e.hasOwnProperty(t)&&n++;return n}(),e)e.hasOwnProperty(c)&&(!n&&!--s&&(r(d)?d=function(){var e=[].slice.call(arguments);f.apply(this,e),p()}:d[c]=function(e){return function(){var t=[].slice.call(arguments);e&&e.apply(this,t),p()}}(f[c])),i(e[c],d,t,c,l))}else!n&&p()}var s,c,l=!!e.test,u=e.load||e.both,d=e.callback||a,f=d,p=e.complete||a;n(l?e.yep:e.nope,!!u),u&&n(u)}var c,l,d=this.yepnope.loader;if(o(e))i(e,0,d,0);else if(C(e))for(c=0;c #mq-test-1 { width: 42px; }',r.insertBefore(a,o),n=42===i.offsetWidth,r.removeChild(a),{matches:n,media:e}}}(e.document)}(this),function(e){"use strict";function t(){E(!0)}var n={};e.respond=n,n.update=function(){};var r=[],o=function(){var t=!1;try{t=new e.XMLHttpRequest}catch(n){t=new e.ActiveXObject("Microsoft.XMLHTTP")}return function(){return t}}(),a=function(e,t){var n=o();n&&(n.open("GET",e,!0),n.onreadystatechange=function(){4!==n.readyState||200!==n.status&&304!==n.status||t(n.responseText)},4!==n.readyState&&n.send(null))},i=function(e){return e.replace(n.regex.minmaxwh,"").match(n.regex.other)};if(n.ajax=a,n.queue=r,n.unsupportedmq=i,n.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^\/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},n.mediaQueriesSupported=e.matchMedia&&null!==e.matchMedia("only all")&&e.matchMedia("only all").matches,!n.mediaQueriesSupported){var s,c,l,u=e.document,d=u.documentElement,f=[],p=[],m=[],h={},g=30,y=u.getElementsByTagName("head")[0]||d,v=u.getElementsByTagName("base")[0],b=y.getElementsByTagName("link"),x=function(){var e,t=u.createElement("div"),n=u.body,r=d.style.fontSize,o=n&&n.style.fontSize,a=!1;return t.style.cssText="position:absolute;font-size:1em;width:1em",n||(n=a=u.createElement("body"),n.style.background="none"),d.style.fontSize="100%",n.style.fontSize="100%",n.appendChild(t),a&&d.insertBefore(n,d.firstChild),e=t.offsetWidth,a?d.removeChild(n):n.removeChild(t),d.style.fontSize=r,o&&(n.style.fontSize=o),e=l=parseFloat(e)},E=function(t){var n="clientWidth",r=d[n],o="CSS1Compat"===u.compatMode&&r||u.body[n]||r,a={},i=b[b.length-1],h=(new Date).getTime();if(t&&s&&g>h-s)return e.clearTimeout(c),void(c=e.setTimeout(E,g));s=h;for(var v in f)if(f.hasOwnProperty(v)){var w=f[v],S=w.minw,C=w.maxw,T=null===S,k=null===C,j="em";S&&(S=parseFloat(S)*(S.indexOf(j)>-1?l||x():1)),C&&(C=parseFloat(C)*(C.indexOf(j)>-1?l||x():1)),w.hasquery&&(T&&k||!(T||o>=S)||!(k||C>=o))||(a[w.media]||(a[w.media]=[]),a[w.media].push(p[w.rules]))}for(var M in m)m.hasOwnProperty(M)&&m[M]&&m[M].parentNode===y&&y.removeChild(m[M]);m.length=0;for(var N in a)if(a.hasOwnProperty(N)){var $=u.createElement("style"),z=a[N].join("\n");$.type="text/css",$.media=N,y.insertBefore($,i.nextSibling),$.styleSheet?$.styleSheet.cssText=z:$.appendChild(u.createTextNode(z)),m.push($)}},w=function(e,t,r){var o=e.replace(n.regex.comments,"").replace(n.regex.keyframes,"").match(n.regex.media),a=o&&o.length||0;t=t.substring(0,t.lastIndexOf("/"));var s=function(e){return e.replace(n.regex.urls,"$1"+t+"$2$3")},c=!a&&r;t.length&&(t+="/"),c&&(a=1);for(var l=0;a>l;l++){var u,d,m,h;c?(u=r,p.push(s(e))):(u=o[l].match(n.regex.findStyles)&&RegExp.$1,p.push(RegExp.$2&&s(RegExp.$2))),m=u.split(","),h=m.length;for(var g=0;h>g;g++)d=m[g],i(d)||f.push({media:d.split("(")[0].match(n.regex.only)&&RegExp.$2||"all",rules:p.length-1,hasquery:d.indexOf("(")>-1,minw:d.match(n.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:d.match(n.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}E()},S=function(){if(r.length){var t=r.shift();a(t.href,function(n){w(n,t.href,t.media),h[t.href]=!0,e.setTimeout(function(){S()},0)})}},C=function(){for(var t=0;t - - \ No newline at end of file diff --git a/dist/styles/styles.css b/dist/styles/styles.css deleted file mode 100644 index 3128fa1..0000000 --- a/dist/styles/styles.css +++ /dev/null @@ -1 +0,0 @@ -html{margin:0;padding:0;border:0}a,abbr,acronym,address,article,aside,blockquote,body,caption,code,dd,del,dfn,dialog,div,dl,dt,em,fieldset,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,iframe,img,label,legend,li,nav,object,ol,p,pre,q,section,span,table,tbody,td,tfoot,th,thead,tr,ul{margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline}article,aside,dialog,figure,footer,header,hgroup,nav,section{display:block}body{line-height:1.5;background:#fff}table{border-collapse:separate;border-spacing:0}caption,td,th{text-align:left;font-weight:400;float:none!important}table,td,th{vertical-align:middle}blockquote after,blockquote before,q after,q before{content:''}a img{border:none}b,i{display:none} \ No newline at end of file diff --git a/gulpfile.babel.js b/gulpfile.babel.js new file mode 100644 index 0000000..28be86b --- /dev/null +++ b/gulpfile.babel.js @@ -0,0 +1,16 @@ +/* + * Harvest : Front-End boilerplate + * Author: Ryan Benson + */ + +// Core libraries +import gulp from 'gulp'; + +// Tasks +import configure from './harvest-core/tasks/configure'; + +/* + * Task: configure + * Allows you to configure the entire boilerplate and workflow + */ +gulp.task('configure', configure()); diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index a0663fe..0000000 --- a/gulpfile.js +++ /dev/null @@ -1,212 +0,0 @@ -//initialize all of our variables -var app, base, concat, directory, gulp, gutil, hostname, path, refresh, sass, uglify, imagemin, minifyCSS, del, browserSync, autoprefixer, gulpSequence, shell, sourceMaps, plumber; - -var autoPrefixBrowserList = ['last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4']; - -//load all of our dependencies -//add more here if you want to include more libraries -gulp = require('gulp'); -gutil = require('gulp-util'); -concat = require('gulp-concat'); -uglify = require('gulp-uglify'); -sass = require('gulp-sass'); -sourceMaps = require('gulp-sourcemaps'); -imagemin = require('gulp-imagemin'); -minifyCSS = require('gulp-minify-css'); -browserSync = require('browser-sync'); -autoprefixer = require('gulp-autoprefixer'); -gulpSequence = require('gulp-sequence').use(gulp); -shell = require('gulp-shell'); -plumber = require('gulp-plumber'); - -gulp.task('browserSync', function() { - browserSync({ - server: { - baseDir: "app/" - }, - options: { - reloadDelay: 250 - }, - notify: false - }); -}); - - -//compressing images & handle SVG files -gulp.task('images', function(tmp) { - gulp.src(['app/images/*.jpg', 'app/images/*.png']) - //prevent pipe breaking caused by errors from gulp plugins - .pipe(plumber()) - .pipe(imagemin({ optimizationLevel: 5, progressive: true, interlaced: true })) - .pipe(gulp.dest('app/images')); -}); - -//compressing images & handle SVG files -gulp.task('images-deploy', function() { - gulp.src(['app/images/**/*', '!app/images/README']) - //prevent pipe breaking caused by errors from gulp plugins - .pipe(plumber()) - .pipe(gulp.dest('dist/images')); -}); - -//compiling our Javascripts -gulp.task('scripts', function() { - //this is where our dev JS scripts are - return gulp.src(['app/scripts/src/_includes/**/*.js', 'app/scripts/src/**/*.js']) - //prevent pipe breaking caused by errors from gulp plugins - .pipe(plumber()) - //this is the filename of the compressed version of our JS - .pipe(concat('app.js')) - //catch errors - .on('error', gutil.log) - //compress :D - .pipe(uglify()) - //where we will store our finalized, compressed script - .pipe(gulp.dest('app/scripts')) - //notify browserSync to refresh - .pipe(browserSync.reload({stream: true})); -}); - -//compiling our Javascripts for deployment -gulp.task('scripts-deploy', function() { - //this is where our dev JS scripts are - return gulp.src(['app/scripts/src/_includes/**/*.js', 'app/scripts/src/**/*.js']) - //prevent pipe breaking caused by errors from gulp plugins - .pipe(plumber()) - //this is the filename of the compressed version of our JS - .pipe(concat('app.js')) - //compress :D - .pipe(uglify()) - //where we will store our finalized, compressed script - .pipe(gulp.dest('dist/scripts')); -}); - -//compiling our SCSS files -gulp.task('styles', function() { - //the initializer / master SCSS file, which will just be a file that imports everything - return gulp.src('app/styles/scss/init.scss') - //prevent pipe breaking caused by errors from gulp plugins - .pipe(plumber({ - errorHandler: function (err) { - console.log(err); - this.emit('end'); - } - })) - //get sourceMaps ready - .pipe(sourceMaps.init()) - //include SCSS and list every "include" folder - .pipe(sass({ - errLogToConsole: true, - includePaths: [ - 'app/styles/scss/' - ] - })) - .pipe(autoprefixer({ - browsers: autoPrefixBrowserList, - cascade: true - })) - //catch errors - .on('error', gutil.log) - //the final filename of our combined css file - .pipe(concat('styles.css')) - //get our sources via sourceMaps - .pipe(sourceMaps.write()) - //where to save our final, compressed css file - .pipe(gulp.dest('app/styles')) - //notify browserSync to refresh - .pipe(browserSync.reload({stream: true})); -}); - -//compiling our SCSS files for deployment -gulp.task('styles-deploy', function() { - //the initializer / master SCSS file, which will just be a file that imports everything - return gulp.src('app/styles/scss/init.scss') - .pipe(plumber()) - //include SCSS includes folder - .pipe(sass({ - includePaths: [ - 'app/styles/scss', - ] - })) - .pipe(autoprefixer({ - browsers: autoPrefixBrowserList, - cascade: true - })) - //the final filename of our combined css file - .pipe(concat('styles.css')) - .pipe(minifyCSS()) - //where to save our final, compressed css file - .pipe(gulp.dest('dist/styles')); -}); - -//basically just keeping an eye on all HTML files -gulp.task('html', function() { - //watch any and all HTML files and refresh when something changes - return gulp.src('app/*.html') - .pipe(plumber()) - .pipe(browserSync.reload({stream: true})) - //catch errors - .on('error', gutil.log); -}); - -//migrating over all HTML files for deployment -gulp.task('html-deploy', function() { - //grab everything, which should include htaccess, robots, etc - gulp.src('app/*') - //prevent pipe breaking caused by errors from gulp plugins - .pipe(plumber()) - .pipe(gulp.dest('dist')); - - //grab any hidden files too - gulp.src('app/.*') - //prevent pipe breaking caused by errors from gulp plugins - .pipe(plumber()) - .pipe(gulp.dest('dist')); - - gulp.src('app/fonts/**/*') - //prevent pipe breaking caused by errors from gulp plugins - .pipe(plumber()) - .pipe(gulp.dest('dist/fonts')); - - //grab all of the styles - gulp.src(['app/styles/*.css', '!app/styles/styles.css']) - //prevent pipe breaking caused by errors from gulp plugins - .pipe(plumber()) - .pipe(gulp.dest('dist/styles')); -}); - -//cleans our dist directory in case things got deleted -gulp.task('clean', function() { - return shell.task([ - 'rm -rf dist' - ]); -}); - -//create folders using shell -gulp.task('scaffold', function() { - return shell.task([ - 'mkdir dist', - 'mkdir dist/fonts', - 'mkdir dist/images', - 'mkdir dist/scripts', - 'mkdir dist/styles' - ] - ); -}); - -//this is our master task when you run `gulp` in CLI / Terminal -//this is the main watcher to use when in active development -// this will: -// startup the web server, -// start up browserSync -// compress all scripts and SCSS files -gulp.task('default', ['browserSync', 'scripts', 'styles'], function() { - //a list of watchers, so it will watch all of the following files waiting for changes - gulp.watch('app/scripts/src/**', ['scripts']); - gulp.watch('app/styles/scss/**', ['styles']); - gulp.watch('app/images/**', ['images']); - gulp.watch('app/*.html', ['html']); -}); - -//this is our deployment task, it will set everything for deployment-ready files -gulp.task('deploy', gulpSequence('clean', 'scaffold', ['scripts-deploy', 'styles-deploy', 'images-deploy'], 'html-deploy')); diff --git a/harvest-core/config/config.js b/harvest-core/config/config.js new file mode 100644 index 0000000..24b44b9 --- /dev/null +++ b/harvest-core/config/config.js @@ -0,0 +1,19 @@ +/* + * Config + * The base Harvest configurations for files, deps, etc + */ + +export default { + files: { + harvestConf: 'harvest.json', + template: './harvest-core/template' + }, + baseDevDependencies: { + "gulp": "^3.9.0", + "gulp-prompt": "^0.1.2", + "babel-core": "^6.4.5", + "babel-preset-es2015": "^6.3.13", + "fs.extra": "^1.3.2", + "async": "^1.5.2" + } +} diff --git a/harvest-core/config/prompts.js b/harvest-core/config/prompts.js new file mode 100644 index 0000000..0ebbc09 --- /dev/null +++ b/harvest-core/config/prompts.js @@ -0,0 +1,83 @@ +/* + * Prompts + * Configuration of the CLI prompts for the configuration system + */ + +export default [ + { + type: 'input', + name: 'name', + message: 'What is the name of the project?', + default: 'Harvest' + }, + { + type: 'input', + name: 'version', + message: 'What is the version number?', + default: '1.0.0' + }, + { + type: 'input', + name: 'description', + message: 'Write a brief description about the project', + default: '' + }, + { + type: 'input', + name: 'main', + message: 'What is the main script?', + default: 'index.js' + }, + { + type: 'input', + name: 'author', + message: 'Who is the author?', + default: '' + }, + { + type: 'input', + name: 'license', + message: 'What is the license?', + default: 'ISC' + }, + { + type: 'list', //checkbox for multi + name: 'css', + message: 'What CSS Pre-processor do you want to use?', + choices: ['None', 'SCSS', 'LESS', 'Stylus'], + default: 'SCSS' + }, + { + type: 'list', + name: 'js', + message: 'What JS manager do you want to use?', + choices: ['Browserify', 'Webpack', 'JS PM'], + default: 'None' + }, + { + type: 'list', + name: 'es2015', + message: 'Do you want to use ES2015?', + choices: ['Yes', 'No'], + default: 'Yes' + }, + { + type: 'input', + name: 'src', + message: 'What do you want to name your development folder?', + default: 'src' + }, + { + type: 'input', + name: 'dist', + message: 'What do you want to name your distribution folder?', + default: 'dist' + }, + { + type: 'list', + name: 'sudo', + message: 'Do you need to install npm package using sudo?', + choices: ['No', 'Yes'], + default: 'No' + } +]; diff --git a/harvest-core/tasks/configure.js b/harvest-core/tasks/configure.js new file mode 100644 index 0000000..5ed7b50 --- /dev/null +++ b/harvest-core/tasks/configure.js @@ -0,0 +1,37 @@ +/* + * Harvest : Front-End boilerplate + * Author: Ryan Benson + */ + +// Core libraries +import gulp from 'gulp'; +import prompt from 'gulp-prompt'; +import async from 'async'; +import prompts from '../config/prompts'; + +// Sub tasks +import updatePackage from './configure/updatePackage'; +import writeCoreConfig from './configure/writeCoreConfig'; +import scaffold from './configure/scaffold'; + +/* + * default + * Public method that updates the NPM package and runs CLI tasks + * @params: nil + */ +export default function() { + gulp.src('package.json') + .pipe(prompt.prompt( + prompts, + (config) => { + async.parallel([ + async.apply(updatePackage, config), + async.apply(writeCoreConfig, config), + async.apply(scaffold, config) + ], + (err, results) => { + console.log('DONE!'); + }); + } + )); +}; diff --git a/harvest-core/tasks/configure/scaffold.js b/harvest-core/tasks/configure/scaffold.js new file mode 100644 index 0000000..11338db --- /dev/null +++ b/harvest-core/tasks/configure/scaffold.js @@ -0,0 +1,73 @@ +/* + * Task: scaffold + * Creates the directories and moves our boilerplate template over to source dir + */ + +// Core libraries +import fs from 'fs.extra'; // will include native FS and extras +import async from 'async'; +import coreConfig from '../../config/config'; + +/* + * isDir - checks to see if a given path is a directory or not + * @params {string} path - path to check + * @params {function} cb - callback to run when done + */ +const isDir = (path, cb) => { + fs.stat(path, (err, stats) => { + if(err) return cb(err, null); + return cb(err, stats.isDirectory()); + }) +}; + +/* + * mkdir - creates a directory + * @params {string} path - path to make + * @params {function} cb - callback to run when done + */ +const mkdir = (path, cb) => { + fs.mkdir(path, (err) => cb(err)); +}; + +/* + * readOrMakeDir - checks to see if a directory exists before trying to make it + * @params {string} path - path to check and/or make + * @params {function} cb - callback to run when done + */ +const readOrMakeDir = (path, cb) => { + isDir(path, (err, results) => { + if(err && err.code === 'ENOENT' && !results) return mkdir(path, (err) => cb(err)); + console.log(`Could not create ${path}, make sure that this doesn't exist`); + cb(null); + }); +}; + +/* + * copyTemplate - moves the template boilerplate to the source directory + * @params {string} dest - where to copy to + * @params {function} cb - callback to run when done + */ +const copyTemplate = (dest, cb) => { + fs.copyRecursive(coreConfig.files.template, dest, (err) => cb(err)); +}; + +/* + * default + * Public method that updates the NPM package and runs CLI tasks + * @params: config (object) - config from the CLI prompts + * @params: cb (function) - callback for async + */ +export default function(config, cb) { + async.parallel([ + (cb) => { + copyTemplate(config.src, (err) => cb(err)); + }, + (cb) => { + readOrMakeDir(config.dist, (err) => cb(err)); + } + ], (err, results) => { + console.log('Finished with the directories'); + return cb(err, results); + }); + +}; diff --git a/harvest-core/tasks/configure/updatePackage.js b/harvest-core/tasks/configure/updatePackage.js new file mode 100644 index 0000000..225511e --- /dev/null +++ b/harvest-core/tasks/configure/updatePackage.js @@ -0,0 +1,58 @@ +/* + * Task: updatePackage + * Updates the package.json file and runs NPM taks (install and cleanup) + */ + +// Core libraries +import async from 'async'; +import fs from 'fs'; +import coreConfig from '../../config/config'; +import childProcess from 'child_process'; + +// We need the exec to process the CLI tasks for NPM +const exec = childProcess.exec; + +const addLibs = (npmDevDep, config) => { + if(config.css === 'SCSS') npmDevDep['gulp-sass'] = '^2.2.0'; + if(config.css === 'LESS') npmDevDep['gulp-sass'] = '^3.0.5'; + if(config.css === 'Stylus') npmDevDep['gulp-sass'] = '^2.3.0'; + if(config.js === 'Browserify') npmDevDep['browserify'] = '^13.0.0'; + if(config.js === 'Browserify') npmDevDep['vinyl-source-stream'] = '^1.1.0'; + if(config.js === 'Webpack') npmDevDep['gulp-webpack'] = '^1.5.0'; + if(config.js === 'JS PM') npmDevDep['gulp-jspm'] = '^0.5.6'; + return npmDevDep; +}; + +/* + * default + * Public method that updates the NPM package and runs CLI tasks + * @params: config (object) - config from the CLI prompts + * @params: cb (function) - callback for async + */ +export default function(config, cb) { + config.devDependencies = coreConfig.baseDevDependencies; + + config.devDependencies = addLibs(config.devDependencies, config); + + const {name, version, description, main, author, license, devDependencies} = config; + const packageJsonData = {name, version, description, main, author, license, devDependencies}; + + async.series([ + (cb) => { + fs.writeFile('package.json', JSON.stringify(packageJsonData, null, 2), (err) => { + cb(err, true); + }); + }, + (cb) => { + let sudo = ''; + if(config.sudo === 'Yes') sudo = 'sudo '; + exec(sudo + 'npm install; npm prune;', (err, stdout, stderr) => { + if(stdout) console.log(stdout); + if(stderr) console.log(stderr); + cb(err, true); + }); + } + ], (err, results) => { + cb(err, results); + }); +}; diff --git a/harvest-core/tasks/configure/writeCoreConfig.js b/harvest-core/tasks/configure/writeCoreConfig.js new file mode 100644 index 0000000..8f1432c --- /dev/null +++ b/harvest-core/tasks/configure/writeCoreConfig.js @@ -0,0 +1,20 @@ +/* + * Task: writeCoreConfig + * Writes our Harvest configuration for later use + */ + +// Core libraries +import fs from 'fs'; +import coreConfig from '../../config/config'; + +/* + * default + * Public method writes our Harvest config + * @params: config (object) - config from the CLI prompts + * @params: cb (function) - callback for async + */ +export default function(config, cb) { + fs.writeFile(coreConfig.files.harvestConf, JSON.stringify(config, null, 2), (err) => { + cb(err, true); + }); +}; diff --git a/app/styles/ie8.css b/harvest-core/template/fonts/.gitkeep similarity index 100% rename from app/styles/ie8.css rename to harvest-core/template/fonts/.gitkeep diff --git a/app/styles/ie9.css b/harvest-core/template/images/.gitkeep similarity index 100% rename from app/styles/ie9.css rename to harvest-core/template/images/.gitkeep diff --git a/harvest-core/template/index.html b/harvest-core/template/index.html new file mode 100644 index 0000000..b580baf --- /dev/null +++ b/harvest-core/template/index.html @@ -0,0 +1,28 @@ + + + + + + Website Title + + + + + + + +

Content

+ + + + + + + diff --git a/app/styles/scss/layout/_main.scss b/harvest-core/template/scripts/app.js similarity index 100% rename from app/styles/scss/layout/_main.scss rename to harvest-core/template/scripts/app.js diff --git a/dist/images/README b/harvest-core/template/scripts/src/.gitkeep similarity index 100% rename from dist/images/README rename to harvest-core/template/scripts/src/.gitkeep diff --git a/dist/styles/ie8.css b/harvest-core/template/scripts/vendors/.gitkeep similarity index 100% rename from dist/styles/ie8.css rename to harvest-core/template/scripts/vendors/.gitkeep diff --git a/dist/styles/ie9.css b/harvest-core/template/styles/scss/base/_reset.scss similarity index 100% rename from dist/styles/ie9.css rename to harvest-core/template/styles/scss/base/_reset.scss diff --git a/harvest-core/template/styles/scss/base/_typography.scss b/harvest-core/template/styles/scss/base/_typography.scss new file mode 100644 index 0000000..e69de29 diff --git a/harvest-core/template/styles/scss/components/_buttons.scss b/harvest-core/template/styles/scss/components/_buttons.scss new file mode 100644 index 0000000..e69de29 diff --git a/harvest-core/template/styles/scss/components/_navigation.scss b/harvest-core/template/styles/scss/components/_navigation.scss new file mode 100644 index 0000000..e69de29 diff --git a/harvest-core/template/styles/scss/helpers/_functions.scss b/harvest-core/template/styles/scss/helpers/_functions.scss new file mode 100644 index 0000000..e69de29 diff --git a/harvest-core/template/styles/scss/helpers/_mixins.scss b/harvest-core/template/styles/scss/helpers/_mixins.scss new file mode 100644 index 0000000..e69de29 diff --git a/harvest-core/template/styles/scss/helpers/_variables.scss b/harvest-core/template/styles/scss/helpers/_variables.scss new file mode 100644 index 0000000..e69de29 diff --git a/harvest-core/template/styles/scss/layout/_footer.scss b/harvest-core/template/styles/scss/layout/_footer.scss new file mode 100644 index 0000000..e69de29 diff --git a/harvest-core/template/styles/scss/layout/_header.scss b/harvest-core/template/styles/scss/layout/_header.scss new file mode 100644 index 0000000..e69de29 diff --git a/harvest-core/template/styles/scss/main.scss b/harvest-core/template/styles/scss/main.scss new file mode 100644 index 0000000..e867bf6 --- /dev/null +++ b/harvest-core/template/styles/scss/main.scss @@ -0,0 +1,25 @@ +// Helpers +@import 'helpers/_variables'; +@import 'helpers/_functions'; +@import 'helpers/_mixins'; + +// Base +@import 'base/_reset'; +@import 'base/_typography'; + +// Vendors +// @import 'vendors/...' + +// Themes +@import 'themes/_theme'; + +// Layout +@import 'layout/_header'; +@import 'layout/_footer'; + +// Components +@import 'components/_navigation'; +@import 'components/_buttons'; + +// Pages +@import 'pages/_home'; diff --git a/harvest-core/template/styles/scss/pages/_home.scss b/harvest-core/template/styles/scss/pages/_home.scss new file mode 100644 index 0000000..e69de29 diff --git a/harvest-core/template/styles/scss/styles.css b/harvest-core/template/styles/scss/styles.css new file mode 100644 index 0000000..e69de29 diff --git a/harvest-core/template/styles/scss/themes/_theme.scss b/harvest-core/template/styles/scss/themes/_theme.scss new file mode 100644 index 0000000..e69de29 diff --git a/harvest-core/template/styles/scss/vendors/.gitkeep b/harvest-core/template/styles/scss/vendors/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json index 21e4026..524206a 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,16 @@ { - "name": "YourProject", - "version": "0.0.1", - "description": "Description of your project", - "dependencies": {}, + "name": "Harvest", + "version": "1.0.0", + "description": "", + "main": "index.js", + "author": "", + "license": "ISC", "devDependencies": { - "browser-sync": "^2.9.10", + "async": "^1.5.2", + "babel-core": "^6.4.5", + "babel-preset-es2015": "^6.3.13", + "fs.extra": "^1.3.2", "gulp": "^3.9.0", - "gulp-autoprefixer": "^3.0.2", - "gulp-concat": "^2.6.0", - "gulp-imagemin": "^2.3.0", - "gulp-minify-css": "^1.2.1", - "gulp-sass": "^2.0.4", - "gulp-sequence": "^0.4.1", - "gulp-shell": "^0.5.0", - "gulp-sourcemaps": "^1.6.0", - "gulp-uglify": "^1.4.1", - "gulp-util": "^3.0.6", - "gulp-plumber": "^1.0.1" + "gulp-prompt": "^0.1.2" } }