-
+
@@ -39,15 +39,12 @@ export default {
},
computed: {
switchState: function() {
- if (this.disabled) {
- return 'disabled';
- } else if (this.loading) {
- return 'loading';
- } else if (this.checked) {
- return 'on';
- } else {
- return 'off';
- }
+ let switchState = this.checked ? ['is-on'] : ['is-off'];
+
+ if (this.disabled) switchState.push('is-disabled');
+ if (this.loading) switchState.push('is-loading');
+
+ return switchState;
}
},
methods: {
diff --git a/packages/zanui-css/src/cell.pcss b/packages/zanui-css/src/cell.pcss
index ef7afc429..eed4745c9 100644
--- a/packages/zanui-css/src/cell.pcss
+++ b/packages/zanui-css/src/cell.pcss
@@ -2,7 +2,7 @@
@import "./mixins/border_retina.pcss";
@component-namespace z {
- @component cell-group {
+ @b cell-group {
padding-left: 10px;
position: relative;
@@ -11,7 +11,7 @@
}
}
- @component cell {
+ @b cell {
display: block;
overflow: hidden;
position: relative;
@@ -33,19 +33,19 @@
}
}
- @descendent title {
+ @empty-cells: show title {
float: left;
overflow: hidden;
}
- @descendent label {
+ @e label {
display: block;
font-size: 12px;
line-height: 1.2;
color: #666;
}
- @descendent value {
+ @e value {
float: right;
overflow: hidden;
diff --git a/packages/zanui-css/src/field.pcss b/packages/zanui-css/src/field.pcss
index 17596194c..a9333e609 100644
--- a/packages/zanui-css/src/field.pcss
+++ b/packages/zanui-css/src/field.pcss
@@ -2,46 +2,46 @@
@import "./mixins/border_retina.pcss";
@component-namespace z {
- @component field {
+ @b field {
width: 100%;
overflow: hidden;
@when textarea {
- .z-field-control {
+ .z-field__control {
min-height: 60px;
}
}
@when nolabel {
- .z-cell-title {
+ .z-cell__title {
display: none;
}
- .z-cell-value {
+ .z-cell__value {
width: 100%;
padding-left: 0;
}
}
- .z-cell-title,
- .z-cell-value {
+ .z-cell__title,
+ .z-cell__value {
float: none;
box-sizing: border-box;
}
- .z-cell-title {
+ .z-cell__title {
width: 90px;
position: absolute;
top: 10px;
left: 0;
}
- .z-cell-value {
+ .z-cell__value {
width: 100%;
padding-left: 90px;
}
- @descendent control {
+ @e control {
border: 0;
font-size: 14px;
line-height: 22px;
diff --git a/packages/zanui-css/src/index.pcss b/packages/zanui-css/src/index.pcss
index 8a849223c..afe503ef7 100644
--- a/packages/zanui-css/src/index.pcss
+++ b/packages/zanui-css/src/index.pcss
@@ -8,4 +8,5 @@
@import './field.pcss';
@import './icon.pcss';
@import './popup.pcss';
+@import './picker.pcss';
@import './switch.pcss';
diff --git a/packages/zanui-css/src/picker.pcss b/packages/zanui-css/src/picker.pcss
new file mode 100644
index 000000000..05aa9d123
--- /dev/null
+++ b/packages/zanui-css/src/picker.pcss
@@ -0,0 +1,110 @@
+@component-namespace z {
+ @b picker {
+ overflow: hidden;
+
+ @e toolbar {
+ height: 40px;
+ }
+
+ @e columns {
+ position: relative;
+ overflow: hidden;
+
+ @m 1 {
+ .z-picker-column {
+ width: 100%;
+ }
+ }
+
+ @m 2 {
+ .z-picker-column {
+ width: 50%;
+ }
+ }
+
+ @m 3 {
+ .z-picker-column {
+ width: 33.333%;
+ }
+ }
+ }
+ }
+
+ .z-picker-center-highlight {
+ box-sizing: border-box;
+ position: absolute;
+ left: 0;
+ width: 100%;
+ top: 50%;
+ margin-top: -18px;
+ pointer-events: none;
+ }
+
+ .z-picker-center-highlight:before,
+ .z-picker-center-highlight:after {
+ content: '';
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ background-color: #eaeaea;
+ display: block;
+ z-index: 15;
+ transform: scaleY(0.5);
+ }
+
+ .z-picker-center-highlight:before {
+ left: 0;
+ top: 0;
+ bottom: auto;
+ right: auto;
+ }
+
+ .z-picker-center-highlight:after {
+ left: 0;
+ bottom: 0;
+ right: auto;
+ top: auto;
+ }
+
+ @b picker-column {
+ font-size: 18px;
+ overflow: hidden;
+ position: relative;
+ max-height: 100%;
+ float: left;
+ text-align: center;
+
+ @e item {
+ height: 44px;
+ line-height: 44px;
+ padding: 0 10px;
+ white-space: nowrap;
+ position: relative;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ color: #707274;
+ left: 0;
+ top: 0;
+ width: 100%;
+ box-sizing: border-box;
+ transition-duration: .3s;
+ backface-visibility: hidden;
+
+ @m selected {
+ color: #000;
+ transform: translate3d(0, 0, 0) rotateX(0);
+ }
+ }
+ }
+
+ .picker-column-wrapper {
+ transition-duration: 0.3s;
+ transition-timing-function: ease-out;
+ backface-visibility: hidden;
+ }
+
+ .picker-column-wrapper.dragging,
+ .picker-column-wrapper.dragging .picker-item {
+ transition-duration: 0s;
+ }
+}
diff --git a/packages/zanui-css/src/radio.pcss b/packages/zanui-css/src/radio.pcss
new file mode 100644
index 000000000..c8ec135cd
--- /dev/null
+++ b/packages/zanui-css/src/radio.pcss
@@ -0,0 +1,5 @@
+@component-namespace z {
+ @b radio {
+
+ }
+}
diff --git a/packages/zanui-css/src/switch.pcss b/packages/zanui-css/src/switch.pcss
index 1199114fa..7802cb39a 100644
--- a/packages/zanui-css/src/switch.pcss
+++ b/packages/zanui-css/src/switch.pcss
@@ -17,28 +17,23 @@
box-shadow: 0 3px 1px 0 rgba(0, 0, 0, .05), 0 2px 2px 0 rgba(0, 0, 0, .1), 0 3px 3px 0 rgba(0, 0, 0, .05);
@when on {
left: 0;
+ transition: all .5s ease-in-out;
}
@when off {
- right: 0;
+ left: 20px;
+ transition: all .5s ease-in-out;
}
-
}
@when on {
background-color: #44db5e;
border-color: #44db5e;
- @descendent node {
- left: 0;
- }
}
@when off {
background-color: #fff;
border-color: rgba(0, 0, 0, .1);
- @descendent node {
- right: 0;
- }
}
@when loading {
@@ -46,8 +41,13 @@
}
@when disabled {
- background-color: #f2f2f2;
- border-color: rgba(0, 0, 0, .1);
+ @when off {
+ background-color: #f2f2f2;
+ border-color: rgba(0, 0, 0, .1);
+ }
+ @when on {
+ background-color: #a6e7b1;
+ }
}
}
}
diff --git a/src/index.js b/src/index.js
index dc0270226..4fa0815ec 100644
--- a/src/index.js
+++ b/src/index.js
@@ -8,6 +8,7 @@ import CellGroup from '../packages/cell-group/index.js';
import Popup from '../packages/popup/index.js';
import Dialog from '../packages/dialog/index.js';
import Picker from '../packages/picker/index.js';
+import RadioGroup from '../packages/radio-group/index.js';
// zanui
import '../packages/zanui-css/src/index.pcss';
@@ -23,6 +24,7 @@ const install = function(Vue) {
Vue.component(CellGroup.name, CellGroup);
Vue.component(Popup.name, Popup);
Vue.component(Picker.name, Picker);
+ Vue.component(RadioGroup.name, RadioGroup);
};
// auto install
@@ -42,5 +44,6 @@ module.exports = {
CellGroup,
Popup,
Dialog,
- Picker
+ Picker,
+ RadioGroup
};
diff --git a/src/utils/transition.js b/src/utils/transition.js
new file mode 100644
index 000000000..215dc0d4f
--- /dev/null
+++ b/src/utils/transition.js
@@ -0,0 +1,100 @@
+import Vue from 'vue';
+
+var exportObj = {};
+
+if (!Vue.prototype.$isServer) {
+ var docStyle = document.documentElement.style;
+ var engine;
+ var translate3d = false;
+
+ if (window.opera && Object.prototype.toString.call(opera) === '[object Opera]') {
+ engine = 'presto';
+ } else if ('MozAppearance' in docStyle) {
+ engine = 'gecko';
+ } else if ('WebkitAppearance' in docStyle) {
+ engine = 'webkit';
+ } else if (typeof navigator.cpuClass === 'string') {
+ engine = 'trident';
+ }
+
+ var cssPrefix = {trident: '-ms-', gecko: '-moz-', webkit: '-webkit-', presto: '-o-'}[engine];
+
+ var vendorPrefix = {trident: 'ms', gecko: 'Moz', webkit: 'Webkit', presto: 'O'}[engine];
+
+ var helperElem = document.createElement('div');
+ var perspectiveProperty = vendorPrefix + 'Perspective';
+ var transformProperty = vendorPrefix + 'Transform';
+ var transformStyleName = cssPrefix + 'transform';
+ var transitionProperty = vendorPrefix + 'Transition';
+ var transitionStyleName = cssPrefix + 'transition';
+ var transitionEndProperty = vendorPrefix.toLowerCase() + 'TransitionEnd';
+
+ if (helperElem.style[perspectiveProperty] !== undefined) {
+ translate3d = true;
+ }
+
+ var getTranslate = function(element) {
+ var result = {left: 0, top: 0};
+ if (element === null || element.style === null) return result;
+
+ var transform = element.style[transformProperty];
+ var matches = /translate\(\s*(-?\d+(\.?\d+?)?)px,\s*(-?\d+(\.\d+)?)px\)\s*translateZ\(0px\)/ig.exec(transform);
+ if (matches) {
+ result.left = +matches[1];
+ result.top = +matches[3];
+ }
+
+ return result;
+ };
+
+ var translateElement = function(element, x, y) {
+ if (x === null && y === null) return;
+
+ if (element === null || element === undefined || element.style === null) return;
+
+ if (!element.style[transformProperty] && x === 0 && y === 0) return;
+
+ if (x === null || y === null) {
+ var translate = getTranslate(element);
+ if (x === null) {
+ x = translate.left;
+ }
+ if (y === null) {
+ y = translate.top;
+ }
+ }
+
+ cancelTranslateElement(element);
+
+ if (translate3d) {
+ element.style[transformProperty] += ' translate(' + (x ? (x + 'px') : '0px') + ',' + (y ? (y + 'px') : '0px') + ') translateZ(0px)';
+ } else {
+ element.style[transformProperty] += ' translate(' + (x ? (x + 'px') : '0px') + ',' + (y ? (y + 'px') : '0px') + ')';
+ }
+ };
+
+ var cancelTranslateElement = function(element) {
+ if (element === null || element.style === null) return;
+
+ var transformValue = element.style[transformProperty];
+
+ if (transformValue) {
+ transformValue = transformValue.replace(/translate\(\s*(-?\d+(\.?\d+?)?)px,\s*(-?\d+(\.\d+)?)px\)\s*translateZ\(0px\)/g, '');
+ element.style[transformProperty] = transformValue;
+ }
+ };
+
+ exportObj = {
+ transformProperty: transformProperty,
+ transformStyleName: transformStyleName,
+ transitionProperty: transitionProperty,
+ transitionStyleName: transitionStyleName,
+ transitionEndProperty: transitionEndProperty,
+ getElementTranslate: getTranslate,
+ translateElement: translateElement,
+ cancelTranslateElement: cancelTranslateElement
+ };
+};
+
+export default exportObj;
+