From 9956e64af011c235b4f626738c4d28611f3aa0e8 Mon Sep 17 00:00:00 2001 From: Andrew Miner Date: Sat, 21 Mar 2015 15:48:35 -0700 Subject: [PATCH] Replace jQuery animations with CSS animations --- src/coffee/constants.coffee | 21 +++- src/coffee/controllers/base_controller.coffee | 77 +++++++++++-- .../controllers/browse_page_controller.coffee | 3 +- .../crafting_table_controller.coffee | 4 +- .../controllers/feedback_controller.coffee | 4 +- .../controllers/inventory_controller.coffee | 22 ++-- .../inventory_table_controller.coffee | 66 ++++++----- .../controllers/item_group_controller.coffee | 59 +++++----- .../controllers/item_page_controller.coffee | 79 +++++-------- src/coffee/controllers/mod_controller.coffee | 14 +-- .../controllers/mod_page_controller.coffee | 105 ++++++++++-------- .../mod_selector_controller.coffee | 2 +- .../controllers/recipe_step_controller.coffee | 25 ----- .../controllers/stack_controller.coffee | 3 + .../tutorial_page_controller.coffee | 78 ++++++------- src/coffee/crafting_guide_router.coffee | 22 ++-- src/coffee/models/mod_version.coffee | 5 + src/jade/app.jade | 2 +- src/jade/templates/browse_page.jade | 2 +- src/jade/templates/crafting_table.jade | 2 +- src/jade/templates/feedback.jade | 2 +- src/jade/templates/home_page.jade | 45 ++++---- src/jade/templates/item.jade | 2 +- src/jade/templates/item_group.jade | 2 +- src/jade/templates/item_page.jade | 16 +-- src/jade/templates/mod_page.jade | 8 +- src/jade/templates/tutorial_page.jade | 4 +- src/scss/classes.scss | 16 ++- src/scss/main.scss | 6 +- src/scss/templates/item_page.scss | 15 --- src/scss/templates/mod_page.scss | 2 - static/index.html | 41 +++---- 32 files changed, 385 insertions(+), 369 deletions(-) delete mode 100644 src/coffee/controllers/recipe_step_controller.coffee diff --git a/src/coffee/constants.coffee b/src/coffee/constants.coffee index 8ab9e87fa..81ba24c6c 100644 --- a/src/coffee/constants.coffee +++ b/src/coffee/constants.coffee @@ -20,10 +20,10 @@ exports.DefaultMods = thermal_expansion: { defaultVersion: '4.0.0B8-23' } exports.Duration = Duration = {} -Duration.snap = 200 -Duration.fast = Duration.snap * 2 -Duration.normal = Duration.fast * 2 -Duration.slow = Duration.normal * 2 +Duration.snap = 100 +Duration.fast = 200 +Duration.normal = 400 +Duration.slow = 1200 exports.Event = Event = {} Event.add = 'add' # collection, item... @@ -38,7 +38,18 @@ Event.request = 'request' # model Event.route = 'route' Event.sort = 'sort' Event.sync = 'sync' # model, response -Event.transitionEnd = 'webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend' +Event.transitionEnd = (-> + transitions = + 'transition': 'transitionend', + 'OTransition': 'oTransitionEnd', + 'MSTransition': 'msTransitionEnd', + 'MozTransition': 'transitionend', + 'WebkitTransition': 'webkitTransitionEnd' + + el = document.createElement 'fakeelement' + for styleName, eventName of transitions + return eventName if el.style[styleName]? +)() exports.Key = Key = {} Key.Return = 13 diff --git a/src/coffee/controllers/base_controller.coffee b/src/coffee/controllers/base_controller.coffee index 10e8d0d39..cfdeebca1 100644 --- a/src/coffee/controllers/base_controller.coffee +++ b/src/coffee/controllers/base_controller.coffee @@ -5,7 +5,8 @@ Copyright (c) 2014-2015 by Redwood Labs All rights reserved. ### -views = require '../views' +views = require '../views' +{Event} = require '../constants' ######################################################################################################################## @@ -31,13 +32,31 @@ module.exports = class BaseController extends Backbone.View options.parent = this child = new Controller options - child.render() + child.render options @_children.push child return child + hide: (args...)-> + {$el, callback} = @_resolveShowHideArgs args + + $el.addClass 'hideable' unless $el.hasClass 'hideable' + + if $el.hasClass('hiding') or $el.hasClass('hidden') + _.defer => callback this + else + $el.one Event.transitionEnd, => + $el.addClass 'hidden' + $el.removeClass 'hiding' + callback this + + $el.addClass 'hiding' + refresh: -> logger.verbose => "#{this} refreshing" + remove: -> + @hide -> @$el.remove() + routeLinkClick: (event)-> event.preventDefault() href = $(event.target).attr 'href' @@ -45,6 +64,23 @@ module.exports = class BaseController extends Backbone.View logger.info "Re-routing link to internal navigation: #{href}" router.navigate href, trigger:true + show: (args...)-> + {$el, callback} = @_resolveShowHideArgs args + + $el.addClass 'hideable' unless $el.hasClass 'hideable' + + if $el.hasClass('hiding') or $el.hasClass('hidden') + $el.one Event.transitionEnd, => + callback this + $el.removeClass 'hiding' + $el.removeClass 'hidden' + else + _.defer => callback this + + unrender: -> + @undelegateEvents() + @$el.empty() + # Event Methods ################################################################################ onDidModelChange: -> @@ -68,7 +104,7 @@ module.exports = class BaseController extends Backbone.View if newModel?.on? @listenTo newModel, 'sync', (e)=> @onDidModelSync e @listenTo newModel, 'change', (e)=> @onDidModelChange e - return true + return newModel # Property Methods ############################################################################# @@ -77,8 +113,8 @@ module.exports = class BaseController extends Backbone.View setModel: (newModel)-> return if @model is newModel - return unless @onWillChangeModel @_model, newModel + newModel = @onWillChangeModel @_model, newModel @_model = newModel @tryRefresh() @@ -88,23 +124,27 @@ module.exports = class BaseController extends Backbone.View return {} render: (options={})-> + options.force ?= false + options.show ?= true return this unless not @_rendered or options.force - data = (@model?.toHash? and @model.toHash()) or @model or {} - if not @_template? logger.error => "Default render called for #{@constructor.name} without a template" return this + data = (@model?.toHash? and @model.toHash()) or @model or {} logger.verbose => "#{this} rendering with data: #{data}" + $renderedEl = $($(@_template(data))[0]) + @onWillRender() - $oldEl = @$el - $newEl = Backbone.$(@_template(data)) - if $oldEl - $oldEl.replaceWith $newEl - $newEl.addClass $oldEl.attr 'class' + @hide() + + @unrender() + @$el.append $renderedEl.children() + @$el.addClass $renderedEl.attr 'class' + @delegateEvents() + @show() if options.show - @setElement $newEl @_rendered = true @onDidRender() @@ -121,6 +161,19 @@ module.exports = class BaseController extends Backbone.View if templateName? @_template = views[templateName] + _resolveShowHideArgs: (args)-> + if args.length is 0 + return $el:@$el, callback:-> + else if args.length is 1 + if _.isFunction args[0] + return $el:@$el, callback:args[0] + else + return $el:args[0], callback:-> + else if args.length is 2 + return $el:args[0], callback:args[1] + else + throw new Error "expected to get 0, 1, or 2 args" + _tryRefresh: -> return unless @_rendered @refresh() diff --git a/src/coffee/controllers/browse_page_controller.coffee b/src/coffee/controllers/browse_page_controller.coffee index f4c30fe2a..4dcad0620 100644 --- a/src/coffee/controllers/browse_page_controller.coffee +++ b/src/coffee/controllers/browse_page_controller.coffee @@ -54,7 +54,6 @@ module.exports = class BrowsePageController extends PageController while @_controllers.length > controllerIndex controller = @_controllers.pop() - controller.$el.addClass 'removing' - controller.$el.one Event.transitionEnd -> controller.$el.remove() + controller.hide -> controller.$el.remove() super diff --git a/src/coffee/controllers/crafting_table_controller.coffee b/src/coffee/controllers/crafting_table_controller.coffee index 1a903698c..c8a2c67a7 100644 --- a/src/coffee/controllers/crafting_table_controller.coffee +++ b/src/coffee/controllers/crafting_table_controller.coffee @@ -79,9 +79,9 @@ module.exports = class CraftingTableController extends BaseController @$multiplier.html '' if not (@model.hasSteps and global.feedbackController?) - @$problemControl.hide duration:Duration.snap + @$problemControl.addClass 'hidden' else - @$problemControl.show duration:Duration.snap + @$problemControl.removeClass 'hidden' super diff --git a/src/coffee/controllers/feedback_controller.coffee b/src/coffee/controllers/feedback_controller.coffee index 4d01103f2..3e92e3a4b 100644 --- a/src/coffee/controllers/feedback_controller.coffee +++ b/src/coffee/controllers/feedback_controller.coffee @@ -49,9 +49,9 @@ module.exports = class FeedbackController extends BaseController @model.send(message) .then => @onToggle() - @$error.slideUp duration:Duration.normal + @$error.addClass 'hidden' .catch (error)=> - @$error.slideDown duration:Duration.normal + @$error.removeClass 'hidden' .finally => @$sendButton.removeAttr 'disabled' diff --git a/src/coffee/controllers/inventory_controller.coffee b/src/coffee/controllers/inventory_controller.coffee index d8a999d26..6a3e1867d 100644 --- a/src/coffee/controllers/inventory_controller.coffee +++ b/src/coffee/controllers/inventory_controller.coffee @@ -120,12 +120,12 @@ module.exports = class InventoryController extends BaseController events: -> return _.extend super, - 'blur input[name="name"]': 'onNameFieldBlur' - 'click button[name="add"]': 'onAddButtonClicked' - 'click button[name="clear"]': 'onClearButtonClicked' - 'focus input[name="name"]': 'onNameFieldFocused' - 'input input[name="name"]': 'onNameFieldChanged' - 'keyup input[name="name"]': 'onNameFieldKeyUp' + 'blur input[name="name"]': 'onNameFieldBlur' + 'click button[name="add"]': 'onAddButtonClicked' + 'click button[name="clear"]': 'onClearButtonClicked' + 'focus input[name="name"]': 'onNameFieldFocused' + 'input input[name="name"]': 'onNameFieldChanged' + 'keyup input[name="name"]': 'onNameFieldKeyUp' # Private Methods ############################################################################## @@ -164,18 +164,16 @@ module.exports = class InventoryController extends BaseController modPack: @modPack onChange: @onChange onRemove: if not @editable then null else (stack)=> @_removeStack(stack) - controller.render() - controller.$el.hide() - controller.$el.insertBefore $lastRow - controller.$el.slideDown duration:Duration.fast + @_stackControllers.push controller + controller.$el.insertBefore $lastRow + controller.render() else controller.model = stack index += 1 while @_stackControllers.length > index - controller = @_stackControllers.pop() - controller.$el.fadeOut duration:Duration.fast, complete:-> @remove() + @_stackControllers.pop().remove() _removeStack: (stack)-> @model.remove stack.itemSlug, stack.quantity diff --git a/src/coffee/controllers/inventory_table_controller.coffee b/src/coffee/controllers/inventory_table_controller.coffee index 88425ce58..a0e28abff 100644 --- a/src/coffee/controllers/inventory_table_controller.coffee +++ b/src/coffee/controllers/inventory_table_controller.coffee @@ -72,7 +72,7 @@ module.exports = class InventoryTableController extends BaseController onNameFieldChanged: -> item = @modPack.findItemByName @$nameField.val() - @_updateButtonState() + @_refreshButtonState() onNameFieldFocused: -> @$nameField.val '' @@ -99,7 +99,7 @@ module.exports = class InventoryTableController extends BaseController @$quantityField.removeClass 'error', Duration.normal @$quantityField.removeClass 'error-new', Duration.normal - @_updateButtonState() + @_refreshButtonState() onQuantityFieldFocused: -> @$quantityField.val '' @@ -125,22 +125,10 @@ module.exports = class InventoryTableController extends BaseController if _.isEmpty(@$quantityField.val()) then @$quantityField.val '1' @$table.find('tr:not(:last-child)').remove() - $lastRow = @$table.find 'tr:last-child' - @_stackControllers = [] - @model.each (stack)=> - controller = new StackController - editable: @editable - imageLoader: @imageLoader - model: stack - modPack: @modPack - onRemove: if not @editable then null else (stack)=> @_removeStack(stack) - controller.render() - controller.$el.insertBefore $lastRow - @_stackControllers.push controller - - @_updateNameAutocomplete() - @_updateButtonState() + @_refreshNameAutocomplete() + @_refreshButtonState() + @_refreshStacks() super @@ -160,10 +148,15 @@ module.exports = class InventoryTableController extends BaseController # Private Methods ############################################################################## - _removeStack: (stack)-> - @model.remove stack.itemSlug, stack.quantity + _refreshButtonState: -> + if @model.isEmpty then @$clearButton.attr('disabled', 'disabled') else @$clearButton.removeAttr('disabled') - _updateNameAutocomplete: -> + itemValid = @modPack.findItemByName(@$nameField.val())? + quantityValid = @$quantityField.val().match(InventoryTableController.ONLY_DIGITS) + disable = not (itemValid and quantityValid) + if disable then @$addButton.attr('disabled', 'disabled') else @$addButton.removeAttr('disabled') + + _refreshNameAutocomplete: -> onChanged = => @onNameFieldChanged() onSelected = => @onItemSelected() @@ -175,10 +168,31 @@ module.exports = class InventoryTableController extends BaseController close: onChanged select: onSelected - _updateButtonState: -> - if @model.isEmpty then @$clearButton.attr('disabled', 'disabled') else @$clearButton.removeAttr('disabled') + _refreshStacks: -> + @_stackControllers ?= [] + index = 0 - itemValid = @modPack.findItemByName(@$nameField.val())? - quantityValid = @$quantityField.val().match(InventoryTableController.ONLY_DIGITS) - disable = not (itemValid and quantityValid) - if disable then @$addButton.attr('disabled', 'disabled') else @$addButton.removeAttr('disabled') + $lastRow = @$table.find 'tr:last-child' + @model.each (stack)=> + controller = @_stackControllers[index] + if not controller? + controller = new StackController + editable: @editable + imageLoader: @imageLoader + model: stack + modPack: @modPack + onRemove: if not @editable then null else (stack)=> @_removeStack(stack) + + @_stackControllers.push controller + controller.$el.insertBefore $lastRow + controller.render() + else + controller.model = stack + + index += 1 + + while @_stackControllers.length > index + @_stackControllers.pop().remove() + + _removeStack: (stack)-> + @model.remove stack.itemSlug, stack.quantity diff --git a/src/coffee/controllers/item_group_controller.coffee b/src/coffee/controllers/item_group_controller.coffee index 52450b8a7..2210c9872 100644 --- a/src/coffee/controllers/item_group_controller.coffee +++ b/src/coffee/controllers/item_group_controller.coffee @@ -6,10 +6,10 @@ All rights reserved. ### BaseController = require './base_controller' -{Duration} = require '../constants' -{Event} = require '../constants' Item = require '../models/item' ItemController = require './item_controller' +{Duration} = require '../constants' +{Event} = require '../constants' ######################################################################################################################## @@ -18,19 +18,15 @@ module.exports = class ItemGroupController extends BaseController constructor: (options={})-> if not options.imageLoader? then throw new Error 'options.imageLoader is required' if not options.modPack? then throw new Error 'options.modPack is required' + options.model ?= [] options.title ?= '' options.templateName = 'item_group' super options - @_delayStep = 20 @_imageLoader = options.imageLoader - @_itemControllers = [] @_modPack = options.modPack @_title = options.title - Object.defineProperties this, - title: {get:@getTitle, set:@setTitle} - # Property Methods ############################################################################# getTitle: -> @@ -40,6 +36,9 @@ module.exports = class ItemGroupController extends BaseController @_title = title @tryRefresh() + Object.defineProperties @prototype, + title: {get:@prototype.getTitle, set:@prototype.setTitle} + # BaseController Overrides ##################################################################### onDidRender: -> @@ -47,37 +46,37 @@ module.exports = class ItemGroupController extends BaseController @$items = @$('.panel') super + onWillChangeModel: (oldModel, newModel)-> + newModel ?= [] + return super oldModel, newModel + refresh: -> - @$title.html @_title - @_refreshItems() + if @model.length > 0 + @$title.html @_title + @_refreshItems() + @show() + else + @hide() + super # Private Methods ############################################################################## - _createItemController: (item, delay)-> - controller = new ItemController imageLoader:@_imageLoader, model:item, modPack:@_modPack - @_itemControllers.push controller - - attachController = => - controller.render() - @$items.append controller.$el - - _.delay attachController, delay - _refreshItems: -> + @_itemControllers ?= [] controllerIndex = 0 delay = 0 - if @model? - for item in @model - controller = @_itemControllers[controllerIndex] - if not controller? - @_createItemController item, delay - delay += @_delayStep - else - controller.model = item - controllerIndex += 1 + for item in @model + controller = @_itemControllers[controllerIndex] + if not controller? + controller = new ItemController imageLoader:@_imageLoader, model:item, modPack:@_modPack + @_itemControllers.push controller + @$items.append controller.$el + controller.render() + else + controller.model = item + controllerIndex += 1 while @_itemControllers.length > controllerIndex - controller = @_itemControllers.pop() - controller.$el.slideUp duration:Duration.normal, complete:-> @remove() + @_itemControllers.pop().remove() diff --git a/src/coffee/controllers/item_page_controller.coffee b/src/coffee/controllers/item_page_controller.coffee index d37d0e42a..178e8e4ed 100644 --- a/src/coffee/controllers/item_page_controller.coffee +++ b/src/coffee/controllers/item_page_controller.coffee @@ -43,6 +43,7 @@ module.exports = class ItemPageController extends PageController craftingPlanButtonClicked: -> display = @modPack.findItemDisplay @model.item.slug + logger.debug "button clicked, going to: #{display.craftingUrl}" router.navigate display.craftingUrl, trigger:true return false @@ -56,21 +57,13 @@ module.exports = class ItemPageController extends PageController onDidRender: -> @adsenseController = @addChild AdsenseController, '.view__adsense', model:'sidebar_skyscraper' - @_similarItemsController = @addChild ItemGroupController, '.similar .view__item_group', - imageLoader: @imageLoader - modPack: @modPack - - @_usedAsToolToMakeController = @addChild ItemGroupController, '.usedAsToolToMake .view__item_group', - imageLoader: @imageLoader - modPack: @modPack - - @_usedToMakeController = @addChild ItemGroupController, '.usedToMake .view__item_group', - imageLoader: @imageLoader - modPack: @modPack + options = imageLoader:@imageLoader, modPack:@modPack, show:false + @_similarItemsController = @addChild ItemGroupController, '.view__item_group.similar', options + @_usedAsToolToMakeController = @addChild ItemGroupController, '.view__item_group.usedAsToolToMake', options + @_usedToMakeController = @addChild ItemGroupController, '.view__item_group.usedToMake', options @$byline = @$('.byline') @$bylineLink = @$('.byline a') - @$craftingPlanButton = @$('button.craftingPlan') @$descriptionPanel = @$('.description .panel') @$descriptionSection = @$('.description') @$name = @$('h1.name') @@ -92,20 +85,18 @@ module.exports = class ItemPageController extends PageController if @model.item? display = @modPack.findItemDisplay @model.item.slug - @$craftingPlanButton.fadeIn duration:Duration.fast @imageLoader.load display.iconUrl, @$titleImage @$name.html display.itemName if @model.item.officialUrl? @$officialPageLink.attr 'href', @model.item.officialUrl - @$officialPageLink.fadeIn duration:Duration.normal + @show @$officialPageLink else - @$officialPageLink.fadeOut duration:Duration.normal + @hide @$officialPageLink - @$el.slideDown duration:Duration.normal + @show() else - @$craftingPlanButton.fadeOut duration:Duration.fast - @$el.slideUp duration:Duration.normal + @hide() @_refreshByline() @_refreshDescription() @@ -121,10 +112,10 @@ module.exports = class ItemPageController extends PageController events: -> return _.extend super, - 'click a.craftingPlan': 'routeLinkClick' - 'click .byline a': 'routeLinkClick' - 'click .markdown': 'routeLinkClick' - 'click button.craftingPlan': 'craftingPlanButtonClicked' + 'click a.craftingPlan': 'routeLinkClick' + 'click .byline a': 'routeLinkClick' + 'click .markdown': 'routeLinkClick' + 'click button': 'craftingPlanButtonClicked' # Private Methods ############################################################################## @@ -133,25 +124,25 @@ module.exports = class ItemPageController extends PageController if mod?.name?.length > 0 @$bylineLink.attr 'href', Url.mod modSlug:mod.slug @$bylineLink.html mod.name - @$byline.fadeIn duration:Duration.fast + + @show @$byline else - @$byline.fadeOut duration:Duration.fast + @hide @$byline _refreshDescription: -> description = @model.compileDescription() if description? @$descriptionPanel.html description - @$descriptionSection.slideDown duration:Duration.normal + @show @$descriptionPanel else - @$descriptionSection.slideUp duration:Duration.normal + @hide @$descriptionPanel _refreshRecipes: -> @_recipeControllers ?= [] index = 0 recipes = @model.findRecipes() - if recipes? - @$recipesSection.slideDown duration:Duration.normal + if recipes?.length > 0 @$recipesSectionTitle.html if recipes.length is 1 then 'Recipe' else 'Recipes' for recipe in @model.findRecipes() @@ -159,17 +150,18 @@ module.exports = class ItemPageController extends PageController if not controller? controller = new FullRecipeController imageLoader:@imageLoader, modPack:@modPack, model:recipe @_recipeControllers.push controller - controller.render() @$recipeContainer.append controller.$el + controller.render() else controller.model = recipe index++ + + @show @$recipesSection else - @$recipesSection.slideUp duration:Duration.normal + @hide @$recipesSection while @_recipeControllers.length > index - controller = @_recipeControllers.pop() - controller.$el.slideUp duration:Duration.normal, complete:-> controller.$el.remove() + @_recipeControllers.pop().remove() _refreshSimilarItems: -> group = @model.item?.group @@ -179,28 +171,13 @@ module.exports = class ItemPageController extends PageController else @_similarItemsController.model = null - if @_similarItemsController.model? - @$similarSection.slideDown duration:Duration.normal - else - @$similarSection.slideUp duration:Duration.normal - _refreshUsedAsToolToMake: -> @_usedAsToolToMakeController.title = 'Used as Tool to Make' - @_usedAsToolToMakeController.model = @model.findToolForRecipes() - if @_usedAsToolToMakeController.model? - @$usedAsToolToMakeSection.slideDown duration:Duration.normal - else - @$usedAsToolToMakeSection.slideUp duration:Duration.normal _refreshUsedToMake: -> @_usedToMakeController.title = 'Used to Make' - @_usedToMakeController.model = @model.findComponentInItems() - if @_usedToMakeController.model? - @$usedToMakeSection.slideDown duration:Duration.normal - else - @$usedToMakeSection.slideUp duration:Duration.normal _refreshVideos: -> @_videoControllers ?= [] @@ -208,7 +185,6 @@ module.exports = class ItemPageController extends PageController videos = @model?.item?.videos or [] if videos? and videos.length > 0 - @$videosSection.slideDown duration:Duration.normal @$videosSectionTitle.html if videos.length is 1 then 'Video' else 'Videos' for video in videos @@ -221,12 +197,13 @@ module.exports = class ItemPageController extends PageController else controller.model = video index++ + + @show @$videosSection else - @$videosSection.slideUp duration:Duration.normal + @hide @$videosSection while @_videoControllers.length > index - controller = @_videoControllers.pop() - controller.$el.slideUp duration:Duration.normal, complete:-> controller.$el.remove() + @_videoControllers.pop().remove() _resolveItemSlug: -> return if @model.item? diff --git a/src/coffee/controllers/mod_controller.coffee b/src/coffee/controllers/mod_controller.coffee index 1b7604ab7..0aed937a6 100644 --- a/src/coffee/controllers/mod_controller.coffee +++ b/src/coffee/controllers/mod_controller.coffee @@ -13,6 +13,7 @@ BaseController = require './base_controller' module.exports = class ModController extends BaseController constructor: (options={})-> + if not options.model? then throw new Error 'options.model is required' options.templateName = 'mod' super options @@ -26,15 +27,10 @@ module.exports = class ModController extends BaseController super refresh: -> - if @model? - @$el.removeClass 'empty' - - @$link.attr 'href', Url.mod modSlug:@model.slug - @$logo.attr 'src', Url.modIcon modSlug:@model.slug - @$name.html @model.name - @$description.html @model.description - else - @$el.addClass 'empty' + @$link.attr 'href', Url.mod modSlug:@model.slug + @$logo.attr 'src', Url.modIcon modSlug:@model.slug + @$name.html @model.name + @$description.html @model.description # Backbone.View Overrides ###################################################################### diff --git a/src/coffee/controllers/mod_page_controller.coffee b/src/coffee/controllers/mod_page_controller.coffee index 600ca93fc..1d43805e5 100644 --- a/src/coffee/controllers/mod_page_controller.coffee +++ b/src/coffee/controllers/mod_page_controller.coffee @@ -34,9 +34,6 @@ module.exports = class ModPageController extends PageController @_effectiveModVersion = null @_groupControllers = [] - Object.defineProperties this, - effectiveModVersion: {get:@_getEffectiveModVersion} - # Event Methods ################################################################################ onVersionChanged: -> @@ -46,6 +43,21 @@ module.exports = class ModPageController extends PageController if modVersion? then modVersion.fetch() @refresh() + # Property Methods ############################################################################# + + getEffectiveModVersion: -> + return @_effectiveModVersion if @_effectiveModVersion? + return null unless @model? + + modVersion = @model.activeModVersion + modVersion ?= @model.getModVersion Mod.Version.Latest + modVersion.fetch() if modVersion? + + return modVersion + + Object.defineProperties @prototype, + effectiveModVersion: {get:@prototype.getEffectiveModVersion} + # PageController Overrides ##################################################################### getTitle: -> @@ -56,34 +68,35 @@ module.exports = class ModPageController extends PageController onDidRender: -> @adsenseController = @addChild AdsenseController, '.view__adsense', model:'sidebar_skyscraper' - @$name = @$('.name') - @$byline = @$('.byline p') - @$description = @$('.description p') - @$documentationLink = @$('.documentation') - @$downloadLink = @$('.download') - @$homePageLink = @$('.homePage') - @$groupContainer = @$('.itemGroups') - @$titleImage = @$('.titleImage img') - @$tutorialsSection = @$('.tutorials') - @$tutorialsContainer = @$('.tutorials .panel') - @$versionSelector = @$('select.version') + @$name = @$('.name') + @$byline = @$('.byline p') + @$description = @$('.description p') + @$documentationLink = @$('.documentation') + @$downloadLink = @$('.download') + @$homePageLink = @$('.homePage') + @$groupContainer = @$('.itemGroups') + @$titleImage = @$('.titleImage img') + @$titleImageContainer = @$('.titleImage') + @$tutorialsSection = @$('.tutorials') + @$tutorialsContainer = @$('.tutorials .panel') + @$versionSelector = @$('select.version') super refresh: -> - if @model? - @$name.html @model.name + if @model?.isLoaded and @effectiveModVersion?.isLoaded @$byline.html "by #{@model.author}" - @$titleImage.attr 'src', Url.modIcon modSlug:@model.slug @$description.html @model.description + @$name.html @model.name + @$titleImage.attr 'src', Url.modIcon modSlug:@model.slug - @$el.slideDown duration:Duration.normal + @show() else - @$el.slideUp duration:Duration.normal + @hide() - @_refreshLink @$homePageLink, @model.homePageUrl - @_refreshLink @$documentationLink, @model.documentationUrl - @_refreshLink @$downloadLink, @model.downloadUrl + @_refreshLink @$homePageLink, @model?.homePageUrl + @_refreshLink @$documentationLink, @model?.documentationUrl + @_refreshLink @$downloadLink, @model?.downloadUrl @_refreshItemGroups() @_refreshTutorials() @@ -97,33 +110,25 @@ module.exports = class ModPageController extends PageController # Private Methods ############################################################################## - _getEffectiveModVersion: -> - return @_effectiveModVersion if @_effectiveModVersion? - return null unless @model? - - modVersion = @model.activeModVersion - modVersion ?= @model.getModVersion Mod.Version.Latest - modVersion.fetch() if modVersion? - - return modVersion - _refreshItemGroups: -> + @_groupControllers ?= [] groupIndex = 0 modVersion = @effectiveModVersion + if modVersion? modVersion.eachGroup (group)=> controller = @_groupControllers[groupIndex] items = modVersion.allItemsInGroup group if not controller? - title = if group is Item.Group.Other then 'Items' else group controller = new ItemGroupController imageLoader: @imageLoader model: items modPack: @modPack - title: title - controller.render() + title: if group is Item.Group.Other then 'Items' else group + + @_groupControllers.push controller @$groupContainer.append controller.$el - @_groupControllers[groupIndex] = controller + controller.render() else controller.modVersion = modVersion controller.model = items @@ -132,32 +137,28 @@ module.exports = class ModPageController extends PageController while @_groupControllers.length > groupIndex + 1 controller = @_groupControllers.pop() - controller.$el.slideUp duration:Duration.normal, complete:-> @remove() + controller.hide -> controller.$el.remove() _refreshLink: ($link, url)-> if url? - $link.slideDown duration:Duration.normal $link.attr 'href', url + $link.removeClass 'hidden' else - $link.slideUp duration:Duration.normal + $link.addClass 'hidden' _refreshTutorials: -> @_tutorialControllers ?= [] - tutorials = @model.tutorials + index = 0 + tutorials = @model.tutorials - if tutorials.length is 0 - @$tutorialsSection.addClass 'hidden' - else - @$tutorialsSection.removeClass 'hidden' - - index = 0 + if tutorials.length > 0 for tutorial in tutorials controller = @_tutorialControllers[index] if not controller? controller = new TutorialController model:tutorial - controller.render() - @$tutorialsContainer.append controller.$el @_tutorialControllers.push controller + @$tutorialsContainer.append controller.$el + controller.render() else controller.model = model @@ -165,12 +166,18 @@ module.exports = class ModPageController extends PageController while @_tutorialControllers.length > index controller = @_tutorialControllers.pop() - controller.$el.slideUp duration:Duration.normal, complete:-> @remove() + controller.hide -> controller.$el.remove() + + @show @$tutorialsSection + else + @hide @tutorialsSection _refreshVersions: -> @$versionSelector.empty() return unless @model? + @$versionSelector.removeClass 'hiding' + effectiveModVersion = @effectiveModVersion versionCount = 0 @model.eachModVersion (modVersion)=> diff --git a/src/coffee/controllers/mod_selector_controller.coffee b/src/coffee/controllers/mod_selector_controller.coffee index fb0b05b30..192f8e530 100644 --- a/src/coffee/controllers/mod_selector_controller.coffee +++ b/src/coffee/controllers/mod_selector_controller.coffee @@ -1,5 +1,5 @@ ### -Crafting Guide - mod_controller.coffee +Crafting Guide - mod_selector_controller.coffee Copyright (c) 2014-2015 by Redwood Labs All rights reserved. diff --git a/src/coffee/controllers/recipe_step_controller.coffee b/src/coffee/controllers/recipe_step_controller.coffee deleted file mode 100644 index b0705fb7e..000000000 --- a/src/coffee/controllers/recipe_step_controller.coffee +++ /dev/null @@ -1,25 +0,0 @@ -### -Crafting Guide - recipe_step_controller.coffee - -Copyright (c) 2014-2015 by Redwood Labs -All rights reserved. -### - -BaseController = require './base_controller' - -######################################################################################################################## - -module.exports = class RecipeStepController extends BaseController - - constructor: (options={})-> - if not options.model? then throw new Error 'options.model is required' - if not options.modPack? then throw new Error 'options.modPack is required' - options.templateName = 'recipe_step' - super options - - # BaseController Overrides ##################################################################### - - onDidRender: -> - @$slotImages = (@$slots.push $(el) for el in @$('.table-slot img')) - @$output = @$('.output') - super diff --git a/src/coffee/controllers/stack_controller.coffee b/src/coffee/controllers/stack_controller.coffee index 24bf71cbc..4bb8e346a 100644 --- a/src/coffee/controllers/stack_controller.coffee +++ b/src/coffee/controllers/stack_controller.coffee @@ -25,6 +25,7 @@ module.exports = class StackController extends BaseController options.editable ?= false options.onChange ?= -> # do nothing options.onRemove ?= (stack)-> # do nothing + options.tagName = 'tr' options.templateName = 'stack' super options @@ -95,6 +96,8 @@ module.exports = class StackController extends BaseController super refresh: -> + if not @model? then throw new Error "must have a model to render" + display = @modPack.findItemDisplay @model.itemSlug @_imageLoader.load display.iconUrl, @$image diff --git a/src/coffee/controllers/tutorial_page_controller.coffee b/src/coffee/controllers/tutorial_page_controller.coffee index f56c5202e..bad0687b5 100644 --- a/src/coffee/controllers/tutorial_page_controller.coffee +++ b/src/coffee/controllers/tutorial_page_controller.coffee @@ -53,64 +53,55 @@ module.exports = class TutorialPageController extends BaseController refresh: -> if @model? and @model.isLoaded - @$el.removeClass 'hidden' + @_refreshByline() + @_refreshOfficialUrl() + @_refreshSections() + @_refreshTitle() + @_refreshVideos() + + @show() else - @$el.addClass 'hidden' + @hide() - @_refreshByline() - @_refreshOfficialUrl() - @_refreshSections() - @_refreshTitle() - @_refreshVideos() super # Private Methods ############################################################################## _refreshByline: -> - if @model? - @$byline.removeClass 'hidden' - @$bylineLink.html @modPack.getMod(@modSlug).name - @$bylineLink.attr 'href', Url.mod modSlug:@modSlug - else - @$byline.addClass 'hidden' + @$bylineLink.html @modPack.getMod(@modSlug).name + @$bylineLink.attr 'href', Url.mod modSlug:@modSlug _refreshOfficialUrl: -> - if @model?.officialUrl? + if @model.officialUrl? @$officialLink.attr 'href', @model.officialUrl - @$officialLink.removeClass 'hidden' + @show @$officialLink else - @$officialLink.addClass 'hidden' + @hide @$officialLink _refreshTitle: -> - if @model? - @$title.html @model.name - @$titleImage.attr 'src', Url.tutorialIcon modSlug:@modSlug, tutorialSlug:@tutorialSlug - else - @$title.empty() - @$titleImage.removeAttr 'src' + @$title.html @model.name + @$titleImage.attr 'src', Url.tutorialIcon modSlug:@modSlug, tutorialSlug:@tutorialSlug _refreshSections: -> @_sectionControllers ?= [] index = 0 - if @model? - for section in @model.sections - controller = @_sectionControllers[index] - if not controller? - controller = new MarkdownSectionController title:section.title, model:section.content - controller.render() - @$sectionsContainer.append controller.$el - @_sectionControllers.push controller - else - controller.title = section.title - controller.model = section.model - controller.refresh() + for section in @model.sections + controller = @_sectionControllers[index] + if not controller? + controller = new MarkdownSectionController title:section.title, model:section.content + @_sectionControllers.push controller + @$sectionsContainer.append controller.$el + controller.render() + else + controller.title = section.title + controller.model = section.model + controller.refresh() - index += 1 + index += 1 while @_sectionControllers.length > index - controller = @_sectionController.pop() - controller.$el.fadeOut duration:Duration.normal, complete:-> @remove() + @_sectionController.pop().remove() _refreshVideos: -> @_videoControllers ?= [] @@ -118,7 +109,6 @@ module.exports = class TutorialPageController extends BaseController videos = @model?.videos or [] if videos? and videos.length > 0 - @$videosSection.slideDown duration:Duration.normal @$videosSectionTitle.html if videos.length is 1 then 'Video' else 'Videos' for video in videos @@ -126,17 +116,19 @@ module.exports = class TutorialPageController extends BaseController if not controller? controller = new VideoController model:video @_videoControllers.push controller - controller.render() @$videosSectionPanel.append controller.$el + controller.render() else controller.model = video - index++ + + index += 1 + + @show @$videosSection else - @$videosSection.slideUp duration:Duration.normal + @hide @$videosSection while @_videoControllers.length > index - controller = @_videoControllers.pop() - controller.$el.slideUp duration:Duration.normal, complete:-> controller.$el.remove() + @_videoControllers.pop().remove() _resolveTutorial: -> return if @model? diff --git a/src/coffee/crafting_guide_router.coffee b/src/coffee/crafting_guide_router.coffee index 6a5f3e06d..01c702e3f 100644 --- a/src/coffee/crafting_guide_router.coffee +++ b/src/coffee/crafting_guide_router.coffee @@ -163,27 +163,27 @@ module.exports = class CraftingGuideRouter extends Backbone.Router @headerController.model = page showDuration = Duration.normal - show = => + switchToNextController = (event)=> + logger.debug "show called: #{event}" @_resetGlobals() + @_controller.unrender() if @_controller? @_page = page @_controller = controller + $pageContent = $('.page') + $pageContent.attr 'class', 'page hideable hidden' + + window.scrollTo 0, 0 + controller.onWillShow() + controller.$el = $pageContent controller.render() - $pageContent = $('.page') - controller.$el.addClass 'page' - $pageContent.replaceWith controller.$el - - controller.$el.slideDown showDuration, -> - controller.onDidShow() - if @_controller? - showDuration = showDuration / 2 - @_controller.$el.slideUp showDuration, show + @_controller.hide -> switchToNextController() else - show() + switchToNextController() _resetGlobals: -> if global.env in ProductionEnvs diff --git a/src/coffee/models/mod_version.coffee b/src/coffee/models/mod_version.coffee index 3dd5bd298..564824ff3 100644 --- a/src/coffee/models/mod_version.coffee +++ b/src/coffee/models/mod_version.coffee @@ -87,6 +87,11 @@ module.exports = class ModVersion extends BaseModel # Group Methods ################################################################################ + getAllGroups: -> + result = [] + @eachGroup (group)-> result.push group + return result + eachGroup: (callback)-> groupNames = _.keys @_groups groupNames.sort (a, b)-> diff --git a/src/jade/app.jade b/src/jade/app.jade index 41e25aae1..e135d4779 100644 --- a/src/jade/app.jade +++ b/src/jade/app.jade @@ -23,7 +23,7 @@ html .content include ./includes/_header.jade - .page + .page.hideable include ./includes/_footer.jade block scripts diff --git a/src/jade/templates/browse_page.jade b/src/jade/templates/browse_page.jade index 7a2e31aa9..906c23f82 100644 --- a/src/jade/templates/browse_page.jade +++ b/src/jade/templates/browse_page.jade @@ -11,4 +11,4 @@ .mainBody h2: p Active Mods - .mods \ No newline at end of file + .mods diff --git a/src/jade/templates/crafting_table.jade b/src/jade/templates/crafting_table.jade index 0f517f8c2..b4aefa5d0 100644 --- a/src/jade/templates/crafting_table.jade +++ b/src/jade/templates/crafting_table.jade @@ -15,5 +15,5 @@ .view__minimal_recipe .next - .problem + .problem.hideable a report a problem diff --git a/src/jade/templates/feedback.jade b/src/jade/templates/feedback.jade index f509949f5..9ffaa006a 100644 --- a/src/jade/templates/feedback.jade +++ b/src/jade/templates/feedback.jade @@ -12,7 +12,7 @@ label(name="comment") Comment: textarea(name="comment") button(name="send") send - .error: p Sending failed. Please try again later. + .error.hideable.hidden: p Sending failed. Please try again later. .label img(src="/images/paper.png") diff --git a/src/jade/templates/home_page.jade b/src/jade/templates/home_page.jade index a4f1d28e6..9dd95d845 100644 --- a/src/jade/templates/home_page.jade +++ b/src/jade/templates/home_page.jade @@ -47,6 +47,26 @@ .section h2 What's new? .panel + h3 2015-03-20 + .entry + p. + Recently, I've been working on allowing mod authors to add more detail to the item pages here on + Crafting Guide. To that end, there are a couple of new features to announce. First, item detail + pages can now show text and pictures to describe the item (check out the Assembly Table for an example). Second, mods can + now include tutorial pages containing similar text and pictures to describe tricky concepts, + complex builds, or anything else their mod has to offer (see Gates, Wires, and Chips for an + example). Finally, both item pages and tutorial pages can display a list of YouTube videos. Only + a few pages in the Buildcraft section have been updated so far, but keep an eye out for + more to come! + p. + And... the second piece of news is that Crafting Guide now supports Thermal Dynamics! This mod is an off-shoot from Thermal Expansion which contains all the ducts (item, fluid + and redstone flux) you're used to from TE3 plus some extras both for higher capacity throughput + and combining item ducts with redstone flux ducts. + h3 2015-03-13 .entry p. @@ -126,28 +146,3 @@ | smelting ore directly in a furnace li recipes for vanilla items added by mods are now available (e.g., smelting Iron Dust into Iron | ingots) - - h3 2015-02-10 - .entry - p. - I just pushed up some fixes to avoid confusing various items of the same name from different - mods. The best example of this are the two Wrenches from Buildcraft and IC2, but there are a - bunch of others. - - h3 2015-02-09 - .entry - p. - This release fixes a number of small issues and improves performance in a number of places. Most - especially, all links within the site have been changed to update the page in place without the - need to re-download anything. This should make browsing between item pages much faster. - - h3 2015-02-08 - .entry - p. - This is the singlest largest expansion of the website yet! Each item from each mod now has its - own page! This will expand in the future, but for now this shows all the recipes for the item as - well as all the closely related items and the others items that can be made using the item. - p. - This also changes things so that links to Crafting Guide from other sites will first go to the - item's page (instead of to the crafting plan). Not to worry though... there's still a direct - link from each item to the full crafting plan for that item. diff --git a/src/jade/templates/item.jade b/src/jade/templates/item.jade index f210ca3c3..5349f8c40 100644 --- a/src/jade/templates/item.jade +++ b/src/jade/templates/item.jade @@ -5,7 +5,7 @@ //- All rights reserved. //- -.view__item +.view__item.hideable.hidden a table tr diff --git a/src/jade/templates/item_group.jade b/src/jade/templates/item_group.jade index 8c54c35c7..f8cf6d549 100644 --- a/src/jade/templates/item_group.jade +++ b/src/jade/templates/item_group.jade @@ -5,6 +5,6 @@ //- All rights reserved. //- -.view__item_group.section +.view__item_group.section.hideable.hidden h2 .panel diff --git a/src/jade/templates/item_page.jade b/src/jade/templates/item_page.jade index 15fed1421..926336450 100644 --- a/src/jade/templates/item_page.jade +++ b/src/jade/templates/item_page.jade @@ -8,7 +8,7 @@ .view__item_page .sidebar .titleImage: a: img - a.officialPage.externalLink(target="new"): p Offical Documentation + a.officialPage.externalLink.hideable.hidden(target="new"): p Offical Documentation button.large.craftingPlan See Crafting Plan @@ -16,22 +16,22 @@ .mainBody h1.name - .byline: p from + .byline.hideable.hidden: p from - .recipes.section + .recipes.section.hideable.hidden h2 Recipes .panel - .description.section + .description.section.hideable.hidden h2 Description .panel.markdown - .videos.section + .videos.section.hideable.hidden h2 Videos .panel - .usedToMake: .view__item_group + .view__item_group.usedToMake - .usedAsToolToMake: .view__item_group + .view__item_group.usedAsToolToMake - .similar: .view__item_group + .view__item_group.similar diff --git a/src/jade/templates/mod_page.jade b/src/jade/templates/mod_page.jade index f0145fdc3..2af6057cf 100644 --- a/src/jade/templates/mod_page.jade +++ b/src/jade/templates/mod_page.jade @@ -9,9 +9,9 @@ .sidebar .titleImage: a: img select.version - a.homePage.externalLink(target="new"): p Offical Home Page - a.documentation.externalLink(target="new"): p Documentation - a.download.externalLink(target="new"): p Download + a.homePage.externalLink.hideable.hidden(target="new"): p Offical Home Page + a.documentation.externalLink.hideable.hidden(target="new"): p Documentation + a.download.externalLink.hideable.hidden(target="new"): p Download .view__adsense @@ -20,7 +20,7 @@ .byline: p .description: p - .tutorials.section + .tutorials.section.hideable.hidden h2 Tutorials .panel diff --git a/src/jade/templates/tutorial_page.jade b/src/jade/templates/tutorial_page.jade index d3076229c..059a7a9b4 100644 --- a/src/jade/templates/tutorial_page.jade +++ b/src/jade/templates/tutorial_page.jade @@ -8,7 +8,7 @@ .view__tutorial_page .sidebar .titleImage: a: img - a.officialPage.externalLink(target="new"): p Offical Documentation + a.officialPage.externalLink.hideable.hidden(target="new"): p Offical Documentation .view__adsense @@ -18,6 +18,6 @@ .sections - .videos.section + .videos.section.hideable.hidden h2 .panel diff --git a/src/scss/classes.scss b/src/scss/classes.scss index c797e935b..74d7a4f7f 100644 --- a/src/scss/classes.scss +++ b/src/scss/classes.scss @@ -32,11 +32,20 @@ All rights reserved. .error-new { background: $color-error-new !important; } -.hidden { - max-height: 0; +.hideable { + opacity: 1; + transition: opacity $animate-normal; +} + +.hiding { opacity: 0; } +.hidden { + opacity: 0; + display: none; +} + .mainBody { position: relative; width: 81.25%; @@ -67,7 +76,6 @@ All rights reserved. .externalLink { position: relative; width: 80%; margin: 0.5em 10%; - display: none; p { font-family: $font-family-normal; @@ -104,8 +112,6 @@ All rights reserved. } .videos { - display: none; - .panel { text-align: center; } diff --git a/src/scss/main.scss b/src/scss/main.scss index 02618d70c..3f721b288 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -28,9 +28,9 @@ All rights reserved. // Animation Speeds //////////////////////////////////////////////////////////////////////////////// -$animate-fast: 0.1s; -$animate-normal: 0.25s; -$animate-slow: 0.6s; +$animate-fast: 0.200s; +$animate-normal: 0.400s; +$animate-slow: 1.200s; // Font Faces ////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/scss/templates/item_page.scss b/src/scss/templates/item_page.scss index 2780a09d7..3ad6ee155 100644 --- a/src/scss/templates/item_page.scss +++ b/src/scss/templates/item_page.scss @@ -6,18 +6,12 @@ All rights reserved. */ .view__item_page { - display: none; - & > div { vertical-align: top; display: inline-block; } .sidebar { - .externalLink { - display: none; - } - button.large { width: 100%; } @@ -26,7 +20,6 @@ All rights reserved. .mainBody { .recipes { - display: none; .view__full_recipe { width: 100%; @@ -37,14 +30,6 @@ All rights reserved. } } } - - .similar { - display: none; - } - - .usedToMake { - display: none; - } } .view__item { diff --git a/src/scss/templates/mod_page.scss b/src/scss/templates/mod_page.scss index 5d2670b72..baedf0f08 100644 --- a/src/scss/templates/mod_page.scss +++ b/src/scss/templates/mod_page.scss @@ -6,8 +6,6 @@ All rights reserved. */ .view__mod_page { - display: none; - & > div { vertical-align: top; display: inline-block; diff --git a/static/index.html b/static/index.html index 8edd0a96f..1268d7255 100644 --- a/static/index.html +++ b/static/index.html @@ -32,14 +32,29 @@ see full recipe lists, related items, recipes added by each tool, and even which made from the item you're looking at.

