From 5b014c9921a5add4d0e97d04ab12f6960478ab5f Mon Sep 17 00:00:00 2001 From: Andrew Miner Date: Tue, 14 Apr 2015 12:34:46 -0700 Subject: [PATCH] Redesign the crafting page This introduces the new crafting page design featuring a new vertical layout and list display of all crafting steps. It also makes it easy to move items between the have/need sections and even from each step into your inventory (causing a new crafting plan to be created which doesn't plan on making that item). * Convert the `BaseController.hide` and `show` methods to be much more robust in the use of CSS transitions (using a timer in case a transition doesn't actually fire). * Change `hide`/`show` to use events for communicating animation state instead of callbacks * Convert several controllers to fire events for communication with parent controllers instead of accepting functions. * Rewrite the `CraftPageController`, `CraftPage` model and related Jade/SCSS files to implement the new design. * Alter the `InventoryController` and `StackController` to allow a variety of action buttons, and for the events from those action buttons to bubble up to parent controllers * Add the `StepController` and its related model, template, and style sheet as part of the new craft page. * Tweak the `ItemSelectorController` and related files to allow for a variety of styles for the launcher button --- design/pages.graffle | Bin 684431 -> 684457 bytes src/coffee/constants.coffee | 51 +++-- src/coffee/controllers/base_controller.coffee | 96 +++++---- .../controllers/craft_page_controller.coffee | 204 ++++++++++++------ .../controllers/header_controller.coffee | 2 +- .../controllers/inventory_controller.coffee | 87 ++++---- .../controllers/item_group_controller.coffee | 1 - .../minimal_recipe_controller.coffee | 10 + .../controllers/mod_page_controller.coffee | 2 +- .../controllers/stack_controller.coffee | 107 +++++---- src/coffee/controllers/step_controller.coffee | 75 +++++++ src/coffee/crafting_guide_router.coffee | 4 +- src/coffee/models/craft_page.coffee | 1 + src/coffee/models/crafting_plan.coffee | 25 ++- src/coffee/models/inventory.coffee | 13 +- src/coffee/models/item_selector.coffee | 2 +- src/coffee/models/step.coffee | 35 +++ src/jade/includes/_header.jade | 2 +- src/jade/templates/craft_page.jade | 50 ++++- src/jade/templates/inventory.jade | 13 +- src/jade/templates/item.jade | 2 +- src/jade/templates/item_selector.jade | 2 - src/jade/templates/minimal_recipe.jade | 3 +- src/jade/templates/stack.jade | 13 +- src/jade/templates/step.jade | 12 ++ src/scss/classes.scss | 12 ++ src/scss/templates/craft_page.scss | 46 +++- src/scss/templates/index.scss | 1 + src/scss/templates/inventory.scss | 128 +++++------ src/scss/templates/item_selector.scss | 28 ++- src/scss/templates/minimal_recipe.scss | 15 +- src/scss/templates/mod_page.scss | 4 + src/scss/templates/stack.scss | 163 +++++++++----- src/scss/templates/step.scss | 47 ++++ static/images/arrow-left-disabled.png | Bin 282 -> 0 bytes static/images/arrow-left-hover.png | Bin 302 -> 0 bytes static/images/arrow-left.png | Bin 282 -> 0 bytes static/images/arrow-right-disabled.png | Bin 277 -> 0 bytes static/images/arrow-right-hover.png | Bin 296 -> 0 bytes static/images/arrow-right.png | Bin 280 -> 0 bytes static/images/check.png | Bin 0 -> 2570 bytes static/images/check_active.png | Bin 0 -> 2584 bytes static/images/check_disabled.png | Bin 0 -> 1817 bytes static/images/check_hover.png | Bin 0 -> 2420 bytes static/images/down.png | Bin 0 -> 2122 bytes static/images/down_active.png | Bin 0 -> 2297 bytes static/images/down_disabled.png | Bin 0 -> 1887 bytes static/images/down_hover.png | Bin 0 -> 2023 bytes static/images/question.png | Bin 0 -> 2319 bytes static/images/question_disabled.png | Bin 0 -> 1925 bytes static/images/question_hover.png | Bin 0 -> 2236 bytes static/images/remove-hover.png | Bin 921 -> 0 bytes static/images/remove.png | Bin 853 -> 2261 bytes static/images/remove_action.png | Bin 0 -> 2445 bytes static/images/remove_disabled.png | Bin 0 -> 1815 bytes static/images/remove_hover.png | Bin 0 -> 2158 bytes static/images/up.png | Bin 0 -> 2405 bytes static/images/up_active.png | Bin 0 -> 2387 bytes static/images/up_disabled.png | Bin 0 -> 1697 bytes static/images/up_hover.png | Bin 0 -> 2262 bytes static/images/wordmark.png | Bin 36148 -> 0 bytes 61 files changed, 855 insertions(+), 401 deletions(-) create mode 100644 src/coffee/controllers/step_controller.coffee create mode 100644 src/coffee/models/step.coffee create mode 100644 src/jade/templates/step.jade create mode 100644 src/scss/templates/step.scss delete mode 100644 static/images/arrow-left-disabled.png delete mode 100644 static/images/arrow-left-hover.png delete mode 100644 static/images/arrow-left.png delete mode 100644 static/images/arrow-right-disabled.png delete mode 100644 static/images/arrow-right-hover.png delete mode 100644 static/images/arrow-right.png create mode 100644 static/images/check.png create mode 100644 static/images/check_active.png create mode 100644 static/images/check_disabled.png create mode 100644 static/images/check_hover.png create mode 100644 static/images/down.png create mode 100644 static/images/down_active.png create mode 100644 static/images/down_disabled.png create mode 100644 static/images/down_hover.png create mode 100644 static/images/question.png create mode 100644 static/images/question_disabled.png create mode 100644 static/images/question_hover.png delete mode 100644 static/images/remove-hover.png create mode 100644 static/images/remove_action.png create mode 100644 static/images/remove_disabled.png create mode 100644 static/images/remove_hover.png create mode 100644 static/images/up.png create mode 100644 static/images/up_active.png create mode 100644 static/images/up_disabled.png create mode 100644 static/images/up_hover.png delete mode 100644 static/images/wordmark.png diff --git a/design/pages.graffle b/design/pages.graffle index 47e89f39ce77c761cf662af0806153f5f18cd64c..52d8de4d3eba8718d74b2d94013c5b371cede396 100644 GIT binary patch delta 14536 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 delta 14657 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 E0PdRLegFUf diff --git a/src/coffee/constants.coffee b/src/coffee/constants.coffee index eee1bdd3b..a61a8ddbe 100644 --- a/src/coffee/constants.coffee +++ b/src/coffee/constants.coffee @@ -37,32 +37,45 @@ Duration.fast = 200 Duration.normal = 400 Duration.slow = 1200 -exports.Event = Event = {} -Event.add = 'add' # collection, item... -Event.change = 'change' # model -Event.click = 'click' # event -Event.load = {} -Event.load.started = 'load:started' # controller, url -Event.load.succeeded = 'load:succeeded' # controller, book -Event.load.failed = 'load:failed' # controller, error message -Event.load.finished = 'load:finished' # controller -Event.remove = 'remove' # collection, item... -Event.request = 'request' # model -Event.route = 'route' -Event.sort = 'sort' -Event.sync = 'sync' # model, response -Event.transitionEnd = (-> +exports.Event = Event = {} +Event.add = 'add' # collection, item... +Event.animate = {} +Event.animate.hide = {} +Event.animate.hide.start = 'animate:hide:start' # controller, selector +Event.animate.hide.finish = 'animate:hide:finish' # controller, selector +Event.animate.show = {} +Event.animate.show.start = 'animate:show:start' # controller, selector +Event.animate.show.finish = 'animate:show:finish' # controller, selector +Event.button = {} +Event.button.complete = 'button:complete' # controller +Event.button.first = 'button:first' # controller, buttonType +Event.button.second = 'button:second' # controller, buttonType +Event.change = 'change' # model +Event.click = 'click' # event +Event.load = {} +Event.load.started = 'load:started' # controller, url +Event.load.succeeded = 'load:succeeded' # controller, book +Event.load.failed = 'load:failed' # controller, error message +Event.load.finished = 'load:finished' # controller +Event.remove = 'remove' # collection, item... +Event.request = 'request' # model +Event.route = 'route' +Event.sort = 'sort' +Event.sync = 'sync' # model, response +Event.transitionEnd = (-> return unless document? transitions = - 'transition': 'transitionend', - 'OTransition': 'oTransitionEnd', - 'MSTransition': 'msTransitionEnd', - 'MozTransition': 'transitionend', 'WebkitTransition': 'webkitTransitionEnd' + 'MozTransition': 'transitionend' + 'MSTransition': 'msTransitionEnd' + 'OTransition': 'oTransitionEnd' + 'transition': 'transitionend' el = document.createElement 'fakeelement' for styleName, eventName of transitions return eventName if el.style[styleName]? + + throw new Error 'cannot determine transitionEnd event' )() exports.Key = Key = {} diff --git a/src/coffee/controllers/base_controller.coffee b/src/coffee/controllers/base_controller.coffee index 2aa43fbec..52b22a748 100644 --- a/src/coffee/controllers/base_controller.coffee +++ b/src/coffee/controllers/base_controller.coffee @@ -5,22 +5,22 @@ Copyright (c) 2014-2015 by Redwood Labs All rights reserved. ### -views = require '../views' -{Event} = require '../constants' +views = require '../views' +{Duration} = require '../constants' +{Event} = require '../constants' ######################################################################################################################## module.exports = class BaseController extends Backbone.View constructor: (options={})-> - options.useAnimations ?= true @tryRefresh = _.debounce @_tryRefresh, 100 - @_model = null - @_rendered = false - @_parent = options.parent @_children = [] - @_useAnimations = options.useAnimations + @_model = null + @_parent = options.parent + @_rendered = false + @_useAnimations = options.useAnimations ?= true @_loadTemplate options.templateName super options @@ -36,33 +36,39 @@ module.exports = class BaseController extends Backbone.View @_children.push child return child - hide: (args...)-> - {$el, callback} = @_resolveShowHideArgs args + hide: ($el)-> + $el ?= @$el - $el.addClass 'hideable' unless $el.hasClass 'hideable' + if not $el.hasClass 'hideable' + $el.addClass 'hideable' + _.defer => @hide $el + return - logger.verbose => "#{this} is hiding #{$el.selector}" - if $el.hasClass('hiding') or $el.hasClass('hidden') - _.defer => callback this - else - $el.off Event.transitionEnd - $el.one Event.transitionEnd, => + if not ($el.hasClass('hiding') or $el.hasClass('hidden')) + logger.verbose => "#{this} is hiding \"#{$el.selector}\"" + @_onAnimationComplete $el, Duration.normal, => $el.addClass 'hidden' $el.removeClass 'hiding' - callback this + logger.verbose => "#{this} is finished hiding #{$el.selector}" + @trigger Event.animate.hide.finish, this, $el $el.addClass 'hiding' + @trigger Event.animate.hide.start, this, $el refresh: -> logger.verbose => "#{this} refreshing" remove: -> if @_useAnimations - @hide => + logger.verbose => "#{this} is hiding element before removing it" + @once Event.animate.hide.finish, => logger.verbose => "#{this} is removing its element from the DOM" @$el.remove() + @off() + @hide() else @$el.remove() + @off() routeLinkClick: (event)-> event.preventDefault() @@ -75,19 +81,22 @@ module.exports = class BaseController extends Backbone.View else router.navigate href, trigger:true - show: (args...)-> - {$el, callback} = @_resolveShowHideArgs args + show: ($el)-> + $el ?= @$el + $el.addClass 'hideable' - $el.addClass 'hideable' unless $el.hasClass 'hideable' + if $el.hasClass('hidden') or $el.hasClass('hiding') + logger.verbose => "#{this} is showing \"#{$el.selector}\"" - logger.verbose => "#{this} is showing #{$el.selector}" - if $el.hasClass('hiding') or $el.hasClass('hidden') - $el.off Event.transitionEnd - $el.one Event.transitionEnd, => callback this - $el.removeClass 'hiding' + @_onAnimationComplete $el, Duration.normal, => + logger.verbose => "#{this} is finished showing #{$el.selector}" + @trigger Event.animate.show.finish, this, $el + + $el.addClass 'hiding' $el.removeClass 'hidden' - else - _.defer => callback this + _.defer => + $el.removeClass 'hiding' + @trigger Event.animate.show.start, this, $el unrender: -> @undelegateEvents() @@ -164,14 +173,12 @@ module.exports = class BaseController extends Backbone.View $renderedEl = $($(@_template(data))[0]) @onWillRender() - @hide() if @_useAnimations - @unrender() + @$el.append $renderedEl.children() @$el.addClass $renderedEl.attr 'class' @$el.data $renderedEl.data() @delegateEvents() - @show() if options.show and @_useAnimations @_rendered = true @onDidRender() @@ -189,19 +196,20 @@ 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() + + _onAnimationComplete: ($el, maxDuration, callback)-> + $el ?= @$el + maxDuration ?= Duration.slow + callback ?= -> # do nothing + + $el.off Event.transitionEnd + $el.one Event.transitionEnd, callback + + # One would very much like this not to be necessary, but because of the way CSS transitions work, they are + # frequently not triggered. Rather than try to avoid the multitude of corner cases where this can happen, this + # simply sets a timer to ensure the event does eventually trigger. Since we're only listening for the first + # event, if the transition end event *did* happen, then this is a no-op. -- Andrew 2015-04-18 + setTimeout (-> $el.trigger Event.transitionEnd), maxDuration diff --git a/src/coffee/controllers/craft_page_controller.coffee b/src/coffee/controllers/craft_page_controller.coffee index 5e0b4e894..64df883b7 100644 --- a/src/coffee/controllers/craft_page_controller.coffee +++ b/src/coffee/controllers/craft_page_controller.coffee @@ -5,17 +5,13 @@ Copyright (c) 2014-2015 by Redwood Labs All rights reserved. ### -CraftingTableController = require './crafting_table_controller' -CraftPage = require '../models/craft_page' -{Event} = require '../constants' -ImageLoader = require './image_loader' -InventoryController = require './inventory_controller' -ModPackController = require './mod_pack_controller' -NameFinder = require '../models/name_finder' -PageController = require './page_controller' -Storage = require '../models/storage' -{Text} = require '../constants' -{Url} = require '../constants' +AdsenseController = require './adsense_controller' +CraftPage = require '../models/craft_page' +InventoryController = require './inventory_controller' +PageController = require './page_controller' +StepController = require './step_controller' +{Event} = require '../constants' +{Url} = require '../constants' ######################################################################################################################## @@ -24,20 +20,56 @@ module.exports = class CraftPageController extends PageController 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' + if not options.storage? then throw new Error 'options.storage is required' - options.model ?= new CraftPage modPack:options.modPack - options.storage ?= new Storage storage:window.localStorage - options.templateName = 'craft_page' + options.model ?= new CraftPage modPack:options.modPack + options.templateName = 'craft_page' super options @imageLoader = options.imageLoader @modPack = options.modPack @storage = options.storage + @model.plan.on Event.change, => @refresh() + # Event Methods ################################################################################ - onToolsBoxToggled: -> - @model.plan.includingTools = @$('.includeTools:checked').length isnt 0 + onCraftTool: (itemSlug)-> + # TODO: implement this + + onHaveInventoryChanged: -> + @storage.store 'crafting-plan:have', @model.plan.have.unparse() + + onMoveNeedToHave: (itemSlug)-> + quantity = @model.plan.need.quantityOf itemSlug + @model.plan.have.add itemSlug, quantity + @_saveHaveInventory() + + onRemoveFromHaveInventory: (itemSlug)-> + @model.plan.have.remove itemSlug + @onHaveInventoryChanged() + + onRemoveFromWant: (itemSlug)-> + @model.plan.want.remove itemSlug + @onWantInventoryChange() + + onStopUsingTool: (itemSlug)-> + # TODO: implement this + + onStepComplete: (stepController)-> + step = stepController.model + for stack in step.recipe.output + @model.plan.have.add stack.itemSlug, stack.quantity * step.multiplier + @onHaveInventoryChanged() + + onWantInventoryChange: -> + text = @model.plan.want.unparse() + url = Url.crafting inventoryText:text + router.navigate url + + if @model.plan.want.isEmpty + @model.plan.have.clear() + @onHaveInventoryChanged() # PageController Overrides ##################################################################### @@ -46,69 +78,105 @@ module.exports = class CraftPageController extends PageController # BaseController Overrides ##################################################################### + onDidRender: -> + @adsenseController = @addChild AdsenseController, '.view__adsense', model:'sidebar_skyscraper' + + @wantInventoryController = @addChild InventoryController, '.want .view__inventory', + imageLoader: @imageLoader + isAcceptable: (item)=> item.isCraftable + model: @model.plan.want + modPack: @modPack + firstButtonType: 'remove' + @wantInventoryController.on Event.button.first, (c, s)=> @onRemoveFromWant(s) + @wantInventoryController.on Event.change, (c)=> @onWantInventoryChange() + + # @toolsInUseController = @addChild InventoryController, '.tools .view__inventory', + # imageLoader: @imageLoader + # model: @model.plan.toolsInUse + # modPack: @modPack + # firstButtonType: 'down' + # secondButtonType: 'up' + # @toolsInUseController.on Event.button.first, (c, s)=> @onStopUsingTool(s) + # @toolsInUseController.of Event.button.second, (c, s)=> @onCraftTool(s) + + @haveInventoryController = @addChild InventoryController, '.have .view__inventory', + imageLoader: @imageLoader + model: @model.plan.have + modPack: @modPack + firstButtonType: 'down' + @haveInventoryController.on Event.button.first, (c, s)=> + @onRemoveFromHaveInventory(s) + @haveInventoryController.on Event.change, (c)=> @onHaveInventoryChanged() + + @needInventoryController = @addChild InventoryController, '.need .view__inventory', + editable: false + imageLoader: @imageLoader + model: @model.plan.need + modPack: @modPack + firstButtonType: 'up' + @needInventoryController.on Event.button.first, (c, s)=> @onMoveNeedToHave(s) + + @$instructionsSection = @$('.instructions.section') + @$makeSection = @$('.make.section') + @$toolsSection = @$('.tools.section') + @$ingredientsSection = @$('.ingredients.section') + @$stepsSection = @$('.steps.section') + @$stepsContainer = @$('.steps.section .panel') + + super + onWillRender: -> - @storage.register 'crafting-plan', @model.plan, 'includingTools' @model.plan.have.clear() @model.plan.have.parse @storage.load('crafting-plan:have') super - onDidRender: -> - @wantController = @addChild InventoryController, '.want', - editable: true - icon: '/images/fishing_rod.png' - imageLoader: @imageLoader - isAcceptable: (item)-> item.isCraftable - model: @model.plan.want - modPack: @model.modPack - onChange: => @_updateLocation() - title: 'Items you want' - - @haveController = @addChild InventoryController, '.have', - editable: true, - imageLoader: @imageLoader - model: @model.plan.have - modPack: @model.modPack - onChange: => @_saveHaveInventory() - title: 'Items you have' - - @needController = @addChild InventoryController, '.need', - editable: false - icon: '/images/boots.png' - imageLoader: @imageLoader - model: @model.plan.need - modPack: @model.modPack - title: "Items you'll need" - - @craftingTableController = @addChild CraftingTableController, '.view__crafting_table', - imageLoader: @imageLoader - model: @model.table - modPack: @model.modPack - - @$('.want .toolbar').append '' - @$includeToolsBox = @$('.includeTools') - - super - refresh: -> - if @model.plan.includingTools - @$includeToolsBox.attr 'checked', 'checked' - else - @$includeToolsBox.removeAttr 'checked' - + @_refreshSectionVisibility() + @_refreshSteps() super - # Backbone.View Overrides ###################################################################### + # Backbone.View Overrides ######################################################################## events: -> return _.extend super, - 'change .includeTools': 'onToolsBoxToggled' + 'click .instructions a': 'routeLinkClick' - # Private Methods ############################################################################## + # Private Methods ################################################################################ - _saveHaveInventory: -> - @storage.store 'crafting-plan:have', @model.plan.have.unparse() + _isStepCompletable: (controller)-> + return not @model.plan.want.hasAtLeast controller.model.outputItemSlug - _updateLocation: -> - text = @model.plan.want.unparse() - url = Url.crafting inventoryText:text - router.navigate url + _refreshSectionVisibility: -> + if @model.plan.want.isEmpty + for $el in [@$toolsSection, @$ingredientsSection, @$stepsSection] + @hide $el + @show @$instructionsSection + else + for $el in [@$toolsSection, @$ingredientsSection, @$stepsSection] + @show $el + @hide @$instructionsSection + + _refreshSteps: -> + @_stepControllers ?= [] + index = 0 + + for step in @model.plan.steps + controller = @_stepControllers[index] + if not controller? + controller = new StepController + canComplete: (controller)=> @_isStepCompletable(controller) + imageLoader: @imageLoader + model: step + modPack: @modPack + controller.on Event.button.complete, (c)=> @onStepComplete(c) + controller.render() + + @$stepsContainer.append controller.$el + @_stepControllers.push controller + else + controller.model = step + + index += 1 + + while @_stepControllers.length > index + @_stepControllers.pop().remove() diff --git a/src/coffee/controllers/header_controller.coffee b/src/coffee/controllers/header_controller.coffee index 4eaf010e8..3507cced5 100644 --- a/src/coffee/controllers/header_controller.coffee +++ b/src/coffee/controllers/header_controller.coffee @@ -81,7 +81,7 @@ module.exports = class HeaderController extends BaseController addThisUrl = '//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-54f3c9717b2e530d' $('body').append "" - @_itemSelector = @addChild ItemSelectorController, '.view__item_selector', + @_itemSelector = @addChild ItemSelectorController, '.view__item_selector.search', modPack: @modPack onChoseItem: (itemSlug)=> @_goToItem(itemSlug) diff --git a/src/coffee/controllers/inventory_controller.coffee b/src/coffee/controllers/inventory_controller.coffee index 1d7c9ee92..af038f077 100644 --- a/src/coffee/controllers/inventory_controller.coffee +++ b/src/coffee/controllers/inventory_controller.coffee @@ -16,6 +16,14 @@ StackController = require './stack_controller' ######################################################################################################################## +### +Events: + clear(this) + change(this) + add(this, itemSlug) + button:first(this, itemSlug) + button:second(this, itemSlug) +### module.exports = class InventoryController extends BaseController @MAX_QUANTITY = 9999 @@ -27,13 +35,16 @@ module.exports = class InventoryController extends BaseController if not options.model? then throw new Error 'options.model is required' if not options.modPack? then throw new Error 'options.modPack is required' - @editable = options.editable ?= true - @icon = options.icon ?= '/images/chest_front.png' - @imageLoader = options.imageLoader - @isAcceptable = options.isAcceptable ?= null - @modPack = options.modPack - @onChange = options.onChange ?= -> # do nothing - @title = options.title ?= 'Inventory' + @imageLoader = options.imageLoader + @modPack = options.modPack + + @editable = options.editable ?= true + @icon = options.icon ?= '/images/chest_front.png' + @firstButtonType = options.firstButtonType ?= null + @isAcceptable = options.isAcceptable ?= null + @secondButtonType = options.secondButtonType ?= null + @shouldEnableButton = options.shouldEnableButton ?= (model, button)-> true + @title = options.title ?= 'Inventory' options.templateName = 'inventory' super options @@ -46,11 +57,19 @@ module.exports = class InventoryController extends BaseController onClearButtonClicked: -> @model.clear() - @onChange() + @trigger Event.clear, this + @trigger Event.change, this + + onFirstButtonClicked: (stackController)-> + @trigger Event.button.first, this, stackController?.model?.itemSlug onItemChosen: (itemSlug)-> @model.add itemSlug, 1 - @onChange() + @trigger Event.add, this, itemSlug + @trigger Event.change, this + + onSecondButtonClicked: (stackController)-> + @trigger Event.button.second, this, stackController?.model?.itemSlug # BaseController Overrides ##################################################################### @@ -60,32 +79,23 @@ module.exports = class InventoryController extends BaseController modPack: @modPack, onChoseItem: (itemSlug)=> @onItemChosen(itemSlug) - @$clearButton = @$('button[name="clear"]') + @$clearButton = @$('button.clear') @$icon = @$('.icon') - @$editPanel = @$('.edit') - @$scrollbox = @$('.scrollbox') - @$table = @$('table') - @$toolbar = @$('.toolbar') + @$itemContainer = @$('.item_container') @$title = @$('h2 p') super refresh: -> if @editable - @show @$editPanel - @show @$toolbar, => - @$scrollbox.css bottom:@$toolbar.height() + @selector.show() else - if not @$editPanel? then throw new Error "no edit panel" - if not @$toolbar? then throw new Error "no toolbar" - @hide @$editPanel - @hide @$toolbar - @$scrollbox.css bottom:0 + @selector.hide() @$icon.attr 'src', @icon @$title.html @title + @$clearButton.disabled = @model.isEmpty @_refreshStacks() - @_refreshButtonState() super @@ -93,38 +103,37 @@ module.exports = class InventoryController extends BaseController events: -> return _.extend super, - 'click button[name="clear"]': 'onClearButtonClicked' + 'click button.clear': 'onClearButtonClicked' + 'click button.first': 'onFirstButtonClicked' + 'click button.second': 'onSecondButtonClicked' # Private Methods ############################################################################## - _refreshButtonState: -> - if @model.isEmpty then @$clearButton.attr('disabled', 'disabled') else @$clearButton.removeAttr('disabled') - _refreshStacks: -> @_stackControllers ?= [] index = 0 - $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 - onChange: @onChange - onRemove: if not @editable then null else (stack)=> @_removeStack(stack) + editable: @editable + firstButtonType: @firstButtonType + imageLoader: @imageLoader + model: stack + modPack: @modPack + secondButtonType: @secondButtonType + shouldEnableButton: @shouldEnableButton + controller.on Event.change, => @trigger Event.change, this + controller.on Event.button.first, (c)=> @onFirstButtonClicked(c) + controller.on Event.button.second, (c)=> @onSecondButtonClicked(c) + controller.render() @_stackControllers.push controller - controller.$el.insertBefore $lastRow - controller.render() + @$itemContainer.append controller.$el 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 2210c9872..be11c7238 100644 --- a/src/coffee/controllers/item_group_controller.coffee +++ b/src/coffee/controllers/item_group_controller.coffee @@ -65,7 +65,6 @@ module.exports = class ItemGroupController extends BaseController _refreshItems: -> @_itemControllers ?= [] controllerIndex = 0 - delay = 0 for item in @model controller = @_itemControllers[controllerIndex] diff --git a/src/coffee/controllers/minimal_recipe_controller.coffee b/src/coffee/controllers/minimal_recipe_controller.coffee index 7d7ab0c8f..b6067c608 100644 --- a/src/coffee/controllers/minimal_recipe_controller.coffee +++ b/src/coffee/controllers/minimal_recipe_controller.coffee @@ -24,6 +24,7 @@ module.exports = class MinimalRecipeController extends BaseController @imageLoader = options.imageLoader @modPack = options.modPack + @multiplier = options.multiplier ?= null # BaseController Overrides ##################################################################### @@ -36,6 +37,7 @@ module.exports = class MinimalRecipeController extends BaseController imageLoader: @imageLoader modPack: @modPack + @$multiplier = @$('.multiplier') @$outputImg = @$('.output img') @$outputLink = @$('.output a') @$outputQuantity = @$('.quantity') @@ -46,6 +48,8 @@ module.exports = class MinimalRecipeController extends BaseController @gridController.model = @model @outputSlotController.model = @model?.output?[0] @$el.tooltip show:{delay:Duration.snap, duration:Duration.fast} + + @_refreshMultiplier() @_refreshTools() super @@ -57,6 +61,12 @@ module.exports = class MinimalRecipeController extends BaseController # Private Methods ############################################################################## + _refreshMultiplier: -> + if @multiplier? and @multiplier > 1 + @$multiplier.html "x#{@multiplier}" + else + @$multiplier.html '' + _refreshTools: -> @$toolContainer.empty() return unless @model? diff --git a/src/coffee/controllers/mod_page_controller.coffee b/src/coffee/controllers/mod_page_controller.coffee index f036d78a9..68a7f5198 100644 --- a/src/coffee/controllers/mod_page_controller.coffee +++ b/src/coffee/controllers/mod_page_controller.coffee @@ -159,7 +159,7 @@ module.exports = class ModPageController extends PageController @$tutorialsContainer.append controller.$el controller.render() else - controller.model = model + controller.model = tutorial index += 1 diff --git a/src/coffee/controllers/stack_controller.coffee b/src/coffee/controllers/stack_controller.coffee index 81fd7d978..840c600a1 100644 --- a/src/coffee/controllers/stack_controller.coffee +++ b/src/coffee/controllers/stack_controller.coffee @@ -6,13 +6,20 @@ All rights reserved. ### BaseController = require './base_controller' +ImageLoader = require './image_loader' {Duration} = require '../constants' {Event} = require '../constants' -ImageLoader = require './image_loader' {Key} = require '../constants' ######################################################################################################################## +### +Events: + change(this) + change:quantity(this, oldQuantity, newQuantity) + button:first(this, type) + button:second(this, type) +### module.exports = class StackController extends BaseController @MAX_QUANTITY = 9999 @@ -22,60 +29,67 @@ module.exports = class StackController extends BaseController 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.editable ?= false - options.onChange ?= -> # do nothing - options.onRemove ?= (stack)-> # do nothing - options.tagName = 'tr' options.templateName = 'stack' super options - @editable = options.editable - @modPack = options.modPack - @onChange = options.onChange - @onRemove = options.onRemove - @_imageLoader = options.imageLoader + @editable = options.editable ?= false + @firstButtonType = options.firstButtonType ?= null + @imageLoader = options.imageLoader + @modPack = options.modPack + @secondButtonType = options.secondButtonType ?= null + @shouldEnableButton = options.shouldEnableButton ?= (model, button)-> true @modPack.on Event.change, => @tryRefresh() # Event Methods ################################################################################ + onFirstButtonClicked: (event)-> + @trigger Event.button.first, this, @firstButtonType + return false + onQuantityFieldBlur: -> return unless @editable + @$bubble.removeClass 'editing' + + oldQuantity = @_priorValue quantityText = @$quantityField.val().trim() if quantityText.length is 0 - quantity = @_priorValue + newQuantity = oldQuantity else if not quantityText.match /^[0-9]*$/ - quantity = 1 + newQuantity = 1 else - quantity = parseInt quantityText, 10 - if _.isNaN quantity then quantity = 1 + newQuantity = parseInt quantityText, 10 + if _.isNaN newQuantity then newQuantity = 1 - quantity = Math.min quantity, StackController.MAX_QUANTITY - quantity = Math.max 1, quantity + newQuantity = Math.min newQuantity, StackController.MAX_QUANTITY + newQuantity = Math.max 1, newQuantity - if quantity? - @$quantityField.val "#{quantity}" - @$quantityField.removeClass 'error', Duration.snap - @$quantityField.removeClass 'error-new', Duration.snap + if newQuantity? and newQuantity isnt oldQuantity + @$quantityField.val "#{newQuantity}" + @$bubble.removeClass 'error', Duration.snap + @$bubble.removeClass 'error-new', Duration.snap - @model.quantity = quantity - @onChange() + @model.quantity = newQuantity + @trigger Event.change + ':quantity', this, oldQuantity, newQuantity + @trigger Event.change, this onQuantityFieldChanged: -> return unless @editable quantityText = @$quantityField.val().trim() if not quantityText.match /^[0-9]*$/ - @$quantityField.addClass 'error', 0 - @$quantityField.addClass 'error-new', 0 - @$quantityField.removeClass 'error-new', Duration.fast + @$bubble.addClass 'error', 0 + @$bubble.addClass 'error-new', 0 + @$bubble.removeClass 'error-new', Duration.fast else - @$quantityField.removeClass 'error', Duration.snap - @$quantityField.removeClass 'error-new', Duration.snap + @$bubble.removeClass 'error', Duration.snap + @$bubble.removeClass 'error-new', Duration.snap onQuantityFieldFocused: -> + if @editable + @$bubble.addClass 'editing' @_priorValue = @model.quantity @$quantityField.val '' else @@ -87,18 +101,20 @@ module.exports = class StackController extends BaseController if event.which is Key.Return @$quantityField.blur() - onRemoveClicked: -> - @onRemove @model - @onChange() + onSecondButtonClicked: (event)-> + event.preventDefault() + @trigger Event.button.second, this, @secondButtonType # BaseController Overrides ##################################################################### onDidRender: -> @$action = @$('.action') + @$bubble = @$('.bubble') + @$firstButton = @$('button.first') @$image = @$('.icon img') @$nameLink = @$('.name a') @$quantityField = @$('.quantity input') - @$removeButton = @$('button.remove') + @$secondButton = @$('button.second') super refresh: -> @@ -106,19 +122,23 @@ module.exports = class StackController extends BaseController display = @modPack.findItemDisplay @model.itemSlug - @_imageLoader.load display.iconUrl, @$image + @imageLoader.load display.iconUrl, @$image @$nameLink.html display.itemName @$nameLink.attr 'href', display.itemUrl @$quantityField.val @model.quantity + @_updateButtonType @$firstButton, @firstButtonType + @_updateButtonType @$secondButton, @secondButtonType + + @$firstButton.prop('disabled', not @shouldEnableButton(@model, 1)) if @firstButtonType? + @$secondButton.prop('disabled', not @shouldEnableButton(@model, 2)) if @secondButtonType? + if @editable @$quantityField.removeAttr 'readonly' - @$quantityField.addClass 'editable' + @$bubble.addClass 'editable' else @$quantityField.attr 'readonly', 'readonly' - @$quantityField.removeClass 'editable' - - @$action.css display:(if @editable then 'table-cell' else 'none') + @$bubble.removeClass 'editable' super @@ -127,8 +147,21 @@ module.exports = class StackController extends BaseController events: -> return _.extend super, 'blur .quantity input': 'onQuantityFieldBlur' - 'click button.remove': 'onRemoveClicked' 'click .name a': 'routeLinkClick' + 'click button.first': 'onFirstButtonClicked' + 'click button.second': 'onSecondButtonClicked' 'focus .quantity input': 'onQuantityFieldFocused' 'input .quantity input': 'onQuantityFieldChanged' 'keyup .quantity input': 'onQuantityKeyUp' + + # Private Methods ############################################################################## + + _updateButtonType: ($button, type)-> + for currentType in ['check', 'down', 'remove', 'up'] + $button.removeClass currentType + + if type? + $button.css 'display', null + $button.addClass type + else + $button.css 'display', 'none' diff --git a/src/coffee/controllers/step_controller.coffee b/src/coffee/controllers/step_controller.coffee new file mode 100644 index 000000000..91fa73093 --- /dev/null +++ b/src/coffee/controllers/step_controller.coffee @@ -0,0 +1,75 @@ +### +Crafting Guide - step_controller.coffee + +Copyright (c) 2015 by Redwood Labs +All rights reserved. +### + +BaseController = require './base_controller' +InventoryController = require './inventory_controller' +MinimalRecipeController = require './minimal_recipe_controller' +{Event} = require '../constants' + +######################################################################################################################## + +module.exports = class StepController 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' + if not options.imageLoader? then throw new Error 'options.imageLoader is required' + options.templateName = 'step' + super options + + @canComplete = options.canComplete or (controller)-> true + @imageLoader = options.imageLoader + @modPack = options.modPack + + # Event Methods ################################################################################ + + onCompleteButtonClicked: (event)-> + event.preventDefault() + @trigger Event.button.complete, this + + # BaseController Overrides ##################################################################### + + onDidRender: -> + @inventoryController = @addChild InventoryController, '.view__inventory', + editable: false + imageLoader: @imageLoader + model: @model.inventory + modPack: @modPack + + @recipeController = @addChild MinimalRecipeController, '.view__minimal_recipe', + imageLoader: @imageLoader + model: @model.recipe + modPack: @modPack + + @$header = @$('h3') + @$completeButton = @$('button.complete') + super + + onWillChangeModel: (oldModel, newModel)-> + if not newModel? then throw new Error 'model cannot be null' + return super + + refresh: -> + itemDisplay = @modPack.findItemDisplay @model.outputItemSlug + @$header.html "#{@model.number}. #{itemDisplay.itemName}" + + @inventoryController.model = @model.inventory + @recipeController.model = @model.recipe + @recipeController.multiplier = @model.multiplier + + if @canComplete(this) + @$completeButton.removeProp 'disabled' + else + @$completeButton.prop 'disabled', true + + super + + # Backbone.View Overrides ###################################################################### + + events: -> + return _.extend super, + 'click button.complete': 'onCompleteButtonClicked' diff --git a/src/coffee/crafting_guide_router.coffee b/src/coffee/crafting_guide_router.coffee index 9c61c4821..ba4770cca 100644 --- a/src/coffee/crafting_guide_router.coffee +++ b/src/coffee/crafting_guide_router.coffee @@ -224,9 +224,11 @@ module.exports = class CraftingGuideRouter extends Backbone.Router controller.onWillShow() controller.$el = $pageContent controller.render() + controller.show() if @_controller? - @_controller.hide -> switchToNextController() + @_controller.once Event.animate.hide.finish, switchToNextController + @_controller.hide() else switchToNextController() diff --git a/src/coffee/models/craft_page.coffee b/src/coffee/models/craft_page.coffee index 2fafb162d..403e58825 100644 --- a/src/coffee/models/craft_page.coffee +++ b/src/coffee/models/craft_page.coffee @@ -25,6 +25,7 @@ module.exports = class CraftPage extends BaseModel @modPack.on Event.change, => @_consumeParams() @on Event.change + ':params', => @_consumeParams() + @plan.on Event.change, => @trigger Event.change, this # Private Methods ############################################################################## diff --git a/src/coffee/models/crafting_plan.coffee b/src/coffee/models/crafting_plan.coffee index 693ead03f..5c6b49114 100644 --- a/src/coffee/models/crafting_plan.coffee +++ b/src/coffee/models/crafting_plan.coffee @@ -6,9 +6,10 @@ All rights reserved. ### BaseModel = require './base_model' -{Event} = require '../constants' Inventory = require './inventory' ItemSlug = require './item_slug' +Step = require './step' +{Event} = require '../constants' ######################################################################################################################## @@ -26,7 +27,7 @@ module.exports = class CraftingPlan extends BaseModel recraft = _.debounce (=> @craft()), 100 for inventory in [@have, @want] - inventory.on 'change', recraft + inventory.on Event.change, recraft @on Event.change + ':includingTools', recraft @@ -140,7 +141,7 @@ module.exports = class CraftingPlan extends BaseModel @_findSteps inputStack.itemSlug, parentSteps logger.verbose -> "adding step for: #{recipe.slug}" - @steps[recipe.slug] = recipe:recipe, itemSlug:item.slug + @steps[recipe.slug] = new Step outputItemSlug:item.slug, recipe:recipe foundValidRecipe = true break catch error @@ -166,16 +167,26 @@ module.exports = class CraftingPlan extends BaseModel return itemSlug _removeExtraSteps: -> - result = (step for step in @steps when step.multiplier > 0) + result = [] + + number = 1 + for step in @steps + if step.multiplier > 0 + result.push step + step.number = number + number += 1 + @steps = result _resolveNeeds: -> for i in [@steps.length-1..0] by -1 step = @steps[i] - recipe = step.recipe - outputQuantity = recipe.getQuantityProducedOf step.itemSlug + step.number = i + 1 - step.multiplier = Math.ceil(@need.quantityOf(step.itemSlug) / outputQuantity) + recipe = step.recipe + outputQuantity = recipe.getQuantityProducedOf step.outputItemSlug + + step.multiplier = Math.ceil(@need.quantityOf(step.outputItemSlug) / outputQuantity) if @includingTools recipe.eachToolStack (stack)=> diff --git a/src/coffee/models/inventory.coffee b/src/coffee/models/inventory.coffee index 720195b2d..b6cda2e9d 100644 --- a/src/coffee/models/inventory.coffee +++ b/src/coffee/models/inventory.coffee @@ -20,9 +20,6 @@ module.exports = class Inventory extends BaseModel attributes.modPack ?= null @clear() - Object.defineProperties this, - isEmpty: { get:-> @_itemSlugs.length is 0 } - # Class Methods ################################################################################ @Delimiters = @@ -161,6 +158,14 @@ module.exports = class Inventory extends BaseModel return parts.join Inventory.Delimiters.Stack + # Property Methods ############################################################################# + + getIsEmpty: -> + return @_itemSlugs.length is 0 + + Object.defineProperties @prototype, + isEmpty: { get:@prototype.getIsEmpty } + # Object Overrides ############################################################################# toString: -> @@ -185,7 +190,7 @@ module.exports = class Inventory extends BaseModel stack = @_stacks[itemSlug] if not stack? stack = new Stack itemSlug:itemSlug, quantity:quantity - @listenTo stack, Event.change, => @trigger Event.change, stack + @listenTo stack, Event.change, => @trigger Event.change, this @_stacks[itemSlug] = stack @_itemSlugs.push itemSlug @_sort() diff --git a/src/coffee/models/item_selector.coffee b/src/coffee/models/item_selector.coffee index 38da50ab0..daaa28601 100644 --- a/src/coffee/models/item_selector.coffee +++ b/src/coffee/models/item_selector.coffee @@ -14,7 +14,7 @@ module.exports = class ItemSelector extends BaseModel constructor: (attributes={}, options={})-> if not options.modPack? then throw new Error 'options.modPack is required' - options.isAcceptable ?= (itemSlug)-> return true # accept everything by default + options.isAcceptable ?= (item)-> return true # accept everything by default super attributes, options @_isAcceptable = options.isAcceptable diff --git a/src/coffee/models/step.coffee b/src/coffee/models/step.coffee new file mode 100644 index 000000000..087b6cac1 --- /dev/null +++ b/src/coffee/models/step.coffee @@ -0,0 +1,35 @@ +### +Crafting Guide - step.coffee + +Copyright (c) 2015 by Redwood Labs +All rights reserved. +### + +BaseModel = require './base_model' +Inventory = require './inventory' +{Event} = require '../constants' + +######################################################################################################################## + +module.exports = class Step extends BaseModel + + constructor: (attributes={}, options={})-> + if not attributes.outputItemSlug? then throw new Error 'attributes.outputItemSlug is required' + if not attributes.recipe? then throw new Error 'attributes.recipe is required' + + attributes.inventory = new Inventory + attributes.number ?= 1 + attributes.outputItemSlug ?= null + attributes.multiplier ?= 1 + attributes.recipe ?= null + super attributes, options + + @_computeInventory() + @on Event.change + ':multiplier', => @_computeInventory() + + # Private Methods ############################################################################## + + _computeInventory: -> + @inventory.clear() + @recipe.eachInputStack (stack)=> + @inventory.add stack.itemSlug, stack.quantity * @multiplier diff --git a/src/jade/includes/_header.jade b/src/jade/includes/_header.jade index cfac200e5..8f5b564e5 100644 --- a/src/jade/includes/_header.jade +++ b/src/jade/includes/_header.jade @@ -30,4 +30,4 @@ p Craft .dot - .view__item_selector: p.placeholder find an item... + .view__item_selector.search: p find an item... diff --git a/src/jade/templates/craft_page.jade b/src/jade/templates/craft_page.jade index 782e0e77a..9ca88db4c 100644 --- a/src/jade/templates/craft_page.jade +++ b/src/jade/templates/craft_page.jade @@ -6,8 +6,50 @@ //- .view__craft_page - .view__inventory.want - .view__inventory.have - .view__inventory.need + .sidebar + ins.view__adsense - .view__crafting_table + .mainBody + + .want.section + h2 Items to Make + .panel + .view__inventory.large.editable + + //- .tools.section.hideable.hidden + //- h2 Tools + //- .panel + //- .inUse + //- h3 In Use + //- .view__inventory.large + //- + //- .options + //- h3 More Options + //- .view__inventory.large + + .ingredients.section.hideable.hidden + h2 Ingredients + .panel + .have + h3 Already In Inventory + .view__inventory.large + + .need + h3 Need to Gather + .view__inventory.large + + .steps.section.hideable.hidden + h2 Steps + .panel + + .instructions.section + h2 Instructions + .panel + p. + Welcome to the Craft page. Here you can get detailed instructions for making any item in your + current mod pack (use the Configure page to change it). Making a crafting + plan is very simple: + ol + li Click the "add an item..." button to choose items to craft + li Use the button to mark any items you already possess + li Use the button to complete any step if you already have that item diff --git a/src/jade/templates/inventory.jade b/src/jade/templates/inventory.jade index 8f723066f..753d86150 100644 --- a/src/jade/templates/inventory.jade +++ b/src/jade/templates/inventory.jade @@ -6,13 +6,6 @@ //- .view__inventory - h2 - img.icon - p - .panel - .scrollbox - table - tr.edit.hideable.hidden - td.name(colspan="4", width="*"): .view__item_selector: p.button-label add an item... - .toolbar.hideable.hidden - button(name="clear") clear + .item_container + .empty_placeholder.hideable.hidden Empty + .view__item_selector.hideable.hidden.button: p add an item... diff --git a/src/jade/templates/item.jade b/src/jade/templates/item.jade index 5349f8c40..f210ca3c3 100644 --- a/src/jade/templates/item.jade +++ b/src/jade/templates/item.jade @@ -5,7 +5,7 @@ //- All rights reserved. //- -.view__item.hideable.hidden +.view__item a table tr diff --git a/src/jade/templates/item_selector.jade b/src/jade/templates/item_selector.jade index 9086bc62c..7fa9f1d6b 100644 --- a/src/jade/templates/item_selector.jade +++ b/src/jade/templates/item_selector.jade @@ -6,8 +6,6 @@ //- .view__item_selector - p.placeholder find items... - .view__item_selector_popup.hideable.hiding .search input diff --git a/src/jade/templates/minimal_recipe.jade b/src/jade/templates/minimal_recipe.jade index 56dcf94bf..63f010f22 100644 --- a/src/jade/templates/minimal_recipe.jade +++ b/src/jade/templates/minimal_recipe.jade @@ -7,6 +7,7 @@ .view__minimal_recipe .input - table.view__crafting_grid + .view__crafting_grid .tool .output.view__slot + .multiplier \ No newline at end of file diff --git a/src/jade/templates/stack.jade b/src/jade/templates/stack.jade index 8909aaa0f..3c8b64020 100644 --- a/src/jade/templates/stack.jade +++ b/src/jade/templates/stack.jade @@ -5,9 +5,10 @@ //- All rights reserved. //- -tr.view__stack - td.quantity: input - td.icon: img(src='') - td.name(width='*'): a - td.action - button.remove   +.view__stack + .quantity: .bubble: input + .icon: img(src='') + .name: a + .action + button.second   + button.first   diff --git a/src/jade/templates/step.jade b/src/jade/templates/step.jade new file mode 100644 index 000000000..00e9cb3a7 --- /dev/null +++ b/src/jade/templates/step.jade @@ -0,0 +1,12 @@ +//- +//- Crafting Guide - step.jade +//- +//- Copyright (c) 2015 by Redwood Labs +//- All rights reserved. +//- + +.view__step + h3 + .view__inventory + .view__minimal_recipe + button.complete diff --git a/src/scss/classes.scss b/src/scss/classes.scss index 455660243..88f21d5da 100644 --- a/src/scss/classes.scss +++ b/src/scss/classes.scss @@ -101,12 +101,20 @@ All rights reserved. font-family: $font-family-header; font-size: $font-size-large; margin-bottom: 0.5em; + + &:first-child { + margin-top: 0; + } } h3 { font-family: $font-family-header; font-size: $font-size-normal; margin: 2em 0 0 0.5em; + + &:first-child { + margin-top: 0; + } } .entry { @@ -118,6 +126,10 @@ All rights reserved. background: white; padding: 1em; } + + &:first-child { + margin-top: 0; + } } .slideable { diff --git a/src/scss/templates/craft_page.scss b/src/scss/templates/craft_page.scss index c0516e680..ac2464b3f 100644 --- a/src/scss/templates/craft_page.scss +++ b/src/scss/templates/craft_page.scss @@ -7,20 +7,44 @@ All rights reserved. .view__craft_page { - & > div { - display: inline-block; - margin-top: 2em; - padding: 0 2em; - position: relative; - vertical-align: top; + .want.section { + .view__inventory { + position: relative; width: 100%; + } } - .view__inventory { width: 50%; height: 30em; } + .tools.section { + .options { + margin-top: 4em; + } + } - .view__crafting_table { width: 50%; height: 30em; } + .ingredients.section { + .need { + margin-top: 4em; + } + } - .want label { - position: absolute; top: 50%; left: 0.5em; - @include transform(translateY(-50%)); + .instructions.section { + p { + font-size: $font-size-large; + margin-top: 1em; + + &:first-child { + margin-top: 0; + } + } + + ol { + margin: 2em 3em 0 3em; + + li { + font-family: $font-family-normal; + font-size: $font-size-large; + line-height: $font-size-normal + 0.15em; + list-style: decimal; + margin: 0.66em 0 0 2em; + } + } } } diff --git a/src/scss/templates/index.scss b/src/scss/templates/index.scss index a77181d75..2bd749953 100644 --- a/src/scss/templates/index.scss +++ b/src/scss/templates/index.scss @@ -27,5 +27,6 @@ All rights reserved. @import 'mod_selector'; @import 'stack'; @import 'slot'; +@import 'step'; @import 'tutorial'; @import 'video'; diff --git a/src/scss/templates/inventory.scss b/src/scss/templates/inventory.scss index cff7a1d0e..9521b4b0e 100644 --- a/src/scss/templates/inventory.scss +++ b/src/scss/templates/inventory.scss @@ -6,92 +6,72 @@ All rights reserved. */ .view__inventory { - min-height: 14em; - width: 100%; - .edit td { - padding-top: 1em; - } + .item_container { + position: relative; width: 100%; - .panel { - position: absolute; top: 3.6em; right: 2em; bottom: 0; left: 2em; - background: $color-background-panel; - text-align: right; - } + .view__stack > div { + height: 4.2em; + padding: 0 1em 0.5em 0; + vertical-align: middle; - .scrollbox { - position: absolute; top: 0em; right: 0em; bottom: 3em; left: 0em; - padding: 0.5em 1em; - overflow: auto; - } - - .toolbar { - position: absolute; right: 0; bottom: 0; left: 0; height: 3.5em; - background: $color-background-toolbar; - border-top: 1px solid $color-gray-light; - } - - .view__item_selector { - height: 2.5em; width: 80%; - background: $color-gray-faint; - margin: 0 auto; - - transition: background $animate-normal; - - &:hover { - background: $color-background-panel; + &:last-child { + padding: 0 0 0.5em 0; + } } - } - button[name="clear"] { - position: absolute; bottom: 0.5em; right: 0.5em; - } - - input { - border: 1px solid $color-gray-light; - } - - button:disabled { - background: white; - color: $color-gray-light; - } - - table { - width: 100%; - } - - td { - height: 2.4em; - vertical-align: middle; - } - - td.icon { - width: 4.8em; - padding: 0 1em; - - img { - width: 100%; height: auto; - max-height: 4.8em; + .icon { + img { + height: 3.6em; width: 3.6em; + } } - } - td.name { - text-align: left; - padding-right: 1em; - - input { + .name { width: 100%; - border: 0; - border-bottom: 1px dashed $color-gray-light; - outline: 0; + } - &:focus { - border: 1px solid $color-gray-light; + .action { + white-space: nowrap; + + button:first-child { + margin-right: 0.5em; } } } - td.action { - width: 4em; + .view__item_selector { + position: relative; width: 80%; + margin: 1em auto; + } + + &.large { + .item_container { + .view__stack > div { + height: 5em; + } + + .quantity { + .bubble { + border-radius: 3em; + + input { + font-size: $font-size-large; + } + } + } + + .icon { + img { + height: 4.8em; width: 4.8em; + } + } + + .name { + a { + font-size: $font-size-large; + font-weight: bold; + } + } + } } } diff --git a/src/scss/templates/item_selector.scss b/src/scss/templates/item_selector.scss index f8f9a4eb4..abd8c34f0 100644 --- a/src/scss/templates/item_selector.scss +++ b/src/scss/templates/item_selector.scss @@ -6,30 +6,42 @@ All rights reserved. */ .view__item_selector { - background: $color-background-panel; + position: relative; min-height: $font-size-normal * 2; min-width: 20em; + border: 0.1em solid $color-gray-medium; border-radius: 1.5em; cursor: pointer; padding: 0 0.75em; - p { - position: relative; top: 50%; width: 100%; - @include transform(translateY(-50%)); + &.search { + background: $color-background-panel; - &.placeholder { + p { color: $color-gray-medium; font-family: $font-family-input; - font-size: $font-size-normal; + } + } + + &.button { + background: $color-gray-faint; + + &:hover { + background: $color-background-panel; } - &.button-label { + p { color: $color-active; font-family: $font-family-normal; - font-size: $font-size-normal; font-weight: bold; text-align: center; } } + + p { + position: absolute; top: 50%; width: 100%; + @include transform(translateY(-50%)); + font-size: $font-size-normal; + } } .view__item_selector_popup { diff --git a/src/scss/templates/minimal_recipe.scss b/src/scss/templates/minimal_recipe.scss index a783e60c6..3a72470c8 100644 --- a/src/scss/templates/minimal_recipe.scss +++ b/src/scss/templates/minimal_recipe.scss @@ -44,13 +44,6 @@ All rights reserved. @include transform(translate(-50%, -50%)); } - .multiplier { - position: absolute; bottom: -2.0em; left: 0; right: 0; height: 1.5em; - font-family: $font-family-header; - font-size: $font-size-large; - text-align: center; - } - .quantity { position: absolute; right: 0.1em; bottom: 0; color: white; @@ -59,4 +52,12 @@ All rights reserved. text-shadow: -2px -2px 0 #000, 2px -2px 0 #000, -2px 2px 0 #000, 2px 2px 0 #000; } } + + .multiplier { + position: absolute; top: 50%; right: 0; width: 2.7em; + @include transform(translateY(-50%) translateY(2.5em)); + font-family: $font-family-header; + font-size: $font-size-large; + text-align: center; + } } diff --git a/src/scss/templates/mod_page.scss b/src/scss/templates/mod_page.scss index baedf0f08..9550f6b5d 100644 --- a/src/scss/templates/mod_page.scss +++ b/src/scss/templates/mod_page.scss @@ -29,6 +29,10 @@ All rights reserved. font-size: $font-size-large; } } + + .itemGroups { + margin-top: 2em; + } } .view__item { diff --git a/src/scss/templates/stack.scss b/src/scss/templates/stack.scss index c608259a4..20e946562 100644 --- a/src/scss/templates/stack.scss +++ b/src/scss/templates/stack.scss @@ -7,38 +7,36 @@ All rights reserved. .view__stack { font-family: $font-family-normal; + display: table-row; - td { - padding: 0.2em 0; + & > div { + display: table-cell; + vertical-align: middle; } - td.quantity { - position: relative; - width: 5em; - - input { - position: absolute; top: 50%; height: $font-size-small; width: 100%; - @include transform(translateY(-50%)); - - border-radius: 0.75em; + .quantity { + .bubble { + border: 0.1em solid $color-gray-light; + border-radius: 1.5em; background: $color-ice; - color: $color-background-panel; - font-family: $font-family-normal; - font-size: $font-size-normal; - font-weight: bold; - text-align: center; - &.editable { - &:focus { - background: $color-background-panel; - color: $color-text; - font-family: $font-family-input; - font-weight: normal; - outline: none; - } + input { + width: 3em; + background: none; + border: none; + color: $color-background-panel; + font-family: $font-family-normal; + font-size: $font-size-normal; + font-weight: bold; + line-height: $font-size-normal; + outline: none; + text-align: center; + } - &:hover { - background: $color-background-panel; + &.editable:hover, &.editing { + background: $color-background-panel; + + input { color: $color-text; font-family: $font-family-input; font-weight: normal; @@ -47,10 +45,7 @@ All rights reserved. } } - td.icon { - width: 4.6em; - padding: 0.2em 0.5em; - + .icon { img { width: 100%; height: auto; max-height: 4.8em; @@ -58,37 +53,99 @@ All rights reserved. } } - td.name a { - color: $color-text; - display: inline; - font-size: $font-size-normal; - text-decoration: none; + .name { + a { + color: $color-text; + font-size: $font-size-normal; + text-decoration: none; - &:hover { - color: $color-active-hover; - text-decoration: underline; + &:hover { + color: $color-active-hover; + text-decoration: underline; + } } } - td.action { + .action { text-align: right; - } - button.remove { - opacity: 0; - position: relative; width: 1.8em; height: 1.8em; - background: url('/images/remove.png') no-repeat center; - border: 0; - outline: none; + button { + position: relative; width: 3.0em; height: 3.0em; + display: inline-block; - &:hover { - background: url('/images/remove-hover.png') no-repeat center; - } - } + border: 0; + font-size: $font-size-small; + margin: 0; + outline: none; + padding: 0; - &:hover { - button.remove { - opacity: 1; + &.check { + background: url('/images/check.png') no-repeat center; + + &:active { + background: url('/images/check_active.png') no-repeat center; + } + + &:disabled { + background: url('/images/check_disabled.png') no-repeat center !important; + cursor: inherit; + } + + &:hover { + background: url('/images/check_hover.png') no-repeat center; + } + } + + &.down { + background: url('/images/down.png') no-repeat center; + + &:active { + background: url('/images/down_active.png') no-repeat center; + } + + &:disabled { + background: url('/images/down_disabled.png') no-repeat center !important; + cursor: inherit; + } + + &:hover { + background: url('/images/down_hover.png') no-repeat center; + } + } + + &.remove { + background: url('/images/remove.png') no-repeat center; + + &:active { + background: url('/images/remove_active.png') no-repeat center; + } + + &:disabled { + background: url('/images/remove_disabled.png') no-repeat center !important; + cursor: inherit; + } + + &:hover { + background: url('/images/remove_hover.png') no-repeat center; + } + } + + &.up { + background: url('/images/up.png') no-repeat center; + + &:active { + background: url('/images/up_active.png') no-repeat center; + } + + &:disabled { + background: url('/images/up_disabled.png') no-repeat center !important; + cursor: inherit; + } + + &:hover { + background: url('/images/up_hover.png') no-repeat center; + } + } } } } diff --git a/src/scss/templates/step.scss b/src/scss/templates/step.scss new file mode 100644 index 000000000..d617d2279 --- /dev/null +++ b/src/scss/templates/step.scss @@ -0,0 +1,47 @@ +/* +Crafting Page - step.scss + +Copyright (C) 2015 by Redwood Labs +All rights reserved. +*/ + +.view__step { + position: relative; min-height: 24em; + + border-top: 0.1em solid $color-gray-medium; + padding: 1em 0; + + &:first-child { + border-top: 0; + } + + .view__inventory { + margin: 1em 0 0 3em; + } + + .view__minimal_recipe { + position: absolute; top: 2em; right: 4.8em; + } + + button.complete { + position: absolute; top: 1em; right: 0; height: 3em; width: 3em; + + background: url("/images/check.png") no-repeat center; + border: 0; + font-size: $font-size-small; + outline: none; + + &:active { + background: url('/images/check_active.png') no-repeat center; + } + + &:disabled { + background: url('/images/check_disabled.png') no-repeat center !important; + cursor: inherit; + } + + &:hover { + background: url('/images/check_hover.png') no-repeat center; + } + } +} \ No newline at end of file diff --git a/static/images/arrow-left-disabled.png b/static/images/arrow-left-disabled.png deleted file mode 100644 index 8ce5770fc2d6bf8e0a616f46c9939b63c4254fbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmV+#0p^` zaI;aq&r;=5O4I$BY{N>*l*>7vN}=slPOe}nv%Z(BW0s_?v*%@Lt!XJe%F>p94%!cA z4_auU?SXcJwg+0TOuIk}Ews==t4q5;+XJnWrL~koS6SMff}34uC>5L=#H-XSN-vVS z&5Vt0MvHo9HA8&}wc0E~{jI|T)KGIA>y6q&4K>tI|Lau=)KEix9JQ0CmU>2qA)b0COl`Inn~{dH?_b07*qoM6N<$f-EO_i~s-t diff --git a/static/images/arrow-left-hover.png b/static/images/arrow-left-hover.png deleted file mode 100644 index f635425a4fc51ef490dbcddeae896a1c7b54b6f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302 zcmV+}0nz@6P)Nkl z{Uwdb#xM+LsdD2uo>H;dITvkMNttpn#zQLfc$bqa*!O+6ESC$mlC*i;m1*Y?!cmqs zeY--ta?gVnT4<}MwbIa5PitjlX;YaSw9rBeEwrMv_6^$VX>End(&pKF%F>n!+Ns&D zGn9_;ZDC{X)Min4kyz}X_H&z&qb{vxsJEh)nnkF8b$EapYK~)jqn0~2LJc+4d!v@V zDuEhms5hdPx!e9iJxLXmeq6So)_tBw2qA)b0T%mfn>gUn`v3p{07*qoM6N<$f;Os( A(f|Me diff --git a/static/images/arrow-left.png b/static/images/arrow-left.png deleted file mode 100644 index 8088ee2ed9cfb1e69a41d168124ae650f104bbf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmV+#0p?I-ZFH+@7DQ7G8u&L`TGUaNmr=0V&DW_G?R`0eeSFP}%O6%pKGOd^Gm1zUCp9ETH zp>2WIOGDcNZIq?8awD|RLJKXly0jy-Ezky8T8|aF%hJ9nIQemg((^a$iGBAhwTjX& z$;#Zn_{_*r2dIytR$E1=kJ>yy4K>@b)~F-YP(uy%zaEu94K>u?qYmoSi&R1B%VnFN gf8FbOgb*T_Cp(oyl4x@LB7jc^-bTRaDT$qJ~ASehG=NDvO%wxjP^x;4VA>?gJDMv}O zq`8!GvMVTQj)=N^k(q;Y!7AxiYwc_bM#TBG;8ODHc8b%gq!)E&_VJ7_wWJa1Us1cA zBGgbr{Q>m=b<5P#9;h!+Lk%_5Q2SF~pl+FZbf>=Cl&iINl5VyIC0*CV5pm{{d`TOb z+1t|E++O?tAGEE}4$wl|>~m@lv=g+@LJMsRqYP-Fg?77~_pEtiHOg+T=e=BJzn(`3 bA%C6+{|R3?xs;T800000NkvXXu0mjfbk%!h diff --git a/static/images/arrow-right-hover.png b/static/images/arrow-right-hover.png deleted file mode 100644 index ace111db5a163ac4c53b384ae1bba937c80a0406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 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 LJ8XriSJeLi_-$b- literal 0 HcmV?d00001 diff --git a/static/images/check_disabled.png b/static/images/check_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..31727dfc9dbcba7588b37f0aeb286d8178902089 GIT binary patch literal 1817 zcmZ`)3pkT|82?;C=2DtM($^|!C;Mio%*76h$czu zOgE2oQMxfbM9Vo!5>iN_Qql!=zM<>W`9IJ9_Wpmr_x-)!`##UN-OqQ4zOI=r008>l zG!K7tw@^(TEp&Axp2|lzO|GktD*zOyVuo20&^ySc`TGDsj3ofXCjr1m)D+(h0Fguh z=vfB<j7L5;A(^a}X9N;cpa($r2~rD1wZhRb~hWjzW+PPB?~-ALtH?IG{bjjzGjwbwLoM zh{D3j{vKZAboAzgi$D+|8G<%#+CJM>ygQ2u7&in0l-Cer#^YDodgnY4$Nu{>l-DWqVCX5vLiGU#+&+Z)=sf%XF z=an?wh)#c~H=k=DT{bvWZl0=rpstH#Zm>F1o9|#*kW*L1e3sS_pv}H0{=*0qcgOp1zZTHLmzU zQ+$fs%X2=zGbE2Nq?pBIyv1hSo&!# z#&-8mnML-*07&}ujpAxbsqAKM0JW-ddGiG`W)a0#8E%_#u|+VQCC@SsV-B7+Ob>rk zKMkMtfC$d=lvcQ&Yc{k`w(_-{qEOSYSh)s!G?{H@<}5F2cfTVzFK%m7n>2e5H!`ho zHkZ+XA34rlY15~%_|7q`X*cP#8JYvcZ4-EI2q)03FuJB)V`YO+4_jUONIn^;i zy>MYZw>tBsb#zri|Aq3v1v3^886TPYtmDPox2YN#ySnNbuTl~pKbvCU=jYPrl+v@I zuBj)eCp)6}R%d?J4k>8ZYMy!#>)Aq$(t>p0#-qR?Q(cg(aMEv#q)qOX8eIo~=M9yS zvtH}d*PhN{QT|X@FUOLqF~>P!^q$re{bmWnCYoS~+OULv>0y3Z-+F^On-v;63e8=y z`iF~OWx3d1yAmB$nyPenh!?Dx8k6kIsA1(9J`P$8=uf=rnD-|%$%lRVne38*b&o8&g)!hA*={~f4ER~CY$=?#lUtN(ep&0 z^MFx*h0;+c^7Lk*4r9=AFQhQ{a?KSN#jOnq*F2dhDm1!5|0}WY`~zu8gT6bso0-Lg zwbZDS+$_#D#{_lYFIgJQ^OmPSEpJb~$KIL0Sy*!nPHBoym=rqqL)WFo4W#_o_}w!X zhUAsMe0LxxB8&WyT)&5O=+lZ?%dMuKE?0`pl>PfEwtW7W*ely#O^Vklm|oQ0NN?v{ z?&~#<$(gUtY5*F8(gs>$3%tPi?mh6SdlYERJ~|gUVRbL|JEs==V#tILN=I8VC#SIT7Ekk4loHm0!=*eW)mr|nO*&a?I!b8qG3s(wJ; Mp1vNZ+}0)j2ZWsIp#T5? literal 0 HcmV?d00001 diff --git a/static/images/check_hover.png b/static/images/check_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..8911dc7c0298a863129561a1430db345d6ce442e GIT binary patch literal 2420 zcmZ`*c|6qVAOE^F5@jd~6OkM<*T;fP@Tx2mraPT>v0>hUk8be$4SO!k-)l#RZV@ z1Sm6%!eaw~856-0h8$k#Yl1e!mUNTCzSBnUq)4o^NsN2;js6aD>c`lJ&B|H(w6eJP7qAdG(k z(}lue|0UxU`?tS;shBv*rf8$8&17c$P>5r$1R6Q?6yKD&k)GK`{C|P}xZ4z9$YB&J zfkxvC4u0W(i+#`c{I3Mxg5L{Vg2{9;uQ^nrzdeagpz^ZOaU1@=+WY^EZ({Mj1p-4Q z;OJzkJDD76j`k;0Ne~8s%6ASifbzO*2K%1$MQ;Y<_vf2_ZC-{Aly@7_z~u54`%!&|kx4;^TM0IX; z5buOYEM^KcjWK&~sKshZxST*#OA40x9zV`wS(wt29oNYmNyJ*3E;rq{{Oe=riQvI@ay*B~P#f-;62 z_Rz$0(MY@aJljc;9!oGg)8$5H`TlY#+a0r|SpjY7bHq!(`WpV833|Jx!^&BaQw!He zziS?g)l;7Dsbgu~v?ya9cq>^r+hVGrb( z&RJYyEE4HJD9qE~6vIZnRwj2)MAR|pis>Aa^T*XnbWcDv2E1>{eZUW^oq7JJuKASl zh3PIucH-C->+6CeH4FMEe{Iwa2Bn?eZw$#XW$m`HGw^|G6s7isFh4NXZa;h_q-Z=C zE%;MK%*Bpjg$UICWv*!yTDG7-eLdi&XFqGVivuC(_oh2|K~gfQ@#P#s_7G+%^ithL ze=U@B4AVt!3KJ-f;fgi4jcWRyK(hYWo#9%tzMtcsE$BbEYtcxVa&-)GPV1-$)-}sR zx7WN+J{>hqh6xUJ4q}SDx*V|$w1>Az5?sTGUk4iwt!s+VEaW3v>(mJH212#Agk9-f zg^EELy1AN;4gSn41xhImlP&gaMvU0t@$xpL?dyGBi~~LUt=l+++ErmE4_7-c`)t~n zNkFUomZ}n;hkrsn)#5qW*v1iyHHb=HB8YKoY_+-ued&#jwBCF3VexULtGQ4Ryp62^ z)vqit)?WNk?$&%YQ5kxyq0xQ2NKV1wyfDYI0~&oTZ4t#Ro0!S;d#6gpYMh5JRy-Gx zN4PpMCOGl#*h3R1KmF3w((}`3qsMPuGvq9x1qJM**VvGpo}_^LHK>7<0HVU1y)Rtx zW&884KqfR$%Ty=CgK3ht>9F5OYAw~F`zSr3cf@8K0c~F_ErN;p9;r`)8tUdLH(HEi zt9yFmEZ-kg>kx33_Ng-H=mv9#DaDl%JtCo(Lz{~!S%v_}Pg|-(K!tKDgUw{p>&$vfAr;3LtW?K-OW{d8#g5Cqdb^@G&3N9E2Li}&x)plCenk_GPTu=TP`E5Uo>3H zi*{RC3x0iWYh3K^+|v|=z}A`>N;T-ZBn@EaxT9Bn$IIHWY1b^2p`UD*@G zo9tNO2qn;=tK55)N2xE|&FMx7``O*ZL(|E#SfdQ*5}8N)gg;(e+8(xcvg($J zYKrFy{4?O|d?sE$V`w-WXF0IWhC|(w$7Hw;zN#+U5+h6370VTw$l4R0>^dLva{O>V zOWSd{@M(Ltyo@@hRrMvJFTegNWTpiewo*vD$BjpK%+=2C6};bHR}r8-+m-oQ_WAPY zpxzdX!fVJDr3>DV)RSyS+S_hoF75nnZgVNmT>NH@FetHy%p{?Bi*@Rq&%O&sx16?>JBMo8tjnLvuy{6axSYP z+iUJfjq0a%A8_BGM;7;VJ2QSHGQn;oE&uk1XEMS;i!;fy-S>COjyw!w-|hooxoD24 zfmgJK(RtHd8GAb-TZu<|v%M5-HM{ryQr%dsaDv+1zw3oY%iX0%?m}r8`lne*Lwad% z@-}B~ZbQXk5};dut~vj-}rZ Fe*tiy8#Dj_ literal 0 HcmV?d00001 diff --git a/static/images/down.png b/static/images/down.png new file mode 100644 index 0000000000000000000000000000000000000000..3c576c1ac7fe71714e3a5b74f32ee5377a2899cb GIT binary patch literal 2122 zcmZ`)2~<(!JmM(*46*ky6@h*@80L^^UhuCCAzsB zQd7}Z0RX5Go$M*n873P_TcvLcjOdzlQaE8lwgI3#b^9t!QM!lIohW1gqCN#6CJumQ zDHQVzfCvl#6aE0;F9Vv{He?;RJSI5T0W1_*O36St5hE+%P;E&FAw``~xV6eFBZe;c#e-3EITOSjsTw zM6$Rvfia7tyBXwN9D4?b&Sr*jnGg#ui%ScDBDj`Fq%6@N&!$f8y9s@hCOkcGl~Qy3g5BtmA&>Yxc>BmQ5&KizE#?4Zyv zHiN^F3C!N|-^V`W`}|#k_rVVZZov>2k~W9Uq!U?O23wkqOWW}G&ffoLycbLQE%0`1 z28|1`Js~K>%7zZHS#TbMEprYxMM=9%Kz~Sjt0$mk{duono0nk&mEHy`6{+&w&9YKy zw3`|LK+&9NZ{z8tR^oLO+U2)1`&g+nb=SWJ;y~i3oh#e7H0~Qq)`wYh5#feNrOqo# z#1Ju0C;H~y!GqBq%YqTT9SbQ>o-7JFUM~gJBAmX^U7w1i>vXoBwO_kC5Sfv**nCZJ z_sijOq{noF^)dB%BhByv7cT_NgZSnVdi>iZC9AB= z6Ja^Il*D)+EyK>$3G(Y+f~Kg1xbV9Lv;LGZ?WSSI*GJg>RYYEpV_l$LLQ#=PuxTJT zb5FScrGHCLnl1$wK{7G*r$!FHjA~9ui`8D3c7C$}8R`%WguC?h>Z7X#eNzf6;qm-4 z^{0g^>vi0*u?wZVxk7bXoZTLSFG$fjRu6{jqSI|&+>eFW7NBnNUUg^7Ie!Kk<+BwarZyQkxhTRIfY5?JGJr?dI)E z6=BWM^#Vk@I914Auk8_0X`UZ9UmuQzC-9ZCyPEp?tIfXpw+?Z#?|{$R`mtK7%f$oY zrL`3yZ@jApi@Bh}RKIw0kt9y_lk9gVsM;|Jf?NlW`fz$3B}#te-Y8>S_tGh=Qd^`! zhxLv0q44YOxM;6?Ue1|2_K{fPj~;Y%7!^THEfb8NF$Jgc&WY}OW7aDmAOGUxYcokd zwcp?^RV)VI-aX4weqiIA>)HB*z*9;YPP-loQD^(|4!neYm1mR>uy z2&Q?DGt41q zeP)($yB1GET*_Vv37OYYbk)N=1hY8LTB9t5-8J9GoOG}bc-dQCBPrphxOIf%&ntE< z#UAP#XYQTR<}Juc{C|w^ZU{&?a3kj8pJYp0~Opw_QV+ z8dQJt=*iAK`pcJt5jwiDY3kM{qZKTb-*ikLIi|6HT=&e4D@xt1Zd=^1EZ+NxCY|Ei z(?5C%UHNQFjFO>`+Rq?7p?K*D@pHYkUp3F$VA-))u7ZL~cCxxJ{SGupnii+lY&{%4 z!A08Td!`#H%$JF7mEmq+qG+~4p5|!WU2VcsQd6*xBE2fpIKH>dhk74m;<*O2L=8FJ zGQnb5T(7q8Oy+?q_SoUJX9=BgHtuY(J2kXa)lmQzy9tIn`8ytVdLz#7>v9+W(lI6O5=aAHj#A8H#5 zD1|-N;#Zm_-DzB{osI9seAi8VeHkxIE1;iUVtAbW@9E!k%vF&c9_d$(3MLTRjq}fa zt>qr+FDxv^ukcgy*2Q&wvq=b;+^DUp>R3`3Y3dUT$w3Wk{j`vb6^%FG!lZmjT8ZqB NO>}Uv7uov9{tp;og=+u+ literal 0 HcmV?d00001 diff --git a/static/images/down_active.png b/static/images/down_active.png new file mode 100644 index 0000000000000000000000000000000000000000..d1241546818259575bd36c89ab70b5f7b1300768 GIT binary patch literal 2297 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 literal 0 HcmV?d00001 diff --git a/static/images/down_disabled.png b/static/images/down_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a82fad995060cb768db5831ee4d26880a4a61e GIT binary patch literal 1887 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z%2~Ij105p zNH8!k)ntZ5ltlRYSS9D@>LsS+C#C9DVstT4fPE4v1tQ(7VbV2T@{H15KUlT zK`gTY8D$j_lv*nAX0gzF$0obz)Fic*VXF6J)kk8p09g=S zLqJA;Nj@-giZYWu^GZ^SfVPz+g53vm9&Qy#W&y*(%DE^tu_V7JBtJjL&M`T^C{Lj* zwFu;L1rt4BEZgX#D}w5`(Fes3QhY%Y16UN88tk}$I$x-RZtVA;%vbGZAK`WSWYmbISQ z&vb+TK%v@X&4U$nb=$6A55M2N=)|g3t9l|QxO^^c)0y%2B-hRwF+(T8qPn^~b#?W! z>gsHNfB$dazNI|~2?>cvOfQafZbhZ5%RSxm^SlUOux?#_{r0gL4cLfJ38XnnfiuW?tZmcz^ebFdAH-ar$utBXU>!qUzg#~{ChHkczeZ~ z?c28HrkA|4wan+S1(3e&2?9kv!o1C*uNpSmrP6@Z2ORu@7 zsM>R|)m=XO)a^l5L)CoMjS?yjLJK5Lo%rj?+G6{G;aY{?cbg}jyB{_mjhxZe)4IZT zoy7O(#0UEhPbqFNwfOw`v)+{dH*el_Ir!+TjHh+x8s|ul&{wZseadcFmMJE@?)Y){ z{gPWeG}Y?PXz(Ufx>P4G{QXq@AUmr@dx=_$*FuJ)-xF@#zyIF(9#>(+VwvOBaVpMQ<)A8BW^u_Pa#+s+r9V28=#G^7Hb_PCwN< zSK5{o92{J@Qgm(F!?|1`^)R7D|*_9cyUdBVY%2`I4IP8yF|;w zhl$%~9h-ZsrS_e5p6azDUFVdSs(5Vv@gZ-q`~>DhU!O1uu1@q2bhl=3YIB(9kUfd_ z^}@*v4-K>XZ~5pS(=IZ8{?VDi<&LlA;jESmrx*+qb$csaxwahNUvTsAsn%9je;*rR zCmjiwjtxzc5BHe;xE>tV69wOL=N$?6duLq+`beCDXz?EFb+D zk~d8cNYwp1cLIx3XY`*_I+bQlJPR!IwdZMn$zHRpN-$ole~QBHl^!DOv67qSX)l|> zHfx)fN%<~rPxnO%E(+T}^(%#}fA=mgJitP;ST6i|5TEe&Oc4zwRsoN+V)y@y e29y5H{?GF0#}4n+v7vdOYRuEs&t;ucLK6T3iTNP_ literal 0 HcmV?d00001 diff --git a/static/images/down_hover.png b/static/images/down_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..99aadeb67e7ec4d39abdb02b98963ec15a242357 GIT binary patch literal 2023 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z%2~Ij105p zNH8!k)ntZ5ltlRYSS9D@>LsS+C#C9DVstT4fPE4v1tQ(7VbV2T@{H15KUlT zK`gTY8D$j_lv*nAX0gzF$0obz)Fic*VXF6J)kk8p09g=S zLqJA;Nj@-giZYWu^GZ^SfVPz+g53vm9&Qy#W&y*(%DE^tu_V7JBtJjL&M`T^C{Lj* zwFu;L1rt4BEZgX#D}w5`(Fes3QhY%Y16UN88tk}$I$ow0N}b`B9ma{w&j%X0v~tDKKg@}TnJ$K;PS^Ebu1WIpJTeQ|Hz zoV``5Om3`O6-zh@SKMW{Q+(~Twk^=UuVw$I<^H?O|3C2za;iGX>MRjgwQ9kcODYT+G;{QGK{n|Eb#h!nkmxq{{xo9}Edwi2rczk|;?c{>GxU_56&dB{sPDsmqdDptL z!1qtiHu)=?jDrroS)$9%Y(7jg9-TNphwHSCjWKyRfR})yGsWZSuNz@I_<$ zR%NFhx1Sm{Y`oB9e0Em0K_ zJ+R`<+UTN}FM~tfWbSz`Z3!w{vRXe*Lm<^Je%}-^t6Kq^q9omprf-!@T9DSpR&AQ1 zXgqOV_I=kT9--CK-z~QN=Q=e@sWGTDNZ^6Vy>!pdiWkD==B7n;eAZgDC~#&_RLL9j zZRhvL@1J$b`~-V!)xQF@=5tRk8=2*)UAQpwf%NxCw^&PArtL+!DOo@NRzF_JyK=LA zozamqGh10(q^2BwVle4M&$Sy)6Ia&!FvyW%sa&UOGM!_4bE5y*8YYKuh5)y~#?Lb0 z6Q)+FUeal3Xn&kAedVT47nG~A_NMZtwO=~&czYm=rJuS=uF#z6pUU6Al3i@7%vqi4 zqsp_o$vN=vhYNF7OG{j8Ie1)q+RmEDL(=9`l-(Zo94Tz&aZdLQt2kt^>Bf|MdoF(W zTdL%`&a>x`#3zBRhnm@!r8oQU7M{9Gvh(pN4<`BDJ!b#b>b~758=}bH>UwydT8BoV z*W9?+sVkp8ow3;b&BvUCQpw3I=Y2N!=lq%H_Q4_Z(8UcZ#+Bmp?b9a(NjguSv075A zK}62>((hxxPo!LY_RxW6%1?RrjKlX>Gv3`YjjZ_Qliy~Q_`OO_eQMHKt`J8HOO+QP zP72TWR$ED~KC?G#UPJrhw=!xzx&c!@?zxf7bbCgm;c}5v5o;yN{P=EpRJbQL%nUgA z-exh+^UOHwnsa)3r_TKSZB+YyUSO8P&UehuPDgYZ)L!G~+tRst{w0p443>nB{#R-% zJQUY?|NEB987O`%&U<2R)t^e8R}a+I1+*Mo*sOfvSD#J7+f>Op3~s(9liue3mKQMW VpS)dL?lY)5^>p=fS?83{1OQ#KPW=D? literal 0 HcmV?d00001 diff --git a/static/images/question.png b/static/images/question.png new file mode 100644 index 0000000000000000000000000000000000000000..15481c2ab91f21309c54ab080fe0a6989adc1d07 GIT binary patch literal 2319 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 diff --git a/static/images/remove_action.png b/static/images/remove_action.png new file mode 100644 index 0000000000000000000000000000000000000000..ca0e6d17e44cb4f6c8ae4aea7b24adf8f92a5173 GIT binary patch literal 2445 zcmZ`*dpy(YAOGse{oaqIi`IxTHil$2<#L$Iq)E1MWSDJ7Gi`G=P34kGl1ouhF5Nh} zB$wP3QbLEQl-s6~lFP&ixpX$_oKCOv`@UY!_j#W8^L~Fm@6Y%1{PB%-b9GRZTPFtq zfTAPD4kwzm#6w0(^tLoAyds(;Db`qP0JxnXzd%|o+JpTuI4l4h(glEsV*v131Vy|9 zfKVd<81V%FrL_RCDx9_#&&Fe2kp2uhj1<7| zBg44#5D^;yP+X*FNhh;OU@rYYFbl~=LzWpx(OL|{A>d^SI|vQIW8J{E3?>R#-5b z#5D|NX|DwN7RQdv@@LXQ*fd5kSR9w+#|UMkArNt*zn>MKY+B$ynSxng%Muj`7oWh5 zVMg%(l8K7_+uy%bTvEu2Xt}DDWGHbcBpyd*F%E=^O<9>EP|NZE1^(l1MPSRIhcL-3 zmRMl+mH$2VBcJeJ3BCt^6u40tY=)>gOq#!AFq_O2Wn+_;{e83d{~6!K5`7D#Et5=Q zGnjiBj00BI{tRX?_%||B>>O+g6LlE{|B>`nkAjQ)^IgAIF2gb^x(!xxBIUQ6WhGZ{ zJ30UWQandH>%ADo+Vg}1@wBxMGg(!%)~z0;SJ)k=pFgvUk{^r`*g*W8D>PyyRh~qqP~cN2j_fzxMVMWXTTMa~@He#{Q!@ty-_16Z`Z|(QGl3ia_7cLtitx%NTVAHzZG7pc7(6bk5#u?4>SH{NQ2~ALm?l`~3 z;kMhIDNsYsDBdLCPkd(atb;(M^w0P1c>`swX`4_*3WT9TJ08SVW;W0<*V2?7#Nk!* zv^mpMXm3%yQz}f6yQ-%yQoH-<{^~#vuW}+KD37e9HA=Kpa9Zq^tDm%=nVDGfotvfi z_C@0mnqA2!htU#=9TyB%O*i$FJx{^xpca>O0oW1FrbnGukH6VMHZ&F9FDWsc%E=t< zk6rU=c)TB0eFA@IHlew;J%dnI8t44_^ra1;UHR2_kCct7YUi&P9?_t#F zs}`TqfCQX=ntA(bRVZrLZ(oWzx76WYfn#cIjg}(yPlf^^q_LhXGmo7aCwNiI=1(Wn z@(S;?MgD|_={Ww;oCH%b&%WMWa1KJ#ZK0o2R86m7WKL8zJl!sMWqpyaVNj$LYSA|? z<&>0Q9{i&Hte*6v7~KjG$W5qn=jZ~Jp|l|cum#Ivn8ySu56=){GAfc2(L1A$#}i>Nn2ho`qDN`RjqYPi>|rm9dj+};a)W)cOtjuYTuT3b})>Y+{9G15LYujgS1 z;l3+39;l5(9b9KsYmRo`=)GxLuuhg+Npn}`25jWNpV+*$RCsT`G1 zjP!82Z}d#cR;eZl&CY#x)5Ry>Yxt2GVU(Z!AxtkRD^f#C`4=QJSLg8M>^0}sq<`sN z93_tG)GDixu4}O51;u6DaqP3>FM0s37$yR zcyFjU6UM^V^|k7yY^9BdavTIsg}G1dW2Jp|CK$-h88LU!XubzCe1K1FF>ZDWF>10| zTJBlrykzY1xi|r7n~l73%|NdNJIQ#rTQGEPXvlga=-u0_`b+w;*CacI4`~_5+_WgD zdgRT33%*C+P2%EefC}oMX8FOZt-Dg8IVG_8mW3846Epox*BFz)*~j%Um>s8MKOf>< zcO2qC5n3SYLR_##0BgQ+u~Gsw>C)jVPvDcB55tV!QfI1ZjKh z>(M5xWAN{QK6KB=L@;e%dwSi$_cz6*79fXycb@|qG)=v=1d$+3E1egfi%K_hi?U59 z$dF&_4!TooSPvc6(N)H1s}#F$@nl*!qeYyD2|N~Hbkm)Is5-AYUu+hXPqe)|_!fIN ztSWu=>n45w2l+nq+Y906L4B2_jtU@!(=7#465@MuH&5({515rv zmt|%7j_gfmf4oM1VsFv7wqT&!%lkvM@%)E2O&&{_6*@v}RN;{P?k~Eg*sm|bgyui7 zioS=g2#CeHkrSmiQw6{FBP5h4qzKI>jmJc-op)x^Di@;Pz1g0PxQgE0a18P3d8aA&YUs zQYmVasav&9`B0C*5^ACFM|#OGlSe zk!!ijX`a^O?wq1TJP{$ecIH~nH*``@=l?wa+x!3h-uL%@@B2L8IhxZR6_hRt000$x zJBlm3>&vF%Qh41#$V!K|C5Nr3RsfJ2yKIJugzsoSJ69?Igku39`V;_6!KUb500<@k zK)(+F5U&EjDt>Z_3kiNu;@f!&0AQJhY$AZ9WNiSDi{!Y`g>zkAr{&cXM!VO$S5=# zO@jQ{L|2OK0v*0tVgiIhJ`s-(4GqPGZo`4lVf@1Pf`w3F2ih_^mhs{zo)8 z+5hx?!xAz1^Q5_~=7W)Bu84G3mH^}i%S4gQj7f9;zcGGQH&3tz1Njh3AdnGE7x0U1 z-{U=h6kxIOdjc&06oPPZAda6sPsoDcXhPn;1v9^N78&)}dY~QdYotBJ%FRyY zVM0qt`Y!b|2awA(3(IC5>b$x&CCF72%9FlqySOvaRbGxMmA`ZDz0WSs7=PgZIqv6l z0*RLWV%w*myxVuG%eyy_E6Udpmf59xQxgt4rgqeJxo9^Pb_^-qc{j;6(Y=P&)@jg- z+$=R9h@XArUViI8IDS?~nY3;76jnJZcSUzvgSd@nHr-bDCTEp_n9ofQ*feucS17lR zTM>KzbTQpH4S(PCu|pz+rD_PsX?5L~lO`jXlCGf5A=yTfB4J^x=LH3JEkf-J~#`&*#NN%wgswj1;uXT(xCY7?CHh8Z@uci;V)-@Gvy68Yt zy_~z(W+W#lD#avLA#Aux!{*j4y7MR%tD$*#sss}kvr+7kv0vq5cwKFHc|lgG;dEkX z(xF;*e!;c0rq2jf^tsT|?xqUV)d7Pzt@GV`BnhPG6=0t3lfO;wtG+)`Ub$8))x2G& zzQ`o4!KPD;vj)`M$r7-{UJ0b_b|Fzq^9ric%Eo z8X#l3USfT>w3a+oD2o&{Q*BAxb&)HaCYD^iKK;m>Q>PZwxuJ)qXFg4(NzI=%o1dxt zvwCAhKYOnvE7k5tYRUwl07>$kFx_*~g@u5+ip8itM>bv|BHENZiC z9u`-679MXz^|HORE&=;q`Wt;>oKp|za3@6JwfsRtwWD^kBew2g(y`msW3?eqe@i)3 z{diY&AERr8f>khUuBF8*y3?St8luYnoe{Wr%fvrC-3I zX&MJ+BX+2&8Mv)acJPj#tn#tNsDlqAP+o4>OU;`{_hRiYO564ij*o_Co)kO$vLnJE zm}-epHiPaXA2()|?^PJ*M$85CJtZ_-DTvI7pyrY&l_kz|;(=+#fp7Wn`-t)fS_kRC(p65^V`qmAs zs;3G70N9;KAW3H<*-%!LzIP&Tlt?G}U}sNf0H`^yCZQ@w_YfM9lBj{WzgclLcbA&Ru+(;|}5gi>3kG6rc*ue;E2L}fP5`{patfUMp zP7ISvA{4cSu`96P_;7jmpffs|tWl5XE4xza-xpcNP8<)E7@3X!C&-fyi^jlzE z*mNqF#XiVlh2x!REH)Ezg3gvXhoIroF5?hilRoKj2w8u==-0+&SVyI|0k0}me!f|F z)pnOxLI60+Q{`AP}Pubxji>`IZD_ zJ56QNOna3Yj{VZs zuPb@{0G&(7U70i|E3e)m+--kZCl8x#e_vaDdM&i4c$aTHvv&|g@#UbDn6}k;YijAq zrQx}@xWWEbsEOo|urqg?TR-(4Yu`=M@65I* zH7rj5a>WS+5d>w}$+>mZzj+?<`-F?{hxeW1U+!_>?AhUtsjh~PuSXSq(|w~)4C+*xL(x(D4!P1&G)AWD!v?)-B~c%0 z&lTHG%*-Tud!Vao+;%&w^?8Ym^0Pr1`-^iEX11YUwVgH`)2E$Nf~mT7|6*ut?mqV~dO%WfmV&cN~{ zV|=)kqei-@v_s`*M~JS2#hxT+k1^i51>Z6AA`;$6JaJZ)3B~_0Dd7IdIV*_LUKh_Co->LDFmyT7cvz>BFUT9$Q^>j3t_fiQ*E-yARp=B$0=1-CuRy{{-gV>7C*k2jIpyyIdhrul&uri~QcHhw85$hAg!Xw)m5tpJ}0 z7{o{YD`!*Kal^csGsil6;w`U%2QIlty?ZOHW4Kiata zzT-nTfPNH|2~t7(-c@RjBN-V?7L>y#>NA`yNG6wa=D`>DEeb$k6^L7Hk1lmi#y9+9 zxV65KA?IfxX|Pc91Q!d#YD^-6DysaiGWoWv#?LP3H?f=wt?06a;+<=#1kx?|$F8=bUxc+I#K0&ySl#B04E6fE54$ zP9dVM`R@0UVs-PJ$7*d#h=>Segej8C4?=CVw6sK_O;9E#2nhorh~x-q zA_PaEyBy?u9D9a<&S&z3OfCl|jZ5?Ah6!)Z%gO$Ik0dBU+NrYhLm&}i~5=LO^-!M`}0G;mM_B+D!C1K1&Q+e&B80x6DFPl zfc!2Ods|Ou<%_$Y2zGg`{rY5hRLsokDMrWz2un$AaiF)hUD~#}WEq47zEm7y>rtk>nPv}c$SY>Tdd^y+&|xu@<$S&LGDM?82ZjOG|8h+yARb* zz~%$L)CaSaswS=jCCR@(Qn3c_oe93galFPwuzWW@@-7#<;VNCB`Eu{8w8VZ{b}!u>@IKkRG%|TYxfZDmdO+Go-U8us`)GO%}tJs zd&zG*dvo3PP|-s4Ou6_A{krGP^;L$1w$ZB?ACTARhQi}T&X~hftuM#Zp4sdXX$~~j z+`BPiPyTpoJk)6XT-6&{HUuB?NlC`)EGWMgmXN7WnzI@+Bs3n3j`C6N(`Gd$hC$%@ z8vC1LTNxnJ+QjBqn-sm4Lw7HmRZ;_99N$!wI>dbOnYEz6D%@x`mzVrpR<8^nT8Vh9 zGDs6|9!SEt)FH0=9xe4ixCK41SU0!Eb}*y!m)j(gaZCJY)4h+!wEDE?w0+eJb6YzM zPhbgm0r1?xNuo@QX0t&$ONHb(lPiaN*Pi99dgb;Pbx*6s$O=WM7A;-SZz*)lC?DI| zL$@%WO92!8jMN@$T`A$97SdU#E+~!ZKhHLPnMvJ1$uO@Q9kVfVTWJ(M+J9Ng6@R#Q z`h1(mk%}tl-juHwvHgT(P}1~=0aQ9$v-5KxhaNzq%zr-p}joH`s+k^2)vc zTdX#kIF)Fa>Y8b>wOe1G9?BHDPU{sXggd6QhC9Gsde#peAo!A<SCI zGhJGo+}dGB(vDM|Q#z9ytghXB5f+u%IznK7(y7+iaw-=8dF2-T-5t7gxKpK--lXzs~%yx(^IzOU+Fc0M7#L`E#oJs-ERGqKSS=|!IB zdN3gX$sEs~;nR=CAbpn{1=+Qg)L% ze{oNGqZe}sm7l7wo2WRGkuKThPv#|+;g?}yHJwFKG-XW znvIQ(0;NrjP$qp(tlFmdwBm_@Uri`{;KEr?PNlht4pppKeC%yst~E5n_09~tBFA47 zjkb#Oo#^D1`ArhnpY4UreD2P_b#D8r6(`#2PwUtk&DQozXS~^>G!g)AUmX5bCq?Mr zo^?_5;90ppc&ngY57{)H+&Ei*v;XBkzg7l`Tr)sB9p4eJ&ZX|r~$=QDMP^HUJ z`xoMg3Sfu8dUgnfb z#u(%P_mgf&l3ZglR9)l|NQ$$6ORL^glwENzq}uXfpLx{N$eSwFgwm_U&v#VOv;!Q# zuBtDHLn@9VE$HY$yP7U=%La(LvPaEoi;QC4so0~M(3epQ7^t&)QJY(mi+}E3&yk|i zECafWI4AguMeW8l*Z&y2I^ICCJz$NiqaHf9OFtXrV4&upXO6_hIR28bbAU!+y&)UL nZ_D>RWPDKrR5%>#F#lCf==iFsFBhUL{h4ubAlhHD+kg0fRb}$W literal 0 HcmV?d00001 diff --git a/static/images/up_active.png b/static/images/up_active.png new file mode 100644 index 0000000000000000000000000000000000000000..f9d1e8dde7adb787549724dc8da1c22492425c4d GIT binary patch literal 2387 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 WXf<=MSGc_B*Tvq(8B=E!aN>Ws^8?`k literal 0 HcmV?d00001 diff --git a/static/images/up_disabled.png b/static/images/up_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b782cf356402d99ee80d383a52098aa08b14e5 GIT binary patch literal 1697 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 literal 0 HcmV?d00001 diff --git a/static/images/wordmark.png b/static/images/wordmark.png deleted file mode 100644 index e538238ed2b023813ab3c665abfbb733c1a3e654..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36148 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 b_PCh@%^P2fN529W-f~^DxN*74+&%GM%~qQ}