Initial version of header nav bar
This commit is contained in:
@@ -22,6 +22,9 @@ serveIndex = (request, response)->
|
|||||||
response.set 'Content-Type', 'text/html'
|
response.set 'Content-Type', 'text/html'
|
||||||
response.sendFile 'index.html', root:ROOT
|
response.sendFile 'index.html', root:ROOT
|
||||||
|
|
||||||
|
app.get '/browse(/*)?', serveIndex
|
||||||
|
app.get '/configure(/*)?', serveIndex
|
||||||
|
app.get '/craft(/*)?', serveIndex
|
||||||
app.get '/crafting(/*)?', serveIndex
|
app.get '/crafting(/*)?', serveIndex
|
||||||
app.get '/item(/*)?', serveIndex
|
app.get '/item(/*)?', serveIndex
|
||||||
app.get '/mod(/*)?', serveIndex
|
app.get '/mod(/*)?', serveIndex
|
||||||
|
|||||||
+9
-3
@@ -26,6 +26,12 @@ All rights reserved.
|
|||||||
|
|
||||||
// Constants ///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
// Constants ///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Animation Speeds ////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
$animate-fast: 0.1s;
|
||||||
|
$animate-normal: 0.25s;
|
||||||
|
$animate-slow: 0.6s;
|
||||||
|
|
||||||
// Font Faces //////////////////////////////////////////////////////////////////////////////////////
|
// Font Faces //////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
$font-family-header: 'Silkscreen';
|
$font-family-header: 'Silkscreen';
|
||||||
@@ -73,9 +79,9 @@ $color-text: #000000;
|
|||||||
|
|
||||||
// Z-Index Layers //////////////////////////////////////////////////////////////////////////////////
|
// Z-Index Layers //////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
$layer-normal: 0;
|
$layer-normal: 100;
|
||||||
$layer-screen: 5;
|
$layer-screen: 500;
|
||||||
$layer-dialog: 10;
|
$layer-dialog: 1000;
|
||||||
|
|
||||||
// Child Stylesheets ///////////////////////////////////////////////////////////////////////////////////////////////////
|
// Child Stylesheets ///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
Crafting Guide - crafting_page.scss
|
Crafting Guide - craft_page.scss
|
||||||
|
|
||||||
Copyright (c) 2014-2015 by Redwood Labs
|
Copyright (c) 2014-2015 by Redwood Labs
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.view__crafting_page {
|
.view__craft_page {
|
||||||
|
|
||||||
& > div {
|
& > div {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
@@ -6,7 +6,7 @@ All rights reserved.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
@import 'crafting_grid';
|
@import 'crafting_grid';
|
||||||
@import 'crafting_page';
|
@import 'craft_page';
|
||||||
@import 'crafting_table';
|
@import 'crafting_table';
|
||||||
@import 'feedback';
|
@import 'feedback';
|
||||||
@import 'full_recipe';
|
@import 'full_recipe';
|
||||||
|
|||||||
+49
-2
@@ -41,7 +41,7 @@ All rights reserved.
|
|||||||
|
|
||||||
.view__header {
|
.view__header {
|
||||||
background: $color-gray-light;
|
background: $color-gray-light;
|
||||||
position: relative; height: 8em;
|
position: relative; height: 13em;
|
||||||
margin-top: 3.2em;
|
margin-top: 3.2em;
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
@@ -54,7 +54,54 @@ All rights reserved.
|
|||||||
|
|
||||||
.divider {
|
.divider {
|
||||||
background: $color-brick-dark url('/images/stone_brick.png');
|
background: $color-brick-dark url('/images/stone_brick.png');
|
||||||
position: absolute; bottom: 0; height: 3.2em; width: 100%;
|
position: absolute; bottom: 5em; height: 3.2em; width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navBar {
|
||||||
|
position: absolute; right: 2em; bottom: 1em; left: 2em; height: 3em;
|
||||||
|
|
||||||
|
a {
|
||||||
|
position: relative; height: 3em; width: 15em;
|
||||||
|
background: $color-gray-faint;
|
||||||
|
border: 0.1em solid $color-gray-medium;
|
||||||
|
border-radius: 0 1.5em 1.5em 0;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: -1.5em;
|
||||||
|
|
||||||
|
transition: background $animate-normal;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-radius: 1.5em;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: $color-background-panel;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.selected {
|
||||||
|
background: $color-active;
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: $color-background-panel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
position: absolute; top: 50%; left: 50%; width: 100%;
|
||||||
|
@include transform(translateX(-50%) translateY(-50%));
|
||||||
|
|
||||||
|
color: $color-active;
|
||||||
|
font-family: $font-family-normal;
|
||||||
|
font-size: $font-size-normal;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
|
||||||
|
transition: color $animate-normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,3 +10,17 @@
|
|||||||
a.logo(href="/"): img(src="/images/workbench_front.png")
|
a.logo(href="/"): img(src="/images/workbench_front.png")
|
||||||
p Crafting Guide for Minecraft
|
p Crafting Guide for Minecraft
|
||||||
.divider.bottom
|
.divider.bottom
|
||||||
|
|
||||||
|
.navBar
|
||||||
|
a(data-page="whats_new", href="/")
|
||||||
|
p What's New?
|
||||||
|
.dot
|
||||||
|
a(data-page="configure", href="/configure")
|
||||||
|
p Configure
|
||||||
|
.dot
|
||||||
|
a(data-page="browse", href="/browse")
|
||||||
|
p Browse
|
||||||
|
.dot
|
||||||
|
a(data-page="craft", href="/craft")
|
||||||
|
p Craft
|
||||||
|
.dot
|
||||||
|
|||||||
@@ -55,10 +55,10 @@ exports.Text = Text = {}
|
|||||||
Text.title = 'Crafting Guide for Minecraft | The Ultimate Step-by-Step Tutorial for Making Anything in Minecraft'
|
Text.title = 'Crafting Guide for Minecraft | The Ultimate Step-by-Step Tutorial for Making Anything in Minecraft'
|
||||||
|
|
||||||
exports.Url = Url = {}
|
exports.Url = Url = {}
|
||||||
Url.crafting = _.template "/crafting/<%= inventoryText %>"
|
Url.crafting = _.template "/craft/<%= inventoryText %>"
|
||||||
Url.itemIcon = _.template "/data/<%= modSlug %>/<%= modVersion %>/images/<%= itemSlug %>.png"
|
Url.itemIcon = _.template "/data/<%= modSlug %>/<%= modVersion %>/images/<%= itemSlug %>.png"
|
||||||
Url.item = _.template "/mod/<%= modSlug %>/<%= itemSlug %>"
|
Url.item = _.template "/browse/<%= modSlug %>/<%= itemSlug %>"
|
||||||
Url.mod = _.template "/mod/<%= modSlug %>"
|
Url.mod = _.template "/browse/<%= modSlug %>"
|
||||||
Url.modData = _.template "/data/<%= modSlug %>/mod.cg"
|
Url.modData = _.template "/data/<%= modSlug %>/mod.cg"
|
||||||
Url.modVersion = _.template "/data/<%= modSlug %>/<%= modVersion %>/mod-version.cg"
|
Url.modVersion = _.template "/data/<%= modSlug %>/<%= modVersion %>/mod-version.cg"
|
||||||
Url.modLogoImage = _.template "/data/<%= modSlug %>/logo.png"
|
Url.modLogoImage = _.template "/data/<%= modSlug %>/logo.png"
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
###
|
||||||
|
Crafting Guide - browse_page_controller.coffee
|
||||||
|
|
||||||
|
Copyright (c) 2015 by Redwood Labs
|
||||||
|
All rights reserved.
|
||||||
|
###
|
||||||
|
|
||||||
|
BaseController = require './base_controller'
|
||||||
|
|
||||||
|
########################################################################################################################
|
||||||
|
|
||||||
|
module.exports = class BrowsePageController extends BaseController
|
||||||
|
|
||||||
|
constructor: (options={})->
|
||||||
|
options.templateName = 'browse_page'
|
||||||
|
super options
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
###
|
||||||
|
Crafting Guide - configure_page_controller.coffee
|
||||||
|
|
||||||
|
Copyright (c) 2015 by Redwood Labs
|
||||||
|
All rights reserved.
|
||||||
|
###
|
||||||
|
|
||||||
|
BaseController = require './base_controller'
|
||||||
|
|
||||||
|
########################################################################################################################
|
||||||
|
|
||||||
|
module.exports = class ConfigurePageController extends BaseController
|
||||||
|
|
||||||
|
constructor: (options={})->
|
||||||
|
options.templateName = 'configure_page'
|
||||||
|
super options
|
||||||
+3
-3
@@ -1,5 +1,5 @@
|
|||||||
###
|
###
|
||||||
Crafting Guide - crafting_page_controller.coffee
|
Crafting Guide - craft_page_controller.coffee
|
||||||
|
|
||||||
Copyright (c) 2014-2015 by Redwood Labs
|
Copyright (c) 2014-2015 by Redwood Labs
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
@@ -10,7 +10,7 @@ CraftingTableController = require './crafting_table_controller'
|
|||||||
{Event} = require '../constants'
|
{Event} = require '../constants'
|
||||||
ImageLoader = require './image_loader'
|
ImageLoader = require './image_loader'
|
||||||
InventoryController = require './inventory_controller'
|
InventoryController = require './inventory_controller'
|
||||||
CraftingPage = require '../models/crafting_page'
|
CraftingPage = require '../models/craft_page'
|
||||||
ModPackController = require './mod_pack_controller'
|
ModPackController = require './mod_pack_controller'
|
||||||
NameFinder = require '../models/name_finder'
|
NameFinder = require '../models/name_finder'
|
||||||
Storage = require '../models/storage'
|
Storage = require '../models/storage'
|
||||||
@@ -27,7 +27,7 @@ module.exports = class CraftingPageController extends BaseController
|
|||||||
|
|
||||||
options.model ?= new CraftingPage modPack:options.modPack
|
options.model ?= new CraftingPage modPack:options.modPack
|
||||||
options.storage ?= new Storage storage:window.localStorage
|
options.storage ?= new Storage storage:window.localStorage
|
||||||
options.templateName = 'crafting_page'
|
options.templateName = 'craft_page'
|
||||||
super options
|
super options
|
||||||
|
|
||||||
@_imageLoader = options.imageLoader
|
@_imageLoader = options.imageLoader
|
||||||
@@ -20,14 +20,36 @@ module.exports = class HeaderController extends BaseController
|
|||||||
router.navigate '/', trigger:true
|
router.navigate '/', trigger:true
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
onNavItemClicked: (event)->
|
||||||
|
return true unless $(event.currentTarget).attr('href')?
|
||||||
|
|
||||||
|
router.navigate $(event.currentTarget).attr('href'), trigger:true
|
||||||
|
return false
|
||||||
|
|
||||||
# BaseController Overrides #####################################################################
|
# BaseController Overrides #####################################################################
|
||||||
|
|
||||||
render: ->
|
render: ->
|
||||||
# Overriding render because the header is already part of the stock page layout, and we
|
# Overriding render because the header is already part of the stock page layout, and we
|
||||||
# don't need to replace it here.
|
# don't need to replace it here.
|
||||||
|
@_rendered = true
|
||||||
|
|
||||||
|
@$navLinks = ($(el) for el in @$('.navBar a'))
|
||||||
|
|
||||||
|
zIndex = @$navLinks.length + 100
|
||||||
|
for $navLink in @$navLinks
|
||||||
|
$navLink.css 'z-index', zIndex--
|
||||||
|
|
||||||
|
refresh: ->
|
||||||
|
for $navLink in @$navLinks
|
||||||
|
logger.debug "@model: #{@model}, page: #{$navLink.data('page')}"
|
||||||
|
if $navLink.data('page') is @model
|
||||||
|
$navLink.addClass 'selected'
|
||||||
|
else
|
||||||
|
$navLink.removeClass 'selected'
|
||||||
|
|
||||||
# Backbone.View Overrides ######################################################################
|
# Backbone.View Overrides ######################################################################
|
||||||
|
|
||||||
events: ->
|
events: ->
|
||||||
return _.extend super,
|
return _.extend super,
|
||||||
'click a.logo': 'onLogoClicked'
|
'click a.logo': 'onLogoClicked'
|
||||||
|
'click .navBar a': 'onNavItemClicked'
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
###
|
||||||
|
Crafting Guide - whats_new_page_controller.coffee
|
||||||
|
|
||||||
|
Copyright (c) 2015 by Redwood Labs
|
||||||
|
All rights reserved.
|
||||||
|
###
|
||||||
|
|
||||||
|
BaseController = require './base_controller'
|
||||||
|
|
||||||
|
########################################################################################################################
|
||||||
|
|
||||||
|
module.exports = class WhatsNewController extends BaseController
|
||||||
|
|
||||||
|
constructor: (options={})->
|
||||||
|
options.templateName = 'whats_new_page'
|
||||||
|
super options
|
||||||
@@ -6,21 +6,24 @@ All rights reserved.
|
|||||||
###
|
###
|
||||||
|
|
||||||
|
|
||||||
CraftingPageController = require './controllers/crafting_page_controller'
|
BrowsePageController = require './controllers/browse_page_controller'
|
||||||
{DefaultMods} = require './constants'
|
CraftPageController = require './controllers/craft_page_controller'
|
||||||
{Duration} = require './constants'
|
ConfigurePageController = require './controllers/configure_page_controller'
|
||||||
{Event} = require './constants'
|
{DefaultMods} = require './constants'
|
||||||
HeaderController = require './controllers/header_controller'
|
{Duration} = require './constants'
|
||||||
ItemPageController = require './controllers/item_page_controller'
|
{Event} = require './constants'
|
||||||
ItemSlug = require './models/item_slug'
|
HeaderController = require './controllers/header_controller'
|
||||||
ImageLoader = require './controllers/image_loader'
|
ItemPageController = require './controllers/item_page_controller'
|
||||||
Mod = require './models/mod'
|
ItemSlug = require './models/item_slug'
|
||||||
ModPack = require './models/mod_pack'
|
ImageLoader = require './controllers/image_loader'
|
||||||
ModPageController = require './controllers/mod_page_controller'
|
Mod = require './models/mod'
|
||||||
{Opacity} = require './constants'
|
ModPack = require './models/mod_pack'
|
||||||
Storage = require './models/storage'
|
ModPageController = require './controllers/mod_page_controller'
|
||||||
{Url} = require './constants'
|
{Opacity} = require './constants'
|
||||||
UrlParams = require './url_params'
|
Storage = require './models/storage'
|
||||||
|
{Url} = require './constants'
|
||||||
|
UrlParams = require './url_params'
|
||||||
|
WhatsNewPageController = require './controllers/whats_new_page_controller'
|
||||||
|
|
||||||
########################################################################################################################
|
########################################################################################################################
|
||||||
|
|
||||||
@@ -38,6 +41,7 @@ module.exports = class CraftingGuideRouter extends Backbone.Router
|
|||||||
@_defaultOptions = imageLoader:@imageLoader, modPack:@modPack, storage:@storage
|
@_defaultOptions = imageLoader:@imageLoader, modPack:@modPack, storage:@storage
|
||||||
|
|
||||||
@headerController = new HeaderController el:'.view__header'
|
@headerController = new HeaderController el:'.view__header'
|
||||||
|
@headerController.render()
|
||||||
|
|
||||||
# Public Methods ###############################################################################
|
# Public Methods ###############################################################################
|
||||||
|
|
||||||
@@ -60,36 +64,71 @@ module.exports = class CraftingGuideRouter extends Backbone.Router
|
|||||||
@_recordPageView()
|
@_recordPageView()
|
||||||
|
|
||||||
routes:
|
routes:
|
||||||
'': 'root'
|
'': 'route__whats_new'
|
||||||
'item/:itemSlug': 'item'
|
'browse': 'route__browse'
|
||||||
'crafting/(:text)': 'crafting'
|
'browse/:modSlug': 'route__browseMod'
|
||||||
'mod/:modSlug': 'mod'
|
'browse/:modSlug/:itemSlug': 'route__browseModItem'
|
||||||
'mod/:modSlug/:itemSlug': 'modItem'
|
'configure': 'route__configure'
|
||||||
|
'craft(/:text)': 'route__craft'
|
||||||
|
|
||||||
|
'item/:itemSlug': 'deprecated__item'
|
||||||
|
'crafting/(:text)': 'deprecated__crafting'
|
||||||
|
'mod/:modSlug': 'deprecated__mod'
|
||||||
|
'mod/:modSlug/:itemSlug': 'deprecated__modItem'
|
||||||
|
|
||||||
# Route Methods ################################################################################
|
# Route Methods ################################################################################
|
||||||
|
|
||||||
crafting: (text)->
|
route__whats_new: ->
|
||||||
controller = new CraftingPageController _.extend {}, @_defaultOptions
|
params = new UrlParams recipeName:{type:'string'}, count:{type:'integer'}
|
||||||
|
if params.recipeName?
|
||||||
|
@deprecated__v1_root params
|
||||||
|
return
|
||||||
|
|
||||||
|
@_setPage 'whats_new', new WhatsNewPageController _.extend {}, @_defaultOptions
|
||||||
|
|
||||||
|
route__browse: ->
|
||||||
|
@_setPage 'browse', new BrowsePageController _.extend {}, @_defaultOptions
|
||||||
|
|
||||||
|
route__browseMod: (modSlug)->
|
||||||
|
controller = new ModPageController _.extend {}, @_defaultOptions
|
||||||
|
controller.model = @modPack.getMod modSlug
|
||||||
|
@_setPage 'browseMod', controller
|
||||||
|
|
||||||
|
route__browseModItem: (modSlug, itemSlug)->
|
||||||
|
slug = new ItemSlug modSlug, itemSlug
|
||||||
|
controller = new ItemPageController _.extend {itemSlug:slug}, @_defaultOptions
|
||||||
|
@_setPage 'browseModItem', controller
|
||||||
|
|
||||||
|
route__configure: ->
|
||||||
|
@_setPage 'configure', new ConfigurePageController _.extend {}, @_defaultOptions
|
||||||
|
|
||||||
|
route__craft: (text)->
|
||||||
|
controller = new CraftPageController _.extend {}, @_defaultOptions
|
||||||
|
controller.model.params = inventoryText:text
|
||||||
|
@_setPage 'craft', controller
|
||||||
|
|
||||||
|
# Deprecated Route Methods #####################################################################
|
||||||
|
|
||||||
|
deprecated__crafting: (text)->
|
||||||
|
controller = new CraftPageController _.extend {}, @_defaultOptions
|
||||||
controller.model.params = inventoryText:text
|
controller.model.params = inventoryText:text
|
||||||
@_setPage 'crafting', controller
|
@_setPage 'crafting', controller
|
||||||
|
|
||||||
item: (itemSlug)->
|
deprecated__item: (itemSlug)->
|
||||||
controller = new ItemPageController _.extend {itemSlug:itemSlug}, @_defaultOptions
|
controller = new ItemPageController _.extend {itemSlug:itemSlug}, @_defaultOptions
|
||||||
@_setPage 'item', controller
|
@_setPage 'item', controller
|
||||||
|
|
||||||
modItem: (modSlug, itemSlug)->
|
deprecated__modItem: (modSlug, itemSlug)->
|
||||||
slug = new ItemSlug modSlug, itemSlug
|
slug = new ItemSlug modSlug, itemSlug
|
||||||
controller = new ItemPageController _.extend {itemSlug:slug}, @_defaultOptions
|
controller = new ItemPageController _.extend {itemSlug:slug}, @_defaultOptions
|
||||||
@_setPage 'item', controller
|
@_setPage 'item', controller
|
||||||
|
|
||||||
mod: (modSlug)->
|
deprecated__mod: (modSlug)->
|
||||||
controller = new ModPageController _.extend {}, @_defaultOptions
|
controller = new ModPageController _.extend {}, @_defaultOptions
|
||||||
controller.model = @modPack.getMod modSlug
|
controller.model = @modPack.getMod modSlug
|
||||||
@_setPage 'mod', controller
|
@_setPage 'mod', controller
|
||||||
|
|
||||||
root: ->
|
deprecated__v1_root: (params)->
|
||||||
params = new UrlParams recipeName:{type:'string'}, count:{type:'integer'}
|
|
||||||
|
|
||||||
text = ''
|
text = ''
|
||||||
if params.recipeName?
|
if params.recipeName?
|
||||||
if params.count? and params.count > 1
|
if params.count? and params.count > 1
|
||||||
@@ -114,6 +153,8 @@ module.exports = class CraftingGuideRouter extends Backbone.Router
|
|||||||
return if @_controller is controller
|
return if @_controller is controller
|
||||||
|
|
||||||
logger.info -> "changing to page controller: #{controller.constructor.name}"
|
logger.info -> "changing to page controller: #{controller.constructor.name}"
|
||||||
|
@headerController.model = page
|
||||||
|
|
||||||
showDuration = Duration.normal
|
showDuration = Duration.normal
|
||||||
show = =>
|
show = =>
|
||||||
@_page = page
|
@_page = page
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
###
|
###
|
||||||
Crafting Guide - crafting_page.coffee
|
Crafting Guide - craft_page.coffee
|
||||||
|
|
||||||
Copyright (c) 2014-2015 by Redwood Labs
|
Copyright (c) 2014-2015 by Redwood Labs
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
//-
|
||||||
|
//- Crafting Guide - browse_page.jade
|
||||||
|
//-
|
||||||
|
//- Copyright (c) 2015 by Redwood Labs
|
||||||
|
//- All rights reserved.
|
||||||
|
//-
|
||||||
|
|
||||||
|
h1 Browse
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
//-
|
||||||
|
//- Crafting Guide - configure_page.jade
|
||||||
|
//-
|
||||||
|
//- Copyright (c) 2015 by Redwood Labs
|
||||||
|
//- All rights reserved.
|
||||||
|
//-
|
||||||
|
|
||||||
|
h1 Configure
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
//- All rights reserved.
|
//- All rights reserved.
|
||||||
//-
|
//-
|
||||||
|
|
||||||
.view__crafting_page
|
.view__craft_page
|
||||||
.view__inventory.want
|
.view__inventory.want
|
||||||
.view__inventory.have
|
.view__inventory.have
|
||||||
.view__inventory.need
|
.view__inventory.need
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
//-
|
||||||
|
//- Crafting Guide - whats_new_page.jade
|
||||||
|
//-
|
||||||
|
//- Copyright (c) 2015 by Redwood Labs
|
||||||
|
//- All rights reserved.
|
||||||
|
//-
|
||||||
|
|
||||||
|
h1 What's new?
|
||||||
Reference in New Issue
Block a user