Craft any number of items from your mod pack to see a full list of raw ingredients, and recipe-by-recipe instructions on how to make everything on your list. No item is too complex, and no build is too big. -

What's new?

What's new?

2015-03-20

Recently, I've been working on allowing mod authors to add more detail to the item pages here on +Crafting Guide. To that end, there are a couple of new features to announce. First, item detail +pages can now show text and pictures to describe the item (check out the Assembly Table for an example). Second, mods can +now include tutorial pages containing similar text and pictures to describe tricky concepts, +complex builds, or anything else their mod has to offer (see Gates, Wires, and Chips for an +example). Finally, both item pages and tutorial pages can display a list of YouTube videos. Only +a few pages in the Buildcraft section have been updated so far, but keep an eye out for +more to come!

And... the second piece of news is that Crafting Guide now supports Thermal Dynamics! This mod is an off-shoot from Thermal Expansion which contains all the ducts (item, fluid +and redstone flux) you're used to from TE3 plus some extras both for higher capacity throughput +and combining item ducts with redstone flux ducts. +

2015-03-13

Happy Friday! For the weekend, you get Big Reactors! Enjoy! +

2015-03-12

Thanks to the extraordinary generosity and effort of Sheldon Griffin, Crafting Guide now supports +Forestry! Forestry is not a small mod, but he put in a huge effort, and it looks great. +If you'd like to help out too, head over to the GitHub +Wiki for full instructions: no programming required!

