diff --git a/ionic/components/card/modes/ios.scss b/ionic/components/card/modes/ios.scss
index 2866f0b076..6a41f81645 100644
--- a/ionic/components/card/modes/ios.scss
+++ b/ionic/components/card/modes/ios.scss
@@ -13,7 +13,7 @@ $card-ios-padding-bottom: 14px !default;
$card-ios-padding-left: 16px !default;
$card-ios-padding-media-top: 10px !default;
-$card-ios-padding-media-bottom: 10px !default;
+$card-ios-padding-media-bottom: 9px !default;
$card-ios-background-color: $list-background-color !default;
$card-ios-box-shadow: 0 1px 2px rgba(0,0,0,.3) !default;
@@ -43,14 +43,18 @@ ion-card {
.list {
margin-bottom: 0;
+ .item {
+ padding-right: 0;
+ }
+
ion-item-content {
padding: 0;
}
}
.item {
- padding-right: ($card-ios-padding-right / 2);
padding-left: ($card-ios-padding-left / 2);
+ padding-right: ($card-ios-padding-right / 2);
font-size: $item-ios-font-size;
}
diff --git a/ionic/components/checkbox/checkbox.scss b/ionic/components/checkbox/checkbox.scss
index e99f95c1f9..177ffc23f1 100644
--- a/ionic/components/checkbox/checkbox.scss
+++ b/ionic/components/checkbox/checkbox.scss
@@ -8,7 +8,7 @@ ion-checkbox {
@include user-select-none();
}
-ion-checkbox[aria-disabled=true] {
+ion-checkbox[aria-disabled=true] .item-inner > * {
pointer-events: none;
opacity: 0.5;
color: $subdued-text-color;
diff --git a/ionic/components/checkbox/checkbox.ts b/ionic/components/checkbox/checkbox.ts
index 16d61c7716..2de01fbd2e 100644
--- a/ionic/components/checkbox/checkbox.ts
+++ b/ionic/components/checkbox/checkbox.ts
@@ -33,12 +33,14 @@ import {Form} from '../../util/form';
'(click)': 'click($event)'
},
template:
- '
' +
- ' ' +
- ' ' +
- '
' +
- ' ' +
- ' '
+ '
' +
+ '' +
+ ' ' +
+ ' ' +
+ '' +
+ ' ' +
+ ' ' +
+ '
'
})
export class Checkbox {
diff --git a/ionic/components/checkbox/modes/ios.scss b/ionic/components/checkbox/modes/ios.scss
index d671f70014..a908839c66 100644
--- a/ionic/components/checkbox/modes/ios.scss
+++ b/ionic/components/checkbox/modes/ios.scss
@@ -38,7 +38,7 @@ ion-checkbox {
media-checkbox {
display: block;
- margin: $item-ios-padding-media-top ($item-ios-padding-right / 2) $item-ios-padding-media-bottom ($item-ios-padding-left / 2);
+ margin: $item-ios-padding-media-top $item-ios-padding-right $item-ios-padding-media-bottom 2px;
}
checkbox-icon {
diff --git a/ionic/components/checkbox/modes/md.scss b/ionic/components/checkbox/modes/md.scss
index 85c3b492c2..37a33323db 100644
--- a/ionic/components/checkbox/modes/md.scss
+++ b/ionic/components/checkbox/modes/md.scss
@@ -36,7 +36,8 @@ ion-checkbox {
media-checkbox {
display: block;
- margin: $item-md-padding-media-top ($item-md-padding-right / 2) $item-md-padding-media-bottom ($item-md-padding-left / 2);
+ // TODO convert these to sass variables
+ margin: $item-md-padding-media-top 36px $item-md-padding-media-bottom 4px;
}
checkbox-icon {
diff --git a/ionic/components/item/item-media.scss b/ionic/components/item/item-media.scss
index 66fb649b98..50eb573211 100644
--- a/ionic/components/item/item-media.scss
+++ b/ionic/components/item/item-media.scss
@@ -3,17 +3,19 @@
// --------------------------------------------------
// Icons, avatars, thumbnails, notes, etc.
+.item > icon[small]:first-child,
+.item-inner > icon[small]:first-child {
+ min-width: 18px;
+}
-.item > icon:first-child {
+.item > icon:first-child,
+.item-inner > icon:first-child {
min-width: 24px;
text-align: center;
}
-.list .item > icon[small]:first-child {
- min-width: 18px;
-}
-
-.item > icon {
+.item > icon,
+.item-inner > icon {
line-height: 1;
font-size: 2.4rem;
diff --git a/ionic/components/item/item-sliding-gesture.ts b/ionic/components/item/item-sliding-gesture.ts
new file mode 100644
index 0000000000..a400fbf7b4
--- /dev/null
+++ b/ionic/components/item/item-sliding-gesture.ts
@@ -0,0 +1,194 @@
+import {Hammer} from 'ionic/gestures/hammer';
+import {DragGesture} from 'ionic/gestures/drag-gesture';
+import {List} from '../list/list';
+
+import {CSS, raf, closest} from 'ionic/util/dom';
+
+
+export class ItemSlidingGesture extends DragGesture {
+ constructor(list: List, listEle) {
+ super(listEle, {
+ direction: 'x',
+ threshold: 40
+ });
+
+ this.data = {};
+ this.openItems = 0;
+
+ this.list = list;
+ this.listEle = listEle;
+ this.canDrag = true;
+ this.listen();
+
+ this.on('tap', ev => {
+ if (!isFromOptionButtons(ev.target)) {
+ let didClose = this.closeOpened();
+ if (didClose) {
+ ev.preventDefault();
+ }
+ }
+ });
+
+ this.mouseOut = (ev) => {
+ this.onDragEnd(ev);
+ };
+ }
+
+ onDragStart(ev) {
+ let itemContainerEle = getItemConatiner(ev.target);
+ if (!itemContainerEle) return;
+
+ this.closeOpened(ev, itemContainerEle);
+
+ let openAmout = this.getOpenAmount(itemContainerEle);
+ let itemData = this.get(itemContainerEle);
+
+ if (openAmout) {
+ return ev.preventDefault();
+ }
+
+ itemContainerEle.classList.add('active-slide');
+
+ this.set(itemContainerEle, 'offsetX', openAmout);
+ this.set(itemContainerEle, 'startX', ev.center[this.direction]);
+
+ if (ev.srcEvent.type.indexOf('mouse') > -1) {
+ ev.target.addEventListener('mouseout', this.mouseOut);
+ }
+ }
+
+ onDrag(ev) {
+ let itemContainerEle = getItemConatiner(ev.target);
+ if (!itemContainerEle || !isActive(itemContainerEle)) return;
+
+ let itemData = this.get(itemContainerEle);
+
+ if (!itemData.optsWidth) {
+ itemData.optsWidth = getOptionsWidth(itemContainerEle);
+ if (!itemData.optsWidth) return;
+ }
+
+ let x = ev.center[this.direction];
+ let delta = x - itemData.startX;
+
+ let newX = Math.max(0, itemData.offsetX - delta);
+
+ if (newX > itemData.optsWidth) {
+ // Calculate the new X position, capped at the top of the buttons
+ newX = -Math.min(-itemData.optsWidth, -itemData.optsWidth + (((delta + itemData.optsWidth) * 0.4)));
+ }
+
+ this.open(itemContainerEle, newX, false);
+ }
+
+ onDragEnd(ev) {
+ let itemContainerEle = getItemConatiner(ev.target);
+ if (!itemContainerEle || !isActive(itemContainerEle)) return;
+
+ // If we are currently dragging, we want to snap back into place
+ // The final resting point X will be the width of the exposed buttons
+ let itemData = this.get(itemContainerEle);
+
+ var restingPoint = itemData.optsWidth;
+
+ // Check if the drag didn't clear the buttons mid-point
+ // and we aren't moving fast enough to swipe open
+
+ if (this.getOpenAmount(itemContainerEle) < (restingPoint / 2)) {
+
+ // If we are going left but too slow, or going right, go back to resting
+ if (ev.direction & Hammer.DIRECTION_RIGHT) {
+ // Left
+ restingPoint = 0;
+
+ } else if (Math.abs(ev.velocityX) < 0.3) {
+ // Right
+ restingPoint = 0;
+ }
+ }
+
+ ev.target.removeEventListener('mouseout', this.mouseOut);
+
+ raf(() => {
+ this.open(itemContainerEle, restingPoint, true);
+ });
+ }
+
+ closeOpened(ev, doNotCloseEle) {
+ let didClose = false;
+ if (this.openItems) {
+ let openItemElements = this.listEle.querySelectorAll('.active-slide');
+ for (let i = 0; i < openItemElements.length; i++) {
+ if (openItemElements[i] !== doNotCloseEle) {
+ this.open(openItemElements[i], 0, true);
+ didClose = true;
+ }
+ }
+ }
+ return didClose;
+ }
+
+ open(itemContainerEle, openAmount, animate) {
+ let slidingEle = itemContainerEle.querySelector('ion-item');
+ if (!slidingEle) return;
+
+ this.set(itemContainerEle, 'openAmount', openAmount);
+
+ clearTimeout(this.get(itemContainerEle).timerId);
+
+ if (openAmount > 0) {
+ this.openItems++;
+
+ } else {
+ let timerId = setTimeout(() => {
+ if (slidingEle.style[CSS.transform] === '') {
+ itemContainerEle.classList.remove('active-slide');
+ this.openItems--;
+ }
+ }, 400);
+ this.set(itemContainerEle, 'timerId', timerId);
+ }
+
+ slidingEle.style[CSS.transform] = (openAmount === 0 ? '' : 'translate3d(' + -openAmount + 'px,0,0)');
+ slidingEle.style[CSS.transition] = (animate ? '' : 'none');
+ }
+
+ getOpenAmount(itemContainerEle) {
+ return this.get(itemContainerEle).openAmount || 0;
+ }
+
+ get(itemContainerEle) {
+ return this.data[itemContainerEle && itemContainerEle.$ionSlide] || {};
+ }
+
+ set(itemContainerEle, key, value) {
+ if (!this.data[itemContainerEle.$ionSlide]) {
+ this.data[itemContainerEle.$ionSlide] = {};
+ }
+ this.data[itemContainerEle.$ionSlide][key] = value;
+ }
+
+ unlisten() {
+ super.unlisten();
+ this.listEle = null;
+ }
+}
+
+function getItemConatiner(ele) {
+ return closest(ele, 'ion-item-sliding', true);
+}
+
+function isFromOptionButtons(ele) {
+ return !!closest(ele, 'ion-item-options', true);
+}
+
+function getOptionsWidth(itemContainerEle) {
+ let optsEle = itemContainerEle.querySelector('ion-item-options');
+ if (optsEle) {
+ return optsEle.offsetWidth;
+ }
+}
+
+function isActive(itemContainerEle) {
+ return itemContainerEle.classList.contains('active-slide');
+}
diff --git a/ionic/components/item/item-sliding.scss b/ionic/components/item/item-sliding.scss
new file mode 100644
index 0000000000..f27705b017
--- /dev/null
+++ b/ionic/components/item/item-sliding.scss
@@ -0,0 +1,36 @@
+
+/**
+ * The hidden right-side buttons that can be exposed under a list item
+ * with dragging.
+ */
+
+ion-item-sliding {
+ display: block;
+ position: relative;
+ overflow: hidden;
+
+ .item {
+ position: static;
+ }
+}
+
+ion-item-options {
+ display: none;
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: $z-index-item-options;
+ height: 100%;
+}
+
+ion-item-sliding.active-slide {
+
+ .item {
+ position: relative;
+ z-index: $z-index-item-options + 1;
+ }
+
+ ion-item-options {
+ display: flex;
+ }
+}
diff --git a/ionic/components/item/item-sliding.ts b/ionic/components/item/item-sliding.ts
index ea04bacbfd..4e7fcdae43 100644
--- a/ionic/components/item/item-sliding.ts
+++ b/ionic/components/item/item-sliding.ts
@@ -1,31 +1,7 @@
-import {Component, Directive, ElementRef, NgIf, Host, Optional, Renderer, NgZone} from 'angular2/angular2';
+import {Component, ElementRef, Optional} from 'angular2/angular2';
-import {Gesture} from 'ionic/gestures/gesture';
-import {DragGesture} from 'ionic/gestures/drag-gesture';
-import {Hammer} from 'ionic/gestures/hammer';
-import {List} from 'ionic/components/list/list';
+import {List} from '../list/list';
-import * as util from 'ionic/util';
-
-import {CSS, raf} from 'ionic/util/dom';
-
-
-
-@Directive({
- selector: 'ion-item-options > button,ion-item-options > [button]',
- host: {
- '(click)': 'clicked($event)'
- }
-})
-export class ItemSlidingOptionButton {
- constructor(elementRef: ElementRef) {
- }
- clicked(event) {
- // Don't allow the click to propagate
- event.preventDefault();
- event.stopPropagation();
- }
-}
/**
* @name ionItem
@@ -36,238 +12,35 @@ export class ItemSlidingOptionButton {
* @usage
* ```html
*
- *
- * {{item.title}}
- *
- * {{item.note}}
- *
+ *
+ *
+ * {{item.title}}
+ *
+ *
+ * Favorite
+ * Share
+ *
*
*
- * ```
+ * ```
*/
@Component({
selector: 'ion-item-sliding',
- inputs: [
- 'sliding'
- ],
template:
- '
' +
- '
' +
- ' ' +
- ' ' +
- '' +
- ' '+
- ' ' +
- ' '
+ '
' +
+ '
'
})
export class ItemSliding {
- /**
- * TODO
- * @param {ElementRef} elementRef A reference to the component's DOM element.
- */
- constructor(elementRef: ElementRef, renderer: Renderer, @Optional() @Host() list: List, zone: NgZone) {
- this._zone = zone;
- renderer.setElementClass(elementRef, 'item', true);
- renderer.setElementAttribute(elementRef, 'tappable', '');
- this._isOpen = false;
- this._isSlideActive = false;
- this._isTransitioning = false;
- this._transform = '';
-
- this.list = list;
-
- this.elementRef = elementRef;
- this.swipeButtons = {};
- this.optionButtons = {};
+ constructor(@Optional() private list: List, elementRef: ElementRef) {
+ list.enableSlidingItems(true);
+ elementRef.nativeElement.$ionSlide = ++slideIds;
}
- onInit() {
- let ele = this.elementRef.nativeElement;
- this.itemSlidingContent = ele.querySelector('ion-item-sliding-content');
- this.itemOptions = ele.querySelector('ion-item-options');
- this.openAmount = 0;
- this._zone.runOutsideAngular(() => {
- this.gesture = new ItemSlideGesture(this, this.itemSlidingContent, this._zone);
- });
+ close() {
+ this.list.closeSlidingItems();
}
- onDestroy() {
- this.gesture && this.gesture.unlisten();
- this.itemSlidingContent = this.itemOptionsContent = null;
- }
-
- close(andStopDrag) {
- this.openAmount = 0;
-
- // Enable it once, it'll get disabled on the next drag
- raf(() => {
- this.enableAnimation();
- if (this.itemSlidingContent) {
- this.itemSlidingContent.style[CSS.transform] = 'translateX(0)';
- }
- });
- }
-
- open(amt) {
- let el = this.itemSlidingContent;
- this.openAmount = amt || 0;
-
- if (this.list) {
- this.list.setOpenItem(this);
- }
-
- if (amt === '') {
- el.style[CSS.transform] = '';
- } else {
- el.style[CSS.transform] = 'translateX(' + -amt + 'px)';
- }
- }
-
- isOpen() {
- return this.openAmount > 0;
- }
-
- getOpenAmt() {
- return this.openAmount;
- }
-
- disableAnimation() {
- this.itemSlidingContent.style[CSS.transition] = 'none';
- }
-
- enableAnimation() {
- // Clear the explicit transition, allow for CSS one to take over
- this.itemSlidingContent.style[CSS.transition] = '';
- }
-
- /**
- * User did a touchstart
- */
- didTouch() {
- if (this.isOpen()) {
- this.close();
- this.didClose = true;
-
- } else {
- let openItem = this.list.getOpenItem();
- if (openItem && openItem !== this) {
- this.didClose = true;
- }
- if (this.list) {
- this.list.closeOpenItem();
- }
- }
- }
}
-class ItemSlideGesture extends DragGesture {
- constructor(item: ItemSliding, el: Element, zone) {
- super(el, {
- direction: 'x',
- threshold: el.offsetWidth
- });
- this.item = item;
- this.canDrag = true;
- this.listen();
-
- zone.runOutsideAngular(() => {
- let touchStart = (e) => {
- this.item.didTouch();
- raf(() => {
- this.item.itemOptionsWidth = this.item.itemOptions && this.item.itemOptions.offsetWidth || 0;
- })
- };
- el.addEventListener('touchstart', touchStart);
- el.addEventListener('mousedown', touchStart);
-
- let touchEnd = (e) => {
- // If we have a touch end and the item is closing,
- // prevent default to stop a click from triggering
- if(this.item.didClose) {
- e.preventDefault();
- }
- this.item.didClose = false;
- };
- el.addEventListener('touchend', touchEnd);
- el.addEventListener('mouseup', touchEnd);
- el.addEventListener('mouseout', touchEnd);
- el.addEventListener('mouseleave', touchEnd);
- el.addEventListener('touchcancel', touchEnd);
- });
- }
-
- onDragStart(ev) {
- if (this.item.didClose) { return; }
-
- if (!this.item.itemOptionsWidth) { return; }
-
- this.slide = {};
-
- this.slide.offsetX = this.item.getOpenAmt();
- this.slide.startX = ev.center[this.direction];
- this.slide.started = true;
-
- this.item.disableAnimation();
- }
-
- onDrag(ev) {
- if (!this.slide || !this.slide.started) return;
-
- this.slide.x = ev.center[this.direction];
- this.slide.delta = this.slide.x - this.slide.startX;
-
- let newX = Math.max(0, this.slide.offsetX - this.slide.delta);
-
- let buttonsWidth = this.item.itemOptionsWidth;
-
- if (newX > this.item.itemOptionsWidth) {
- // Calculate the new X position, capped at the top of the buttons
- newX = -Math.min(-buttonsWidth, -buttonsWidth + (((this.slide.delta + buttonsWidth) * 0.4)));
- }
-
- this.item.open(newX);
- }
-
- onDragEnd(ev) {
- if (!this.slide || !this.slide.started) return;
-
- let buttonsWidth = this.item.itemOptionsWidth;
-
- // If we are currently dragging, we want to snap back into place
- // The final resting point X will be the width of the exposed buttons
- var restingPoint = this.item.itemOptionsWidth;
-
- // Check if the drag didn't clear the buttons mid-point
- // and we aren't moving fast enough to swipe open
- if (this.item.openAmount < (buttonsWidth / 2)) {
-
- // If we are going left but too slow, or going right, go back to resting
- if (ev.direction & Hammer.DIRECTION_RIGHT) {
- // Left
- restingPoint = 0;
- } else if (Math.abs(ev.velocityX) < 0.3) {
- // Right
- restingPoint = 0;
- }
- }
-
- raf(() => {
- if (restingPoint === 0) {
- // Reset to zero
- this.item.open('');
- var buttons = this.item.itemOptions;
- clearTimeout(this.hideButtonsTimeout);
- this.hideButtonsTimeout = setTimeout(() => {
- buttons && buttons.classList.add('invisible');
- }, 250);
-
- } else {
- this.item.open(restingPoint);
- }
- this.item.enableAnimation();
-
- this.slide = null;
- });
- }
-}
+let slideIds = 0;
diff --git a/ionic/components/item/item.scss b/ionic/components/item/item.scss
index e69e9b070e..bab7f5250e 100644
--- a/ionic/components/item/item.scss
+++ b/ionic/components/item/item.scss
@@ -5,7 +5,6 @@
.item {
- position: relative;
display: flex;
justify-content: space-between;
align-items: center;
@@ -19,6 +18,22 @@
background-color: $list-background-color;
color: $list-text-color;
+
+ box-sizing: border-box;
+}
+
+.item-inner {
+ display: flex;
+ margin: 0;
+ padding: 0;
+ border: 0;
+ overflow: hidden;
+ box-sizing: border-box;
+
+ flex: 1;
+ flex-direction: inherit;
+ align-items: inherit;
+ align-self: stretch;
}
.item-group {
@@ -31,7 +46,7 @@
font-weight: 500;
width: 100%;
z-index: 1000;
-
+
&.sticky {
position: -webkit-sticky;
position: sticky;
@@ -74,10 +89,6 @@ ion-item-content {
white-space: normal;
}
-.list .item {
- border-radius: 0;
-}
-
.item {
h1 {
@@ -129,24 +140,6 @@ ion-input.item {
align-items: flex-start;
}
-/**
- * The hidden right-side buttons that can be exposed under a list item
- * with dragging.
- */
-ion-item-sliding-content {
- display: block;
- z-index: $z-index-item-options + 1;
- flex: 1;
-}
-ion-item-options {
- display: flex;
- position: absolute;
- top: 0;
- right: 0;
- z-index: $z-index-item-options;
- height: 100%;
-}
-
// TEMP hack for https://github.com/angular/angular/issues/4582
[item-right] {
diff --git a/ionic/components/item/item.ts b/ionic/components/item/item.ts
index 875861237e..8d301ccbcf 100644
--- a/ionic/components/item/item.ts
+++ b/ionic/components/item/item.ts
@@ -32,10 +32,12 @@ import {Component} from 'angular2/angular2';
selector: 'ion-item,[ion-item]',
template:
'
' +
- '
' +
- '
' +
- ' '+
- ' ',
+ '
' +
+ ' ' +
+ '' +
+ ' '+
+ ' ' +
+ '
',
host: {
'[class.item]': 'isItem'
}
diff --git a/ionic/components/item/modes/ios.scss b/ionic/components/item/modes/ios.scss
index 725333ec5f..c8a78d40c9 100644
--- a/ionic/components/item/modes/ios.scss
+++ b/ionic/components/item/modes/ios.scss
@@ -6,16 +6,16 @@ $item-ios-border-color: $list-border-color !default;
$item-ios-activated-background-color: #d9d9d9 !default;
$item-ios-font-size: 1.6rem !default;
-$item-ios-padding-top: 13px !default;
+$item-ios-padding-top: 12px !default;
$item-ios-padding-right: 16px !default;
-$item-ios-padding-bottom: 14px !default;
+$item-ios-padding-bottom: 13px !default;
$item-ios-padding-left: 16px !default;
$item-ios-padding-media-top: 10px !default;
$item-ios-padding-media-bottom: 10px !default;
$item-ios-padding-icon-top: 10px !default;
-$item-ios-padding-icon-bottom: 10px !default;
+$item-ios-padding-icon-bottom: 9px !default;
$item-ios-avatar-size: 3.6rem !default;
$item-ios-thumbnail-size: 5.6rem !default;
@@ -40,171 +40,21 @@ ion-note {
color: $item-ios-note-color;
}
-.list {
-
- .item-group {
- // Make sure the first and last items don't have borders
- > .item:first-of-type:before {
- border-top: none !important;
- }
- > .item:last-of-type:after {
- border-top: none !important;
- }
+.item-group {
+ ion-item-group-title {
+ border-bottom: 1px solid $item-ios-border-color;
}
- .item {
- margin-top: -1px;
- padding-right: ($item-ios-padding-right / 2);
- padding-left: ($item-ios-padding-left / 2);
- font-size: $item-ios-font-size;
-
- &:before {
- position: absolute;
- top: 0;
- right: 0;
- left: $item-ios-padding-left;
- border-top: 1px solid $item-ios-border-color;
- content: '';
- pointer-events: none;
- }
-
- &:after {
- position: absolute;
- right: 0;
- bottom: 0;
- left: $item-ios-padding-left;
- border-top: 1px solid $item-ios-border-color;
- content: '';
- pointer-events: none;
- }
-
- &:first-child:before,
- &:last-child:after {
- left: 0;
- }
- }
-
- ion-header + .item:first-of-type:before {
- left: 0;
- }
-
- &[inset] .item {
- &:before,
- &:after {
- left: 0;
- }
- }
-
- ion-item-content {
- margin: $item-ios-padding-top ($item-ios-padding-right / 2) $item-ios-padding-bottom ($item-ios-padding-left / 2);
- }
-
- [item-left],
- [item-right] {
- margin: $item-ios-padding-media-top ($item-ios-padding-right / 2) $item-ios-padding-media-bottom ($item-ios-padding-left / 2);
- }
-
- icon[item-left],
- icon[item-right] {
- margin-top: $item-ios-padding-icon-top;
- margin-bottom: $item-ios-padding-icon-bottom;
- }
-
- button[item-left],
- button[item-right],
- [button][item-left],
- [button][item-right] {
- padding: 0 0.5em;
- font-size: 1.3rem;
- min-height: 25px;
- }
-
- [item-left].icon-only,
- [item-right].icon-only,
- [item-left].icon-only icon,
- [item-right].icon-only icon,
- [item-left][clear],
- [item-right][clear] {
- padding: 0 1px;
- }
-
- [item-left].icon-left icon,
- [item-right].icon-left icon {
- margin-left: 0;
- margin-bottom: 1px;
- padding-right: 0.3em;
- }
-
- [item-left].icon-right icon,
- [item-right].icon-right icon {
- margin-right: 0;
- margin-bottom: 1px;
- }
-
- ion-avatar {
- min-width: $item-ios-avatar-size;
- min-height: $item-ios-avatar-size;
-
- img {
- max-width: $item-ios-avatar-size;
- max-height: $item-ios-avatar-size;
- border-radius: $item-ios-avatar-size / 2;
- }
- }
-
- ion-thumbnail {
- min-width: $item-ios-thumbnail-size;
- min-height: $item-ios-thumbnail-size;
-
- img {
- max-width: $item-ios-thumbnail-size;
- max-height: $item-ios-thumbnail-size;
- }
- }
-
-
- ion-item-sliding.item {
- padding-left: 0;
- padding-right: 0;
- }
-
- ion-item-sliding-content {
- background-color: $item-ios-sliding-content-bg;
- padding-right: ($item-ios-padding-right / 2);
- padding-left: ($item-ios-padding-left / 2);
- display: flex;
- min-height: 42px;
- justify-content: center;
-
- transition: $item-ios-sliding-transition;
-
- // To allow the hairlines through
- margin-top: 1px;
- margin-bottom: 1px;
- }
- ion-item-options {
- button, [button] {
- min-height: calc(100% - 2px);
- height: calc(100% - 2px);
- margin: 1px 0 2px 0;
-
- border: none;
- border-radius: 0;
- display: inline-flex;
- align-items: center;
- box-sizing: border-box;
-
- &:before{
- margin: 0 auto;
- }
+ .item:first-child {
+ .item-inner {
+ border-top-width: 0;
}
}
}
.item.activated,
a.item.activated,
-button.item.activated,
-.item.activated ion-item-sliding-content {
+button.item.activated {
background-color: $item-ios-activated-background-color;
transition-duration: 0ms;
}
@@ -214,69 +64,3 @@ a.item,
button.item {
transition-duration: 200ms;
}
-
-.list,
-ion-card {
- button[ion-item]:not([detail-none]),
- a[ion-item]:not([detail-none]),
- [detail-push]:not(ion-item-sliding) {
- @include ios-detail-push-icon($item-ios-detail-push-color);
- background-repeat: no-repeat;
- background-position: right ($item-ios-padding-right - 2) center;
- background-size: 14px 14px;
- padding-right: 32px;
- }
-
- ion-item-sliding[detail-push] {
-
- ion-item-sliding-content {
- @include ios-detail-push-icon($item-ios-detail-push-color);
- background-repeat: no-repeat;
- background-position: right ($item-ios-padding-right - 2) center;
- background-size: 14px 14px;
- padding-right: 32px;
- }
- }
-}
-
-&.hairlines .list {
-
- ion-item-options {
- button, [button] {
- min-height: calc(100% - 1px);
- height: calc(100% - 1px);
- margin-top: 0.55px;
- margin-bottom: 0.55px;
- }
- }
-
- ion-item-sliding-content {
- margin-top: 0.55px;
- margin-bottom: 0.55px;
- }
-
- .item {
- margin-top: -0.55px;
-
- &:last-child {
- margin-bottom: -0.55px;
- }
-
- &:before,
- &:after {
- border-top-width: 0.55px;
- }
- }
-
-}
-
-.item[no-lines] {
- &:before,
- &:after {
- border-width: 0;
- }
-
- + .item:before {
- border-width: 0;
- }
-}
diff --git a/ionic/components/item/modes/md.scss b/ionic/components/item/modes/md.scss
index 4afc28a385..651d0bcf52 100644
--- a/ionic/components/item/modes/md.scss
+++ b/ionic/components/item/modes/md.scss
@@ -42,230 +42,19 @@ ion-note {
color: $item-md-note-color;
}
-.list {
- .item-group {
- // Make sure the first and last items don't have borders
- > .item:first-of-type:before {
- border-top: none !important;
- }
- > .item:last-of-type:after {
- border-top: none !important;
- }
- }
-
- .item {
- margin-top: -1px;
- padding-right: ($item-md-padding-right / 2);
- padding-left: ($item-md-padding-left / 2);
- font-size: $item-md-font-size;
- text-transform: none;
-
- &:before {
- position: absolute;
- top: 0;
- right: 0;
- left: $item-md-padding-left;
- border-top: 1px solid $item-md-border-color;
- content: '';
- pointer-events: none;
- }
-
- &:after {
- position: absolute;
- right: 0;
- bottom: 0;
- left: $item-md-padding-left;
- border-top: 1px solid $item-md-border-color;
- content: '';
- pointer-events: none;
- }
-
- &:first-child:before,
- &:last-child:after {
- left: 0;
- }
- }
-
- ion-header + .item:before {
- left: 0;
- }
-
- ion-item-content {
- margin: $item-md-padding-top ($item-md-padding-right / 2) $item-md-padding-bottom ($item-md-padding-left / 2);
- }
-
- [item-left],
- [item-right] {
- margin: $item-md-padding-media-top ($item-md-padding-right / 2) $item-md-padding-media-bottom ($item-md-padding-left / 2);
- }
-
- icon[item-left],
- icon[item-right] {
- margin-top: $item-md-padding-icon-top;
- margin-bottom: $item-md-padding-icon-bottom;
- }
-
- button[item-left],
- button[item-right],
- [button][item-left],
- [button][item-right] {
- padding: 0 0.6em;
- min-height: 26px;
- font-size: 1.2rem;
- }
-
- [item-left].icon-only,
- [item-right].icon-only,
- [item-left].icon-only icon,
- [item-right].icon-only icon {
- padding: 0 1px;
- }
-
- [item-left][clear],
- [item-right][clear] {
- padding: 0 8px;
- }
-
- [item-left].icon-left icon,
- [item-right].icon-left icon {
- margin-left: 0;
- margin-bottom: 1px;
- padding-right: 0.3em;
- }
-
- [item-left].icon-right icon,
- [item-right].icon-right icon {
- margin-right: 0;
- margin-bottom: 1px;
- }
-
- [text-wrap] ion-item-content {
- font-size: $item-md-body-text-font-size;
- line-height: $item-md-body-text-line-height;
- }
-
- .item[actions] ion-item-content {
- margin: 4px;
- }
-
- icon[item-left] + ion-item-content,
- icon[item-left] + [text-input] {
- margin-left: $item-md-padding-left + ($item-md-padding-left / 2);
- }
-
- ion-avatar {
- min-width: $item-md-avatar-size;
- min-height: $item-md-avatar-size;
-
- img {
- max-width: $item-md-avatar-size;
- max-height: $item-md-avatar-size;
- border-radius: $item-md-avatar-size / 2;
- }
- }
-
- ion-thumbnail {
- min-width: $item-md-thumbnail-size;
- min-height: $item-md-thumbnail-size;
-
- img {
- max-width: $item-md-thumbnail-size;
- max-height: $item-md-thumbnail-size;
- }
- }
-
- h1 {
- margin: 0 0 2px;
- font-size: 2.4rem;
- font-weight: normal;
- }
-
- h2 {
- margin: 2px 0 2px;
- font-size: 1.6rem;
- font-weight: normal;
- }
-
- h3,
- h4,
- h5,
- h6 {
- line-height: normal;
- margin: 2px 0 2px;
- font-size: 1.4rem;
- font-weight: normal;
- }
-
- p {
- line-height: normal;
- color: #666;
- font-size: 1.4rem;
- margin: 0 0 2px;
- }
-
- button.item.activated {
- box-shadow: none;
- }
-
- ion-item-sliding.item {
- padding-left: 0;
- padding-right: 0;
- }
- ion-item-sliding-content {
- background-color: $item-md-sliding-content-bg;
- padding-right: ($item-md-padding-right / 2);
- padding-left: ($item-md-padding-left / 2);
- display: flex;
- min-height: 42px;
- justify-content: center;
-
- transition: $item-md-sliding-transition;
-
- // To allow the hairlines through
- margin-top: 1px;
- margin-bottom: 1px;
- }
- ion-item-options {
- button, [button] {
- height: calc(100% - 2px);
- margin: 1px 0 1px 0;
- box-shadow: none;
-
- border: none;
- border-radius: 0;
- display: inline-flex;
- align-items: center;
- box-sizing: border-box;
-
- &:before{
- margin: 0 auto;
- }
- }
- }
-}
-
.item,
a.item,
-button.item,
-.item ion-item-sliding-content {
- transition: background-color $button-md-transition-duration $button-md-animation-curve;
+button.item {
+ transition: background-color $button-md-transition-duration $button-md-animation-curve, transform 300ms;
}
.item.activated,
a.item.activated,
-button.item.activated,
-.item.activated ion-item-sliding-content {
+button.item.activated {
background-color: $item-md-activated-background-color;
box-shadow: none;
}
.item[no-lines] {
- &:before,
- &:after {
- border-width: 0;
- }
-
- + .item:before {
- border-width: 0;
- }
+ border-width: 0;
}
diff --git a/ionic/components/item/test/sliding/index.ts b/ionic/components/item/test/sliding/index.ts
index edf8bf5718..96d33e8aca 100644
--- a/ionic/components/item/test/sliding/index.ts
+++ b/ionic/components/item/test/sliding/index.ts
@@ -1,29 +1,35 @@
-import {App} from 'ionic/ionic';
+import {App, IonicApp} from 'ionic/ionic';
@App({
templateUrl: 'main.html'
})
class E2EApp {
- constructor() {
+ constructor(private app: IonicApp) {
setTimeout(() => {
this.shouldShow = true;
}, 10);
}
+ closeOpened() {
+ this.app.getComponent('myList').closeSlidingItems();
+ }
+
getItems() {
- console.log('getItems');
return [0,1];
}
- didClick(e) {
- console.log('CLICK', e.defaultPrevented, e)
+ didClick(ev, item) {
+ console.log('CLICK', ev.defaultPrevented, ev)
}
- archive(e) {
- console.log('Accept', e);
+ archive(ev, item) {
+ console.log('Archive', ev, item);
+ item.close();
}
- del(e) {
- console.log('Delete', e);
+
+ del(ev, item) {
+ console.log('Delete', ev, item);
+ item.close();
}
}
diff --git a/ionic/components/item/test/sliding/main.html b/ionic/components/item/test/sliding/main.html
index 5f13ed5840..7b3fd83541 100644
--- a/ionic/components/item/test/sliding/main.html
+++ b/ionic/components/item/test/sliding/main.html
@@ -1,77 +1,99 @@
Sliding Items
-
+
+
+
-
- Max Lynch
-
- Hey do you want to go to the game tonight?
-
-
- Archive
- Delete
-
-
+
+
+ Max Lynch
+
+ Hey do you want to go to the game tonight?
+
+
+
+ Archive
+ Delete
+
+
-
- Adam Bradley
-
- I think I figured out how to get more Mountain Dew
-
-
- Archive
-
-
-
+
+
+ Adam Bradley
+
+ I think I figured out how to get more Mountain Dew
+
+
+
+ Archive
+
+
+
-
- Ben Sperry
-
- I like paper
-
-
- Archive
- Delete
-
-
+
+
+ Ben Sperry
+
+ I like paper
+
+
+
+ Archive
+ Delete
+
+
-
-
- One Line w/ Icon, div only text
-
- Archive
-
-
+
+
+
+ One Line w/ Icon, div only text
+
+
+ Archive
+
+
-
-
-
-
- One Line w/ Avatar, div only text
-
- Archive
-
-
+
+
+
+
+
+ One Line w/ Avatar, div only text
+
+
+ Archive
+
+
-
-
-
-
- Two Lines w/ Thumbnail, H2 Header
- Paragraph text.
-
- Archive
-
-
+
+
+
+
+
+ Two Lines w/ Thumbnail, H2 Header
+ Paragraph text.
+
+
+ Archive
+
+
-
- ng-for {{item}}
-
- Archive
-
-
+
+
+ ng-for {{item}}
+
+
+ Archive
+
+
-
+
+
+
+ Close opened items
+
+
+