Merge lp:~mrqtros/component-store/bottom-edge-tabs into lp:component-store

Proposed by Roman Shchekin on 2015-04-13
Status: Merged
Approved by: Nekhelesh Ramananthan on 2015-04-14
Approved revision: 52
Merged at revision: 50
Proposed branch: lp:~mrqtros/component-store/bottom-edge-tabs
Merge into: lp:component-store
Diff against target: 738 lines (+680/-0)
8 files modified
curated-store/ComponentStore/BottomEdgeTabs/BottomEdgeTabs.qml (+427/-0)
curated-store/ComponentStore/BottomEdgeTabs/FakeHeader.qml (+39/-0)
curated-store/ComponentStore/BottomEdgeTabs/ubuntu_component_store.json (+6/-0)
curated-store/GallerySRC/BottomEdgeTabsWidget.qml (+69/-0)
curated-store/GallerySRC/WidgetsModel.qml (+5/-0)
docs/_components/bottomedgetabs.rst (+129/-0)
docs/index.rst (+1/-0)
docs/release.rst (+4/-0)
To merge this branch: bzr merge lp:~mrqtros/component-store/bottom-edge-tabs
Reviewer Review Type Date Requested Status
Nekhelesh Ramananthan 2015-04-13 Approve on 2015-04-14
Review via email: mp+256041@code.launchpad.net

Commit message

New component - BottomEdgeTabs (something like PageWithBottomEdge, but for Tabs).

Description of the change

New component - BottomEdgeTabs (something like PageWithBottomEdge, but for Tabs).

P.S. I think that PageWithBottomEdge also should use my method of displaying live preview (use ShaderEffectSource instead of manual creating and reparenting).

To post a comment you must log in.
Roman Shchekin (mrqtros) wrote :

Btw, you maybe will see warning message about message loop - it's result of hosting one PageStack in another, in real use case there are no any warnings.
And feel free to change docs & other staff - my English is not good.

Nekhelesh Ramananthan (nik90) wrote :

The only warning I see is,

QML UbuntuShape: Binding Loop Detected for property "hidden".. I guess that's fine.

1. Merge https://code.launchpad.net/~nik90/component-store/fix-bottomedgetabs-docs/+merge/256047
2. This is your component, so please maintain it as and when required :-)

Nice Work!

52. By Roman Shchekin on 2015-04-14

Merged with correct docs (thanks Nekhelesh).

Roman Shchekin (mrqtros) wrote :

1. Merged with your branch!
2. Yes I will :)

BTW, binding loop can be caused by this bug https://bugreports.qt.io/browse/QTBUG-39921 (reported by me some time ago).

Nekhelesh Ramananthan (nik90) wrote :

