Merge branch 'develop' into zakkain-ui-tweaks

Conflicts:
	styles/app/index.styl
	styles/app/tasks.styl
	views/app/alerts.html
	views/app/avatar.html
	views/app/header.html
	views/app/index.html
Merge branch 'develop' into zakkain-ui-tweaks

Conflicts:
	styles/app/index.styl
	styles/app/tasks.styl
	views/app/alerts.html
	views/app/avatar.html
	views/app/header.html
	views/app/index.html
by popular demand, we're dropping the crosshatched square and going blank

Conflicts:
	styles/app/tasks.styl
This commit is contained in:
Tyler Renelle 2013-03-21 12:36:05 -06:00
commit fa89b20dd5
32 changed files with 1355 additions and 257 deletions

12
.gitmodules vendored
View file

@ -1,18 +1,6 @@
[submodule "public/vendor/bootstrap-datepicker"]
path = public/vendor/bootstrap-datepicker
url = https://github.com/eternicode/bootstrap-datepicker.git
[submodule "public/vendor/bootstrap-growl"]
path = public/vendor/bootstrap-growl
url = https://github.com/ifightcrime/bootstrap-growl.git
[submodule "public/vendor/bootstrap"]
path = public/vendor/bootstrap
url = https://github.com/twitter/bootstrap.git
[submodule "public/vendor/github-buttons"]
path = public/vendor/github-buttons
url = https://github.com/mdo/github-buttons.git
[submodule "public/vendor/jquery-cookie"]
path = public/vendor/jquery-cookie
url = https://github.com/carhartl/jquery-cookie.git
[submodule "public/vendor/jquery-ui"]
path = public/vendor/jquery-ui
url = https://github.com/jquery/jquery-ui.git

View file

@ -1,2 +1,9 @@
3/3/2013
## 3/21/2013
* New Design: https://github.com/lefnire/habitrpg/issues/585
* Toggle helm visible: https://trello.com/card/toggle-helm-visible/50e5d3684fe3a7266b0036d6/153
* Toggle Header: https://trello.com/card/toggle-header/50e5d3684fe3a7266b0036d6/241
* Deletable Accounts: https://trello.com/card/deletable-accounts/50e5d3684fe3a7266b0036d6/69
* Undo Button: https://trello.com/card/undo-button/50e5d3684fe3a7266b0036d6/20
## 3/3/2013
* Add custom day start: https://trello.com/card/custom-day-start/50e5d3684fe3a7266b0036d6/15

1067
public/css/docs.css Normal file

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

View file

@ -0,0 +1,11 @@
Mount_Head_Lion, Mount_Body_Lion, Mount_Head_PolarBear, Mount_Body_PolarBear, Mount_Head_Panda, Mount_Body_Panda, Mount_Head_Tiger, Mount_Body_Tiger, Mount_Head_Bear, Mount_Body_Bear {background: url(Mount-SpriteSheet.png) no-repeat}
Mount_Head_Lion {background-position: 0 0; width: 105px; height: 123px}
Mount_Body_Lion {background-position: -105 0; width: 105px; height: 123px}
Mount_Head_PolarBear {background-position: -210 0; width: 105px; height: 123px}
Mount_Body_PolarBear {background-position: -315 0; width: 105px; height: 123px}
Mount_Head_Panda {background-position: -420 0; width: 105px; height: 123px}
Mount_Body_Panda {background-position: -525 0; width: 105px; height: 123px}
Mount_Head_Tiger {background-position: -630 0; width: 105px; height: 123px}
Mount_Body_Tiger {background-position: -735 0; width: 105px; height: 123px}
Mount_Head_Bear {background-position: -840 0; width: 105px; height: 123px}
Mount_Body_Bear {background-position: -945 0; width: 105px; height: 123px}

View file

