Playing with a new design. Anything is better than what's there now.
4
.gitignore
vendored
@ -1,2 +1,6 @@
|
||||
_site
|
||||
*.lock
|
||||
node_modules
|
||||
bower_components
|
||||
.tmp
|
||||
.sass-cache
|
||||
|
7
Gemfile
@ -1,2 +1,7 @@
|
||||
source 'https://rubygems.org'
|
||||
source 'http://rubygems.org'
|
||||
|
||||
gem 'github-pages'
|
||||
gem 'jemoji'
|
||||
gem 'jekyll-mentions'
|
||||
gem 'jekyll-redirect-from'
|
||||
gem 'jekyll-sitemap'
|
||||
|
53
_config.yml
@ -1,9 +1,56 @@
|
||||
# Set by github - do not change.
|
||||
safe: true
|
||||
lsi: false
|
||||
pygments: true
|
||||
highlighter: pygments
|
||||
|
||||
exclude:
|
||||
- bower.json
|
||||
- bower_components
|
||||
- Gemfile
|
||||
- Gemfile.lock
|
||||
|
||||
title: xenia
|
||||
description: >
|
||||
xenia is a BSD licensed open source research project for emulating Xbox 360
|
||||
games on modern PCs.
|
||||
baseurl: /xenia
|
||||
url: "http://xenia.jp"
|
||||
twitter_username: xeniaproject
|
||||
github_username: xenia-project
|
||||
|
||||
markdown: kramdown
|
||||
|
||||
gems:
|
||||
- jemoji
|
||||
- jeykll-mentions
|
||||
- jeykll-redirect-from
|
||||
- jekyll-mentions
|
||||
- jekyll-redirect-from
|
||||
- jekyll-sitemap
|
||||
|
||||
navigation:
|
||||
- pages:
|
||||
- title: Home
|
||||
path: index.html
|
||||
- path: about.md
|
||||
- path: faq.md
|
||||
- path: roadmap.md
|
||||
- path: compatibility.html
|
||||
- path: gallery.html
|
||||
- title: Community
|
||||
pages:
|
||||
- title: /r/xenia
|
||||
url: https://www.reddit.com/r/xenia
|
||||
icon: communication:forum
|
||||
- title: YouTube
|
||||
url: https://www.youtube.com/channel/UC6bJhkUUHE18HVG2mpbygSQ
|
||||
icon: av:videocam
|
||||
- title: Development
|
||||
pages:
|
||||
- path: development/quickstart.md
|
||||
- path: development/debugging.md
|
||||
- title: Source Code
|
||||
url: https://github.com/benvanik/xenia
|
||||
icon: code
|
||||
- title: Issues
|
||||
url: https://github.com/benvanik/xenia/issues
|
||||
icon: bug-report
|
||||
- path: development/irc.md
|
||||
|
43
_includes/head.html
Normal file
@ -0,0 +1,43 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width initial-scale=1" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
|
||||
<title>xenia - {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
|
||||
<meta name="description" content="{{ site.description }}">
|
||||
|
||||
<link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
|
||||
|
||||
<link rel="stylesheet" href="{{ site.baseurl }}/styles/main.css">
|
||||
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
|
||||
<script src="{{ site.baseurl }}/scripts/webcomponents-lite.min.js"></script>
|
||||
<link rel="import" href="{{ site.baseurl }}/polymer-vulcanized.html">
|
||||
|
||||
<!-- Add to homescreen for Chrome on Android -->
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="application-name" content="xenia">
|
||||
|
||||
<!-- Add to homescreen for Safari on iOS -->
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||
<meta name="apple-mobile-web-app-title" content="xenia">
|
||||
|
||||
<link rel="manifest" href="{{ site.baseurl }}/images/icons/manifest.json">
|
||||
<meta name="theme-color" content="#303F9F">
|
||||
<meta name="msapplication-TileColor" content="#3372DF">
|
||||
<meta name="msapplication-TileImage" content="{{ site.baseurl }}/images/icons/ms-icon-144x144.png">
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="{{ site.baseurl }}/images/icons/apple-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="{{ site.baseurl }}/images/icons/apple-icon-60x60.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="{{ site.baseurl }}/images/icons/apple-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="{{ site.baseurl }}/images/icons/apple-icon-76x76.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="{{ site.baseurl }}/images/icons/apple-icon-114x114.png">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="{{ site.baseurl }}/images/icons/apple-icon-120x120.png">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="{{ site.baseurl }}/images/icons/apple-icon-144x144.png">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="{{ site.baseurl }}/images/icons/apple-icon-152x152.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="{{ site.baseurl }}/images/icons/apple-icon-180x180.png">
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="{{ site.baseurl }}/images/icons/android-icon-192x192.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="{{ site.baseurl }}/images/icons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="96x96" href="{{ site.baseurl }}/images/icons/favicon-96x96.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="{{ site.baseurl }}/images/icons/favicon-16x16.png">
|
||||
</head>
|
58
_includes/page-footer.html
Normal file
@ -0,0 +1,58 @@
|
||||
<footer class="site-footer">
|
||||
<div class="wrapper">
|
||||
|
||||
<div class="footer-col-wrapper">
|
||||
<div class="footer-col footer-col-1">
|
||||
<ul class="contact-list">
|
||||
<li></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="footer-col footer-col-2">
|
||||
<ul class="social-media-list">
|
||||
{% if site.github_username %}
|
||||
<li>
|
||||
<a href="https://github.com/{{ site.github_username }}">
|
||||
<span class="icon icon--github">
|
||||
<svg viewBox="0 0 16 16">
|
||||
<path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
|
||||
</svg>
|
||||
</span>
|
||||
|
||||
<span class="username">{{ site.github_username }}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if site.twitter_username %}
|
||||
<li>
|
||||
<a href="https://twitter.com/{{ site.twitter_username }}">
|
||||
<span class="icon icon--twitter">
|
||||
<svg viewBox="0 0 16 16">
|
||||
<path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
|
||||
c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
|
||||
</svg>
|
||||
</span>
|
||||
|
||||
<span class="username">{{ site.twitter_username }}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
<li>
|
||||
<p class="rss-subscribe">Subscribe <a href="{{ "/feed.xml" | prepend: site.baseurl }}">via RSS</a></p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="footer-col footer-col-3">
|
||||
<p class="text">
|
||||
xenia is an open source research project for emulating Xbox 360 games on
|
||||
modern PCs. Code and content are covered under a <a href="https://github.com/benvanik/xenia/blob/master/LICENSE" target="_top">BSD license</a>.
|
||||
We build this for fun.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</footer>
|
0
_includes/page-header.html
Normal file
73
_layouts/default.html
Normal file
@ -0,0 +1,73 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
{% include head.html %}
|
||||
<body class="fullbleed layout vertical">
|
||||
<paper-drawer-panel id="paperDrawerPanel">
|
||||
<div drawer>
|
||||
<!-- Drawer Toolbar -->
|
||||
<paper-toolbar id="drawerToolbar">
|
||||
<img src="{{ site.baseurl }}/images/logo-256x256.png">
|
||||
<span class="paper-font-title">xenia</span>
|
||||
</paper-toolbar>
|
||||
|
||||
<!-- Drawer Content -->
|
||||
{% for category in site.navigation %}
|
||||
{% if category.title %}
|
||||
<div class="menu-subheader">{{ category.title }}</div>
|
||||
{% endif %}
|
||||
<paper-menu>
|
||||
{% for page_entry in category.pages %}
|
||||
{% if page_entry.url %}
|
||||
<a href="{{ page_entry.url }}">
|
||||
<iron-icon icon="{{ page_entry.icon }}"></iron-icon>
|
||||
<span>{{ page_entry.title }}</span>
|
||||
<paper-ripple fit/>
|
||||
</a>
|
||||
{% else %}
|
||||
{% for page_item in site.pages %}
|
||||
{% if page_item.path == page_entry.path %}
|
||||
{% assign nav_page = page_item %}
|
||||
<a href="{{ nav_page.url | prepend: site.baseurl }}"
|
||||
{% if nav_page.url == page.url %}class="iron-selected"{% endif %}>
|
||||
<iron-icon icon="{{ nav_page.icon }}"></iron-icon>
|
||||
<span>{% if page_entry.title %}{{ page_entry.title }}{% else %}{{ nav_page.title }}{% endif %}</span>
|
||||
<paper-ripple fit/>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</paper-menu>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<paper-header-panel main
|
||||
{% if page.tall_header == true %}mode="waterfall-tall"{% else %}mode="waterfall"{% endif %}>
|
||||
<paper-toolbar>
|
||||
<paper-icon-button icon="menu" paper-drawer-toggle></paper-icon-button>
|
||||
<div><h3>{{ page.title }}</h3></div>
|
||||
</paper-toolbar>
|
||||
|
||||
<div class="content fit page-content">
|
||||
{% include page-header.html %}
|
||||
|
||||
<div class="wrapper">
|
||||
{{ content }}
|
||||
</div>
|
||||
|
||||
{% include page-footer.html %}
|
||||
</div>
|
||||
</paper-header-panel>
|
||||
</paper-drawer-panel>
|
||||
|
||||
<script type="text/javascript">
|
||||
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
try {
|
||||
var pageTracker = _gat._getTracker("UA-541992-12");
|
||||
pageTracker._trackPageview();
|
||||
} catch(err) {}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
10
_layouts/page.html
Normal file
@ -0,0 +1,10 @@
|
||||
---
|
||||
layout: default
|
||||
---
|
||||
<div class="post">
|
||||
|
||||
<article class="post-content">
|
||||
{{ content }}
|
||||
</article>
|
||||
|
||||
</div>
|
15
_layouts/post.html
Normal file
@ -0,0 +1,15 @@
|
||||
---
|
||||
layout: default
|
||||
---
|
||||
<div class="post">
|
||||
|
||||
<header class="post-header">
|
||||
<h1 class="post-title">{{ page.title }}</h1>
|
||||
<p class="post-meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>
|
||||
</header>
|
||||
|
||||
<article class="post-content">
|
||||
{{ content }}
|
||||
</article>
|
||||
|
||||
</div>
|
8
_posts/2015-06-13-hello-world.md
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
layout: post
|
||||
title: "Hello World!"
|
||||
date: 2015-06-13
|
||||
categories: site
|
||||
---
|
||||
|
||||
New site! Needs some style love.
|
1
_prepare.bat
Normal file
@ -0,0 +1 @@
|
||||
vulcanize --inline-css --inline-scripts --strip-comments polymer.html > polymer-vulcanized.html
|
19
_readme.md
Normal file
@ -0,0 +1,19 @@
|
||||
* [Install Ruby 2.2+ and DevKit](http://rubyinstaller.org/downloads).
|
||||
* `gem update --system`
|
||||
* Extract DevKit
|
||||
* `ruby dk.rb init`
|
||||
* `ruby dk.rb install`
|
||||
* `gem install bundler`
|
||||
* `npm install -g bower vulcanize`
|
||||
|
||||
From the repository root:
|
||||
|
||||
```
|
||||
bundle install
|
||||
bower install
|
||||
bundle exec jekyll serve
|
||||
```
|
||||
|
||||
If changing anything in `polymer.html`, run `_prepare.bat`.
|
||||
|
||||
Icons from: https://www.google.com/design/icons/
|
217
_sass/_base.scss
Normal file
@ -0,0 +1,217 @@
|
||||
/**
|
||||
* Reset some basic elements
|
||||
*/
|
||||
body, h1, h2, h3, h4, h5, h6,
|
||||
p, blockquote, pre, hr,
|
||||
dl, dd, ol, ul, figure {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Basic styling
|
||||
*/
|
||||
body {
|
||||
font-family: $base-font-family;
|
||||
font-size: $base-font-size;
|
||||
line-height: $base-line-height;
|
||||
font-weight: 300;
|
||||
color: $text-color;
|
||||
background-color: $background-color;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Set `margin-bottom` to maintain vertical rhythm
|
||||
*/
|
||||
h1, h2, h3, h4, h5, h6,
|
||||
p, blockquote, pre,
|
||||
ul, ol, dl, figure,
|
||||
%vertical-rhythm {
|
||||
margin-bottom: $spacing-unit / 2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Images
|
||||
*/
|
||||
img {
|
||||
max-width: 100%;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Figures
|
||||
*/
|
||||
figure > img {
|
||||
display: block;
|
||||
}
|
||||
|
||||
figcaption {
|
||||
font-size: $small-font-size;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Lists
|
||||
*/
|
||||
ul, ol {
|
||||
margin-left: $spacing-unit;
|
||||
}
|
||||
|
||||
li {
|
||||
> ul,
|
||||
> ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Headings
|
||||
*/
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Links
|
||||
*/
|
||||
a {
|
||||
color: $brand-color;
|
||||
text-decoration: none;
|
||||
|
||||
&:visited {
|
||||
color: darken($brand-color, 15%);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
color: $text-color;
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Blockquotes
|
||||
*/
|
||||
blockquote {
|
||||
color: $grey-color;
|
||||
border-left: 4px solid $grey-color-light;
|
||||
padding-left: $spacing-unit / 2;
|
||||
font-size: 18px;
|
||||
letter-spacing: -1px;
|
||||
font-style: italic;
|
||||
|
||||
> :last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Code formatting
|
||||
*/
|
||||
pre,
|
||||
code {
|
||||
font-size: 15px;
|
||||
border: 1px solid $grey-color-light;
|
||||
border-radius: 3px;
|
||||
background-color: #eef;
|
||||
}
|
||||
|
||||
code {
|
||||
padding: 1px 5px;
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 8px 12px;
|
||||
overflow-x: scroll;
|
||||
|
||||
> code {
|
||||
border: 0;
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Wrapper
|
||||
*/
|
||||
.wrapper {
|
||||
max-width: -webkit-calc(800px - (#{$spacing-unit} * 2));
|
||||
max-width: calc(800px - (#{$spacing-unit} * 2));
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
padding-right: $spacing-unit;
|
||||
padding-left: $spacing-unit;
|
||||
@extend %clearfix;
|
||||
|
||||
@include media-query($on-laptop) {
|
||||
max-width: -webkit-calc(800px - (#{$spacing-unit}));
|
||||
max-width: calc(800px - (#{$spacing-unit}));
|
||||
padding-right: $spacing-unit / 2;
|
||||
padding-left: $spacing-unit / 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Clearfix
|
||||
*/
|
||||
%clearfix {
|
||||
|
||||
&:after {
|
||||
content: "";
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Icons
|
||||
*/
|
||||
.icon {
|
||||
|
||||
> svg {
|
||||
display: inline-block;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
vertical-align: middle;
|
||||
|
||||
path {
|
||||
fill: $grey-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.hr {
|
||||
border-top: 1px solid #e8e8e8;
|
||||
margin-top: 30px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.blink {
|
||||
animation: blink 1s steps(5, start) infinite;
|
||||
-webkit-animation: blink 1s steps(5, start) infinite;
|
||||
}
|
||||
@keyframes blink { to { visibility: hidden; } }
|
||||
@-webkit-keyframes blink { to { visibility: hidden; } }
|
146
_sass/_layout.scss
Normal file
@ -0,0 +1,146 @@
|
||||
/**
|
||||
* Site footer
|
||||
*/
|
||||
.site-footer {
|
||||
border-top: 1px solid $grey-color-light;
|
||||
padding: $spacing-unit 0;
|
||||
}
|
||||
|
||||
.footer-heading {
|
||||
font-size: 18px;
|
||||
margin-bottom: $spacing-unit / 2;
|
||||
}
|
||||
|
||||
.contact-list,
|
||||
.social-media-list {
|
||||
list-style: none;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.footer-col-wrapper {
|
||||
font-size: 15px;
|
||||
color: $grey-color;
|
||||
margin-left: -$spacing-unit / 2;
|
||||
@extend %clearfix;
|
||||
}
|
||||
|
||||
.footer-col {
|
||||
float: left;
|
||||
margin-bottom: $spacing-unit / 2;
|
||||
padding-left: $spacing-unit / 2;
|
||||
}
|
||||
|
||||
.footer-col-1 {
|
||||
width: -webkit-calc(35% - (#{$spacing-unit} / 2));
|
||||
width: calc(35% - (#{$spacing-unit} / 2));
|
||||
}
|
||||
|
||||
.footer-col-2 {
|
||||
width: -webkit-calc(20% - (#{$spacing-unit} / 2));
|
||||
width: calc(20% - (#{$spacing-unit} / 2));
|
||||
}
|
||||
|
||||
.footer-col-3 {
|
||||
width: -webkit-calc(45% - (#{$spacing-unit} / 2));
|
||||
width: calc(45% - (#{$spacing-unit} / 2));
|
||||
}
|
||||
|
||||
@include media-query($on-laptop) {
|
||||
.footer-col-1,
|
||||
.footer-col-2 {
|
||||
width: -webkit-calc(50% - (#{$spacing-unit} / 2));
|
||||
width: calc(50% - (#{$spacing-unit} / 2));
|
||||
}
|
||||
|
||||
.footer-col-3 {
|
||||
width: -webkit-calc(100% - (#{$spacing-unit} / 2));
|
||||
width: calc(100% - (#{$spacing-unit} / 2));
|
||||
}
|
||||
}
|
||||
|
||||
@include media-query($on-palm) {
|
||||
.footer-col {
|
||||
float: none;
|
||||
width: -webkit-calc(100% - (#{$spacing-unit} / 2));
|
||||
width: calc(100% - (#{$spacing-unit} / 2));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Page content
|
||||
*/
|
||||
.page-content {
|
||||
padding: $spacing-unit 0;
|
||||
}
|
||||
|
||||
.page-heading {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.post-list {
|
||||
margin-left: 0;
|
||||
list-style: none;
|
||||
|
||||
> li {
|
||||
margin-bottom: $spacing-unit;
|
||||
}
|
||||
}
|
||||
|
||||
.post-meta {
|
||||
font-size: $small-font-size;
|
||||
color: $grey-color;
|
||||
}
|
||||
|
||||
.post-link {
|
||||
display: block;
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Posts
|
||||
*/
|
||||
.post-header {
|
||||
margin-bottom: $spacing-unit;
|
||||
}
|
||||
|
||||
.post-title {
|
||||
font-size: 42px;
|
||||
letter-spacing: -1px;
|
||||
line-height: 1;
|
||||
|
||||
@include media-query($on-laptop) {
|
||||
font-size: 36px;
|
||||
}
|
||||
}
|
||||
|
||||
.post-content {
|
||||
margin-bottom: $spacing-unit;
|
||||
|
||||
h2 {
|
||||
font-size: 32px;
|
||||
|
||||
@include media-query($on-laptop) {
|
||||
font-size: 28px;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 26px;
|
||||
|
||||
@include media-query($on-laptop) {
|
||||
font-size: 22px;
|
||||
}
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 20px;
|
||||
|
||||
@include media-query($on-laptop) {
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
}
|
67
_sass/_syntax-highlighting.scss
Normal file
@ -0,0 +1,67 @@
|
||||
/**
|
||||
* Syntax highlighting styles
|
||||
*/
|
||||
.highlight {
|
||||
background: #fff;
|
||||
@extend %vertical-rhythm;
|
||||
|
||||
.c { color: #998; font-style: italic } // Comment
|
||||
.err { color: #a61717; background-color: #e3d2d2 } // Error
|
||||
.k { font-weight: bold } // Keyword
|
||||
.o { font-weight: bold } // Operator
|
||||
.cm { color: #998; font-style: italic } // Comment.Multiline
|
||||
.cp { color: #999; font-weight: bold } // Comment.Preproc
|
||||
.c1 { color: #998; font-style: italic } // Comment.Single
|
||||
.cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special
|
||||
.gd { color: #000; background-color: #fdd } // Generic.Deleted
|
||||
.gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific
|
||||
.ge { font-style: italic } // Generic.Emph
|
||||
.gr { color: #a00 } // Generic.Error
|
||||
.gh { color: #999 } // Generic.Heading
|
||||
.gi { color: #000; background-color: #dfd } // Generic.Inserted
|
||||
.gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific
|
||||
.go { color: #888 } // Generic.Output
|
||||
.gp { color: #555 } // Generic.Prompt
|
||||
.gs { font-weight: bold } // Generic.Strong
|
||||
.gu { color: #aaa } // Generic.Subheading
|
||||
.gt { color: #a00 } // Generic.Traceback
|
||||
.kc { font-weight: bold } // Keyword.Constant
|
||||
.kd { font-weight: bold } // Keyword.Declaration
|
||||
.kp { font-weight: bold } // Keyword.Pseudo
|
||||
.kr { font-weight: bold } // Keyword.Reserved
|
||||
.kt { color: #458; font-weight: bold } // Keyword.Type
|
||||
.m { color: #099 } // Literal.Number
|
||||
.s { color: #d14 } // Literal.String
|
||||
.na { color: #008080 } // Name.Attribute
|
||||
.nb { color: #0086B3 } // Name.Builtin
|
||||
.nc { color: #458; font-weight: bold } // Name.Class
|
||||
.no { color: #008080 } // Name.Constant
|
||||
.ni { color: #800080 } // Name.Entity
|
||||
.ne { color: #900; font-weight: bold } // Name.Exception
|
||||
.nf { color: #900; font-weight: bold } // Name.Function
|
||||
.nn { color: #555 } // Name.Namespace
|
||||
.nt { color: #000080 } // Name.Tag
|
||||
.nv { color: #008080 } // Name.Variable
|
||||
.ow { font-weight: bold } // Operator.Word
|
||||
.w { color: #bbb } // Text.Whitespace
|
||||
.mf { color: #099 } // Literal.Number.Float
|
||||
.mh { color: #099 } // Literal.Number.Hex
|
||||
.mi { color: #099 } // Literal.Number.Integer
|
||||
.mo { color: #099 } // Literal.Number.Oct
|
||||
.sb { color: #d14 } // Literal.String.Backtick
|
||||
.sc { color: #d14 } // Literal.String.Char
|
||||
.sd { color: #d14 } // Literal.String.Doc
|
||||
.s2 { color: #d14 } // Literal.String.Double
|
||||
.se { color: #d14 } // Literal.String.Escape
|
||||
.sh { color: #d14 } // Literal.String.Heredoc
|
||||
.si { color: #d14 } // Literal.String.Interpol
|
||||
.sx { color: #d14 } // Literal.String.Other
|
||||
.sr { color: #009926 } // Literal.String.Regex
|
||||
.s1 { color: #d14 } // Literal.String.Single
|
||||
.ss { color: #990073 } // Literal.String.Symbol
|
||||
.bp { color: #999 } // Name.Builtin.Pseudo
|
||||
.vc { color: #008080 } // Name.Variable.Class
|
||||
.vg { color: #008080 } // Name.Variable.Global
|
||||
.vi { color: #008080 } // Name.Variable.Instance
|
||||
.il { color: #099 } // Literal.Number.Integer.Long
|
||||
}
|
852
_scripts/github.js
Normal file
@ -0,0 +1,852 @@
|
||||
/*!
|
||||
* @overview Github.js
|
||||
*
|
||||
* @copyright (c) 2013 Michael Aufreiter, Development Seed
|
||||
* Github.js is freely distributable.
|
||||
*
|
||||
* @license Licensed under MIT license
|
||||
*
|
||||
* For all details and documentation:
|
||||
* http://substance.io/michael/github
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
// Initial Setup
|
||||
// -------------
|
||||
|
||||
var XMLHttpRequest, _;
|
||||
/* istanbul ignore else */
|
||||
if (typeof exports !== 'undefined') {
|
||||
XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
|
||||
_ = require('underscore');
|
||||
if (typeof btoa === 'undefined') {
|
||||
var btoa = require('btoa'); //jshint ignore:line
|
||||
}
|
||||
|
||||
} else {
|
||||
_ = window._;
|
||||
}
|
||||
|
||||
//prefer native XMLHttpRequest always
|
||||
/* istanbul ignore if */
|
||||
if (typeof window !== 'undefined' && typeof window.XMLHttpRequest !== 'undefined'){
|
||||
XMLHttpRequest = window.XMLHttpRequest;
|
||||
}
|
||||
|
||||
|
||||
|
||||
var Github = function(options) {
|
||||
var API_URL = options.apiUrl || 'https://api.github.com';
|
||||
|
||||
// HTTP Request Abstraction
|
||||
// =======
|
||||
//
|
||||
// I'm not proud of this and neither should you be if you were responsible for the XMLHttpRequest spec.
|
||||
|
||||
function _request(method, path, data, cb, raw, sync) {
|
||||
function getURL() {
|
||||
var url = path.indexOf('//') >= 0 ? path : API_URL + path;
|
||||
return url + ((/\?/).test(url) ? '&' : '?') + (new Date()).getTime();
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
|
||||
|
||||
xhr.open(method, getURL(), !sync);
|
||||
if (!sync) {
|
||||
xhr.onreadystatechange = function () {
|
||||
if (this.readyState === 4) {
|
||||
if (this.status >= 200 && this.status < 300 || this.status === 304) {
|
||||
cb(null, raw ? this.responseText : this.responseText ? JSON.parse(this.responseText) : true, this);
|
||||
} else {
|
||||
cb({path: path, request: this, error: this.status});
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if (!raw) {
|
||||
xhr.dataType = 'json';
|
||||
xhr.setRequestHeader('Accept','application/vnd.github.v3+json');
|
||||
} else {
|
||||
xhr.setRequestHeader('Accept','application/vnd.github.v3.raw+json');
|
||||
}
|
||||
|
||||
xhr.setRequestHeader('Content-Type','application/json;charset=UTF-8');
|
||||
if ((options.token) || (options.username && options.password)) {
|
||||
var authorization = options.token ? 'token ' + options.token : 'Basic ' + btoa(options.username + ':' + options.password);
|
||||
xhr.setRequestHeader('Authorization', authorization);
|
||||
}
|
||||
if (data) {
|
||||
xhr.send(JSON.stringify(data));
|
||||
} else {
|
||||
xhr.send();
|
||||
}
|
||||
if (sync) {
|
||||
return xhr.response;
|
||||
}
|
||||
}
|
||||
|
||||
function _requestAllPages(path, cb) {
|
||||
var results = [];
|
||||
(function iterate() {
|
||||
_request('GET', path, null, function(err, res, xhr) {
|
||||
if (err) {
|
||||
return cb(err);
|
||||
}
|
||||
|
||||
results.push.apply(results, res);
|
||||
|
||||
var links = (xhr.getResponseHeader('link') || '').split(/\s*,\s*/g),
|
||||
next = _.find(links, function(link) { return /rel="next"/.test(link); });
|
||||
|
||||
if (next) {
|
||||
next = (/<(.*)>/.exec(next) || [])[1];
|
||||
}
|
||||
|
||||
if (!next) {
|
||||
cb(err, results);
|
||||
} else {
|
||||
path = next;
|
||||
iterate();
|
||||
}
|
||||
});
|
||||
})();
|
||||
}
|
||||
|
||||
|
||||
// User API
|
||||
// =======
|
||||
|
||||
Github.User = function() {
|
||||
this.repos = function(cb) {
|
||||
// Github does not always honor the 1000 limit so we want to iterate over the data set.
|
||||
_requestAllPages('/user/repos?type=all&per_page=1000&sort=updated', function(err, res) {
|
||||
cb(err, res);
|
||||
});
|
||||
};
|
||||
|
||||
// List user organizations
|
||||
// -------
|
||||
|
||||
this.orgs = function(cb) {
|
||||
_request("GET", '/user/orgs', null, function(err, res) {
|
||||
cb(err, res);
|
||||
});
|
||||
};
|
||||
|
||||
// List authenticated user's gists
|
||||
// -------
|
||||
|
||||
this.gists = function(cb) {
|
||||
_request("GET", '/gists', null, function(err, res) {
|
||||
cb(err,res);
|
||||
});
|
||||
};
|
||||
|
||||
// List authenticated user's unread notifications
|
||||
// -------
|
||||
|
||||
this.notifications = function(cb) {
|
||||
_request("GET", '/notifications', null, function(err, res) {
|
||||
cb(err,res);
|
||||
});
|
||||
};
|
||||
|
||||
// Show user information
|
||||
// -------
|
||||
|
||||
this.show = function(username, cb) {
|
||||
var command = username ? '/users/' + username : '/user';
|
||||
|
||||
_request('GET', command, null, function(err, res) {
|
||||
cb(err, res);
|
||||
});
|
||||
};
|
||||
|
||||
// List user repositories
|
||||
// -------
|
||||
|
||||
this.userRepos = function(username, cb) {
|
||||
// Github does not always honor the 1000 limit so we want to iterate over the data set.
|
||||
_requestAllPages('/users/' + username + '/repos?type=all&per_page=1000&sort=updated', function(err, res) {
|
||||
cb(err, res);
|
||||
});
|
||||
};
|
||||
|
||||
// List a user's gists
|
||||
// -------
|
||||
|
||||
this.userGists = function(username, cb) {
|
||||
_request('GET', '/users/' + username + '/gists', null, function(err, res) {
|
||||
cb(err,res);
|
||||
});
|
||||
};
|
||||
|
||||
// List organization repositories
|
||||
// -------
|
||||
|
||||
this.orgRepos = function(orgname, cb) {
|
||||
// Github does not always honor the 1000 limit so we want to iterate over the data set.
|
||||
_requestAllPages('/orgs/' + orgname + '/repos?type=all&&page_num=1000&sort=updated&direction=desc', function(err, res) {
|
||||
cb(err, res);
|
||||
});
|
||||
};
|
||||
|
||||
// Follow user
|
||||
// -------
|
||||
|
||||
this.follow = function(username, cb) {
|
||||
_request('PUT', '/user/following/' + username, null, function(err, res) {
|
||||
cb(err, res);
|
||||
});
|
||||
};
|
||||
|
||||
// Unfollow user
|
||||
// -------
|
||||
|
||||
this.unfollow = function(username, cb) {
|
||||
_request('DELETE', '/user/following/' + username, null, function(err, res) {
|
||||
cb(err, res);
|
||||
});
|
||||
};
|
||||
|
||||
// Create a repo
|
||||
// -------
|
||||
this.createRepo = function(options, cb) {
|
||||
_request('POST', '/user/repos', options, cb);
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
// Repository API
|
||||
// =======
|
||||
|
||||
Github.Repository = function(options) {
|
||||
var repo = options.name;
|
||||
var user = options.user;
|
||||
|
||||
var that = this;
|
||||
var repoPath = '/repos/' + user + '/' + repo;
|
||||
|
||||
var currentTree = {
|
||||
'branch': null,
|
||||
'sha': null
|
||||
};
|
||||
|
||||
|
||||
// Delete a repo
|
||||
// --------
|
||||
|
||||
this.deleteRepo = function(cb) {
|
||||
_request('DELETE', repoPath, options, cb);
|
||||
};
|
||||
|
||||
// Uses the cache if branch has not been changed
|
||||
// -------
|
||||
|
||||
function updateTree(branch, cb) {
|
||||
if (branch === currentTree.branch && currentTree.sha) {
|
||||
return cb(null, currentTree.sha);
|
||||
}
|
||||
|
||||
that.getRef('heads/' + branch, function(err, sha) {
|
||||
currentTree.branch = branch;
|
||||
currentTree.sha = sha;
|
||||
cb(err, sha);
|
||||
});
|
||||
}
|
||||
|
||||
// Get a particular reference
|
||||
// -------
|
||||
|
||||
this.getRef = function(ref, cb) {
|
||||
_request('GET', repoPath + '/git/refs/' + ref, null, function(err, res) {
|
||||
if (err) {
|
||||
return cb(err);
|
||||
}
|
||||
|
||||
cb(null, res.object.sha);
|
||||
});
|
||||
};
|
||||
|
||||
// Create a new reference
|
||||
// --------
|
||||
//
|
||||
// {
|
||||
// "ref": "refs/heads/my-new-branch-name",
|
||||
// "sha": "827efc6d56897b048c772eb4087f854f46256132"
|
||||
// }
|
||||
|
||||
this.createRef = function(options, cb) {
|
||||
_request('POST', repoPath + '/git/refs', options, cb);
|
||||
};
|
||||
|
||||
// Delete a reference
|
||||
// --------
|
||||
//
|
||||
// repo.deleteRef('heads/gh-pages')
|
||||
// repo.deleteRef('tags/v1.0')
|
||||
|
||||
this.deleteRef = function(ref, cb) {
|
||||
_request('DELETE', repoPath + '/git/refs/' + ref, options, cb);
|
||||
};
|
||||
|
||||
// Create a repo
|
||||
// -------
|
||||
|
||||
this.createRepo = function(options, cb) {
|
||||
_request('POST', '/user/repos', options, cb);
|
||||
};
|
||||
|
||||
// Delete a repo
|
||||
// --------
|
||||
|
||||
this.deleteRepo = function(cb) {
|
||||
_request('DELETE', repoPath, options, cb);
|
||||
};
|
||||
|
||||
// List all tags of a repository
|
||||
// -------
|
||||
|
||||
this.listTags = function(cb) {
|
||||
_request('GET', repoPath + '/tags', null, function(err, tags) {
|
||||
if (err) {
|
||||
return cb(err);
|
||||
}
|
||||
|
||||
cb(null, tags);
|
||||
});
|
||||
};
|
||||
|
||||
// List all pull requests of a respository
|
||||
// -------
|
||||
|
||||
this.listPulls = function(state, cb) {
|
||||
_request('GET', repoPath + "/pulls" + (state ? '?state=' + state : ''), null, function(err, pulls) {
|
||||
if (err) return cb(err);
|
||||
cb(null, pulls);
|
||||
});
|
||||
};
|
||||
|
||||
// Gets details for a specific pull request
|
||||
// -------
|
||||
|
||||
this.getPull = function(number, cb) {
|
||||
_request("GET", repoPath + "/pulls/" + number, null, function(err, pull) {
|
||||
if (err) return cb(err);
|
||||
cb(null, pull);
|
||||
});
|
||||
};
|
||||
|
||||
// Retrieve the changes made between base and head
|
||||
// -------
|
||||
|
||||
this.compare = function(base, head, cb) {
|
||||
_request("GET", repoPath + "/compare/" + base + "..." + head, null, function(err, diff) {
|
||||
if (err) return cb(err);
|
||||
cb(null, diff);
|
||||
});
|
||||
};
|
||||
|
||||
// List all branches of a repository
|
||||
// -------
|
||||
|
||||
this.listBranches = function(cb) {
|
||||
_request("GET", repoPath + "/git/refs/heads", null, function(err, heads) {
|
||||
if (err) return cb(err);
|
||||
cb(null, _.map(heads, function(head) { return _.last(head.ref.split('/')); }));
|
||||
});
|
||||
};
|
||||
|
||||
// Retrieve the contents of a blob
|
||||
// -------
|
||||
|
||||
this.getBlob = function(sha, cb) {
|
||||
_request("GET", repoPath + "/git/blobs/" + sha, null, cb, 'raw');
|
||||
};
|
||||
|
||||
// For a given file path, get the corresponding sha (blob for files, tree for dirs)
|
||||
// -------
|
||||
|
||||
this.getCommit = function(branch, sha, cb) {
|
||||
_request("GET", repoPath + "/git/commits/"+sha, null, function(err, commit) {
|
||||
if (err) return cb(err);
|
||||
cb(null, commit);
|
||||
});
|
||||
};
|
||||
|
||||
// For a given file path, get the corresponding sha (blob for files, tree for dirs)
|
||||
// -------
|
||||
|
||||
this.getSha = function(branch, path, cb) {
|
||||
if (!path || path === "") return that.getRef("heads/"+branch, cb);
|
||||
_request("GET", repoPath + "/contents/"+path, {ref: branch}, function(err, pathContent) {
|
||||
if (err) return cb(err);
|
||||
cb(null, pathContent.sha);
|
||||
});
|
||||
};
|
||||
|
||||
// Retrieve the tree a commit points to
|
||||
// -------
|
||||
|
||||
this.getTree = function(tree, cb) {
|
||||
_request("GET", repoPath + "/git/trees/"+tree, null, function(err, res) {
|
||||
if (err) return cb(err);
|
||||
cb(null, res.tree);
|
||||
});
|
||||
};
|
||||
|
||||
// Post a new blob object, getting a blob SHA back
|
||||
// -------
|
||||
|
||||
this.postBlob = function(content, cb) {
|
||||
if (typeof(content) === "string") {
|
||||
content = {
|
||||
"content": content,
|
||||
"encoding": "utf-8"
|
||||
};
|
||||
} else {
|
||||
content = {
|
||||
"content": btoa(String.fromCharCode.apply(null, new Uint8Array(content))),
|
||||
"encoding": "base64"
|
||||
};
|
||||
}
|
||||
|
||||
_request("POST", repoPath + "/git/blobs", content, function(err, res) {
|
||||
if (err) return cb(err);
|
||||
cb(null, res.sha);
|
||||
});
|
||||
};
|
||||
|
||||
// Update an existing tree adding a new blob object getting a tree SHA back
|
||||
// -------
|
||||
|
||||
this.updateTree = function(baseTree, path, blob, cb) {
|
||||
var data = {
|
||||
"base_tree": baseTree,
|
||||
"tree": [
|
||||
{
|
||||
"path": path,
|
||||
"mode": "100644",
|
||||
"type": "blob",
|
||||
"sha": blob
|
||||
}
|
||||
]
|
||||
};
|
||||
_request("POST", repoPath + "/git/trees", data, function(err, res) {
|
||||
if (err) return cb(err);
|
||||
cb(null, res.sha);
|
||||
});
|
||||
};
|
||||
|
||||
// Post a new tree object having a file path pointer replaced
|
||||
// with a new blob SHA getting a tree SHA back
|
||||
// -------
|
||||
|
||||
this.postTree = function(tree, cb) {
|
||||
_request("POST", repoPath + "/git/trees", { "tree": tree }, function(err, res) {
|
||||
if (err) return cb(err);
|
||||
cb(null, res.sha);
|
||||
});
|
||||
};
|
||||
|
||||
// Create a new commit object with the current commit SHA as the parent
|
||||
// and the new tree SHA, getting a commit SHA back
|
||||
// -------
|
||||
|
||||
this.commit = function(parent, tree, message, cb) {
|
||||
var user = new Github.User();
|
||||
user.show(null, function(err, userData){
|
||||
if (err) return cb(err);
|
||||
var data = {
|
||||
"message": message,
|
||||
"author": {
|
||||
"name": options.user,
|
||||
"email": userData.email
|
||||
},
|
||||
"parents": [
|
||||
parent
|
||||
],
|
||||
"tree": tree
|
||||
};
|
||||
_request("POST", repoPath + "/git/commits", data, function(err, res) {
|
||||
if (err) return cb(err);
|
||||
currentTree.sha = res.sha; // update latest commit
|
||||
cb(null, res.sha);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Update the reference of your head to point to the new commit SHA
|
||||
// -------
|
||||
|
||||
this.updateHead = function(head, commit, cb) {
|
||||
_request("PATCH", repoPath + "/git/refs/heads/" + head, { "sha": commit }, function(err) {
|
||||
cb(err);
|
||||
});
|
||||
};
|
||||
|
||||
// Show repository information
|
||||
// -------
|
||||
|
||||
this.show = function(cb) {
|
||||
_request("GET", repoPath, null, cb);
|
||||
};
|
||||
|
||||
// Show repository contributors
|
||||
// -------
|
||||
|
||||
this.contributors = function (cb, retry) {
|
||||
retry = retry || 1000;
|
||||
var self = this;
|
||||
_request("GET", repoPath + "/stats/contributors", null, function (err, data, response) {
|
||||
if (err) return cb(err);
|
||||
if (response.status === 202) {
|
||||
setTimeout(
|
||||
function () {
|
||||
self.contributors(cb, retry);
|
||||
},
|
||||
retry
|
||||
);
|
||||
} else {
|
||||
cb(err, data);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// Get contents
|
||||
// --------
|
||||
|
||||
this.contents = function(ref, path, cb) {
|
||||
path = encodeURI(path);
|
||||
_request("GET", repoPath + "/contents" + (path ? "/" + path : ""), { ref: ref }, cb);
|
||||
};
|
||||
|
||||
// Fork repository
|
||||
// -------
|
||||
|
||||
this.fork = function(cb) {
|
||||
_request("POST", repoPath + "/forks", null, cb);
|
||||
};
|
||||
|
||||
// Branch repository
|
||||
// --------
|
||||
|
||||
this.branch = function(oldBranch,newBranch,cb) {
|
||||
if(arguments.length === 2 && typeof arguments[1] === "function") {
|
||||
cb = newBranch;
|
||||
newBranch = oldBranch;
|
||||
oldBranch = "master";
|
||||
}
|
||||
this.getRef("heads/" + oldBranch, function(err,ref) {
|
||||
if(err && cb) return cb(err);
|
||||
that.createRef({
|
||||
ref: "refs/heads/" + newBranch,
|
||||
sha: ref
|
||||
},cb);
|
||||
});
|
||||
};
|
||||
|
||||
// Create pull request
|
||||
// --------
|
||||
|
||||
this.createPullRequest = function(options, cb) {
|
||||
_request("POST", repoPath + "/pulls", options, cb);
|
||||
};
|
||||
|
||||
// List hooks
|
||||
// --------
|
||||
|
||||
this.listHooks = function(cb) {
|
||||
_request("GET", repoPath + "/hooks", null, cb);
|
||||
};
|
||||
|
||||
// Get a hook
|
||||
// --------
|
||||
|
||||
this.getHook = function(id, cb) {
|
||||
_request("GET", repoPath + "/hooks/" + id, null, cb);
|
||||
};
|
||||
|
||||
// Create a hook
|
||||
// --------
|
||||
|
||||
this.createHook = function(options, cb) {
|
||||
_request("POST", repoPath + "/hooks", options, cb);
|
||||
};
|
||||
|
||||
// Edit a hook
|
||||
// --------
|
||||
|
||||
this.editHook = function(id, options, cb) {
|
||||
_request("PATCH", repoPath + "/hooks/" + id, options, cb);
|
||||
};
|
||||
|
||||
// Delete a hook
|
||||
// --------
|
||||
|
||||
this.deleteHook = function(id, cb) {
|
||||
_request("DELETE", repoPath + "/hooks/" + id, null, cb);
|
||||
};
|
||||
|
||||
// Read file at given path
|
||||
// -------
|
||||
|
||||
this.read = function(branch, path, cb) {
|
||||
_request("GET", repoPath + "/contents/"+encodeURI(path), {ref: branch}, function(err, obj) {
|
||||
if (err && err.error === 404) return cb("not found", null, null);
|
||||
|
||||
if (err) return cb(err);
|
||||
cb(null, obj);
|
||||
}, true);
|
||||
};
|
||||
|
||||
|
||||
// Remove a file
|
||||
// -------
|
||||
|
||||
this.remove = function(branch, path, cb) {
|
||||
that.getSha(branch, path, function(err, sha) {
|
||||
if (err) return cb(err);
|
||||
_request("DELETE", repoPath + "/contents/" + path, {
|
||||
message: path + " is removed",
|
||||
sha: sha,
|
||||
branch: branch
|
||||
}, cb);
|
||||
});
|
||||
};
|
||||
|
||||
// Delete a file from the tree
|
||||
// -------
|
||||
|
||||
this.delete = function(branch, path, cb) {
|
||||
that.getSha(branch, path, function(err, sha) {
|
||||
if (!sha) return cb("not found", null);
|
||||
var delPath = repoPath + "/contents/" + path;
|
||||
var params = {
|
||||
"message": "Deleted " + path,
|
||||
"sha": sha
|
||||
};
|
||||
delPath += "?message=" + encodeURIComponent(params.message);
|
||||
delPath += "&sha=" + encodeURIComponent(params.sha);
|
||||
delPath += '&branch=' + encodeURIComponent(branch);
|
||||
_request("DELETE", delPath, null, cb);
|
||||
});
|
||||
};
|
||||
|
||||
// Move a file to a new location
|
||||
// -------
|
||||
|
||||
this.move = function(branch, path, newPath, cb) {
|
||||
updateTree(branch, function(err, latestCommit) {
|
||||
that.getTree(latestCommit+"?recursive=true", function(err, tree) {
|
||||
// Update Tree
|
||||
_.each(tree, function(ref) {
|
||||
if (ref.path === path) ref.path = newPath;
|
||||
if (ref.type === "tree") delete ref.sha;
|
||||
});
|
||||
|
||||
that.postTree(tree, function(err, rootTree) {
|
||||
that.commit(latestCommit, rootTree, 'Deleted '+path , function(err, commit) {
|
||||
that.updateHead(branch, commit, function(err) {
|
||||
cb(err);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Write file contents to a given branch and path
|
||||
// -------
|
||||
|
||||
this.write = function(branch, path, content, message, cb) {
|
||||
that.getSha(branch, encodeURI(path), function(err, sha) {
|
||||
if (err && err.error !== 404) return cb(err);
|
||||
_request("PUT", repoPath + "/contents/" + encodeURI(path), {
|
||||
message: message,
|
||||
content: btoa(content),
|
||||
branch: branch,
|
||||
sha: sha
|
||||
}, cb);
|
||||
});
|
||||
};
|
||||
|
||||
// List commits on a repository. Takes an object of optional paramaters:
|
||||
// sha: SHA or branch to start listing commits from
|
||||
// path: Only commits containing this file path will be returned
|
||||
// since: ISO 8601 date - only commits after this date will be returned
|
||||
// until: ISO 8601 date - only commits before this date will be returned
|
||||
// -------
|
||||
|
||||
this.getCommits = function(options, cb) {
|
||||
options = options || {};
|
||||
var url = repoPath + "/commits";
|
||||
var params = [];
|
||||
if (options.sha) {
|
||||
params.push("sha=" + encodeURIComponent(options.sha));
|
||||
}
|
||||
if (options.path) {
|
||||
params.push("path=" + encodeURIComponent(options.path));
|
||||
}
|
||||
if (options.since) {
|
||||
var since = options.since;
|
||||
if (since.constructor === Date) {
|
||||
since = since.toISOString();
|
||||
}
|
||||
params.push("since=" + encodeURIComponent(since));
|
||||
}
|
||||
if (options.until) {
|
||||
var until = options.until;
|
||||
if (until.constructor === Date) {
|
||||
until = until.toISOString();
|
||||
}
|
||||
params.push("until=" + encodeURIComponent(until));
|
||||
}
|
||||
if (options.page) {
|
||||
params.push("page=" + options.page);
|
||||
}
|
||||
if (options.perpage) {
|
||||
params.push("per_page=" + options.perpage);
|
||||
}
|
||||
if (params.length > 0) {
|
||||
url += "?" + params.join("&");
|
||||
}
|
||||
_request("GET", url, null, cb);
|
||||
};
|
||||
};
|
||||
|
||||
// Gists API
|
||||
// =======
|
||||
|
||||
Github.Gist = function(options) {
|
||||
var id = options.id;
|
||||
var gistPath = "/gists/"+id;
|
||||
|
||||
// Read the gist
|
||||
// --------
|
||||
|
||||
this.read = function(cb) {
|
||||
_request("GET", gistPath, null, function(err, gist) {
|
||||
cb(err, gist);
|
||||
});
|
||||
};
|
||||
|
||||
// Create the gist
|
||||
// --------
|
||||
// {
|
||||
// "description": "the description for this gist",
|
||||
// "public": true,
|
||||
// "files": {
|
||||
// "file1.txt": {
|
||||
// "content": "String file contents"
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
this.create = function(options, cb){
|
||||
_request("POST","/gists", options, cb);
|
||||
};
|
||||
|
||||
// Delete the gist
|
||||
// --------
|
||||
|
||||
this.delete = function(cb) {
|
||||
_request("DELETE", gistPath, null, function(err,res) {
|
||||
cb(err,res);
|
||||
});
|
||||
};
|
||||
|
||||
// Fork a gist
|
||||
// --------
|
||||
|
||||
this.fork = function(cb) {
|
||||
_request("POST", gistPath+"/fork", null, function(err,res) {
|
||||
cb(err,res);
|
||||
});
|
||||
};
|
||||
|
||||
// Update a gist with the new stuff
|
||||
// --------
|
||||
|
||||
this.update = function(options, cb) {
|
||||
_request("PATCH", gistPath, options, function(err,res) {
|
||||
cb(err,res);
|
||||
});
|
||||
};
|
||||
|
||||
// Star a gist
|
||||
// --------
|
||||
|
||||
this.star = function(cb) {
|
||||
_request("PUT", gistPath+"/star", null, function(err,res) {
|
||||
cb(err,res);
|
||||
});
|
||||
};
|
||||
|
||||
// Untar a gist
|
||||
// --------
|
||||
|
||||
this.unstar = function(cb) {
|
||||
_request("DELETE", gistPath+"/star", null, function(err,res) {
|
||||
cb(err,res);
|
||||
});
|
||||
};
|
||||
|
||||
// Check if a gist is starred
|
||||
// --------
|
||||
|
||||
this.isStarred = function(cb) {
|
||||
_request("GET", gistPath+"/star", null, function(err,res) {
|
||||
cb(err,res);
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
// Issues API
|
||||
// ==========
|
||||
|
||||
Github.Issue = function(options) {
|
||||
var path = "/repos/" + options.user + "/" + options.repo + "/issues";
|
||||
|
||||
this.list = function(options, cb) {
|
||||
var query = [];
|
||||
for (var key in options) {
|
||||
if (options.hasOwnProperty(key)) {
|
||||
query.push(encodeURIComponent(key) + "=" + encodeURIComponent(options[key]));
|
||||
}
|
||||
}
|
||||
_requestAllPages(path + '?' + query.join("&"), cb);
|
||||
};
|
||||
};
|
||||
|
||||
// Top Level API
|
||||
// -------
|
||||
|
||||
this.getIssues = function(user, repo) {
|
||||
return new Github.Issue({user: user, repo: repo});
|
||||
};
|
||||
|
||||
this.getRepo = function(user, repo) {
|
||||
return new Github.Repository({user: user, name: repo});
|
||||
};
|
||||
|
||||
this.getUser = function() {
|
||||
return new Github.User();
|
||||
};
|
||||
|
||||
this.getGist = function(id) {
|
||||
return new Github.Gist({id: id});
|
||||
};
|
||||
};
|
||||
|
||||
/* istanbul ignore else */
|
||||
if (typeof exports !== 'undefined') {
|
||||
module.exports = Github;
|
||||
} else {
|
||||
window.Github = Github;
|
||||
}
|
||||
}).call(this);
|
152
_scripts/jquery.githubRepoWidget.js
Normal file
@ -0,0 +1,152 @@
|
||||
/**
|
||||
Copyright (c) 2012 Joel Sutherland
|
||||
Copyright (c) 2013 Daniel Wirtz <dcode@dcode.io>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
(function(global, $) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* @exports gitHubRepoWidget
|
||||
* @namespace
|
||||
*/
|
||||
var githubRepoWidget = {
|
||||
|
||||
/**
|
||||
* @expose
|
||||
*/
|
||||
init: function() {
|
||||
var i = 0;
|
||||
var box_title_png = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAXCAMAAAAx3e/WAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEQjIyNkJERkM0NjYxMUUxOEFDQzk3ODcxRDkzRjhCRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEQjIyNkJFMEM0NjYxMUUxOEFDQzk3ODcxRDkzRjhCRSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkRCMjI2QkREQzQ2NjExRTE4QUNDOTc4NzFEOTNGOEJFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkRCMjI2QkRFQzQ2NjExRTE4QUNDOTc4NzFEOTNGOEJFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+dka2KgAAAEVQTFRFxMTEyMjI0tLSvb29vr6+zc3Ny8vLxcXFz8/P6enp3t7ex8fH0dHR1NTUw8PDwMDAzs7OvLy8wcHBu7u7v7+/zMzM////budQFwAAABd0Uk5T/////////////////////////////wDmQOZeAAAAcklEQVR42tSQSQ7DMAwD6chOukWs5eX/Ty2coo0T9wOdEzEgdRBuzNmnDofgja52JDyz5TCqUp0O6kfrb4bzSXkRiTviEZZ6JKLMJ5VQ2v8iGbtbfEwXmjFMG0VwdQo10hQNxYqtLMv9O6xvpZ/QeAkwAKjwHiJLaJc3AAAAAElFTkSuQmCC';
|
||||
var stats_png = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAqCAMAAACEJ4viAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEQjIyNkJEQkM0NjYxMUUxOEFDQzk3ODcxRDkzRjhCRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEQjIyNkJEQ0M0NjYxMUUxOEFDQzk3ODcxRDkzRjhCRSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkRCMjI2QkQ5QzQ2NjExRTE4QUNDOTc4NzFEOTNGOEJFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkRCMjI2QkRBQzQ2NjExRTE4QUNDOTc4NzFEOTNGOEJFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+h1kA9gAAAK5QTFRF+fn5sbGx8fHx09PTmpqa2dnZ/f3919fX9PT00NDQ1dXVpKSk+vr6+/v7vb298vLyycnJ8/PztLS0zc3N6enp/v7+q6ur2NjY9/f3srKy/Pz8p6en7u7uoaGhnJyc4eHhtbW1pqam6Ojo9fX17e3toqKirKys1NTUzs7Ox8fHwcHBwMDA5eXlnZ2dpaWl0dHR9vb25ubm4uLi3d3dqqqqwsLCv7+/oKCgmZmZ////8yEsbwAAAMBJREFUeNrE0tcOgjAUBuDSliUoMhTEvfdef9//xUQjgaLX0Ium/ZLT/+SkRPxZpGykvuf5VMJogy5jY9yjDHcWFhqlcRuHc4o6B1QK0BDg+hcZgNDh3NWTwzItH/bRrhvT+g3zSxZkNGCZpoWGIbU0a3Y6zV5VA6keyeDxiw62P0gUqEW0FbDim4nVikFJbU2zZXybUEaxhCqOQqyh5/G0wpWICUwthyqwD4InOMuXJ7/gs7WkoPdVg1vykF8CDACEFanKO3aSYwAAAABJRU5ErkJggg==';
|
||||
|
||||
$('.github-widget').each(function(){
|
||||
|
||||
if(i == 0) $('head').append(
|
||||
'<style type="text/css">'
|
||||
+'.github-box{font-family:helvetica,arial,sans-serif;font-size:13px;line-height:18px;background:#fafafa;border:1px solid #ddd;color:#666;border-radius:3px}'
|
||||
+'.github-box a{color:#4183c4;border:0;text-decoration:none}'
|
||||
+'.github-box .github-box-title{position:relative;border-bottom:1px solid #ddd;border-radius:3px 3px 0 0;background:#fcfcfc;background:-moz-linear-gradient(#fcfcfc,#ebebeb);background:-webkit-linear-gradient(#fcfcfc,#ebebeb);}'
|
||||
+'.github-box .github-box-title h3 {font-family:helvetica,arial,sans-serif;font-weight:normal;font-size:16px;color:gray;margin:0;padding:0 0 0 30px;background:url('+box_title_png+') 7px center no-repeat}'
|
||||
+'.github-box .github-box-title h3 .repo{font-weight:bold}'
|
||||
+'.github-box .github-box-title .github-stats{position:absolute;top:8px;right:10px;background:white;border:1px solid #ddd;border-radius:3px;font-size:11px;font-weight:bold;line-height:21px;height:21px}'
|
||||
+'.github-box .github-box-title .github-stats a{display:inline-block;height:21px;color:#666;padding:0 5px 0 18px;background: url('+stats_png+') no-repeat}'
|
||||
+'.github-box .github-box-title .github-stats .watchers{border-right:1px solid #ddd}'
|
||||
+'.github-box .github-box-title .github-stats .forks{background-position:-4px -21px;padding-left:15px}'
|
||||
+'.github-box .github-box-content{padding:10px;font-weight:300}'
|
||||
+'.github-box .github-box-content p{margin:0}'
|
||||
+'.github-box .github-box-content .link{font-weight:bold}'
|
||||
+'.github-box .github-box-download{position:relative;border-top:1px solid #ddd;background:white;border-radius:0 0 3px 3px;padding:10px;height:20px}'
|
||||
+'.github-box .github-box-download .updated{margin:0;font-size:11px;color:#666;line-height:20px;font-weight:300}'
|
||||
+'.github-box .github-box-download .updated strong{font-weight:bold;color:#000}'
|
||||
+'.github-box .github-box-download .download{position:absolute;display:block;top:10px;right:10px;height:20px;line-height:20px;font-size:12px;color:#666;font-weight:bold;text-shadow:0 1px 0 rgba(255,255,255,0.9);padding:0 10px;border:1px solid #ddd;border-bottom-color:#bbb;border-radius:3px;background:#f5f5f5;background:-moz-linear-gradient(#f5f5f5,#e5e5e5);background:-webkit-linear-gradient(#f5f5f5,#e5e5e5);}'
|
||||
+'.github-box .github-box-download .download:hover{color:#527894;border-color:#cfe3ed;border-bottom-color:#9fc7db;background:#f1f7fa;background:-moz-linear-gradient(#f1f7fa,#dbeaf1);background:-webkit-linear-gradient(#f1f7fa,#dbeaf1);}'
|
||||
+'.github-box .github-box-download .travis { position:absolute;top:11px;right:10px;}'
|
||||
+'</style>'
|
||||
);
|
||||
i++;
|
||||
|
||||
var $container = $(this), $widget,
|
||||
repo = $container.data('repo'),
|
||||
travis = $container.data('travis'),
|
||||
buildkite = $container.data('buildkite'),
|
||||
vendorName = repo.split('/')[0],
|
||||
repoName = repo.split('/')[1],
|
||||
vendorUrl = "http://github.com/" + vendorName,
|
||||
repoUrl = "http://github.com/" + vendorName + '/' + repoName,
|
||||
travisImgUrl = "https://travis-ci.org/"+vendorName+"/"+repoName+".png?branch=master",
|
||||
travisUrl = "https://travis-ci.org/"+vendorName+"/"+repoName+"/builds",
|
||||
buildkiteImgUrl = "https://badge.buildkite.com/" + buildkite + ".svg",
|
||||
buildkiteUrl = "https://buildkite.com/" + vendorName + '/' + repoName;
|
||||
|
||||
$widget = $(
|
||||
'<div class="github-box repo">'
|
||||
+'<div class="github-box-title">'
|
||||
+'<h3>'
|
||||
+'<a class="owner" href="' + vendorUrl + '">' + vendorName + '</a>'
|
||||
+'/'
|
||||
+'<a class="repo" href="' + repoUrl + '">' + repoName + '</a>'
|
||||
+'</h3>'
|
||||
+'<div class="github-stats">'
|
||||
+'<a class="watchers" href="' + repoUrl + '/watchers">?</a>'
|
||||
+'<a class="forks" href="' + repoUrl + '/network/members">?</a>'
|
||||
+'</div>'
|
||||
+'</div>'
|
||||
+'<div class="github-box-content">'
|
||||
+'<p class="description"><span></span> — <a href="' + repoUrl + '#readme">Read More</a></p>'
|
||||
+'<p class="link"></p>'
|
||||
+'</div>'
|
||||
+'<div class="github-box-download">'
|
||||
+'<p class="updated" style="display:inline"></p>'
|
||||
+(travis
|
||||
? '<a href="'+travisUrl+'"><img class="travis" src="'+travisImgUrl+'" alt="Build status" /></a>'
|
||||
: ''
|
||||
)
|
||||
+(buildkite
|
||||
? '<a href="' + buildkiteUrl + '" style="position: absolute; right: 10px; display: inline;"><img src="' + buildkiteImgUrl + '" alt="Build Status" style="max-width:100%;"></a>'
|
||||
: ''
|
||||
)
|
||||
+'</div>'
|
||||
+'</div>'
|
||||
);
|
||||
|
||||
$widget.appendTo($container);
|
||||
|
||||
// Cache that to prevent running into a rate limit
|
||||
(function(url) {
|
||||
var callback = function(results) {
|
||||
var repo = results.data, date, pushed_at = 'unknown';
|
||||
if (repo.message && (/Rate Limit/i).test(repo.message)) {
|
||||
return; // This may happen if there are lots of widgets and caching does not trigger enough
|
||||
}
|
||||
if (repo.pushed_at) {
|
||||
date = new Date(repo.pushed_at);
|
||||
pushed_at = date.toDateString();
|
||||
}
|
||||
$widget.find('.watchers').text(repo.watchers);
|
||||
$widget.find('.forks').text(repo.forks);
|
||||
$widget.find('.description span').text(repo.description);
|
||||
$widget.find('.link').append($('<a />').attr('href', repo.homepage).text(repo.homepage));
|
||||
$widget.find('.updated').html('Latest commit to the <strong>master</strong> branch on ' + pushed_at + '.');
|
||||
if (typeof sessionStorage != 'undefined') {
|
||||
sessionStorage.setItem(url, JSON.stringify(repo));
|
||||
}
|
||||
};
|
||||
if (typeof sessionStorage != 'undefined' && sessionStorage.getItem(url)) {
|
||||
callback({data: JSON.parse(sessionStorage.getItem(url))});
|
||||
} else {
|
||||
$.ajax({
|
||||
url: url,
|
||||
dataType: 'jsonp',
|
||||
success: callback
|
||||
});
|
||||
}
|
||||
})('https://api.github.com/repos/'+repo);
|
||||
|
||||
$(this).removeClass("github-widget"); // only once
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
global["githubRepoWidget"] = githubRepoWidget;
|
||||
$(document).ready(githubRepoWidget.init);
|
||||
|
||||
})(this, $);
|
6
_scripts/underscore-min.js
vendored
Normal file
281
_styles/app-theme.html
Normal file
@ -0,0 +1,281 @@
|
||||
<!--
|
||||
@license
|
||||
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
|
||||
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
||||
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
||||
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
||||
Code distributed by Google as part of the polymer project is also
|
||||
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||
-->
|
||||
|
||||
<style is="custom-style">
|
||||
|
||||
/*
|
||||
Polymer includes a shim for CSS Custom Properties that we can use for application theming.
|
||||
Below, you'll find the default palette for the Polymer Starter Kit layout. Feel free to play
|
||||
with changing the colors used or generate your own palette of colours at MaterialPalette.com.
|
||||
|
||||
See https://www.polymer-project.org/1.0/docs/devguide/styling.html#xscope-styling-details
|
||||
for further information on custom CSS properties.
|
||||
*/
|
||||
|
||||
/* Application theme */
|
||||
|
||||
/* http://www.materialpalette.com/light-green/grey */
|
||||
:root {
|
||||
--dark-primary-color: #689F38;
|
||||
--default-primary-color: #8BC34A;
|
||||
--light-primary-color: #DCEDC8;
|
||||
--text-primary-color: #212121;
|
||||
--accent-color: #7C4DFF;
|
||||
--primary-background-color: #DCEDC8;
|
||||
--primary-text-color: #212121;
|
||||
--secondary-text-color: #727272;
|
||||
--disabled-text-color: #BDBDBD;
|
||||
--divider-color: #B6B6B6;
|
||||
|
||||
|
||||
/* Components */
|
||||
|
||||
/* paper-drawer-panel */
|
||||
--drawer-menu-color: #ffffff;
|
||||
--drawer-border-color: 1px solid #ccc;
|
||||
--drawer-toolbar-border-color: 1px solid rgba(0, 0, 0, 0.22);
|
||||
|
||||
/* paper-menu */
|
||||
--paper-menu-background-color: #fff;
|
||||
--menu-link-color: #111111;
|
||||
|
||||
/* paper-input */
|
||||
--paper-input-container-color: rgba(255, 255, 255, 0.64);
|
||||
--paper-input-container-focus-color: rgba(255, 255, 255, 1);
|
||||
--paper-input-container-input-color: #fff;
|
||||
|
||||
/* custom */
|
||||
--menu-active-background-color: #eee;
|
||||
--toolbar-color: #fff;
|
||||
}
|
||||
|
||||
/* General styles */
|
||||
|
||||
body, html {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
paper-header-panel {
|
||||
height: 100%;
|
||||
}
|
||||
#drawer.paper-drawer-panel > [drawer] {
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
paper-ripple {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
#drawerToolbar {
|
||||
color: var(--secondary-text-color);
|
||||
background-color: var(--drawer-menu-color);
|
||||
border-bottom: var(--drawer-toolbar-border-color);
|
||||
height: 64px;
|
||||
}
|
||||
#drawerToolbar img {
|
||||
height: 50%;
|
||||
margin-right: 12px;
|
||||
margin-left: -5px;
|
||||
}
|
||||
|
||||
paper-material {
|
||||
border-radius: 2px;
|
||||
height: 100%;
|
||||
padding: 16px 0 16px 0;
|
||||
width: calc(98.66% - 16px);
|
||||
margin: 16px auto;
|
||||
background: white;
|
||||
}
|
||||
|
||||
#topBar div {
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
paper-toolbar {
|
||||
color: var(--toolbar-color);
|
||||
}
|
||||
|
||||
paper-icon-button {
|
||||
border-style: none;
|
||||
outline-style: none;
|
||||
display: inline-block;
|
||||
-webkit-appearance: textarea;
|
||||
-webkit-tap-highlight-color: rgba(0,0,0,0);
|
||||
}
|
||||
paper-icon-button[icon=menu] {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
paper-menu iron-icon {
|
||||
margin-right: 16px;
|
||||
opacity: 0.54;
|
||||
}
|
||||
|
||||
.paper-menu > .iron-selected {
|
||||
color: var(--default-primary-color);
|
||||
background-color: var(--menu-active-background-color);
|
||||
}
|
||||
|
||||
.menu-subheader {
|
||||
color: rgba(0, 0, 0, 0.54);
|
||||
padding-left: 16px;
|
||||
height: 34px;
|
||||
line-height: 42px;
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.12);
|
||||
margin-top: 8px;
|
||||
font-weight: 500;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
paper-menu a {
|
||||
text-decoration: none;
|
||||
color: var(--menu-link-color);
|
||||
display: -ms-flexbox;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
-ms-flex-direction: row;
|
||||
-webkit-flex-direction: row;
|
||||
flex-direction: row;
|
||||
-ms-flex-align: center;
|
||||
-webkit-align-items: center;
|
||||
align-items: center;
|
||||
font-family: 'Roboto', 'Noto', sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
text-rendering: optimizeLegibility;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
line-height: 24px;
|
||||
min-height: 48px;
|
||||
padding: 0 16px;
|
||||
position: relative;
|
||||
}
|
||||
paper-menu a:hover {
|
||||
color: var(--menu-link-color);
|
||||
background-color: var(--menu-hover-background-color);
|
||||
}
|
||||
paper-menu a:visited {
|
||||
color: var(--menu-link-color);
|
||||
}
|
||||
|
||||
#mainToolbar .middle {
|
||||
margin-left: 48px;
|
||||
}
|
||||
|
||||
#mainToolbar.has-shadow .middle {
|
||||
font-size: 20px;
|
||||
padding-bottom: 0;
|
||||
margin-left: 48px;
|
||||
}
|
||||
|
||||
#topBar {
|
||||
color: var(--drawer-menu-color);
|
||||
}
|
||||
|
||||
/* Height of the scroll area */
|
||||
.content {
|
||||
height: 900px;
|
||||
}
|
||||
|
||||
/* Breakpoints */
|
||||
|
||||
/* Small */
|
||||
@media (max-width: 600px) {
|
||||
|
||||
paper-material {
|
||||
--menu-container-display: none;
|
||||
width: calc(97.33% - 32px);
|
||||
padding-left: 16px;
|
||||
padding-right: 16px;
|
||||
}
|
||||
|
||||
.paper-font-display1 {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.app-name {
|
||||
font-size: 26px;
|
||||
}
|
||||
|
||||
#drawer .paper-toolbar {
|
||||
margin-left: 16px;
|
||||
}
|
||||
|
||||
#overlay {
|
||||
min-width: 360px;
|
||||
}
|
||||
|
||||
.bg {
|
||||
background: white;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Tablet+ */
|
||||
@media (min-width: 601px) {
|
||||
|
||||
paper-material {
|
||||
width: calc(98% - 46px);
|
||||
margin-bottom: 32px;
|
||||
padding-left: 30px;
|
||||
padding-right: 30px;
|
||||
}
|
||||
|
||||
#drawer.paper-drawer-panel > [drawer] {
|
||||
border-right: 1px solid rgba(0, 0, 0, 0.14);
|
||||
}
|
||||
|
||||
iron-pages {
|
||||
padding: 48px 62px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Material Design Adaptive Breakpoints */
|
||||
/*
|
||||
Below you'll find CSS media queries based on the breakpoint guidance
|
||||
published by the Material Design team. You can choose to use, customise
|
||||
or remove these breakpoints based on your needs.
|
||||
|
||||
http://www.google.com/design/spec/layout/adaptive-ui.html#adaptive-ui-breakpoints
|
||||
*/
|
||||
|
||||
/* mobile-small */
|
||||
@media all and (min-width: 0) and (max-width: 360px) and (orientation: portrait) { }
|
||||
/* mobile-large */
|
||||
@media all and (min-width: 361px) and (orientation: portrait) { }
|
||||
/* mobile-small-landscape */
|
||||
@media all and (min-width: 0) and (max-width: 480px) and (orientation: landscape) { }
|
||||
/* mobile-large-landscape */
|
||||
@media all and (min-width: 481px) and (orientation: landscape) { }
|
||||
/* tablet-small-landscape */
|
||||
@media all and (min-width: 600px) and (max-width: 960px) and (orientation: landscape) { }
|
||||
/* tablet-large-landscape */
|
||||
@media all and (min-width: 961px) and (orientation: landscape) { }
|
||||
/* tablet-small */
|
||||
@media all and (min-width: 600px) and (orientation: portrait) { }
|
||||
/* tablet-large */
|
||||
@media all and (min-width: 601px) and (max-width: 840px) and (orientation : portrait) { }
|
||||
/* desktop-x-small-landscape */
|
||||
@media all and (min-width: 0) and (max-width: 480px) and (orientation: landscape) { }
|
||||
/* desktop-x-small */
|
||||
@media all and (min-width: 0) and (max-width: 480px) and (max-aspect-ratio: 4/3) { }
|
||||
/* desktop-small-landscape */
|
||||
@media all and (min-width: 481px) and (max-width: 840px) and (orientation: landscape) { }
|
||||
/* desktop-small */
|
||||
@media all and (min-width: 481px) and (max-width: 840px) and (max-aspect-ratio: 4/3) { }
|
||||
/* desktop-medium-landscape */
|
||||
@media all and (min-width: 841px) and (max-width: 1280px) and (orientation: landscape) { }
|
||||
/* desktop-medium */
|
||||
@media all and (min-width: 841px) and (max-width: 1280px) and (max-aspect-ratio: 4/3) { }
|
||||
/* desktop-large */
|
||||
@media all and (min-width: 1281px) and (max-width: 1600px) { }
|
||||
/* desktop-xlarge */
|
||||
@media all and (min-width: 1601px) and (max-width: 1920px) { }
|
||||
</style>
|
8
about.md
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
layout: page
|
||||
title: About
|
||||
icon: info
|
||||
permalink: /about/
|
||||
---
|
||||
|
||||
TODO: content.
|
13
bower.json
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "xenia",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"iron-elements": "PolymerElements/iron-elements#1.0.0",
|
||||
"paper-elements": "PolymerElements/paper-elements#1.0.1",
|
||||
"platinum-elements": "PolymerElements/platinum-elements#1.0.1",
|
||||
"neon-elements": "PolymerElements/neon-elements#1.0.0",
|
||||
"page": "visionmedia/page.js#~1.6.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
}
|
||||
}
|
57
compatibility.html
Normal file
@ -0,0 +1,57 @@
|
||||
---
|
||||
layout: page
|
||||
title: Compatibility
|
||||
icon: editor:insert-chart
|
||||
permalink: /compatibility/
|
||||
---
|
||||
|
||||
<a href="https://github.com/xenia-project/game-compatibility/issues">Compatibility Tracker</a>
|
||||
<br/>
|
||||
If filing new issues, please follow the style of the existing ones.
|
||||
<br/>
|
||||
<br/>
|
||||
TODO: a fancy sortable/searchable table.
|
||||
<br/>
|
||||
<br/>
|
||||
<div id="issuesList">
|
||||
</div>
|
||||
|
||||
<script>
|
||||
var issueDataString = localStorage.getItem('game-compatibility-issues');
|
||||
if (!issueDataString) {
|
||||
// No cached data, fetch new.
|
||||
fetchIssueData(renderIssues);
|
||||
} else {
|
||||
var issueData = JSON.parse(issueDataString);
|
||||
if (Date.now() - issueData.__cache_time__ > 5 * 60 * 1000) {
|
||||
// Expired - refetch.
|
||||
fetchIssueData(renderIssues);
|
||||
} else {
|
||||
// Cache is valid, draw.
|
||||
renderIssues(issueData);
|
||||
}
|
||||
}
|
||||
|
||||
function fetchIssueData(callback) {
|
||||
var gh = new Github({});
|
||||
var issueAdapter = gh.getIssues('xenia-project', 'game-compatibility');
|
||||
issueAdapter.list({}, function(err, issueData) {
|
||||
// Store with timestamp for expiration.
|
||||
issueData.__cache_time__ = Date.now();
|
||||
localStorage.setItem('game-compatibility-issues',
|
||||
JSON.stringify(issueData));
|
||||
renderIssues(issueData);
|
||||
});
|
||||
}
|
||||
|
||||
function renderIssues(issueData) {
|
||||
var issuesList = document.getElementById('issuesList');
|
||||
for (var i = 0; i < issueData.length; ++i) {
|
||||
var issue = issueData[i];
|
||||
var el = document.createElement('div');
|
||||
el.innerText = issue.title;
|
||||
issuesList.appendChild(el);
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
8
development/debugging.md
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
layout: page
|
||||
title: Debugging
|
||||
icon: av:play-arrow
|
||||
permalink: /development/debugging/
|
||||
---
|
||||
|
||||
TODO: content.
|
22
development/irc.md
Normal file
@ -0,0 +1,22 @@
|
||||
---
|
||||
layout: page
|
||||
title: "#xenia @ freenode"
|
||||
icon: social:people
|
||||
permalink: /development/irc/
|
||||
---
|
||||
|
||||
<strong class="blink">WARNING:</strong>
|
||||
Anyone asking about or sharing information related to illegal activities
|
||||
will be banned from IRC/GitHub/etc.
|
||||
|
||||
**The IRC channel is used exclusively for development related topics.**
|
||||
Before joining to ask a question, make sure it's not already answered in the
|
||||
[FAQ]({{ site.baseurl }}/faq/).
|
||||
|
||||
If you have *development related questions* or what to watch the progress of
|
||||
the emulator, join up to `#xenia` on freenode.
|
||||
|
||||
You can use the web chat, however note that most of us have day jobs and will
|
||||
not be able to answer right away. Hang out and we'll be around eventually.
|
||||
|
||||
[#xenia on freenode web chat](http://webchat.freenode.net/?channels=%23xenia&uio=MTE9NzIaa)
|
8
development/quickstart.md
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
layout: page
|
||||
title: Quickstart
|
||||
icon: build
|
||||
permalink: /development/quickstart/
|
||||
---
|
||||
|
||||
TODO: content.
|
104
faq.md
Normal file
@ -0,0 +1,104 @@
|
||||
---
|
||||
layout: page
|
||||
title: FAQ
|
||||
icon: assignment
|
||||
permalink: /faq/
|
||||
---
|
||||
|
||||
* foo
|
||||
{:toc}
|
||||
|
||||
## Can I get an exe?
|
||||
|
||||
**NO**, not yet. Xenia is in its extremely early phases and not ready for use by
|
||||
non-developers.
|
||||
|
||||
Don't be an idiot and download a binary claiming to be of this project. In fact,
|
||||
don't be an idiot and download *any* binary claiming to be an Xbox 360 or PS3
|
||||
emulator from *any* source, especially not YouTube videos and shady websites.
|
||||
Come on people. Jeez.
|
||||
|
||||
## I have a copy of the XDK. Do you want it?
|
||||
|
||||
No. Do not post links or downloads to such resources or you will be banned.
|
||||
|
||||
## System Requirements
|
||||
|
||||
* Windows 8.1 or Windows 10
|
||||
* Intel Sandy Bridge or Haswell processor (supporting AVX or AVX2)
|
||||
* An OpenGL 4.5-compatible GPU (NVIDIA preferred)
|
||||
* An XInput-compatible controller
|
||||
|
||||
### Can you add support for Windows Me? How about my Pentium II?
|
||||
|
||||
Support for older operating systems and processors will not be added unless a
|
||||
contributor steps up to build and maintain them. All active contributors are on
|
||||
modern systems and busy with higher priority tasks. Whether the emulator runs on
|
||||
Windows Vista or not doesn't matter if it can't run games.
|
||||
|
||||
### Does Xenia run on Linux or OSX?
|
||||
|
||||
The project is designed to support non-Windows platforms but until it's running
|
||||
games it's not worth the maintenance burden. OSX will likely remain unsupported
|
||||
until Apple supports Vulkan.
|
||||
|
||||
### What kind of GPU do I need?
|
||||
|
||||
OpenGL 4.5 support and drivers are required. This includes NVIDIA's GeForce 400
|
||||
series and above, and AMD's 5000 series and above. AMD cards/drivers often have
|
||||
issues and you'll have better luck with NVIDIA.
|
||||
|
||||
To get full speed and compatibility the project will be adopting Vulkan and
|
||||
Direct3D 12 so plan accordingly.
|
||||
|
||||
## Why did you do X? Why not just use Y? You should use Y. NIH NIH NIH!
|
||||
|
||||
Trust that I either have a good reason for what I did or have absolutely no
|
||||
reason for what I did. This is a large project that I've been working on
|
||||
for almost 5 years and in that time new compilers and language specs have
|
||||
been released, libraries have been created and died, and I've learned a lot.
|
||||
Constructive contributions and improvements are welcome.
|
||||
|
||||
### Have you heard of LLVM/asmjit/jitasm/luajit/etc?
|
||||
|
||||
Yes, I have heard of them. In fact, I spent a long time trying them out:
|
||||
[LLVM](https://github.com/benvanik/xenia/tree/85bdbd24d1b5923cfb104f45194a96e7ac57026e/src/xenia/cpu/codegen),
|
||||
[libjit](https://github.com/benvanik/xenia/tree/eee856be0499a4bc721b6097f5f2b9446929f2cc/src/xenia/cpu/libjit),
|
||||
[asmjit](https://github.com/benvanik/xenia/tree/ca208fa60a0285d396409743064784cc2320c094/src/xenia/cpu/x64).
|
||||
I did not find them acceptable for use in this project for various reasons. If
|
||||
for some reason you feel strongly otherwise, feel free to either contribute a
|
||||
[new CPU backend](https://github.com/benvanik/xenia/tree/master/src/xenia/cpu/backend).
|
||||
|
||||
### (some argument over an unimportant technical choice)
|
||||
|
||||
In general: *I don't care*.
|
||||
That means I either really don't care and something is they way it is because
|
||||
that was convienient or that I don't care because it's not material to the goal
|
||||
of the project. There are a million important things that need to be done to get
|
||||
games running and going back and forth about unimportant orthogonal issues does
|
||||
not help. If you really do have a better way of doing something and can show it,
|
||||
contributions are welcome.
|
||||
|
||||
Here's a short list of common ones:
|
||||
|
||||
* 'Why Python 2.7? 3 is awesome!' -- agreed, but git-clang-format needs 2.7.
|
||||
* 'Why this xb stuff?' -- I like it, it helps me. If you want to
|
||||
manually execute commands have fun, nothing is stopping you.
|
||||
* 'Why not just take the code from project X?' -- the point of this project
|
||||
is to build something different than previous emulator projects and learn while
|
||||
doing it. The easy way is almost never the best way and most certainly isn't as
|
||||
fun.
|
||||
|
||||
## Hey I'm going to go modify every file in the project, ok?
|
||||
|
||||
We welcome contributions, but please try to understand that we cannot accept
|
||||
changes that radically alter the structure or content of the code, especially
|
||||
if they are aesthetic and even more so if they are from someone who has not
|
||||
contributed before. If a pull request of this nature is denied that doesn't
|
||||
necessarily mean your help is not wanted, just that it may need to be more
|
||||
carefully applied.
|
||||
|
||||
Contributions adding large untested pieces of functionality may take some time
|
||||
to land, so engage early in [IRC]({{ site.baseurl }}/development/irc/) to ensure
|
||||
someone else is not already working on it or that things can be done to ensure
|
||||
smooth sailing.
|
BIN
favicon.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
30
feed.xml
Normal file
@ -0,0 +1,30 @@
|
||||
---
|
||||
layout: null
|
||||
---
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>{{ site.title | xml_escape }}</title>
|
||||
<description>{{ site.description | xml_escape }}</description>
|
||||
<link>{{ site.url }}{{ site.baseurl }}/</link>
|
||||
<atom:link href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" rel="self" type="application/rss+xml" />
|
||||
<pubDate>{{ site.time | date_to_rfc822 }}</pubDate>
|
||||
<lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate>
|
||||
<generator>Jekyll v{{ jekyll.version }}</generator>
|
||||
{% for post in site.posts limit:10 %}
|
||||
<item>
|
||||
<title>{{ post.title | xml_escape }}</title>
|
||||
<description>{{ post.content | xml_escape }}</description>
|
||||
<pubDate>{{ post.date | date_to_rfc822 }}</pubDate>
|
||||
<link>{{ post.url | prepend: site.baseurl | prepend: site.url }}</link>
|
||||
<guid isPermaLink="true">{{ post.url | prepend: site.baseurl | prepend: site.url }}</guid>
|
||||
{% for tag in post.tags %}
|
||||
<category>{{ tag | xml_escape }}</category>
|
||||
{% endfor %}
|
||||
{% for cat in post.categories %}
|
||||
<category>{{ cat | xml_escape }}</category>
|
||||
{% endfor %}
|
||||
</item>
|
||||
{% endfor %}
|
||||
</channel>
|
||||
</rss>
|
15
gallery.html
Normal file
@ -0,0 +1,15 @@
|
||||
---
|
||||
layout: page
|
||||
title: Gallery
|
||||
icon: perm-media
|
||||
permalink: /gallery/
|
||||
---
|
||||
|
||||
TODO: content.
|
||||
|
||||
<p>
|
||||
<iframe width="1280" height="720" src="https://www.youtube.com/embed/vE32Z9ytbgU?rel=0" frameborder="0" allowfullscreen></iframe>
|
||||
</p>
|
||||
<p>
|
||||
<iframe width="640" height="360" src="https://www.youtube.com/embed/oAk0_jidpA0?rel=0" frameborder="0" allowfullscreen></iframe>
|
||||
</p>
|
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 33 KiB |
BIN
images/icons/android-icon-144x144.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
images/icons/android-icon-192x192.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
images/icons/android-icon-36x36.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
images/icons/android-icon-48x48.png
Normal file
After Width: | Height: | Size: 5.9 KiB |
BIN
images/icons/android-icon-72x72.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
images/icons/android-icon-96x96.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
images/icons/apple-icon-114x114.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
images/icons/apple-icon-120x120.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
images/icons/apple-icon-144x144.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
images/icons/apple-icon-152x152.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
images/icons/apple-icon-180x180.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
images/icons/apple-icon-57x57.png
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
images/icons/apple-icon-60x60.png
Normal file
After Width: | Height: | Size: 8.0 KiB |
BIN
images/icons/apple-icon-72x72.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
images/icons/apple-icon-76x76.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
images/icons/apple-icon-precomposed.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
images/icons/apple-icon.png
Normal file
After Width: | Height: | Size: 22 KiB |
2
images/icons/browserconfig.xml
Normal file
@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<browserconfig><msapplication><tile><square70x70logo src="/ms-icon-70x70.png"/><square150x150logo src="/ms-icon-150x150.png"/><square310x310logo src="/ms-icon-310x310.png"/><TileColor>#ffffff</TileColor></tile></msapplication></browserconfig>
|
BIN
images/icons/favicon-16x16.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
images/icons/favicon-32x32.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
images/icons/favicon-96x96.png
Normal file
After Width: | Height: | Size: 14 KiB |
41
images/icons/manifest.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"name": "xenia",
|
||||
"icons": [
|
||||
{
|
||||
"src": "\/android-icon-36x36.png",
|
||||
"sizes": "36x36",
|
||||
"type": "image\/png",
|
||||
"density": "0.75"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-48x48.png",
|
||||
"sizes": "48x48",
|
||||
"type": "image\/png",
|
||||
"density": "1.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-72x72.png",
|
||||
"sizes": "72x72",
|
||||
"type": "image\/png",
|
||||
"density": "1.5"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-96x96.png",
|
||||
"sizes": "96x96",
|
||||
"type": "image\/png",
|
||||
"density": "2.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-144x144.png",
|
||||
"sizes": "144x144",
|
||||
"type": "image\/png",
|
||||
"density": "3.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image\/png",
|
||||
"density": "4.0"
|
||||
}
|
||||
]
|
||||
}
|
BIN
images/icons/ms-icon-144x144.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
images/icons/ms-icon-150x150.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
images/icons/ms-icon-310x310.png
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
images/icons/ms-icon-70x70.png
Normal file
After Width: | Height: | Size: 9.7 KiB |
BIN
images/logo-256x256.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 3.1 KiB |
100
index.html
13890
polymer-vulcanized.html
Normal file
27
polymer.html
Normal file
@ -0,0 +1,27 @@
|
||||
<script src="_scripts/underscore-min.js"></script>
|
||||
<script src="_scripts/github.js"></script>
|
||||
<script src="_scripts/jquery.githubRepoWidget.js"></script>
|
||||
|
||||
<!-- Iron elements -->
|
||||
<link rel="import" href="bower_components/iron-flex-layout/classes/iron-flex-layout.html">
|
||||
<link rel="import" href="bower_components/iron-icons/iron-icons.html">
|
||||
<link rel="import" href="bower_components/iron-icons/av-icons.html">
|
||||
<link rel="import" href="bower_components/iron-icons/communication-icons.html">
|
||||
<link rel="import" href="bower_components/iron-icons/editor-icons.html">
|
||||
<link rel="import" href="bower_components/iron-icons/social-icons.html">
|
||||
<link rel="import" href="bower_components/iron-pages/iron-pages.html">
|
||||
<link rel="import" href="bower_components/iron-selector/iron-selector.html">
|
||||
|
||||
<!-- Paper elements -->
|
||||
<link rel="import" href="bower_components/paper-drawer-panel/paper-drawer-panel.html">
|
||||
<link rel="import" href="bower_components/paper-header-panel/paper-header-panel.html">
|
||||
<link rel="import" href="bower_components/paper-icon-button/paper-icon-button.html">
|
||||
<link rel="import" href="bower_components/paper-item/paper-item.html">
|
||||
<link rel="import" href="bower_components/paper-ripple/paper-ripple.html">
|
||||
<link rel="import" href="bower_components/paper-material/paper-material.html">
|
||||
<link rel="import" href="bower_components/paper-menu/paper-menu.html">
|
||||
<link rel="import" href="bower_components/paper-styles/paper-styles-classes.html">
|
||||
<link rel="import" href="bower_components/paper-toast/paper-toast.html">
|
||||
<link rel="import" href="bower_components/paper-toolbar/paper-toolbar.html">
|
||||
|
||||
<link rel="import" href="_styles/app-theme.html">
|
8
roadmap.md
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
layout: page
|
||||
title: Roadmap
|
||||
icon: event
|
||||
permalink: /roadmap/
|
||||
---
|
||||
|
||||
TODO: content.
|
4
robots.txt
Normal file
@ -0,0 +1,4 @@
|
||||
# robotstxt.org
|
||||
|
||||
User-agent: *
|
||||
Disallow:
|
13
scripts/webcomponents-lite.min.js
vendored
Normal file
56
styles/main.scss
Normal file
@ -0,0 +1,56 @@
|
||||
---
|
||||
# Only the main Sass file needs front matter (the dashes are enough)
|
||||
---
|
||||
@charset "utf-8";
|
||||
|
||||
|
||||
|
||||
// Our variables
|
||||
$base-font-family: Helvetica, Arial, sans-serif;
|
||||
$base-font-size: 16px;
|
||||
$small-font-size: $base-font-size * 0.875;
|
||||
$base-line-height: 1.5;
|
||||
|
||||
$spacing-unit: 30px;
|
||||
|
||||
$text-color: #111;
|
||||
$background-color: #fdfdfd;
|
||||
$brand-color: #2a7ae2;
|
||||
|
||||
$grey-color: #828282;
|
||||
$grey-color-light: lighten($grey-color, 40%);
|
||||
$grey-color-dark: darken($grey-color, 25%);
|
||||
|
||||
$on-palm: 600px;
|
||||
$on-laptop: 800px;
|
||||
|
||||
|
||||
|
||||
// Using media queries with like this:
|
||||
// @include media-query($palm) {
|
||||
// .wrapper {
|
||||
// padding-right: $spacing-unit / 2;
|
||||
// padding-left: $spacing-unit / 2;
|
||||
// }
|
||||
// }
|
||||
@mixin media-query($device) {
|
||||
@media screen and (max-width: $device) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Import partials from `sass_dir` (defaults to `_sass`)
|
||||
@import
|
||||
"base",
|
||||
"layout",
|
||||
"syntax-highlighting"
|
||||
;
|
||||
|
||||
|
||||
body {
|
||||
background: #fafafa;
|
||||
font-family: 'Roboto', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
color: #333;
|
||||
}
|
@ -1,226 +0,0 @@
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center,
|
||||
dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td,
|
||||
article, aside, canvas, details, embed,
|
||||
figure, figcaption, footer, header, hgroup,
|
||||
menu, nav, output, ruby, section, summary,
|
||||
time, mark, audio, video {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-size: 100%;
|
||||
font: inherit;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
/* HTML5 display-role reset for older browsers */
|
||||
article, aside, details, figcaption, figure,
|
||||
footer, header, hgroup, menu, nav, section {
|
||||
display: block;
|
||||
}
|
||||
body {
|
||||
line-height: 1;
|
||||
}
|
||||
ol, ul {
|
||||
list-style: none;
|
||||
}
|
||||
blockquote, q {
|
||||
quotes: none;
|
||||
}
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {
|
||||
content: '';
|
||||
content: none;
|
||||
}
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
body {
|
||||
font-size: 13px;
|
||||
line-height: 1.5;
|
||||
font-family: 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #d5000d;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
header {
|
||||
padding-top: 35px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
font-weight: bold;
|
||||
letter-spacing: -1px;
|
||||
font-size: 48px;
|
||||
color: #303030;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
header h2 {
|
||||
letter-spacing: -1px;
|
||||
font-size: 24px;
|
||||
color: #aaa;
|
||||
font-weight: normal;
|
||||
line-height: 1.3;
|
||||
}
|
||||
#downloads {
|
||||
display: none;
|
||||
}
|
||||
#main_content {
|
||||
padding-top: 20px;
|
||||
}
|
||||
|
||||
code, pre {
|
||||
font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal;
|
||||
color: #222;
|
||||
margin-bottom: 30px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
code {
|
||||
padding: 0 3px;
|
||||
}
|
||||
|
||||
pre {
|
||||
border: solid 1px #ddd;
|
||||
padding: 20px;
|
||||
overflow: auto;
|
||||
}
|
||||
pre code {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ul, ol, dl {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
|
||||
/* COMMON STYLES */
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border: 1px solid #ebebeb;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
td {
|
||||
border: 1px solid #ebebeb;
|
||||
text-align: center;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
form {
|
||||
background: #f2f2f2;
|
||||
padding: 20px;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* GENERAL ELEMENT TYPE STYLES */
|
||||
|
||||
h1 {
|
||||
font-size: 2.8em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 22px;
|
||||
font-weight: bold;
|
||||
color: #303030;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #d5000d;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 16px;
|
||||
color: #303030;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1em;
|
||||
color: #303030;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: .8em;
|
||||
color: #303030;
|
||||
}
|
||||
|
||||
p {
|
||||
font-weight: 300;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
p a {
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
font-size: 1.6em;
|
||||
border-left: 10px solid #e9e9e9;
|
||||
margin-bottom: 20px;
|
||||
padding: 0 0 0 30px;
|
||||
}
|
||||
|
||||
ul li {
|
||||
list-style: disc inside;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
ol li {
|
||||
list-style: decimal inside;
|
||||
padding-left: 3px;
|
||||
}
|
||||
|
||||
dl dd {
|
||||
font-style: italic;
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
footer {
|
||||
margin-top: 40px;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 30px;
|
||||
font-size: 13px;
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: #666;
|
||||
}
|
||||
|
||||
/* MISC */
|
||||
.clearfix:after {
|
||||
clear: both;
|
||||
content: '.';
|
||||
display: block;
|
||||
visibility: hidden;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.clearfix {display: inline-block;}
|
||||
* html .clearfix {height: 1%;}
|
||||
.clearfix {display: block;}
|
@ -1,69 +0,0 @@
|
||||
.highlight { background: #ffffff; }
|
||||
.highlight .c { color: #999988; font-style: italic } /* Comment */
|
||||
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
|
||||
.highlight .k { font-weight: bold } /* Keyword */
|
||||
.highlight .o { font-weight: bold } /* Operator */
|
||||
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
||||
.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
|
||||
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
|
||||
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
|
||||
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
||||
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
|
||||
.highlight .ge { font-style: italic } /* Generic.Emph */
|
||||
.highlight .gr { color: #aa0000 } /* Generic.Error */
|
||||
.highlight .gh { color: #999999 } /* Generic.Heading */
|
||||
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
|
||||
.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
|
||||
.highlight .go { color: #888888 } /* Generic.Output */
|
||||
.highlight .gp { color: #555555 } /* Generic.Prompt */
|
||||
.highlight .gs { font-weight: bold } /* Generic.Strong */
|
||||
.highlight .gu { color: #800080; font-weight: bold; } /* Generic.Subheading */
|
||||
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
|
||||
.highlight .kc { font-weight: bold } /* Keyword.Constant */
|
||||
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
|
||||
.highlight .kn { font-weight: bold } /* Keyword.Namespace */
|
||||
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
|
||||
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
|
||||
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
||||
.highlight .m { color: #009999 } /* Literal.Number */
|
||||
.highlight .s { color: #d14 } /* Literal.String */
|
||||
.highlight .na { color: #008080 } /* Name.Attribute */
|
||||
.highlight .nb { color: #0086B3 } /* Name.Builtin */
|
||||
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
|
||||
.highlight .no { color: #008080 } /* Name.Constant */
|
||||
.highlight .ni { color: #800080 } /* Name.Entity */
|
||||
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
|
||||
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
|
||||
.highlight .nn { color: #555555 } /* Name.Namespace */
|
||||
.highlight .nt { color: #000080 } /* Name.Tag */
|
||||
.highlight .nv { color: #008080 } /* Name.Variable */
|
||||
.highlight .ow { font-weight: bold } /* Operator.Word */
|
||||
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
|
||||
.highlight .mf { color: #009999 } /* Literal.Number.Float */
|
||||
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
|
||||
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
|
||||
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
|
||||
.highlight .sb { color: #d14 } /* Literal.String.Backtick */
|
||||
.highlight .sc { color: #d14 } /* Literal.String.Char */
|
||||
.highlight .sd { color: #d14 } /* Literal.String.Doc */
|
||||
.highlight .s2 { color: #d14 } /* Literal.String.Double */
|
||||
.highlight .se { color: #d14 } /* Literal.String.Escape */
|
||||
.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
|
||||
.highlight .si { color: #d14 } /* Literal.String.Interpol */
|
||||
.highlight .sx { color: #d14 } /* Literal.String.Other */
|
||||
.highlight .sr { color: #009926 } /* Literal.String.Regex */
|
||||
.highlight .s1 { color: #d14 } /* Literal.String.Single */
|
||||
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
|
||||
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
|
||||
.highlight .vc { color: #008080 } /* Name.Variable.Class */
|
||||
.highlight .vg { color: #008080 } /* Name.Variable.Global */
|
||||
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
|
||||
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
|
||||
|
||||
.type-csharp .highlight .k { color: #0000FF }
|
||||
.type-csharp .highlight .kt { color: #0000FF }
|
||||
.type-csharp .highlight .nf { color: #000000; font-weight: normal }
|
||||
.type-csharp .highlight .nc { color: #2B91AF }
|
||||
.type-csharp .highlight .nn { color: #000000 }
|
||||
.type-csharp .highlight .s { color: #A31515 }
|
||||
.type-csharp .highlight .sc { color: #A31515 }
|
@ -1,479 +0,0 @@
|
||||
/* http://meyerweb.com/eric/tools/css/reset/
|
||||
v2.0 | 20110126
|
||||
License: none (public domain)
|
||||
*/
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center,
|
||||
dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td,
|
||||
article, aside, canvas, details, embed,
|
||||
figure, figcaption, footer, header, hgroup,
|
||||
menu, nav, output, ruby, section, summary,
|
||||
time, mark, audio, video {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-size: 100%;
|
||||
font: inherit;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
/* HTML5 display-role reset for older browsers */
|
||||
article, aside, details, figcaption, figure,
|
||||
footer, header, hgroup, menu, nav, section {
|
||||
display: block;
|
||||
}
|
||||
body {
|
||||
line-height: 1;
|
||||
}
|
||||
ol, ul {
|
||||
list-style: none;
|
||||
}
|
||||
blockquote, q {
|
||||
quotes: none;
|
||||
}
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {
|
||||
content: '';
|
||||
content: none;
|
||||
}
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
/* LAYOUT STYLES */
|
||||
body {
|
||||
font-size: 15px;
|
||||
line-height: 1.5;
|
||||
background: #fafafa url(../images/body-bg.jpg) 0 0 repeat;
|
||||
font-family: 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-weight: 400;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #2879d0;
|
||||
}
|
||||
a:hover {
|
||||
color: #2268b2;
|
||||
}
|
||||
|
||||
header {
|
||||
padding-top: 40px;
|
||||
padding-bottom: 40px;
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
background: #2e7bcf url(../images/header-bg.jpg) 0 0 repeat-x;
|
||||
border-bottom: solid 1px #275da1;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
letter-spacing: -1px;
|
||||
font-size: 72px;
|
||||
color: #fff;
|
||||
line-height: 1;
|
||||
margin-bottom: 0.2em;
|
||||
width: 540px;
|
||||
}
|
||||
|
||||
header h2 {
|
||||
font-size: 26px;
|
||||
color: #9ddcff;
|
||||
font-weight: normal;
|
||||
line-height: 1.3;
|
||||
width: 540px;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
.inner {
|
||||
position: relative;
|
||||
width: 940px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
#content-wrapper {
|
||||
border-top: solid 1px #fff;
|
||||
padding-top: 30px;
|
||||
}
|
||||
|
||||
#main-content {
|
||||
width: 690px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#main-content img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
aside#sidebar {
|
||||
width: 200px;
|
||||
padding-left: 20px;
|
||||
min-height: 504px;
|
||||
float: right;
|
||||
background: transparent url(../images/sidebar-bg.jpg) 0 0 no-repeat;
|
||||
font-size: 12px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
aside#sidebar p.repo-owner,
|
||||
aside#sidebar p.repo-owner a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#downloads {
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
a.button {
|
||||
width: 134px;
|
||||
height: 58px;
|
||||
line-height: 1.2;
|
||||
font-size: 23px;
|
||||
color: #fff;
|
||||
padding-left: 68px;
|
||||
padding-top: 22px;
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
}
|
||||
a.button small {
|
||||
display: block;
|
||||
font-size: 11px;
|
||||
}
|
||||
header a.button {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
background: transparent url(../images/github-button.png) 0 0 no-repeat;
|
||||
}
|
||||
aside a.button {
|
||||
width: 138px;
|
||||
padding-left: 64px;
|
||||
display: block;
|
||||
background: transparent url(../images/download-button.png) 0 0 no-repeat;
|
||||
margin-bottom: 20px;
|
||||
font-size: 21px;
|
||||
}
|
||||
|
||||
code, pre {
|
||||
font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace;
|
||||
color: #222;
|
||||
margin-bottom: 30px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
code {
|
||||
background-color: #f2f8fc;
|
||||
border: solid 1px #dbe7f3;
|
||||
padding: 0 3px;
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 20px;
|
||||
background: #fff;
|
||||
text-shadow: none;
|
||||
overflow: auto;
|
||||
border: solid 1px #f2f2f2;
|
||||
}
|
||||
pre code {
|
||||
color: #2879d0;
|
||||
background-color: #fff;
|
||||
border: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ul, ol, dl {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
|
||||
/* COMMON STYLES */
|
||||
|
||||
hr {
|
||||
height: 1px;
|
||||
line-height: 1px;
|
||||
margin-top: 1em;
|
||||
padding-bottom: 1em;
|
||||
border: none;
|
||||
background: transparent url('../images/hr.png') 0 0 no-repeat;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border: 1px solid #ebebeb;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
td {
|
||||
border: 1px solid #ebebeb;
|
||||
text-align: center;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
form {
|
||||
background: #f2f2f2;
|
||||
padding: 20px;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* GENERAL ELEMENT TYPE STYLES */
|
||||
|
||||
#main-content h1 {
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-size: 2.8em;
|
||||
letter-spacing: -1px;
|
||||
color: #474747;
|
||||
}
|
||||
|
||||
#main-content h1:before {
|
||||
content: "/";
|
||||
color: #9ddcff;
|
||||
padding-right: 0.3em;
|
||||
margin-left: -0.9em;
|
||||
}
|
||||
|
||||
#main-content h2 {
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-size: 22px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 8px;
|
||||
color: #474747;
|
||||
}
|
||||
#main-content h2:before {
|
||||
content: "//";
|
||||
color: #9ddcff;
|
||||
padding-right: 0.3em;
|
||||
margin-left: -1.5em;
|
||||
}
|
||||
|
||||
#main-content h3 {
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
margin-top: 24px;
|
||||
margin-bottom: 8px;
|
||||
color: #474747;
|
||||
}
|
||||
|
||||
#main-content h3:before {
|
||||
content: "///";
|
||||
color: #9ddcff;
|
||||
padding-right: 0.3em;
|
||||
margin-left: -2em;
|
||||
}
|
||||
|
||||
#main-content h4 {
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
color: #474747;
|
||||
}
|
||||
|
||||
h4:before {
|
||||
content: "////";
|
||||
color: #9ddcff;
|
||||
padding-right: 0.3em;
|
||||
margin-left: -2.8em;
|
||||
}
|
||||
|
||||
#main-content h5 {
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-size: 14px;
|
||||
color: #474747;
|
||||
}
|
||||
h5:before {
|
||||
content: "/////";
|
||||
color: #9ddcff;
|
||||
padding-right: 0.3em;
|
||||
margin-left: -3.2em;
|
||||
}
|
||||
|
||||
#main-content h6 {
|
||||
font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif;
|
||||
font-size: .8em;
|
||||
color: #474747;
|
||||
}
|
||||
h6:before {
|
||||
content: "//////";
|
||||
color: #9ddcff;
|
||||
padding-right: 0.3em;
|
||||
margin-left: -3.7em;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
p a {
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
font-size: 1.6em;
|
||||
border-left: 10px solid #e9e9e9;
|
||||
margin-bottom: 20px;
|
||||
padding: 0 0 0 30px;
|
||||
}
|
||||
|
||||
ul li {
|
||||
list-style: disc inside;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
ol li {
|
||||
list-style: decimal inside;
|
||||
padding-left: 3px;
|
||||
}
|
||||
|
||||
dl dd {
|
||||
font-style: italic;
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
footer {
|
||||
background: transparent url('../images/hr.png') 0 0 no-repeat;
|
||||
margin-top: 40px;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 30px;
|
||||
font-size: 13px;
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: #666;
|
||||
}
|
||||
footer a:hover {
|
||||
color: #444;
|
||||
}
|
||||
|
||||
/* MISC */
|
||||
.clearfix:after {
|
||||
clear: both;
|
||||
content: '.';
|
||||
display: block;
|
||||
visibility: hidden;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.clearfix {display: inline-block;}
|
||||
* html .clearfix {height: 1%;}
|
||||
.clearfix {display: block;}
|
||||
|
||||
/* #Media Queries
|
||||
================================================== */
|
||||
|
||||
/* Smaller than standard 960 (devices and browsers) */
|
||||
@media only screen and (max-width: 959px) {}
|
||||
|
||||
/* Tablet Portrait size to standard 960 (devices and browsers) */
|
||||
@media only screen and (min-width: 768px) and (max-width: 959px) {
|
||||
.inner {
|
||||
width: 740px;
|
||||
}
|
||||
header h1, header h2 {
|
||||
width: 340px;
|
||||
}
|
||||
header h1 {
|
||||
font-size: 60px;
|
||||
}
|
||||
header h2 {
|
||||
font-size: 30px;
|
||||
}
|
||||
#main-content {
|
||||
width: 490px;
|
||||
}
|
||||
#main-content h1:before,
|
||||
#main-content h2:before,
|
||||
#main-content h3:before,
|
||||
#main-content h4:before,
|
||||
#main-content h5:before,
|
||||
#main-content h6:before {
|
||||
content: none;
|
||||
padding-right: 0;
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* All Mobile Sizes (devices and browser) */
|
||||
@media only screen and (max-width: 767px) {
|
||||
.inner {
|
||||
width: 93%;
|
||||
}
|
||||
header {
|
||||
padding: 20px 0;
|
||||
}
|
||||
header .inner {
|
||||
position: relative;
|
||||
}
|
||||
header h1, header h2 {
|
||||
width: 100%;
|
||||
}
|
||||
header h1 {
|
||||
font-size: 48px;
|
||||
}
|
||||
header h2 {
|
||||
font-size: 24px;
|
||||
}
|
||||
header a.button {
|
||||
background-image: none;
|
||||
width: auto;
|
||||
height: auto;
|
||||
display: inline-block;
|
||||
margin-top: 15px;
|
||||
padding: 5px 10px;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
font-size: 13px;
|
||||
line-height: 1;
|
||||
background-color: #9ddcff;
|
||||
color: #2879d0;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
header a.button small {
|
||||
font-size: 13px;
|
||||
display: inline;
|
||||
}
|
||||
#main-content,
|
||||
aside#sidebar {
|
||||
float: none;
|
||||
width: 100% ! important;
|
||||
}
|
||||
aside#sidebar {
|
||||
background-image: none;
|
||||
margin-top: 20px;
|
||||
border-top: solid 1px #ddd;
|
||||
padding: 20px 0;
|
||||
min-height: 0;
|
||||
}
|
||||
aside#sidebar a.button {
|
||||
display: none;
|
||||
}
|
||||
#main-content h1:before,
|
||||
#main-content h2:before,
|
||||
#main-content h3:before,
|
||||
#main-content h4:before,
|
||||
#main-content h5:before,
|
||||
#main-content h6:before {
|
||||
content: none;
|
||||
padding-right: 0;
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Mobile Landscape Size to Tablet Portrait (devices and browsers) */
|
||||
@media only screen and (min-width: 480px) and (max-width: 767px) {}
|
||||
|
||||
/* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */
|
||||
@media only screen and (max-width: 479px) {}
|