Also in the works is another significant expansion to the item pages. I've got the coding part +finished (you can peek at the final result here), and +now there's a lot of entering data left to be done... any volunteers? +

2015-03-09

It may seem like not much has been happening lately, but that's because all the changes have been behind the scenes, and focused on making Google happier with the site. This will make the -site show up better is search results, and will make it load a bit faster. - -As a result of this work, the site also now qualifies for AdSense. I absolutely don't want to +site show up better is search results, and will make it load a bit faster.

As a result of this work, the site also now qualifies for AdSense. I absolutely don't want to choke the site with ads as other big sites do, but it will be nice to pay the bills! -

2015-03-01

This release delivers the second major expansion of Crafting Guide! Here's the list of what's -new:

2015-02-26

This release adds a new section to the item pages called "Used as Tool to Make". The new section +

2015-03-01

This release delivers the second major expansion of Crafting Guide! Here's the list of what's +new:

  • New home page!
  • Moved the crafting planner (the old home page) to its own Craft page
  • Moved mod pack management to the new Configure page
  • Added a Browse page where you can peruse the list of supported mods

2015-02-26

This release adds a new section to the item pages called "Used as Tool to Make". The new section shows all the other items which can be made by that tool. For example, the IC2 Macerator shows a bunch of things like Iron Dust, Gold Dust, etc.