@ -1,17 +1,10 @@
#PetEggs {
/* egg sprite size */
width: 48px;
height: 51px;
/* link to sprite sheet image */
background-image: url(Egg_Sprite_Sheet.png);
}
/* defines where in the sheet the eggs are */
.WolfEgg{background-position: 0px 0px;}
.TigerEgg{background-position: 0px -51px;}
.PolarBearEgg{background-position: 0px -102px;}
.PandaEgg{background-position: 0px -153px;}
.LionEgg{background-position: 0px -204px;}
.FlyingPigEgg{background-position: 0px -255px;}
.DrakeEgg{background-position: 0px -306px;}
.CactusEgg{background-position: 0px -357px;}
.BearEgg{background-position: 0px -408px;}
Pet_Egg_Wolf, Pet_Egg_Tiger, Pet_Egg_PolarBear, Pet_Egg_Panda, Pet_Egg_Lion, Pet_Egg_FlyingPig, Pet_Egg_Drake, Pet_Egg_Cactus, Pet_Egg_Bear {background: url(Egg_Sprite_Sheet.png) no-repeat}
Pet_Egg_Wolf {background-position: 0 0; width: 48px; height: 51px}
Pet_Egg_Tiger {background-position: 0 -51; width: 48px; height: 51px}
Pet_Egg_PolarBear{background-position: 0 -102; width: 48px; height: 51px}
Pet_Egg_Panda {background-position: 0 -153; width: 48px; height: 51px}
Pet_Egg_Lion {background-position: 0 -204; width: 48px; height: 51px}
Pet_Egg_FlyingPig {background-position: 0 -255; width: 48px; height: 51px}
Pet_Egg_Drake {background-position: 0 -306; width: 48px; height: 51px}
Pet_Egg_Cactus {background-position: 0 -357; width: 48px; height: 51px}
Pet_Egg_Bear {background-position: 0 -408; width: 48px; height: 51px}

@ -1 +0,0 @@
Subproject commit eb24718add4dd36fe92fdbdb79e6ff4ce5919300

@ -1 +0,0 @@
Subproject commit 3f12c74bcd5a0d6763951ce14450c8727b661bc9

@ -1 +0,0 @@
Subproject commit c033de329bb1b21e4175e2a53efd844b664d27c8

@ -1 +0,0 @@
Subproject commit cefb0c399960553edae76f91f9fc5470a1c3bc04

View file

@ -61,14 +61,8 @@ module.exports.app = (appExports, model) ->
batch.commit()
browser.resetDom(model)
appExports.closeAlgosNotification = (e, el) ->
user.set('flags.algosNotification', 'hide')
appExports.closeOnliesNotification = (e, el) ->
user.set('flags.onliesNotification', 'hide')
appExports.closePriorityNotification = (e, el) ->
user.set('flags.priorityNotification', 'hide')
appExports.closeNewStuff = (e, el) ->
user.set('flags.newStuff', 'hide')
appExports.customizeGender = (e, el) ->
user.set 'preferences.gender', $(el).attr('data-value')

View file

@ -20,6 +20,6 @@ module.exports.app = (appExports, model) ->
appExports.profileChangeActive = (e, el) ->
uid = $(el).attr('data-uid')
model.ref '_profileActive', model.at("users.#{uid}")
model.set '_profileActiveMain', model.get('_user.id') == uid
model.set '_profileActiveMain', user.get('id') is uid
model.set '_profileActiveUsername', character.username model.get('_profileActive.auth')

View file

@ -54,6 +54,9 @@ router.get '/user', auth, (req, res) ->
user.stats.maxHealth = 50
delete user.apiToken
if user.auth
delete user.auth.hashed_password
delete user.auth.salt
res.json user
@ -184,8 +187,12 @@ scoreTask = (req, res, next) ->
delta = scoring.score(model, taskId, direction)
result = model.get ('_user.stats')
result.delta = delta
res.send(result)
res.json result
###
POST /user/tasks/:taskId/:direction
###
router.post '/user/task/:taskId/:direction', auth, scoreTask
router.post '/user/tasks/:taskId/:direction', auth, scoreTask
module.exports = router

View file

@ -1,3 +1,19 @@
.new-stuff
position: fixed
text-align: center
top: 0
left: 0
width: 100%
height: 0
z-index: 1010
.new-stuff> .alert
border-top: 0
border-radius: 0 0 4px 4px
padding-right: 14px
display: inline-block
// variables
gpColor = #FBEFC0

View file