LGTM

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added directory 'curated-store/ComponentStore/BottomEdgeTabs'
2=== added file 'curated-store/ComponentStore/BottomEdgeTabs/BottomEdgeTabs.qml'
3--- curated-store/ComponentStore/BottomEdgeTabs/BottomEdgeTabs.qml 1970-01-01 00:00:00 +0000
4+++ curated-store/ComponentStore/BottomEdgeTabs/BottomEdgeTabs.qml 2015-04-14 06:07:01 +0000
5@@ -0,0 +1,427 @@
6+/*
7+ * Copyright (C) 2015 Canonical, Ltd.
8+ *
9+ * This program is free software; you can redistribute it and/or modify
10+ * it under the terms of the GNU General Public License as published by
11+ * the Free Software Foundation; version 3.
12+ *
13+ * This program is distributed in the hope that it will be useful,
14+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16+ * GNU General Public License for more details.
17+ *
18+ * You should have received a copy of the GNU General Public License
19+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
20+ */
21+
22+/*
23+ Example:
24+
25+MainView {
26+ objectName: "mainView"
27+
28+ applicationName: "com.ubuntu.developer.qtros.tabsbottomedge"
29+
30+ width: units.gu(50)
31+ height: units.gu(75)
32+ useDeprecatedToolbar: false
33+
34+ PageStack {
35+ id: stack
36+ Component.onCompleted: push(tabs)
37+ }
38+
39+ BottomEdgeTabs {
40+ id: tabs
41+
42+ bottomEdgePage: secondPage
43+ bottomEdgeTitle: "Violet page"
44+
45+ Tab {
46+ title: "First tab"
47+ page: Page {
48+ Label {
49+ anchors.centerIn: parent
50+ text: "Content of first tab"
51+ }
52+ }
53+ }
54+
55+ Tab {
56+ title: "Second tab"
57+ page: Page {
58+ Label {
59+ anchors.centerIn: parent
60+ text: "Centered label"
61+ }
62+ }
63+ }
64+ } // BottomEdgeTabs
65+
66+ Page {
67+ id: secondPage
68+ title: "Violet page"
69+ visible: false
70+
71+ Rectangle {
72+ anchors.fill: parent
73+ color: "darkviolet"
74+ }
75+ }
76+}
77+
78+*/
79+
80+import QtQuick 2.3
81+import Ubuntu.Components 1.1
82+
83+Tabs {
84+ id: page
85+
86+ property Page bottomEdgePage: null
87+ property alias bottomEdgeTitle: tipLabel.text
88+ property color bottomEdgeBackgroundColor: Theme.palette.normal.background
89+ property color bottomEdgeTipColor: Theme.palette.normal.background
90+ property bool bottomEdgeEnabled: true
91+ property bool bottomEdgeHeaderHidden: true
92+ property bool bottomEdgeUseHeaderInCalculations: true
93+ property real bottomEdgeExpandThreshold: 0.2
94+
95+ readonly property bool isReady: bottomEdgePageLoaded && bottomEdgePage.active && bottomEdge.y === __pageStartY
96+ readonly property bool isCollapsed: (bottomEdge.y === page.height)
97+ readonly property bool bottomEdgePageLoaded: bottomEdgePage != null
98+
99+ readonly property int __pageStartY: bottomEdgeUseHeaderInCalculations ? fakeHeader.height : 0
100+
101+ signal bottomEdgeReleased()
102+ signal bottomEdgeDismissed()
103+
104+ function __pushPage() {
105+ if (bottomEdgePageLoaded) {
106+ bottomEdgePage.active = true
107+ if (bottomEdgePage.hasOwnProperty("isDirty")) // TODO
108+ bottomEdgePage.isDirty = true
109+ page.pageStack.push(bottomEdgePage)
110+ if (bottomEdgePage.flickable) {
111+ bottomEdgePage.flickable.contentY = -page.header.height
112+ bottomEdgePage.flickable.returnToBounds()
113+ }
114+ if (bottomEdgePage.ready)
115+ bottomEdgePage.ready()
116+ }
117+ }
118+
119+ onActiveChanged: {
120+ if (active) {
121+ bottomEdge.state = "collapsed"
122+ }
123+ }
124+
125+ onBottomEdgePageChanged: {
126+ tip.forceActiveFocus()
127+ if (page.isReady && bottomEdgePageLoaded && !bottomEdgePage.active) {
128+ page.__pushPage()
129+ }
130+ }
131+
132+ Rectangle {
133+ id: bgVisual
134+
135+ color: "black"
136+ anchors {
137+ fill: parent
138+ topMargin: __pageStartY
139+ }
140+ opacity: 0.7 * ((page.height - bottomEdge.y) / page.height)
141+ z: 1
142+ }
143+
144+ UbuntuShape {
145+ id: tip
146+ objectName: "bottomEdgeTip"
147+
148+ property bool hidden: !activeFocus || (bottomEdge.y - units.gu(1) < tip.y)
149+
150+ enabled: bottomEdgePageLoaded
151+ visible: bottomEdgeEnabled
152+ anchors {
153+ bottom: parent.bottom
154+ horizontalCenter: bottomEdge.horizontalCenter
155+ bottomMargin: hidden ? - height + units.gu(1) : -units.gu(1)
156+ Behavior on bottomMargin {
157+ SequentialAnimation {
158+ // wait some msecs in case of the focus change again, to avoid flickering
159+ PauseAnimation {
160+ duration: 300
161+ }
162+ UbuntuNumberAnimation {
163+ duration: UbuntuAnimation.SnapDuration
164+ }
165+ }
166+ }
167+ }
168+
169+ z: 1
170+ width: tipLabel.paintedWidth + units.gu(6)
171+ height: bottomEdge.tipHeight + units.gu(1)
172+ color: bottomEdgeTipColor //color: "#C9C9C9"
173+
174+ Label {
175+ id: tipLabel
176+
177+ anchors {
178+ top: parent.top
179+ left: parent.left
180+ right: parent.right
181+ }
182+ height: bottomEdge.tipHeight
183+ verticalAlignment: Text.AlignVCenter
184+ horizontalAlignment: Text.AlignHCenter
185+ opacity: tip.hidden ? 0.0 : 1.0
186+ Behavior on opacity {
187+ UbuntuNumberAnimation {
188+ duration: UbuntuAnimation.SnapDuration
189+ }
190+ }
191+ }
192+ } // UbuntuShape
193+
194+ Rectangle {
195+ id: shadow
196+
197+ anchors {
198+ left: parent.left
199+ right: parent.right
200+ bottom: bottomEdge.top
201+ }
202+ height: units.gu(1)
203+ z: 1
204+ opacity: 0.0
205+ gradient: Gradient {
206+ GradientStop { position: 0.0; color: "transparent" }
207+ GradientStop { position: 1.0; color: Qt.rgba(0, 0, 0, 0.2) }
208+ }
209+ }
210+
211+ MouseArea {
212+ id: mouseArea
213+
214+ property real previousY: -1
215+ property string dragDirection: "None"
216+
217+ preventStealing: true
218+ drag {
219+ axis: Drag.YAxis
220+ target: bottomEdge
221+ minimumY: __pageStartY
222+ maximumY: page.height
223+ }
224+ enabled: bottomEdgePageLoaded
225+ visible: page.bottomEdgeEnabled
226+
227+ anchors {
228+ left: parent.left
229+ right: parent.right
230+ bottom: parent.bottom
231+ }
232+ height: bottomEdge.tipHeight
233+ z: 1
234+
235+ onReleased: {
236+ page.bottomEdgeReleased()
237+ if ((dragDirection === "BottomToTop") &&
238+ bottomEdge.y < (page.height - page.height * bottomEdgeExpandThreshold - bottomEdge.tipHeight)) {
239+ bottomEdge.state = "expanded"
240+ } else {
241+ bottomEdge.state = "collapsed"
242+ }
243+ previousY = -1
244+ dragDirection = "None"
245+ }
246+
247+ onPressed: {
248+ previousY = mouse.y
249+ tip.forceActiveFocus()
250+ }
251+
252+ onMouseYChanged: {
253+ var yOffset = previousY - mouseY
254+ // skip if was a small move
255+ if (Math.abs(yOffset) <= units.gu(2))
256+ return
257+
258+ previousY = mouseY
259+ dragDirection = yOffset > 0 ? "BottomToTop" : "TopToBottom"
260+ }
261+ }
262+
263+ FakeHeader {
264+ id: fakeHeader
265+ visible: bottomEdgeEnabled && !bottomEdgeHeaderHidden
266+
267+ anchors {
268+ left: parent.left
269+ right: parent.right
270+ }
271+ y: -fakeHeader.height + (fakeHeader.height * (page.height - bottomEdge.y)) / (page.height - fakeHeader.height)
272+ z: bgVisual.z + 1
273+
274+ Behavior on y {
275+ UbuntuNumberAnimation {
276+ duration: UbuntuAnimation.SnapDuration
277+ }
278+ }
279+ }
280+
281+ Rectangle {
282+ id: bottomEdge
283+ objectName: "bottomEdge"
284+
285+ readonly property int tipHeight: units.gu(3)
286+
287+
288+ z: 1
289+ color: bottomEdgeBackgroundColor
290+ clip: true
291+ anchors {
292+ left: parent.left
293+ right: parent.right
294+ }
295+ height: page.height
296+ y: height
297+
298+ visible: !page.isCollapsed
299+ state: "collapsed"
300+ states: [
301+ State {
302+ name: "collapsed"
303+ PropertyChanges {
304+ target: bottomEdge
305+ y: bottomEdge.height
306+ }
307+ PropertyChanges {
308+ target: fakeHeader
309+ y: -fakeHeader.height
310+ }
311+ },
312+ State {
313+ name: "expanded"
314+ PropertyChanges {
315+ target: bottomEdge
316+ y: __pageStartY
317+ }
318+ PropertyChanges {
319+ target: fakeHeader
320+ y: 0
321+ }
322+ },
323+ State {
324+ name: "floating"
325+ when: mouseArea.drag.active
326+ PropertyChanges {
327+ target: shadow
328+ opacity: 1.0
329+ }
330+ }
331+ ]
332+
333+ transitions: [
334+ Transition {
335+ to: "expanded"
336+ SequentialAnimation {
337+ alwaysRunToEnd: true
338+ ParallelAnimation {
339+ SmoothedAnimation {
340+ target: bottomEdge
341+ property: "y"
342+ duration: UbuntuAnimation.FastDuration
343+ easing.type: Easing.Linear
344+ }
345+ SmoothedAnimation {
346+ target: fakeHeader
347+ property: "y"
348+ duration: UbuntuAnimation.FastDuration
349+ easing.type: Easing.Linear
350+ }
351+ }
352+ SmoothedAnimation {
353+ target: shaderSource
354+ property: "anchors.topMargin"
355+ to: - units.gu(4)
356+ duration: UbuntuAnimation.FastDuration
357+ easing.type: Easing.Linear
358+ }
359+ SmoothedAnimation {
360+ target: shaderSource
361+ property: "anchors.topMargin"
362+ to: 0
363+ duration: UbuntuAnimation.FastDuration
364+ easing: UbuntuAnimation.StandardEasing
365+ }
366+ ScriptAction {
367+ script: page.__pushPage()
368+ }
369+ }
370+ },
371+ Transition {
372+ from: "expanded"
373+ to: "collapsed"
374+ SequentialAnimation {
375+ alwaysRunToEnd: true
376+
377+ ScriptAction {
378+ script: {
379+ Qt.inputMethod.hide()
380+ bottomEdgePage.active = false
381+ }
382+ }
383+ ParallelAnimation {
384+ SmoothedAnimation {
385+ target: bottomEdge
386+ property: "y"
387+ duration: UbuntuAnimation.SlowDuration
388+ }
389+ SmoothedAnimation {
390+ target: fakeHeader
391+ property: "y"
392+ duration: UbuntuAnimation.SlowDuration
393+ }
394+ }
395+ ScriptAction {
396+ script: {
397+ // notify
398+ page.bottomEdgeDismissed()
399+ bottomEdgePage.active = true
400+ }
401+ }
402+ }
403+ },
404+ Transition {
405+ from: "floating"
406+ to: "collapsed"
407+ UbuntuNumberAnimation {
408+ target: bottomEdge
409+ property: "opacity"
410+ }
411+ }
412+ ]
413+
414+ ShaderEffectSource {
415+ id: shaderSource
416+ sourceItem: bottomEdgePage
417+ anchors {
418+ top: parent.top
419+ left: parent.left
420+ right: parent.right
421+ }
422+ height: page.height - fakeHeader.height
423+
424+ Binding {
425+ target: bottomEdgePageLoaded ? shaderSource : null
426+ property: "anchors.topMargin"
427+ value: bottomEdgePage && bottomEdgePage.flickable ? bottomEdgePage.flickable.contentY : 0
428+ when: !page.isReady
429+ }
430+ }
431+ } // Rectanlgle
432+}
433
434=== added file 'curated-store/ComponentStore/BottomEdgeTabs/FakeHeader.qml'
435--- curated-store/ComponentStore/BottomEdgeTabs/FakeHeader.qml 1970-01-01 00:00:00 +0000
436+++ curated-store/ComponentStore/BottomEdgeTabs/FakeHeader.qml 2015-04-14 06:07:01 +0000
437@@ -0,0 +1,39 @@
438+/*
439+ * Copyright (C) 2014 Canonical Ltd
440+ *
441+ * This file is part of Ubuntu Clock App
442+ *
443+ * Ubuntu Clock App is free software: you can redistribute it and/or modify
444+ * it under the terms of the GNU General Public License version 3 as
445+ * published by the Free Software Foundation.
446+ *
447+ * Ubuntu Clock App is distributed in the hope that it will be useful,
448+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
449+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
450+ * GNU General Public License for more details.
451+ *
452+ * You should have received a copy of the GNU General Public License
453+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
454+ */
455+
456+import QtQuick 2.3
457+import Ubuntu.Components 1.1
458+
459+Column {
460+ id: fakeHeader
461+
462+ height: units.gu(9)
463+
464+ Rectangle {
465+ height: units.gu(7)
466+ width: parent.width
467+ color: Theme.palette.normal.background
468+ }
469+
470+ Rectangle {
471+ color: "#C9C9C9"
472+ height: units.gu(2)
473+ anchors.left: parent.left
474+ anchors.right: parent.right
475+ }
476+}
477
478=== added file 'curated-store/ComponentStore/BottomEdgeTabs/ubuntu_component_store.json'
479--- curated-store/ComponentStore/BottomEdgeTabs/ubuntu_component_store.json 1970-01-01 00:00:00 +0000
480+++ curated-store/ComponentStore/BottomEdgeTabs/ubuntu_component_store.json 2015-04-14 06:07:01 +0000
481@@ -0,0 +1,6 @@
482+{
483+ "name": "BottomEdgeTabs",
484+ "description": "This component adds a bottom edge page to Tabs.",
485+ "version": "1.0",
486+ "documentation_url": "http://ubuntu-component-store.readthedocs.org/en/latest/_components/bottomedgetabs.html"
487+}
488
489=== added file 'curated-store/GallerySRC/BottomEdgeTabsWidget.qml'
490--- curated-store/GallerySRC/BottomEdgeTabsWidget.qml 1970-01-01 00:00:00 +0000
491+++ curated-store/GallerySRC/BottomEdgeTabsWidget.qml 2015-04-14 06:07:01 +0000
492@@ -0,0 +1,69 @@
493+import QtQuick 2.0
494+import Ubuntu.Components 1.1
495+import Ubuntu.Components.ListItems 1.0 as ListItems
496+import "../ComponentStore/BottomEdgeTabs"
497+
498+TemplateWidgetPage {
499+ id: bottomEdgeTabsWidget
500+
501+ title: "Tabs With Bottom Edge"
502+ author: "Roman Shchekin"
503+ email: "mrqtros@gmail.com"
504+ license: "GNU General Public License v3.0"
505+ description: "Tabs component with the ability to setting bottom edge page."
506+
507+ Component {
508+ id: pageComponent
509+
510+ PageStack {
511+ id: stack
512+ Component.onCompleted: push(tabs)
513+
514+ BottomEdgeTabs {
515+ id: tabs
516+
517+ bottomEdgePage: secondPage
518+ bottomEdgeTitle: "Violet page"
519+
520+ Tab {
521+ title: "First tab"
522+ page: Page {
523+ Label {
524+ anchors.centerIn: parent
525+ text: "Content of first tab"
526+ }
527+ }
528+ }
529+
530+ Tab {
531+ title: "Second tab"
532+ page: Page {
533+ Label {
534+ anchors.centerIn: parent
535+ text: "Centered label"
536+ }
537+ }
538+ }
539+ } // BottomEdgeTabs
540+
541+ Page {
542+ id: secondPage
543+ title: "Violet page"
544+ visible: false
545+
546+ Rectangle {
547+ anchors.fill: parent
548+ color: "darkviolet"
549+ }
550+ }
551+ }
552+ }
553+
554+ content: Button {
555+ text: "Preview BottomEdgeTabs Component"
556+ color: "Green"
557+ height: units.gu(6)
558+ onClicked: stack.push(pageComponent)
559+ anchors.centerIn: parent
560+ }
561+}
562
563=== modified file 'curated-store/GallerySRC/WidgetsModel.qml'
564--- curated-store/GallerySRC/WidgetsModel.qml 2015-03-03 13:16:09 +0000
565+++ curated-store/GallerySRC/WidgetsModel.qml 2015-04-14 06:07:01 +0000
566@@ -37,4 +37,9 @@
567 label: "Welcome Wizard"
568 source: "GallerySRC/WelcomeWizardWidget.qml"
569 }
570+
571+ ListElement {
572+ label: "Tabs With Bottom Edge"
573+ source: "GallerySRC/BottomEdgeTabsWidget.qml"
574+ }
575 }
576
577=== added file 'docs/_components/bottomedgetabs.rst'
578--- docs/_components/bottomedgetabs.rst 1970-01-01 00:00:00 +0000
579+++ docs/_components/bottomedgetabs.rst 2015-04-14 06:07:01 +0000
580@@ -0,0 +1,129 @@
581+Bottom Edge Tabs
582+================
583+
584++----------+----------------------------------------+
585+| Author | Roman Shchekin |
586++----------+-------------+--------------------------+
587+| License | GNU General Public License v3.0 |
588++----------+----------------------------------------+
589+| Contact | mrqtros@gmail.com |
590++----------+----------------------------------------+
591+| Framework| ubuntu-sdk-14.10 |
592++----------+----------------------------------------+
593+
594+BottomEdgeTabs is very similar to PageWithBottomEdge but uses Tabs as root component instead of Page. Check it's documentation.
595+
596+Example:
597+
598+.. code-block:: qml
599+
600+ MainView {
601+ objectName: "mainView"
602+
603+ applicationName: "com.ubuntu.developer.qtros.tabsbottomedge"
604+
605+ width: units.gu(50)
606+ height: units.gu(75)
607+ useDeprecatedToolbar: false
608+
609+ PageStack {
610+ id: stack
611+ Component.onCompleted: push(tabs)
612+
613+ BottomEdgeTabs {
614+ id: tabs
615+
616+ bottomEdgePage: secondPage
617+ bottomEdgeTitle: "Violet page"
618+
619+ Tab {
620+ title: "First tab"
621+ page: Page {
622+ Label {
623+ anchors.centerIn: parent
624+ text: "Content of first tab"
625+ }
626+ }
627+ }
628+
629+ Tab {
630+ title: "Second tab"
631+ page: Page {
632+ Label {
633+ anchors.centerIn: parent
634+ text: "Centered label"
635+ }
636+ }
637+ }
638+ } // BottomEdgeTabs
639+
640+ Page {
641+ id: secondPage
642+ title: "Violet page"
643+ visible: false
644+
645+ Rectangle {
646+ anchors.fill: parent
647+ color: "darkviolet"
648+ }
649+ }
650+ }
651+ }
652+
653+.. image:: ../_images/bottomedgetabs.png
654+ :align: center
655+
656+Properties
657+----------
658+
659+- :ref:`bottomEdgeTitle`: string
660+- :ref:`bottomEdgePage`: Page
661+- :ref:`bottomEdgeEnabled`: boolean
662+
663+Signals
664+-------
665+
666+- :ref:`bottomEdgeReleased()`
667+- :ref:`bottomEdgeDismissed()`
668+
669+Property Documentation
670+----------------------
671+
672+.. _bottomEdgeTitle:
673+
674+bottomEdgeTitle
675+^^^^^^^^^^^^^^^
676+
677+The text to be displayed in the bottom edge action.
678+
679+.. _bottomEdgePage:
680+
681+bottomEdgePage
682+^^^^^^^^^^^^^^
683+
684+The page to be shown when swiping the bottom edge up.
685+
686+.. _bottomEdgeEnabled:
687+
688+bottomEdgeEnabled
689+^^^^^^^^^^^^^^^^^
690+
691+Boolean property to enable/disable the bottom edge
692+
693+Signal Documentation
694+--------------------
695+
696+.. _bottomEdgeReleased():
697+
698+bottomEdgeReleased()
699+^^^^^^^^^^^^^^^^^^^^
700+
701+This handler is called when the bottom edge is let go.
702+
703+.. _bottomEdgeDismissed():
704+
705+bottomEdgeDismissed()
706+^^^^^^^^^^^^^^^^^^^^^
707+
708+Called when the bottom edge is dismissed (hidden).
709+
710
711=== added file 'docs/_images/bottomedgetabs.png'
712Binary files docs/_images/bottomedgetabs.png 1970-01-01 00:00:00 +0000 and docs/_images/bottomedgetabs.png 2015-04-14 06:07:01 +0000 differ
713=== modified file 'docs/index.rst'
714--- docs/index.rst 2015-04-13 17:45:49 +0000
715+++ docs/index.rst 2015-04-14 06:07:01 +0000
716@@ -50,6 +50,7 @@
717 .. toctree::
718 :maxdepth: 1
719
720+ _components/bottomedgetabs
721 _components/circleimage
722 _components/emptystate
723 _components/fastscroll
724
725=== modified file 'docs/release.rst'
726--- docs/release.rst 2015-03-23 14:32:46 +0000
727+++ docs/release.rst 2015-04-14 06:07:01 +0000
728@@ -1,6 +1,10 @@
729 Release Notes
730 =============
731
732+**13th April 2015**
733+
734+* Added Bottom Edge Tabs component
735+
736 **23rd March 2015**
737
738 * Added haptic feedback to radial action buttons

Subscribers

People subscribed via source and target branches