2015-02-24

This release changes the crafting page to let you modify the quantity of items in the "Items You @@ -54,19 +69,7 @@ plans don't take so long. that there are a few things you should notice:

  1. it will favor recipes which produce more of an item versus those which produce fewer (e.g., IC2 plates get made with the Block Cutter instead of the Forge Hammer)
  2. metal ingots will frequently (but not always) get crafted using 2x recipes instead of smelting ore directly in a furnace
  3. recipes for vanilla items added by mods are now available (e.g., smelting Iron Dust into Iron -ingots)

2015-02-10

I just pushed up some fixes to avoid confusing various items of the same name from different -mods. The best example of this are the two Wrenches from Buildcraft and IC2, but there are a -bunch of others. -

2015-02-09

This release fixes a number of small issues and improves performance in a number of places. Most -especially, all links within the site have been changed to update the page in place without the -need to re-download anything. This should make browsing between item pages much faster. -

2015-02-08

This is the singlest largest expansion of the website yet! Each item from each mod now has its -own page! This will expand in the future, but for now this shows all the recipes for the item as -well as all the closely related items and the others items that can be made using the item.

This also changes things so that links to Crafting Guide from other sites will first go to the -item's page (instead of to the crafting plan). Not to worry though... there's still a direct -link from each item to the full crafting plan for that item. -

2015-02-02

Crafting Guide now has support for EnderIO! I tend to add new mods in order of those with the -most votes, so remember to suggest your favorites!

+ingots)