Merge ~ines-almeida/launchpad:frontpage-revamp into launchpad:master

Proposed by Ines Almeida
Status: Rejected
Rejected by: Ines Almeida
Proposed branch: ~ines-almeida/launchpad:frontpage-revamp
Merge into: launchpad:master
Diff against target: 671 lines (+201/-256)
7 files modified
lib/canonical/launchpad/icing/css/components/_index.scss (+1/-0)
lib/canonical/launchpad/icing/css/components/homepage.scss (+18/-0)
lib/lp/app/browser/doc/root-views.rst (+8/-29)
lib/lp/app/browser/root.py (+0/-20)
lib/lp/app/browser/tales.py (+15/-8)
lib/lp/app/stories/launchpad-root/xx-featuredprojects.rst (+5/-23)
lib/lp/app/templates/root-index.pt (+154/-176)
Reviewer Review Type Date Requested Status
Launchpad code reviewers Pending
Review via email: mp+460775@code.launchpad.net

Commit message

ui: Launchpad homepage revamp

 - Imported Vanilla framework directly to the homepage
 - Re-organized homepage sections and reworked them using Vanilla components
 - Cleaned up CSS styling and page views that are no longer used

Description of the change

Initial stab at making Launchpad's homepage a little bit more modern

To post a comment you must log in.
18aae7f... by Ines Almeida

tests: remove mentions of top-featured-project from doc tests

Revision history for this message
Ines Almeida (ines-almeida) wrote :

Rejecting this MP in favor this one:
 - https://code.launchpad.net/~ines-almeida/launchpad/+git/launchpad/+merge/460819

The new MP is proposed against a branch that removes the top project in a separate MP, to remove some clutter from the frontend changes: https://code.launchpad.net/~ines-almeida/launchpad/+git/launchpad/+merge/460809

Unmerged commits

18aae7f... by Ines Almeida

tests: remove mentions of top-featured-project from doc tests

Succeeded
[SUCCEEDED] docs:0 (build)
[SUCCEEDED] lint:0 (build)
[SUCCEEDED] mypy:0 (build)
13 of 3 results
f26087e... by Ines Almeida

ui: Cleanup homepage CSS styling

Move the CSS that existed in the page into a homepage component and remove everything that is not needed anymore

Succeeded
[SUCCEEDED] docs:0 (build)
[SUCCEEDED] lint:0 (build)
[SUCCEEDED] mypy:0 (build)
13 of 3 results
7c425d4... by Ines Almeida

ui: Update frontpage

Import Vanilla framework to make it look more similar to other (more modern) Canonical pages.
Reorganize the sections, and use some of the components from Vanilla.

4efce31... by Ines Almeida