@ -10,10 +10,8 @@
@import "./helpers.styl";
@import "./responsive.styl";
@import "./header.styl";
@import "./scrollbars.styl";
@import "../../public/vendor/bootstrap-datepicker/css/datepicker.css";
// fix exploding to very wide for some reason
.datepicker

View file

@ -271,3 +271,16 @@ describe 'API', ->
expect(res.statusCode).to.be 400
expect(res.body.err).to.be 'No task found.'
done()
it 'POST /api/v1/user/task/:id/up', (done) ->
tid = currentUser.habitIds[0]
request.post("#{baseURL}/user/task/#{tid}/up")
.set('Accept', 'application/json')
.set('X-API-User', currentUser.id)
.set('X-API-Key', currentUser.apiToken)
.send({})
.end (res) ->
expect(res.body.err).to.be undefined
expect(res.statusCode).to.be 200
expect(res.body).to.eql { gp: 1, exp: 7.5, lvl: 1, hp: 50, delta: 1 }
done()

View file

@ -1,32 +1,16 @@
<alerts:>
<newStuff:>
{#if equal(_user.flags.newStuff,'show')}
<div class='new-stuff'>
<p class='alert alert-success'>
<a href="https://github.com/lefnire/habitrpg/blob/develop/CHANGELOG.md#3212013" target="_blank">New Stuff!</a> <a x-bind="click:closeNewStuff"><i class='icon-remove'></i></a>
</p>
</div>
{/}
<flash:>
{#if _flash.error}
<ul class="unstyled alert alert-error">
{#each _flash.error as :error}<li>{:error}</li>{/}
</ul>
{/}
{#if equal(_user.flags.algosNotification,'show')}
<div class='alert alert-success'>
<a x-bind="click:closeAlgosNotification" class=pull-right></a>
<p>New features! Custom day start, new and better algorithms, authentication enhancements. See <a target="_blank" href="http://habitrpg.tumblr.com/post/44468869138/custom-day-start-better-algorithms-auth-enhancements">details here.</a>
&nbsp;"Hey, I had more Exp before this roll-out!" <a data-target="#restore-modal" data-toggle=modal>Restore your Exp here.</a></p>
</div>
{/}
{#if equal(_user.flags.onliesNotification, 'show')}
<div class='alert alert-success'>
<a x-bind="click:closeOnliesNotification " class=pull-right></a>
<p>
"Onlies" now gain / lose value just like other habits, and are reset back to 0 at the beginning of each day.
&nbsp;See <a target="_blank" href="https://trello.com/card/shading-onlies/50e5d3684fe3a7266b0036d6/67">details here</a>, and
&nbsp;chime in with your recommendations on this mechanic.
</p>
</div>
{/}
{#if equal(_user.flags.priorityNotification, 'show')}
<div class='alert alert-success'>
<a x-bind="click:closePriorityNotification" class=pull-right></a>
<p>New Feature: Priority Multiplier! You can now multiply "more important" tasks on a 1x, 1.5x, or 2x scale. <a target="_blank" href="https://trello.com/card/priority-multiplier/50e5d3684fe3a7266b0036d6/17">See details</a>.</p>
</div>
{/}

View file

@ -1,20 +1,18 @@
<modals:>
<app:modals:modal modalId="avatar-modal">
{#if _profileActiveMain}
{#with _user.preferences}
<ul class="nav nav-tabs">
<li class="active"><a data-toggle='tab' href="#profileCustomize">Avatar</a></li>
<li><a data-toggle='tab' href="#profileEdit">Profile</a></li>
</ul>
<ul class="nav nav-tabs">
<li class="active"><a data-toggle='tab' href="#profileCustomize">Avatar</a></li>
<li><a data-toggle='tab' href="#profileEdit">Profile</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="profileCustomize">
<app:avatar:customize />
</div>
<div class="tab-pane" id="profileEdit"><app:avatar:profile user="{_user}" main="true" /></div>
<div class="tab-content">
<div class="tab-pane active" id="profileCustomize">
<app:avatar:customize />
</div>
{/}
<div class="tab-pane" id="profileEdit"><app:avatar:profile user="{_user}" main="true" /></div>
</div>
{else}
<app:avatar:profile profile={_profileActive} />
{/}
@ -29,9 +27,20 @@
data-level="{@profile.stats.lvl}"
data-checkpet="{#if @profile.items.pet}hasPet{/}"
data-checkuser="{#if equal(@profile.id, _user.id)}isUser{/}"
data-toggle='modal' data-target='#avatar-modal' data-uid="{@profile.id}" x-bind="click:profileChangeActive">
data-toggle='modal' data-target='#avatar-modal' data-uid="{@profile.id}" x-bind="click:profileChangeActive"
rel="popover" data-title="{{username(@profile.auth)}}" data-placement="bottom" data-trigger="hover" data-html="true" data-content="
<div>
<div class='progress progress-danger' style='height:5px;'>
<div class='bar' style='height: 5px; width: {percent(@profile.stats.hp, 50)}%;'></div>
</div>
<div class='progress progress-warning' style='height:5px;'>
<div class='bar' style='height: 5px; width: {percent(@profile.stats.exp, tnl(@profile.stats.lvl))}%;'></div>
</div>
<div>GP: {{floor(@profile.stats.gp)}}</div>
</div>
">
<div class='character-sprites'>
{#unless @minimal}{#if @profile.items.pet}<img class="pet" src='img/sprites/{@profile.items.pet.icon}' />{/}{/}
{#if and(@profile.items.pet, not(@minimal))}<img class="pet" src='img/sprites/{@profile.items.pet.icon}' />{/}
{#with @profile.preferences as :p}
<span class='{:p.gender}_skin_{:p.skin}'></span>
<span class='{:p.gender}_hair_{:p.hair}'></span>
@ -45,8 +54,6 @@
<span class='{:p.gender}_weapon_{@profile.items.weapon}'></span>
{/}
</div>
{{#unless @minimal}}
{{/}}
</figure>
<customize:>
@ -56,101 +63,103 @@
</figure>
<!-- customization options -->
<menu type="list">
<!-- gender -->
<li class="customize-menu">
<menu label="Head">
<button type="button" class="m_head_0 customize-option" data-value="m" x-bind="click:customizeGender"></button>
<button type="button" class="f_head_0 customize-option" data-value="f" x-bind="click:customizeGender"></button>
</menu>
<label class="checkbox">
<input type=checkbox checked="{_user.preferences.showHelm}" /> Show Helm
</label>
</li>
<!-- hair -->
<li class="customize-menu">
<menu label="Hair">
<button type="button" class="{.gender}_hair_blond customize-option" data-value="blond" x-bind="click:customizeHair"></button>
<button type="button" class="{.gender}_hair_black customize-option" data-value="black" x-bind="click:customizeHair"></button>
<button type="button" class="{.gender}_hair_brown customize-option" data-value="brown" x-bind="click:customizeHair"></button>
<button type="button" class="{.gender}_hair_white customize-option" data-value="white" x-bind="click:customizeHair"></button>
</menu>
</li>
<!-- skin -->
<li class="customize-menu">
<menu label="Skin">
<button type="button" class='{.gender}_skin_dead customize-option' data-value="dead" x-bind="click:customizeSkin"></button>
<button type="button" class='{.gender}_skin_orc customize-option' data-value="orc" x-bind="click:customizeSkin"></button>
<button type="button" class='{.gender}_skin_asian customize-option' data-value="asian" x-bind="click:customizeSkin"></button>
<button type="button" class='{.gender}_skin_black customize-option' data-value="black" x-bind="click:customizeSkin"></button>
<button type="button" class='{.gender}_skin_white customize-option' data-value="white" x-bind="click:customizeSkin"></button>
</menu>
</li>
</menu>
{#if equal(_user.preferences.gender, 'f')} <!-- Sorry boys -->
{#with _user.preferences as :p}
<menu type="list">
<!-- gender -->
<li class="customize-menu">
<menu label="Clothing">
<button type="button" class="f_armor_0_v1 customize-option" data-value="v1" x-bind="click:customizeArmorSet"></button>
<button type="button" class="f_armor_0_v2 customize-option" data-value="v2" x-bind="click:customizeArmorSet"></button>
<menu label="Head">
<button type="button" class="m_head_0 customize-option" data-value="m" x-bind="click:customizeGender"></button>
<button type="button" class="f_head_0 customize-option" data-value="f" x-bind="click:customizeGender"></button>
</menu>
<label class="checkbox">
<input type=checkbox checked="{_user.preferences.showHelm}" /> Show Helm
</label>
</li>
<!-- hair -->
<li class="customize-menu">
<menu label="Hair">
<button type="button" class="{:p.gender}_hair_blond customize-option" data-value="blond" x-bind="click:customizeHair"></button>
<button type="button" class="{:p.gender}_hair_black customize-option" data-value="black" x-bind="click:customizeHair"></button>
<button type="button" class="{:p.gender}_hair_brown customize-option" data-value="brown" x-bind="click:customizeHair"></button>
<button type="button" class="{:p.gender}_hair_white customize-option" data-value="white" x-bind="click:customizeHair"></button>
</menu>
</li>
<!-- skin -->
<li class="customize-menu">
<menu label="Skin">
<button type="button" class='{:p.gender}_skin_dead customize-option' data-value="dead" x-bind="click:customizeSkin"></button>
<button type="button" class='{:p.gender}_skin_orc customize-option' data-value="orc" x-bind="click:customizeSkin"></button>
<button type="button" class='{:p.gender}_skin_asian customize-option' data-value="asian" x-bind="click:customizeSkin"></button>
<button type="button" class='{:p.gender}_skin_black customize-option' data-value="black" x-bind="click:customizeSkin"></button>
<button type="button" class='{:p.gender}_skin_white customize-option' data-value="white" x-bind="click:customizeSkin"></button>
</menu>
</li>
</menu>
{#if equal(_user.preferences.gender, 'f')} <!-- Sorry boys -->
<menu type="list">
<li class="customize-menu">
<menu label="Clothing">
<button type="button" class="f_armor_0_v1 customize-option" data-value="v1" x-bind="click:customizeArmorSet"></button>
<button type="button" class="f_armor_0_v2 customize-option" data-value="v2" x-bind="click:customizeArmorSet"></button>
</menu>
</li>
</menu>
{/}
{/}
<profile:>
<div class='row-fluid'>
<div class='span6 well'>
{#if _profileEditing}
{#if _profileActiveMain}
<a class='btn btn-success' x-bind="click:profileSave">Save</a>
<!-- TODO use photo-upload instead: https://groups.google.com/forum/?fromgroups=#!topic/derbyjs/xMmADvxBOak -->
<div class="control-group">
<label class="control-label" for="profileImageUrl">Photo Url</label>
<div class="controls">
<input type="url" id="profileImageUrl" value="{_user.profile.imageUrl}" placeholder="Image Url"/>
</div>
{#if and(_profileEditing, _profileActiveMain)}
<a class='btn btn-success' x-bind="click:profileSave">Save</a>
<!-- TODO use photo-upload instead: https://groups.google.com/forum/?fromgroups=#!topic/derbyjs/xMmADvxBOak -->
<div class="control-group">
<label class="control-label" for="profileImageUrl">Photo Url</label>
<div class="controls">
<input type="url" id="profileImageUrl" value="{_user.profile.imageUrl}" placeholder="Image Url"/>
</div>
</div>
<div class="control-group">
<label class="control-label" for="profileFullName">Full Name</label>
<div class="controls">
<input type="text" id="profileFullName" placeholder="Full Name" value="{_user.profile.name}" />
</div>
<div class="control-group">
<label class="control-label" for="profileFullName">Full Name</label>
<div class="controls">
<input type="text" id="profileFullName" placeholder="Full Name" value="{_user.profile.name}" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="profileBlurb">Blurb</label>
<div class="controls">
<textarea id="profileBlurb" placeholder="Blurb" >{_user.profile.blurb}</textarea>
</div>
<div class="control-group">
<label class="control-label" for="profileBlurb">Blurb</label>
<div class="controls">
<textarea id="profileBlurb" placeholder="Blurb" >{_user.profile.blurb}</textarea>
</div>
</div>
<div class="control-group">
<label class="control-label" for="profileWebsite">Websites</label>
<div class="controls">
<form x-bind="submit:profileAddWebsite">
<input type="url" id="profileWebsite" value="{_newProfileWebsite}" placeholder="Add Website"/>
</form>
</div>
<ul>
{#each _user.profile.websites as :website}
<!-- would prefer if there were and index in #each, instead using data-website to search with indexOf -->
<li>{:website} <a data-website="{:website}" x-bind="click:profileRemoveWebsite"><i class='icon-remove'></i></a></li>
{/}
</ul>
<div class="control-group">
<label class="control-label" for="profileWebsite">Websites</label>
<div class="controls">
<form x-bind="submit:profileAddWebsite">
<input type="url" id="profileWebsite" value="{_newProfileWebsite}" placeholder="Add Website"/>
</form>
</div>
<a class='btn btn-success' x-bind="click:profileSave">Save</a>
{/}
<ul>
{#each _user.profile.websites as :website}
<!-- would prefer if there were and index in #each, instead using data-website to search with indexOf -->
<li>{:website} <a data-website="{:website}" x-bind="click:profileRemoveWebsite"><i class='icon-remove'></i></a></li>
{/}
</ul>
</div>
<a class='btn btn-success' x-bind="click:profileSave">Save</a>
{else}
<h3>
{#if _profileActive.profile.name}{_profileActive.profile.name}
{else}{username(_profileActive.auth)}
{#if _profileActive.profile.name}
{_profileActive.profile.name}
{else}
{username(_profileActive.auth)}
{/}
{#if _profileActiveMain}<a class='btn pull-right' x-bind="click:profileEdit">Edit</a>{/}
</h3>
@ -163,7 +172,7 @@
{#if _profileActive.profile.websites}
<ul>
{#each _profileActive.profile.websites as :website}
<li>{:website}</li>
<li>{:website}</li>
{/}
</ul>
{/}

View file

@ -19,7 +19,7 @@
<ul class='unstyled'>
<li><a href="/static/privacy">Privacy</a></li>
<li><a href="/static/terms">Terms</a></li>
<li><strong>&copy; 2012 OCDevel LLC</strong></li>
<li><strong>&copy; 2013 OCDevel LLC</strong></li>
</ul>
</div>

View file

@ -41,5 +41,6 @@
</div>
{{/}}
{{/}}
</header>
{/}

View file

@ -21,10 +21,13 @@
<!-- CDN -->
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.1/css/bootstrap.min.css" rel="stylesheet">
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.1/css/bootstrap-responsive.min.css" rel="stylesheet">
<link href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.0.0/css/datepicker.css" rel="stylesheet">
<Header:>
<app:modals:modals />
<ui:connectionAlert>
<app:alerts:newStuff />
<div class="header-wrap">
{#if _undo}<a x-bind="click:undo" class='label undo-button'>Undo</a>{/}
@ -37,7 +40,7 @@
<br/>
<div id="notification-area"></div>
<div id="wrap">
<app:alerts:alerts />
<app:alerts:flash />
<div id=main class="grid">
<app:tasks:taskLists />
</div>

View file

@ -1,3 +1,87 @@
<rewardsColumn:>
<div class="module">
<div class="task-column rewards">
<!-- cash or tokens -->
<span class='option-box pull-right wallet'>
{#unless _view.activeTabPets}
<div class="money">
{gold(_user.stats.gp)}
<span class='shop_gold' rel='tooltip' title='Gold'></span>
</div>
<div class="money">
{silver(_user.stats.gp)}
<span class='shop_silver' rel='tooltip' title='Silver'></span>
</div>
<!-- <div class="money">
{copper(_user.stats.gp)}
<span class='shop_copper' rel='tooltip' title='Copper'></span>
</div> -->
{else}
<app:rewards:userTokens />
{/}
</span>
<h2 class="task-column_title">Rewards</h2>
<!-- if pets are enabled, make tabs -->
{#if equal(_user.flags.petsEnabled,true)}
<div class='tabbable tabs-below'>
<div class="tab-content">
<div class="tab-pane active" id="rewards-tab">
<app:rewards:rewardsTab />
</div>
<!-- pets pane -->
<div class="tab-pane pet-grid" id="pets-tab">
{#with _view.items.pets as :pets}
<table>
<tr>
{#with :pets[0]}<app:rewards:pet />{/}
{#with :pets[1]}<app:rewards:pet />{/}
{#with :pets[2]}<app:rewards:pet />{/}
{#with :pets[3]}<app:rewards:pet />{/}
</tr>
<tr>
{#with :pets[4]}<app:rewards:pet />{/}
{#with :pets[5]}<app:rewards:pet />{/}
{#with :pets[6]}<app:rewards:pet />{/}
{#with :pets[7]}<app:rewards:pet />{/}
</tr>
<tr>
{#with :pets[8]}<app:rewards:pet />{/}
{#with :pets[9]}<app:rewards:pet />{/}
{#with :pets[10]}<app:rewards:pet />{/}
{#with :pets[11]}<app:rewards:pet />{/}
</tr>
<tr>
{#with :pets[12]}<app:rewards:pet />{/}
{#with :pets[13]}<app:rewards:pet />{/}
{#with :pets[14]}<app:rewards:pet />{/}
{#with :pets[15]}<app:rewards:pet />{/}
</tr>
<tr>
{#with :pets[16]}<app:rewards:pet />{/}
</tr>
</table>
{/}
</div>
<!--<div class="tab-pane" id="mounts-tab">...</div>-->
</div>
<ul class="nav nav-tabs" id="rewardsTabs">
<li class="active"><a href="#rewards-tab" data-toggle="tab" x-bind="click:activateRewardsTab">Rewards</a></li>
<li><a href="#pets-tab" data-toggle="tab" x-bind='click:activatePetsTab'>Pets</a></li>
<!--<li><a href="#mounts-tab" data-toggle="tab">Mounts</a></li>-->
</ul>
</div>
<!-- if pets are disabled, just do rewards tab -->
{else}
<app:rewards:rewardsTab />
{/}
</div>
</div>
<rewardsTab:>
<!-- add new reward -->
<app:tasks:newTask type="reward" inputValue="{_newReward}" placeHolder="New Reward" />
@ -21,7 +105,7 @@
{/}
<pet:>
<td class="{{#if _user.items.pets[.name]}}active-pet{{/}}">
<td class="{#if _user.items.pets[.name]}active-pet{/}">
<img rel=tooltip title="{.text} - {.value} Tokens" x-bind="click:selectPet" data-pet='{.name}' src='img/sprites/{.icon}'/>
</td>
@ -35,8 +119,7 @@
<item:>
{#unless :item.hide}
<li class="task reward-item">
<li class="task reward-item {#if :item.hide}hide{/}">
<!-- right-hand side control buttons -->
<div class="task-meta-controls">
<span rel="popover" data-trigger="hover" data-placement="left" data-content="{:item.notes}" data-original-title="{:item.text}" class='task-notes'><i class="icon-comment"></i></span>
@ -56,5 +139,4 @@
<!-- main content -->
<span class="shop_{:item.classes} shop-sprite item-img"></span>
<p class="task-text">{:item.text}</p>
</li>
{/}
</li>

View file

@ -149,4 +149,4 @@
</li>
</ul>
{/}
</div>
</div>

View file

@ -54,87 +54,8 @@
</div>
<!-- Rewards Column -->
<div class="module">
<div class="task-column rewards">
<!-- cash or tokens -->
<span class='option-box pull-right wallet'>
{#unless _view.activeTabPets}
<div class="money">
{gold(_user.stats.gp)}
<span class='shop_gold' rel='tooltip' title='Gold'></span>
</div>
<div class="money">
{silver(_user.stats.gp)}
<span class='shop_silver' rel='tooltip' title='Silver'></span>
</div>
<!-- <div class="money">
{copper(_user.stats.gp)}
<span class='shop_copper' rel='tooltip' title='Copper'></span>
</div> -->
{else}
<app:rewards:userTokens />
{/}
</span>
<h2 class="task-column_title">Rewards</h2>
<app:rewards:rewardsColumn />
<!-- if pets are enabled, make tabs -->
{#if equal(_user.flags.petsEnabled,true)}
<div class='tabbable tabs-below'>
<div class="tab-content">
<div class="tab-pane active" id="rewards-tab">
<app:rewards:rewardsTab />
</div>
<!-- pets pane -->
<div class="tab-pane pet-grid" id="pets-tab">
{#with _view.items.pets as :pets}
<table>
<tr>
{#with :pets[0]}<app:rewards:pet />{/}
{#with :pets[1]}<app:rewards:pet />{/}
{#with :pets[2]}<app:rewards:pet />{/}
{#with :pets[3]}<app:rewards:pet />{/}
</tr>
<tr>
{#with :pets[4]}<app:rewards:pet />{/}
{#with :pets[5]}<app:rewards:pet />{/}
{#with :pets[6]}<app:rewards:pet />{/}
{#with :pets[7]}<app:rewards:pet />{/}
</tr>
<tr>
{#with :pets[8]}<app:rewards:pet />{/}
{#with :pets[9]}<app:rewards:pet />{/}
{#with :pets[10]}<app:rewards:pet />{/}
{#with :pets[11]}<app:rewards:pet />{/}
</tr>
<tr>
{#with :pets[12]}<app:rewards:pet />{/}
{#with :pets[13]}<app:rewards:pet />{/}
{#with :pets[14]}<app:rewards:pet />{/}
{#with :pets[15]}<app:rewards:pet />{/}
</tr>
<tr>
{#with :pets[16]}<app:rewards:pet />{/}
</tr>
</table>
{/}
</div>
<!--<div class="tab-pane" id="mounts-tab">...</div>-->
</div>
<ul class="nav nav-tabs" id="rewardsTabs">
<li class="active"><a href="#rewards-tab" data-toggle="tab" x-bind="click:activateRewardsTab">Rewards</a></li>
<li><a href="#pets-tab" id='pets-tab' data-toggle="tab" x-bind='click:activatePetsTab'>Pets</a></li>
<!--<li><a href="#mounts-tab" data-toggle="tab">Mounts</a></li>-->
</ul>
</div>
<!-- if pets are disabled, just do rewards tab -->
{else}
<app:rewards:rewardsTab />
{/}
</div>
</div>
<!-- Templates -->
<newTask:>

View file

@ -36,8 +36,16 @@
<p>Python command line app for HabitRPG (http://habitrpg.com)</p>
<h2 id="php-api"><a href="http://github.com/ruddfawcett/HabitRPG_PHP">PHP API</a></h2>
<p>A PHP class for the HabitRPG API. Will be expanded when more features become available in the API.</p>
<h2 id="perl-api"><a href="https://metacpan.org/module/WebService::HabitRPG">WebService::HabitRPG — Perl API</a></h2>
<p>A full-featured <a href="https://metacpan.org/module/WebService::HabitRPG">Perl interface</a> for HabitRPG. Development versions are available on <a href="https://github.com/pfenwick/WebService-HabitRPG">github</a>.
<h2 id="hrpg-cmd"><a href="https://metacpan.org/module/hrpg">hrpg - HabitRPG command line client</a></h2>
<p>Command-line client for HabitRPG. Supports viewing status, listing tasks by types, creation of new types, incrementing/decrementing of tasks, API debugging, and more.</p>
<h2 id="suggest-an-add-on-extension">Suggest an Add-on / Extension</h2>
<p><a href="mailto:tylerrenelle@gmail.com">Email me</a> to have something listed here</p>
</div>
</div>
<app:footer:footer />
<app:footer:footer />

View file

@ -21,7 +21,7 @@
</div>
</div>
<div class='container'>
<p style="height:600;"><iframe src="http://player.vimeo.com/video/57639356" width="100%" height="539" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<p style="height:600;"><iframe src="//player.vimeo.com/video/57639356" width="100%" height="539" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
</div>
</div>

View file

@ -6,7 +6,7 @@
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.1/css/bootstrap.min.css" rel="stylesheet">
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.1/css/bootstrap-responsive.min.css" rel="stylesheet">
<link href="/vendor/bootstrap/docs/assets/css/docs.css" rel="stylesheet">
<link href="/css/docs.css" rel="stylesheet">
<link href="/css/static-pages.css" rel="stylesheet">
<link href="/css/footer.css" rel="stylesheet">