From a9fc98b7717996f69dc284cd01bdfd3d76454821 Mon Sep 17 00:00:00 2001 From: Andromeda Yelton Date: Mon, 9 Jan 2012 11:50:48 -0500 Subject: [PATCH 1/5] work page now displays a modify-pledge button where appropriate. not yet wired to modification functionality. --- frontend/templates/work.html | 8 +++++++- frontend/views.py | 2 ++ static/css/campaign.css | 3 +++ static/images/btn_bg_grey.png | Bin 0 -> 3584 bytes static/less/campaign.less | 4 ++++ 5 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 static/images/btn_bg_grey.png diff --git a/frontend/templates/work.html b/frontend/templates/work.html index ea0d1ba7..f6daf197 100644 --- a/frontend/templates/work.html +++ b/frontend/templates/work.html @@ -79,7 +79,13 @@ jQuery(document).ready(function(){

{{ work.author }}

{{ pubdate }}

- {% if status == 'ACTIVE' %}
{% endif %} + {% if status == 'ACTIVE' %} + {% if pledged %} +
+ {% else %} +
+ {% endif %} + {% endif %}
diff --git a/frontend/views.py b/frontend/views.py index 97c07cd8..15999154 100755 --- a/frontend/views.py +++ b/frontend/views.py @@ -81,6 +81,7 @@ def work(request, work_id, action='display'): work = get_object_or_404(models.Work, id=work_id) editions = work.editions.all().order_by('-publication_date') campaign = work.last_campaign() + pledged = campaign.transactions().filter(user=request.user, status="ACTIVE") try: pubdate = work.editions.all()[0].publication_date[:4] except IndexError: @@ -111,6 +112,7 @@ def work(request, work_id, action='display'): 'base_url': base_url, 'editions': editions, 'pubdate': pubdate, + 'pledged':pledged, }) def manage_campaign(request, id): diff --git a/static/css/campaign.css b/static/css/campaign.css index 56c7a159..511db518 100755 --- a/static/css/campaign.css +++ b/static/css/campaign.css @@ -130,6 +130,9 @@ padding: 0; cursor: pointer; } +.book-detail-info > div.layout div.btn_support.modify input { + background: url("/static/images/btn_bg_grey.png") 0 0 no-repeat; +} .book-detail-info .btn_wishlist span { text-align: right; } diff --git a/static/images/btn_bg_grey.png b/static/images/btn_bg_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..15a3cd9267794da0b0a70774f1990d7aa590d5ce GIT binary patch literal 3584 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 Date: Mon, 9 Jan 2012 12:36:03 -0500 Subject: [PATCH 2/5] Putting in skeleton for pledge cancel and complete PayPal callbacks --- frontend/templates/pledge_cancel.html | 16 +++++++++++++ frontend/templates/pledge_complete.html | 17 ++++++++++++++ frontend/urls.py | 4 +++- frontend/views.py | 31 +++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 frontend/templates/pledge_cancel.html create mode 100644 frontend/templates/pledge_complete.html diff --git a/frontend/templates/pledge_cancel.html b/frontend/templates/pledge_cancel.html new file mode 100644 index 00000000..33f47f84 --- /dev/null +++ b/frontend/templates/pledge_cancel.html @@ -0,0 +1,16 @@ +{% extends "basedocumentation.html" %} + +{% block title %}Pledge Cancelled{% endblock %} + +{% block extra_extra_head %} + +{% endblock %} + +{% block doccontent %} + +
Would you consider pledging in the future?
+ +
{{output}}
+{% endblock %} + + diff --git a/frontend/templates/pledge_complete.html b/frontend/templates/pledge_complete.html new file mode 100644 index 00000000..f79ad84e --- /dev/null +++ b/frontend/templates/pledge_complete.html @@ -0,0 +1,17 @@ +{% extends "basedocumentation.html" %} + +{% block title %}Pledge Completed{% endblock %} + +{% block extra_extra_head %} + +{% endblock %} + +{% block doccontent %} + +
Thank you!
+ +
{{output}}
+ +{% endblock %} + + diff --git a/frontend/urls.py b/frontend/urls.py index 058e0c27..471402a5 100644 --- a/frontend/urls.py +++ b/frontend/urls.py @@ -5,7 +5,7 @@ from django.views.generic import ListView, DetailView from django.contrib.auth.decorators import login_required from regluit.core.models import Campaign -from regluit.frontend.views import CampaignFormView, GoodreadsDisplayView, LibraryThingView, PledgeView, FAQView +from regluit.frontend.views import CampaignFormView, GoodreadsDisplayView, LibraryThingView, PledgeView, PledgeCompleteView, PledgeCancelView, FAQView from regluit.frontend.views import CampaignListView, DonateView, WorkListView urlpatterns = patterns( @@ -48,6 +48,8 @@ urlpatterns = patterns( #may want to deprecate the following url(r"^setup/work/(?P\d+)/$", "work", {'action':'setup_campaign'}, name="setup_campaign"), url(r"^pledge/(?P\d+)/$", login_required(PledgeView.as_view()), name="pledge"), + url(r"^pledge/cancel/$", PledgeCancelView.as_view(), name="pledge_cancel"), + url(r"^pledge/complete/$", PledgeCompleteView.as_view(), name="pledge_complete"), url(r"^celery/clear/$","clear_celery_tasks", name="clear_celery_tasks"), url(r"^subjects/$", "subjects", name="subjects"), url(r"^librarything/$", LibraryThingView.as_view(), name="librarything"), diff --git a/frontend/views.py b/frontend/views.py index 97c07cd8..8dbb8b64 100755 --- a/frontend/views.py +++ b/frontend/views.py @@ -294,6 +294,37 @@ class PledgeView(FormView): response = t.reference logger.info("PledgeView paypal: Error " + str(t.reference)) return HttpResponse(response) + +class PledgeCompleteView(TemplateView): + """A callback for PayPal to tell unglue.it that a payment transaction has completed successfully""" + + template_name="pledge_complete.html" + + def get_context_data(self, **kwargs): + # pick up all get and post parameters and display + context = super(PledgeCompleteView, self).get_context_data(**kwargs) + + output = "pledge complete" + output += self.request.method + "\n" + str(self.request.REQUEST.items()) + context["output"] = output + + return context + + +class PledgeCancelView(TemplateView): + """A callback for PayPal to tell unglue.it that a payment transaction has been canceled by the user""" + template_name="pledge_cancel.html" + + def get_context_data(self, **kwargs): + # pick up all get and post parameters and display + context = super(PledgeCancelView, self).get_context_data(**kwargs) + + output = "pledge cancel" + output += self.request.method + "\n" + str(self.request.REQUEST.items()) + context["output"] = output + + return context + class DonateView(FormView): template_name="donate.html" From a7009b199819485043488d17a14ec080502c9565 Mon Sep 17 00:00:00 2001 From: Andromeda Yelton Date: Mon, 9 Jan 2012 12:44:35 -0500 Subject: [PATCH 3/5] whoops, should probably commit the version that passes tests --- frontend/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/views.py b/frontend/views.py index 15999154..8b61e1e2 100755 --- a/frontend/views.py +++ b/frontend/views.py @@ -81,7 +81,10 @@ def work(request, work_id, action='display'): work = get_object_or_404(models.Work, id=work_id) editions = work.editions.all().order_by('-publication_date') campaign = work.last_campaign() - pledged = campaign.transactions().filter(user=request.user, status="ACTIVE") + try: + pledged = campaign.transactions().filter(user=request.user, status="ACTIVE") + except: + pledged = None try: pubdate = work.editions.all()[0].publication_date[:4] except IndexError: From 556ecf8a0685cccc56422390bcbf69a619dceac2 Mon Sep 17 00:00:00 2001 From: Andromeda Yelton Date: Mon, 9 Jan 2012 15:53:09 -0500 Subject: [PATCH 4/5] now users can give us feedback on alpha --- frontend/forms.py | 21 ++++++++++++++++- frontend/templates/base.html | 3 +++ frontend/templates/feedback.html | 31 +++++++++++++++++++++++++ frontend/templates/thanks.html | 11 +++++++++ frontend/urls.py | 2 ++ frontend/views.py | 39 +++++++++++++++++++++++++++++++- static/css/sitewide.css | 36 +++++++++++++++++++++++++++++ static/less/sitewide.less | 35 ++++++++++++++++++++++++++++ 8 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 frontend/templates/feedback.html create mode 100644 frontend/templates/thanks.html diff --git a/frontend/forms.py b/frontend/forms.py index 20747ee3..71f8fa00 100644 --- a/frontend/forms.py +++ b/frontend/forms.py @@ -200,4 +200,23 @@ class EmailShareForm(forms.Form): # allows us to return user to original page by passing it as hidden form input # we can't rely on POST or GET since the emailshare view handles both # and may iterate several times as it catches user errors, losing URL info - next = forms.CharField(widget=forms.HiddenInput()) \ No newline at end of file + next = forms.CharField(widget=forms.HiddenInput()) + +class FeedbackForm(forms.Form): + sender = forms.EmailField(widget=forms.TextInput(attrs={'size':50})) + subject = forms.CharField(max_length=500, widget=forms.TextInput(attrs={'size':50})) + message = forms.CharField(widget=forms.Textarea()) + page = forms.CharField(widget=forms.HiddenInput()) + notarobot = forms.IntegerField(label="Please prove you're not a robot") + answer = forms.IntegerField(widget=forms.HiddenInput()) + num1 = forms.IntegerField(widget=forms.HiddenInput()) + num2 = forms.IntegerField(widget=forms.HiddenInput()) + + def clean(self): + cleaned_data = self.cleaned_data + notarobot = str(cleaned_data.get("notarobot")) + answer = str(cleaned_data.get("answer")) + if notarobot!=answer: + raise forms.ValidationError(_("Whoops, try that sum again.")) + + return cleaned_data diff --git a/frontend/templates/base.html b/frontend/templates/base.html index 7b2fbc16..8e1a7e6b 100644 --- a/frontend/templates/base.html +++ b/frontend/templates/base.html @@ -25,6 +25,9 @@ +
diff --git a/frontend/templates/feedback.html b/frontend/templates/feedback.html new file mode 100644 index 00000000..d4b68f4f --- /dev/null +++ b/frontend/templates/feedback.html @@ -0,0 +1,31 @@ +{% extends "basedocumentation.html" %} + +{% block title %}Feedback{% endblock %} + +{% block doccontent %} + +

Love something? Hate something? Found something broken or confusing? We're so glad you're telling us!

+ + To: support@gluejar.com
+
+ {% csrf_token %} + {{ form.sender.label_tag }}
+ {{ form.sender.errors }} + {{ form.sender }}
+ {{ form.subject.label_tag }}
+ {{ form.subject.errors }} + {{ form.subject }}
+ {{ form.message.label_tag }}
+ {{ form.message.errors }} + {{ form.message }}
+ {{ form.notarobot.errors }} + {{ form.non_field_errors }} + Please prove you're not a robot. {{num1}} + {{num2}} = + {{ form.notarobot }}
+ {{ form.answer }} + {{ form.num1 }} + {{ form.num2 }} + {{ form.page }} + +
+{% endblock %} \ No newline at end of file diff --git a/frontend/templates/thanks.html b/frontend/templates/thanks.html new file mode 100644 index 00000000..7c3be620 --- /dev/null +++ b/frontend/templates/thanks.html @@ -0,0 +1,11 @@ +{% extends "basedocumentation.html" %} + +{% block title %}Feedback{% endblock %} + +{% block doccontent %} + +

Thanks for helping us make Unglue.It better!

+ +

Would you like to go back to the page you were on? + +{% endblock %} \ No newline at end of file diff --git a/frontend/urls.py b/frontend/urls.py index 058e0c27..8b078830 100644 --- a/frontend/urls.py +++ b/frontend/urls.py @@ -57,4 +57,6 @@ urlpatterns = patterns( url('^500testing/$', direct_to_template, {'template': '500.html'}), url('^robots.txt$', direct_to_template, {'template': 'robots.txt'}), url(r"^emailshare/$", "emailshare", name="emailshare"), + url(r"^feedback/$", "feedback", name="feedback"), + url(r"^feedback/thanks/$", TemplateView.as_view(template_name="thanks.html")), ) diff --git a/frontend/views.py b/frontend/views.py index 8b61e1e2..6d453119 100755 --- a/frontend/views.py +++ b/frontend/views.py @@ -4,6 +4,7 @@ import json import urllib import logging import datetime +from random import randint from re import sub from itertools import islice from decimal import Decimal as D @@ -39,7 +40,7 @@ from regluit.core.search import gluejar_search from regluit.core.goodreads import GoodreadsClient from regluit.frontend.forms import UserData, ProfileForm, CampaignPledgeForm, GoodreadsShelfLoadingForm from regluit.frontend.forms import RightsHolderForm, UserClaimForm, LibraryThingForm, OpenCampaignForm -from regluit.frontend.forms import ManageCampaignForm, DonateForm, CampaignAdminForm, EmailShareForm +from regluit.frontend.forms import ManageCampaignForm, DonateForm, CampaignAdminForm, EmailShareForm, FeedbackForm from regluit.payment.manager import PaymentManager from regluit.payment.parameters import TARGET_TYPE_CAMPAIGN, TARGET_TYPE_DONATION from regluit.payment.paypal import Preapproval, IPN_PAY_STATUS_ACTIVE, IPN_PAY_STATUS_INCOMPLETE, IPN_PAY_STATUS_COMPLETED, IPN_PAY_STATUS_CANCELED @@ -1049,3 +1050,39 @@ def emailshare(request): form = EmailShareForm(initial={'next':next, 'message':"I'm ungluing books at unglue.it. Here's one of my favorites: "+next, "sender":sender}) return render(request, "emailshare.html", {'form':form}) + +def feedback(request): + num1 = randint(0,10) + num2 = randint(0,10) + sum = num1 + num2 + + if request.method == 'POST': + form=FeedbackForm(request.POST) + if form.is_valid(): + subject = form.cleaned_data['subject'] + message = form.cleaned_data['message'] + sender = form.cleaned_data['sender'] + recipient = 'support@gluejar.com' + page = form.cleaned_data['page'] + message = "<<>>"+message + send_mail(subject, message, sender, [recipient]) + + return render(request, "thanks.html", {"page":page}) + + else: + num1 = request.POST['num1'] + num2 = request.POST['num2'] + + else: + if request.user.is_authenticated(): + sender=user.email; + else: + sender='' + try: + page = request.GET['page'] + except: + page='/' + form = FeedbackForm(initial={"sender":sender, "subject": "Feedback on page "+page, "page":page, "num1":num1, "num2":num2, "answer":sum}) + + return render(request, "feedback.html", {'form':form, 'num1':num1, 'num2':num2}) + \ No newline at end of file diff --git a/static/css/sitewide.css b/static/css/sitewide.css index e698c547..fd8fedd7 100644 --- a/static/css/sitewide.css +++ b/static/css/sitewide.css @@ -35,6 +35,42 @@ body { font-family: "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Arial, Helvetica, sans-serif; color: #3d4e53; } +#feedback { + /* remove after alpha? */ + + position: fixed; + top: 50%; + left: 0; + z-index: 500; +} +#feedback p { + /* see http://scottgale.com/blog/css-vertical-text/2010/03/01/ */ + + writing-mode: tb-rl; + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -o-transform: rotate(90deg); + white-space: nowrap; + display: block; + bottom: 0; + width: 160px; + height: 26px; + -moz-border-radius: 32px 32px 32px 32px; + -webkit-border-radius: 32px 32px 32px 32px; + border-radius: 32px 32px 32px 32px; + background: #8dc63f; + margin-bottom: 0; + text-align: center; + margin-left: -67px; +} +#feedback p a { + color: white; + font-size: 24px; + font-weight: normal; +} +#feedback p a:hover { + color: #3d4e53; +} a { font-weight: bold; font-size: 13px; diff --git a/static/less/sitewide.less b/static/less/sitewide.less index d6039d62..eb1990b0 100644 --- a/static/less/sitewide.less +++ b/static/less/sitewide.less @@ -32,6 +32,41 @@ body{ color:@text-blue; } +#feedback { + /* remove after alpha? */ + position: fixed; + top: 50%; + left: 0; + z-index:500; + + p { + /* see http://scottgale.com/blog/css-vertical-text/2010/03/01/ */ + a { + color:white; + font-size:24px; + font-weight:normal; + + &:hover { + color: @text-blue; + } + } + writing-mode:tb-rl; + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -o-transform: rotate(90deg); + white-space:nowrap; + display:block; + bottom:0; + width:160px; + height:26px; + .border-radius(32px, 32px, 32px, 32px); + background: @call-to-action; + margin-bottom: 0; + text-align: center; + margin-left: -67px; + } +} + a { font-weight:bold; font-size:13px; From 7ca9a5f0a78a095fab600b827d132247ad9f3b93 Mon Sep 17 00:00:00 2001 From: Andromeda Yelton Date: Tue, 10 Jan 2012 11:10:27 -0500 Subject: [PATCH 5/5] it is the skeleton of a press kit --- frontend/templates/press.html | 75 ++++++++++++++++++++++++++++++++++ frontend/urls.py | 2 + static/css/documentation.css | 34 +++++++++++++++ static/css/landingpage.css | 19 +++++---- static/less/documentation.less | 33 +++++++++++++++ static/less/landingpage.less | 9 +++- 6 files changed, 163 insertions(+), 9 deletions(-) create mode 100644 frontend/templates/press.html diff --git a/frontend/templates/press.html b/frontend/templates/press.html new file mode 100644 index 00000000..e9f54457 --- /dev/null +++ b/frontend/templates/press.html @@ -0,0 +1,75 @@ +{% extends "basedocumentation.html" %} + +{% block doccontent %} +

Press

+
+ + +
+ Additional press questions? Please email press@gluejar.com. +
+
+
+ Thanks for your interest! As of January 2011 Unglue.It is in alpha release. Things are mostly working but they're rough around the edges and may change without notice. +
+
+ +

Overview

+
+
What?
+
Unglue.It offers a win-win solution to readers, who want to read and share their favorite books conveniently, and rights holders, who want to be rewarded for their work.

+We run [TBA:link to wikipedia?]crowdfunding campaigns to raise money for specific, already-published books. When we reach a goal set by the rights holder, we pay them to unglue their work. They issue an electronic edition with a Creative Commons license. This license makes the edition free and legal for everyone to read, copy, and share, noncommercially, worldwide.
+
Why?
+
As ereaders proliferate, more and more people are enjoying the ereading experience. However, their favorite books may not be available as ebooks. They may come with DRM which makes them unreadable on certain devices, and difficult or impossible for individuals and libraries to lend. Or they may not be able to tell if they have the legal right to use the book as they'd like.

+When books have a clear, established legal license which promotes use, they can be read more widely, leading to enjoyment, scholarship, and innovation. By raising money to compensate authors and publishers up front, Unglue.It encourages the benefits of openness while ensuring sustainability for creators.
+
Who?
+
Unglue.It is a service of Gluejar, Inc. We are Eric Hellman, Amanda Mecke, Raymond Yee, and Andromeda Yelton. (TBA: include contractors?) We come from the worlds of entrepreneurship, linked data, physics, publishing, education, and library science, to name a few. You can learn more about us at our personal home pages (linked above) or the team page of our corporate site.
+
When?
+
Unglue.It is in alpha -- a limited release for testing purposes -- as of January 2011. If you sign up for our newsletter, we'll tell you the moment we're in beta. At that point we'll have active campaigns and be welcoming account signups from everyone.
+
Where?
+
Gluejar is a New Jersey corporation, but its employees and contractors live and work across North America. The best way to contact us is by email, press@gluejar.com.
+
What does it cost?
+
Unglue.It is free to join and explore. Supporters pay only if they choose to support campaigns, and the amount is up to them. Unglue.It takes a small percentage from successful campaigns, with the remainder going to the rights holders.
+
What's your technology?
+
Unglue.It is built using Python and the Django framework. [TBA: links] We use data from the Google Books, OpenLibrary, LibraryThing, and GoodReads APIs [TBA: public? "Open Library"]; we appreciate that they've made these APIs available, and we'll be returning the favor with our own API. We use the Less framework [TBA:link] to organize our CSS. We collaborate on our code at github[TBA: capitalization?] and deploy to Amazon EC2 [TBA: throw in "cloud" here somehow, look up what EC2 is exactly].
+
I have more questions...
+
Please consult our FAQ (sidebar at left); join the site and explore its features for yourself; or email us, press@gluejar.com.
+ +

Press Coverage

+

Blog Coverage (Highlights)

+

Video

+

Newsletters

+

Logos & Icons

+
+
+
+

(161 x 70)

+
+
+
+

(44 x 30)

+
+
+





+
+logos at +Low Resolution Logo (350 x 150) +Standard Resolution Logo (1400 x 600) +High Resolution Logo (5600 x 2400) + +black background and white background (color versions only) + +icons on black, dark grey, white; 1(?) p grey border, rounded corners (at some surprisingly large border radius), 48px square + +screencaps +look through mail for different sizes of icon and B&W -- ping stefan, ask if this looks like enough, & if not can he send more +
+{% endblock %} \ No newline at end of file diff --git a/frontend/urls.py b/frontend/urls.py index 2e5930f6..125d7dc5 100644 --- a/frontend/urls.py +++ b/frontend/urls.py @@ -61,4 +61,6 @@ urlpatterns = patterns( url(r"^emailshare/$", "emailshare", name="emailshare"), url(r"^feedback/$", "feedback", name="feedback"), url(r"^feedback/thanks/$", TemplateView.as_view(template_name="thanks.html")), + url(r"^press/$", TemplateView.as_view(template_name="press.html"), + name="press"), ) diff --git a/static/css/documentation.css b/static/css/documentation.css index e5b28990..109b086d 100644 --- a/static/css/documentation.css +++ b/static/css/documentation.css @@ -188,6 +188,7 @@ dt { } dd { margin: 0; + padding-bottom: 7px; } .doc ol li { margin-bottom: 7px; @@ -198,3 +199,36 @@ dd { .collapse ul { display: none; } +/* items on press page */ +.presstoc { + overflow: auto; + clear: both; + padding-bottom: 10px; +} +.presstoc div { + float: left; + padding-right: 15px; +} +.presstoc div.pressemail { + border: solid 2px #3d4e53; + padding: 5px; + -moz-border-radius: 7px 7px 7px 7px; + -webkit-border-radius: 7px 7px 7px 7px; + border-radius: 7px 7px 7px 7px; + -moz-border-radius: 7px 7px 7px 7px; + -webkit-border-radius: 7px 7px 7px 7px; + border-radius: 7px 7px 7px 7px; +} +.pressimages { + clear: both; +} +.pressimages .outer { + clear: both; +} +.pressimages .outer div { + float: left; + width: 25%; + padding-bottom: 10px; + display: table-cell; + margin: auto 0; +} diff --git a/static/css/landingpage.css b/static/css/landingpage.css index 890a208c..3835a4cf 100644 --- a/static/css/landingpage.css +++ b/static/css/landingpage.css @@ -141,14 +141,19 @@ height: 24px; line-height: 24px; width: 24px; - -moz-border-radius: 12px 12px 12px 12px; - -webkit-border-radius: 12px 12px 12px 12px; - border-radius: 12px 12px 12px 12px; - -moz-border-radius: 12px 12px 12px 12px; - -webkit-border-radius: 12px 12px 12px 12px; - border-radius: 12px 12px 12px 12px; - border: solid 4px #3d4e53; + -moz-border-radius: 24px 24px 24px 24px; + -webkit-border-radius: 24px 24px 24px 24px; + border-radius: 24px 24px 24px 24px; + -moz-border-radius: 24px 24px 24px 24px; + -webkit-border-radius: 24px 24px 24px 24px; + border-radius: 24px 24px 24px 24px; + -moz-box-shadow: -1px 1px #3d4e53; + -webkit-box-shadow: -1px 1px #3d4e53; + box-shadow: -1px 1px #3d4e53; + border: solid 3px white; text-align: center; + color: white; + background: #3d4e53; font-size: 17px; z-index: 5000; margin-top: -12px; diff --git a/static/less/documentation.less b/static/less/documentation.less index bd814b15..8c476b21 100644 --- a/static/less/documentation.less +++ b/static/less/documentation.less @@ -124,6 +124,7 @@ dt { dd { margin: 0; + padding-bottom: 7px; } .doc ol li { @@ -136,4 +137,36 @@ dd { .collapse ul { display: none; +} + +/* items on press page */ +.presstoc { + div { + float: left; + padding-right: 15px; + + &.pressemail { + border: solid 2px @text-blue; + padding: 5px; + .border-radius(7px, 7px, 7px, 7px); + } + } + overflow: auto; + clear: both; + padding-bottom: 10px; +} + +.pressimages { + .outer { + clear: both; + + div { + float: left; + width: 25%; + padding-bottom: 10px; + display: table-cell; + margin: auto 0; + } + } + clear: both; } \ No newline at end of file diff --git a/static/less/landingpage.less b/static/less/landingpage.less index 4125eadd..bd04be30 100644 --- a/static/less/landingpage.less +++ b/static/less/landingpage.less @@ -92,9 +92,14 @@ float: right; .height(24px); width: 24px; - .border-radius(12px, 12px, 12px, 12px); - border: solid 4px @text-blue; + .border-radius(24px, 24px, 24px, 24px); + -moz-box-shadow: -1px 1px @text-blue; + -webkit-box-shadow: -1px 1px @text-blue; + box-shadow: -1px 1px @text-blue; + border: solid 3px white; text-align: center; + color: white; + background: @text-blue; font-size: 17px; z-index:5000; margin-top: -12px;