ui: Add new frontend icons

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/canonical/launchpad/icing/css/components/_index.scss b/lib/canonical/launchpad/icing/css/components/_index.scss
2index 59e25ed..057da90 100644
3--- a/lib/canonical/launchpad/icing/css/components/_index.scss
4+++ b/lib/canonical/launchpad/icing/css/components/_index.scss
5@@ -1,6 +1,7 @@
6 @import 'access_tokens',
7 'batch_navigation',
8 'bug_picker',
9+ 'homepage',
10 'profiling_info',
11 'sidebar_portlets',
12 'bug_listing',
13diff --git a/lib/canonical/launchpad/icing/css/components/homepage.scss b/lib/canonical/launchpad/icing/css/components/homepage.scss
14new file mode 100644
15index 0000000..17b63cc
16--- /dev/null
17+++ b/lib/canonical/launchpad/icing/css/components/homepage.scss
18@@ -0,0 +1,18 @@
19+.homepage {
20+ margin: auto;
21+ width: 90%;
22+ max-width: 80em;
23+}
24+
25+// Make search box wide
26+#homepage-searchform {
27+ width: 100%;
28+
29+ .p-form__group {
30+ flex-grow: 1;
31+ }
32+
33+ .p-form__control {
34+ width: 100%;
35+ }
36+}
37diff --git a/lib/canonical/launchpad/images/add-homepage.png b/lib/canonical/launchpad/images/add-homepage.png
38new file mode 100644
39index 0000000..0cd9f6f
40Binary files /dev/null and b/lib/canonical/launchpad/images/add-homepage.png differ
41diff --git a/lib/canonical/launchpad/images/bug-homepage.png b/lib/canonical/launchpad/images/bug-homepage.png
42new file mode 100644
43index 0000000..3599ff9
44Binary files /dev/null and b/lib/canonical/launchpad/images/bug-homepage.png differ
45diff --git a/lib/canonical/launchpad/images/ppa-icon-homepage.png b/lib/canonical/launchpad/images/ppa-icon-homepage.png
46new file mode 100644
47index 0000000..f6f529c
48Binary files /dev/null and b/lib/canonical/launchpad/images/ppa-icon-homepage.png differ
49diff --git a/lib/canonical/launchpad/images/question-homepage.png b/lib/canonical/launchpad/images/question-homepage.png
50new file mode 100644
51index 0000000..f43e96f
52Binary files /dev/null and b/lib/canonical/launchpad/images/question-homepage.png differ
53diff --git a/lib/canonical/launchpad/images/translation-homepage.png b/lib/canonical/launchpad/images/translation-homepage.png
54new file mode 100644
55index 0000000..6988a2b
56Binary files /dev/null and b/lib/canonical/launchpad/images/translation-homepage.png differ
57diff --git a/lib/lp/app/browser/doc/root-views.rst b/lib/lp/app/browser/doc/root-views.rst
58index 8782f3f..f5c996e 100644
59--- a/lib/lp/app/browser/doc/root-views.rst
60+++ b/lib/lp/app/browser/doc/root-views.rst
61@@ -12,7 +12,7 @@ special data needed for the layout.
62 ...
63 >>> LaunchpadRootIndexView._get_day_of_year = staticmethod(day)
64
65-The view has a provides a list of featured projects and a top project.
66+The view has a provides a list of featured projects.
67
68 >>> from lp.services.webapp.interfaces import ILaunchpadRoot
69
70@@ -21,36 +21,15 @@ The view has a provides a list of featured projects and a top project.
71 >>> for project in view.featured_projects:
72 ... print(project.name)
73 ...
74- applets bazaar firefox gentoo gnome-terminal mozilla thunderbird ubuntu
75-
76- >>> print(view.featured_projects_top.name)
77+ applets
78+ bazaar
79+ firefox
80+ gentoo
81 gnome
82-
83-The featured_projects_top property is set by a helper method that pops the
84-project from the list of featured_projects.
85-
86- >>> featured_projects = list(view.featured_projects)
87- >>> featured_projects_top = view.featured_projects_top
88- >>> view._setFeaturedProjectsTop()
89- >>> print(view.featured_projects_top.name)
90 gnome-terminal
91-
92- >>> for project in view.featured_projects:
93- ... print(project.name)
94- ...
95- applets bazaar firefox gentoo mozilla thunderbird ubuntu
96-
97-If there are no featured projects, the top featured project is None.
98-
99- >>> view.featured_projects = []
100- >>> view.featured_projects_top = None
101- >>> view._setFeaturedProjectsTop()
102- >>> print(view.featured_projects_top)
103- None
104-
105- # Put the projects back as they were.
106- >>> view.featured_projects = featured_projects
107- >>> view.featured_projects_top = featured_projects_top
108+ mozilla
109+ thunderbird
110+ ubuntu
111
112 The view provides the counts of branches, Git repositories, bugs,
113 projects, translations, blueprints, and answers registered in Launchpad.
114diff --git a/lib/lp/app/browser/root.py b/lib/lp/app/browser/root.py
115index 2a87d2b..154b6a5 100644
116--- a/lib/lp/app/browser/root.py
117+++ b/lib/lp/app/browser/root.py
118@@ -57,21 +57,11 @@ class LaunchpadRootIndexView(HasAnnouncementsView, LaunchpadView):
119
120 page_title = "Launchpad"
121 featured_projects: List[Any] = []
122- featured_projects_top = None
123
124 # Used by the footer to display the lp-arcana section.
125 is_root_page = True
126 has_watermark = False
127
128- @staticmethod
129- def _get_day_of_year():
130- """Calculate the number of the current day.
131-
132- This method gets overridden in tests to make the selection of the
133- top featured project deterministic.
134- """
135- return time.gmtime()[7]
136-
137 def initialize(self):
138 """Set up featured projects list and the top featured project."""
139 super().initialize()
140@@ -80,16 +70,6 @@ class LaunchpadRootIndexView(HasAnnouncementsView, LaunchpadView):
141 self.featured_projects = list(
142 getUtility(IPillarNameSet).featured_projects
143 )
144- self._setFeaturedProjectsTop()
145-
146- def _setFeaturedProjectsTop(self):
147- """Set the top featured project and remove it from the list."""
148- project_count = len(self.featured_projects)
149- if project_count > 0:
150- top_project = self._get_day_of_year() % project_count
151- self.featured_projects_top = self.featured_projects.pop(
152- top_project
153- )
154
155 @cachedproperty
156 def apphomes(self):
157diff --git a/lib/lp/app/browser/tales.py b/lib/lp/app/browser/tales.py
158index c91b890..d6b2760 100644
159--- a/lib/lp/app/browser/tales.py
160+++ b/lib/lp/app/browser/tales.py
161@@ -826,11 +826,10 @@ class ObjectImageDisplayAPI:
162 # XXX: this should go away as soon as all image:icon where replaced
163 return None
164
165- def logo(self):
166- """Return the appropriate <img> tag for this object's logo.
167+ def logo_src(self):
168+ """Return the appropriate src attribute for this object's logo.
169
170- :return: A string, or None if the context object doesn't have
171- a logo.
172+ :return: A string, or None if the context object doesn't have a logo.
173 """
174 context = self._context
175 if not IHasLogo.providedBy(context):
176@@ -843,10 +842,18 @@ class ObjectImageDisplayAPI:
177 url = context.logo.getURL()
178 else:
179 url = self.default_logo_resource(context)
180- if url is None:
181- # We want to indicate that there is no logo for this
182- # object.
183- return None
184+ return url
185+
186+ def logo(self):
187+ """Return the appropriate <img> tag for this object's logo.
188+
189+ :return: A string, or None if the context object doesn't have a logo.
190+ """
191+ url = self.logo_src()
192+ if url is None:
193+ # We want to indicate that there is no logo for this
194+ # object.
195+ return None
196 logo = '<img alt="" width="64" height="64" src="%s" />'
197 return logo % url
198
199diff --git a/lib/lp/app/stories/launchpad-root/xx-featuredprojects.rst b/lib/lp/app/stories/launchpad-root/xx-featuredprojects.rst
200index e0ff0f6..173eb04 100644
201--- a/lib/lp/app/stories/launchpad-root/xx-featuredprojects.rst
202+++ b/lib/lp/app/stories/launchpad-root/xx-featuredprojects.rst
203@@ -11,31 +11,14 @@ page and managed via a special admin-only page.
204 The home page listing
205 ---------------------
206
207-Featured projects are visible to everyone on the home page. One project is
208-featured as "project of the day" depending on the current day. As we do not
209-know the current day, we replace that selection method in the view with a
210-constant value.
211-
212- >>> def fake_get_day_of_year():
213- ... return 4
214- ...
215- >>> from lp.app.browser.root import LaunchpadRootIndexView
216- >>> LaunchpadRootIndexView._get_day_of_year = staticmethod(
217- ... fake_get_day_of_year
218- ... )
219-
220 Anonymous users will see the list of featured projects with links to the
221-projects' pages in Launchpad. The "project of the day" is listed separately.
222+projects' pages in Launchpad.
223
224 >>> anon_browser.open("http://launchpad.test/")
225 >>> featured = find_tag_by_id(anon_browser.contents, "homepage-featured")
226 >>> print(extract_text(featured.h2))
227 Featured projects
228
229- >>> top_project = featured.find("", "featured-project-top")
230- >>> print(extract_text(top_project.h3))
231- GNOME
232-
233 >>> featured_list = featured.find("", "featured-projects-list")
234 >>> for link in featured_list.find_all("a"):
235 ... print(extract_text(link))
236@@ -44,6 +27,7 @@ projects' pages in Launchpad. The "project of the day" is listed separately.
237 Bazaar
238 Mozilla Firefox
239 Gentoo
240+ GNOME
241 GNOME Terminal
242 The Mozilla Project
243 Mozilla Thunderbird
244@@ -98,10 +82,6 @@ is now at index '4' and is therefore displayed as the top project:
245
246 >>> anon_browser.open("http://launchpad.test/")
247 >>> featured = find_tag_by_id(anon_browser.contents, "homepage-featured")
248- >>> top_project = featured.find("", "featured-project-top")
249- >>> print(extract_text(top_project.h3))
250- Gentoo
251-
252 >>> featured_list = featured.find("", "featured-projects-list")
253 >>> for link in featured_list.find_all("a"):
254 ... print(extract_text(link))
255@@ -110,6 +90,7 @@ is now at index '4' and is therefore displayed as the top project:
256 Gnome Applets
257 Bazaar
258 Mozilla Firefox
259+ Gentoo
260 GNOME
261 GNOME Terminal
262 The Mozilla Project
263@@ -136,11 +117,12 @@ that Apache has been removed:
264 >>> for link in featured.find_all("a"):
265 ... print(extract_text(link))
266 ...
267- GNOME
268+ See more...
269 Gnome Applets
270 Bazaar
271 Mozilla Firefox
272 Gentoo
273+ GNOME
274 GNOME Terminal
275 The Mozilla Project
276 Mozilla Thunderbird
277diff --git a/lib/lp/app/templates/root-index.pt b/lib/lp/app/templates/root-index.pt
278index 75084b9..9cf186d 100644
279--- a/lib/lp/app/templates/root-index.pt
280+++ b/lib/lp/app/templates/root-index.pt
281@@ -6,48 +6,7 @@
282 metal:use-macro="view/macro:page/main_only"
283 i18n:domain="launchpad">
284 <metal:head fill-slot="head_epilogue">
285- <style>
286- .homepage {
287- margin: auto;
288- width: 90%;
289- max-width: 80em;
290- }
291- #homepage-whatslaunchpad ul {
292- margin-left: 1em;
293- margin-bottom: 0.5em;
294- }
295- #homepage-whatslaunchpad ul,
296- #homepage-whatslaunchpad-tour {
297- font-weight: bold;
298- }
299- #homepage-stats {
300- max-width: 50em;
301- margin: auto;
302- padding-top: 0.5em;
303- color: gray;
304- }
305- #homepage-blogposts {
306- padding-right: 4em;
307- }
308- #homepage-getstarted ul {
309- padding-top: 0.5em;
310- }
311- .featured-project-top h3 {
312- font-weight: bold;
313- }
314- .featured-project-top h3 img {
315- vertical-align: middle;
316- }
317- .featured-project-top p {
318- margin-top: 0.5em;
319- margin-bottom: 1em;
320- padding-bottom: .5em;
321- border-bottom: 1px dotted #999;
322- }
323- #launchpad-logo-and-name {
324- width: 250px;
325- }
326- </style>
327+ <link rel="stylesheet" href="https://assets.ubuntu.com/v1/vanilla-framework-version-4.7.0.min.css" />
328 </metal:head>
329 <body>
330 <div metal:fill-slot="main">
331@@ -67,95 +26,26 @@
332 style="margin: 0 9em 1em 0"/>
333 </div>
334
335- <div class="yui-g">
336- <div class="yui-u first" style="margin-top: 1.5em;">
337- <div class="homepage-whatslaunchpad"
338- tal:condition="view/show_whatslaunchpad">
339- <h2><span class="launchpad-gold">Launchpad</span> is a software collaboration platform that provides:</h2>
340- <ul tal:define="apphomes view/apphomes">
341- <li>
342- <a class="sprite bug"
343- tal:attributes="href apphomes/bugs">Bug tracking</a>
344- </li>
345- <li>
346- <a class="sprite branch"
347- tal:attributes="href apphomes/code">Code hosting</a>
348- using <a href="http://bazaar.canonical.com/">Bazaar</a>
349- and <a href="https://git-scm.com/">Git</a>
350- </li>
351- <li>
352- <a class="sprite yes"
353- href="https://help.launchpad.net/Code/Review">Code reviews</a>
354- </li>
355- <li>
356- <a class="sprite ubuntu-logo"
357- tal:attributes="href apphomes/ubuntu">Ubuntu package building and hosting</a>
358- </li>
359- <li>
360- <a class="sprite translate-icon"
361- tal:attributes="href apphomes/translations">Translations</a>
362- </li>
363- <li>
364- <a class="sprite mail"
365- href="https://help.launchpad.net/Teams/MailingLists">Mailing lists</a>
366- </li>
367- <li>
368- <a class="sprite question"
369- tal:attributes="href apphomes/answers">Answer tracking and FAQs</a>
370- </li>
371- <li>
372- <a class="sprite blueprint"
373- tal:attributes="href apphomes/blueprints">Specification tracking</a>
374- </li>
375- </ul>
376- <div id="homepage-whatslaunchpad-tour">
377- <a class="sprite tour" href="/+tour">Take the tour!</a>
378- </div>
379- </div>
380-
381- <div id="homepage-blogposts" class="homepage-portlet"
382- tal:condition="features/app.root_blog.enabled">
383- <h2>Recent Launchpad blog posts</h2>
384- <ul tal:define="posts view/getRecentBlogPosts">
385- <li class="news"
386- tal:repeat="post posts">
387- <a href="" tal:attributes="href post/link"
388- tal:content="post/title">
389- Take the Launchpad survey</a><span class="registered">
390- &ndash; <tal:date content="post/date">01 July 2010</tal:date></span><br />
391- <tal:description content="structure post/description">
392- Tell us a little about how you use Launchpad by answering
393- our short survey.
394- </tal:description>
395- </li>
396- <li class="news">
397- <a href="http://blog.launchpad.net/general/launchpad-is-now-open-source">
398- Launchpad now open source</a><span class="registered"> &ndash; 21 Jul 2009</span><br />
399- Get the code to Launchpad and join our development community.
400- </li>
401- </ul>
402- <ul class="horizontal">
403- <li>
404- <strong><a href="http://blog.launchpad.net">Read the blog</a></strong>
405- </li>
406- </ul>
407- </div>
408- </div>
409-
410- <div class="yui-u">
411- <form id="homepage-searchform"
412+ <section class="p-strip is-shallow">
413+ <div class="u-fixed-width">
414+ <form id="homepage-searchform" class="p-form p-form--inline"
415 xml:lang="en" lang="en" dir="ltr"
416 tal:attributes="action string:${rooturl}+search"
417 method="get" accept-charset="UTF-8">
418- <input id="text" type="text" name="field.text" size="25" />
419- <input id="search" type="submit" value="Search Launchpad" />
420+ <div class="p-form__group p-form--search">
421+ <label for="search-input" class="u-off-screen">Search</label>
422+ <div class="p-form__control u-clearfix">
423+ <input id="search-input" type="search" name="field.text" value="" autofocus="">
424+ </div>
425+ </div>
426+ <button id="search" class="p-button--positive" type="submit" value="Search">Search</button>
427 </form>
428 <script type="text/javascript">
429 LPJS.use('lp', function () {
430 setFocusByName('field.text');
431 });
432 </script>
433- <div id="homepage-stats">
434+ <div id="homepage-stats" class="u-text--muted">
435 <strong
436 tal:content="view/project_count/fmt:intcomma">123</strong>&nbsp;projects,
437 <strong
438@@ -172,76 +62,141 @@
439 tal:content="view/blueprint_count/fmt:intcomma">123</strong>&nbsp;blueprints,
440 and&nbsp;counting...
441 </div>
442- <div id="homepage-getstarted" class="homepage-portlet">
443- <h2>Get started</h2>
444+ </div>
445+ </section>
446+
447+ <section class="p-strip is-shallow" tal:condition="view/show_whatslaunchpad">
448+ <div class="homepage-whatslaunchpad">
449+ <div class="u-fixed-width u-clearfix">
450+ <h2>Launchpad</h2>
451+ <h4>A software collaboration platform that provides</h4>
452+ </div>
453+ <div class="u-fixed-width u-clearfix">
454+ <ul class="p-list--divided is-split" tal:define="apphomes view/apphomes">
455+ <li class="p-list__item">
456+ <a class="sprite bug"
457+ tal:attributes="href apphomes/bugs">Bug tracking</a>
458+ </li>
459+ <li class="p-list__item">
460+ <a class="sprite branch"
461+ tal:attributes="href apphomes/code">Code hosting</a>
462+ using <a href="http://bazaar.canonical.com/">Bazaar</a>
463+ and <a href="https://git-scm.com/">Git</a>
464+ </li>
465+ <li class="p-list__item">
466+ <a class="sprite yes"
467+ href="https://help.launchpad.net/Code/Review">Code reviews</a>
468+ </li>
469+ <li class="p-list__item">
470+ <a class="sprite ubuntu-logo"
471+ tal:attributes="href apphomes/ubuntu">Ubuntu package building and hosting</a>
472+ </li>
473+ <li class="p-list__item">
474+ <a class="sprite translate-icon"
475+ tal:attributes="href apphomes/translations">Translations</a>
476+ </li>
477+ <li class="p-list__item">
478+ <a class="sprite mail"
479+ href="https://help.launchpad.net/Teams/MailingLists">Mailing lists</a>
480+ </li>
481+ <li class="p-list__item">
482+ <a class="sprite question"
483+ tal:attributes="href apphomes/answers">Answer tracking and FAQs</a>
484+ </li>
485+ <li class="p-list__item">
486+ <a class="sprite blueprint"
487+ tal:attributes="href apphomes/blueprints">Specification tracking</a>
488+ </li>
489+ </ul>
490+
491+ <div id="homepage-whatslaunchpad-tour">
492+ <a class="sprite tour" href="/+tour">Take the tour!</a>
493+ </div>
494+ </div>
495+ </div>
496+ </section>
497+
498+ <section class="p-strip is-shallow">
499+ <div id="homepage-getstarted" class="homepage-portlet">
500+ <div class="u-fixed-width u-clearfix">
501+ <h2 class="u-float-left">Get started</h2>
502+ <a href="/+tour" class="p-button u-float-right u-hide--small p-featured-lp__see-more">Take the tour</a>
503+ </div>
504+ <div class="u-fixed-width u-clearfix">
505 <tal:logged_out condition="not:view/user" omit-tag="">
506 <a href="/+login">Creating an account</a> allows you to start
507 working within Launchpad.<br />
508 </tal:logged_out>
509- <p>
510+ <span>
511 Learn more about Launchpad in the
512 <a href="https://help.launchpad.net/">user guide</a>
513 or try it for yourself in our
514 <a href="https://qastaging.launchpad.net/">sandbox environment</a>.
515- </p>
516+ </span>
517 <tal:logged_in condition="view/user" omit-tag="">
518 If you're ready, you can:
519- <ul tal:define="apphomes view/apphomes">
520- <li>
521- <a class="sprite add"
522- href="/projects/+new">Register a project</a>
523+
524+ <ul class="p-matrix" tal:define="apphomes view/apphomes">
525+ <li class="p-matrix__item">
526+ <img class="p-matrix__img" src="/@@/add-homepage.png">
527+ <div class="p-matrix__content">
528+ <h4 class="p-matrix__title"><a class="p-matrix__link" href="/projects/+new">Register a project</a></h4>
529+ </div>
530 </li>
531- <li>
532- <a class="sprite add"
533- href="/people/+newteam">Register a team</a>
534+ <li class="p-matrix__item">
535+ <img class="p-matrix__img" src="/@@/add-homepage.png">
536+ <div class="p-matrix__content">
537+ <h4 class="p-matrix__title"><a class="p-matrix__link" href="/people/+newteam">Register a team</a></h4>
538+ </div>
539 </li>
540- <li tal:condition="not:view/show_whatslaunchpad">
541- <a class="sprite bug"
542- tal:attributes="href apphomes/bugs">Browse bugs</a>
543+ <li class="p-matrix__item">
544+ <img class="p-matrix__img" src="/@@/bug-homepage.png">
545+ <div class="p-matrix__content">
546+ <h4 class="p-matrix__title"><a class="p-matrix__link" href="apphomes/bugs">Browse bugs</a></h4>
547+ </div>
548 </li>
549- <li tal:condition="not:view/show_whatslaunchpad">
550- <a class="sprite translate-icon"
551- tal:attributes="href apphomes/translations">Help translate</a>
552+ <li class="p-matrix__item">
553+ <img class="p-matrix__img" src="/@@/translation-homepage.png">
554+ <div class="p-matrix__content">
555+ <h4 class="p-matrix__title"><a class="p-matrix__link" href="apphomes/translations">Help translate</a></h4>
556+ </div>
557 </li>
558- <li tal:condition="not:view/show_whatslaunchpad">
559- <a class="sprite question"
560- tal:attributes="href apphomes/answers">Find answers</a>
561+ <li class="p-matrix__item">
562+ <img class="p-matrix__img" src="/@@/question-homepage.png">
563+ <div class="p-matrix__content">
564+ <h4 class="p-matrix__title"><a class="p-matrix__link" href="apphomes/answers">Find answers</a></h4>
565+ </div>
566 </li>
567- <li>
568- <a class="sprite ppa-icon"
569- href="/ubuntu/+ppas">Browse Ubuntu PPAs</a>
570+ <li class="p-matrix__item">
571+ <img class="p-matrix__img" src="/@@/ppa-icon-homepage.png">
572+ <div class="p-matrix__content">
573+ <h4 class="p-matrix__title"><a class="p-matrix__link" href="/ubuntu/+ppas">Browse Ubuntu PPAs</a></h4>
574+ </div>
575 </li>
576- <li tal:condition="not:view/show_whatslaunchpad">
577- <a class="sprite tour" href="/+tour">Take the tour</a>
578- </li>
579 </ul>
580 </tal:logged_in>
581 </div>
582+ </div>
583+ </section>
584
585- <div id="homepage-featured" class="homepage-portlet">
586- <h2>Featured projects</h2>
587-
588- <div class="featured-project-top"
589- tal:define="topproject view/featured_projects_top"
590- tal:condition="topproject">
591- <h3>
592- <a tal:attributes="href topproject/fmt:url"
593- tal:content="structure topproject/image:logo"><img /></a>
594- <a tal:attributes="href topproject/fmt:url"
595- tal:content="topproject/displayname">Foo project</a>
596- </h3>
597- <p tal:content="structure view/featured_projects_top/summary/fmt:shorten/200">
598- Foo project is great...
599- </p>
600- </div>
601-
602- <div class="two-column-list">
603- <ul class="featured-projects-list">
604- <li tal:repeat="project view/featured_projects">
605- <a tal:replace="structure project/fmt:link" />
606- </li>
607- </ul>
608- </div>
609+ <section class="p-strip is-shallow">
610+ <div id="homepage-featured" class="homepage-portlet">
611+ <div class="u-fixed-width u-clearfix">
612+ <h2 class="u-float-left">Featured projects</h2>
613+ <a href="/projects" class="p-button u-float-right u-hide--small p-featured-lp__see-more">See more...</a>
614+ </div>
615+ <div class="u-fixed-width u-clearfix">
616+ <ul class="p-matrix featured-projects-list">
617+ <li class="p-matrix__item" tal:repeat="project view/featured_projects">
618+ <img class="p-matrix__img" tal:attributes="src project/image:logo_src; alt project/displayname">
619+ <div class="p-matrix__content">
620+ <h4 class="p-matrix__title"><a class="p-matrix__link" href="#" tal:content="structure project/displayname" tal:attributes="href project/fmt:url"></a></h4>
621+ <div class="p-matrix__desc">
622+ <p tal:content="structure project/summary/fmt:shorten/100"></p>
623+ </div>
624+ </div>
625+ </li>
626+ </ul>
627
628 <ul class="horizontal">
629 <li>
630@@ -250,14 +205,37 @@
631 projects</a>!</strong>
632 </li>
633 <li tal:condition="context/required:launchpad.Edit">
634- <a class="sprite edit" href="+featuredprojects">Manage
635- featured project list</a>
636+ <a class="sprite edit" href="+featuredprojects">
637+ Manage featured project list
638+ </a>
639+ </li>
640+ </ul>
641+ </div>
642+ </div>
643+ </section>
644+
645+ <section class="p-strip is-shallow" tal:condition="features/app.root_blog.enabled">
646+ <div id="homepage-blogposts" class="homepage-portlet">
647+ <div class="u-fixed-width u-clearfix">
648+ <h2 class="u-float-left">Recent Launchpad blog posts</h2>
649+ <a href="http://blog.launchpad.net" class="p-button u-float-right u-hide--small p-featured-lp__see-more">Read the blog</a>
650+ </div>
651+ <div class="u-fixed-width u-clearfix">
652+ <ul tal:define="posts view/getRecentBlogPosts">
653+ <li class="news" tal:repeat="post posts">
654+ <a tal:attributes="href post/link" tal:content="post/title">
655+ </a>
656+ <span class="registered">&ndash; <tal:date content="post/date"></tal:date></span><br />
657+ <tal:description content="structure post/description">
658+ Tell us a little about how you use Launchpad by answering
659+ our short survey.
660+ </tal:description>
661 </li>
662 </ul>
663 </div>
664- </div><!-- yui-u -->
665+ </div>
666+ </section>
667
668- </div><!-- yui-gc -->
669 </div><!-- homepage -->
670 </div><!--main-->
671 </body>

Subscribers

People subscribed via source and target branches

to status/vote changes: