mirror of
https://github.com/wahyd4/pinpoint.git
synced 2026-08-15 15:55:54 +10:00
Merge branch 'master' of https://github.com/naver/pinpoint into user-include
This commit is contained in:
+3
-1
@@ -38,7 +38,9 @@ public class ConnectionCloseInterceptor implements AroundInterceptor {
|
||||
logger.beforeInterceptor(target, args);
|
||||
}
|
||||
// In case of close, we have to delete data even if the invocation failed.
|
||||
((DatabaseInfoAccessor)target)._$PINPOINT$_setDatabaseInfo(null);
|
||||
if (target instanceof DatabaseInfoAccessor) {
|
||||
((DatabaseInfoAccessor) target)._$PINPOINT$_setDatabaseInfo(null);
|
||||
}
|
||||
}
|
||||
|
||||
@IgnoreMethod
|
||||
|
||||
+4
-2
@@ -76,7 +76,9 @@ public class DriverConnectInterceptor extends SpanEventSimpleAroundInterceptorFo
|
||||
DatabaseInfo databaseInfo = createDatabaseInfo(driverUrl);
|
||||
if (success) {
|
||||
if (recordConnection) {
|
||||
((DatabaseInfoAccessor)result)._$PINPOINT$_setDatabaseInfo(databaseInfo);
|
||||
if (result instanceof DatabaseInfoAccessor) {
|
||||
((DatabaseInfoAccessor) result)._$PINPOINT$_setDatabaseInfo(databaseInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -86,7 +88,7 @@ public class DriverConnectInterceptor extends SpanEventSimpleAroundInterceptorFo
|
||||
|
||||
if (recordConnection) {
|
||||
DatabaseInfo databaseInfo = (result instanceof DatabaseInfoAccessor) ? ((DatabaseInfoAccessor)result)._$PINPOINT$_getDatabaseInfo() : null;
|
||||
|
||||
|
||||
if (databaseInfo == null) {
|
||||
databaseInfo = UnKnownDatabaseInfo.INSTANCE;
|
||||
}
|
||||
|
||||
+3
-2
@@ -75,8 +75,9 @@ public class StatementCreateInterceptor implements AroundInterceptor {
|
||||
if (databaseInfo == null) {
|
||||
databaseInfo = UnKnownDatabaseInfo.INSTANCE;
|
||||
}
|
||||
|
||||
((DatabaseInfoAccessor)result)._$PINPOINT$_setDatabaseInfo(databaseInfo);
|
||||
if (result instanceof DatabaseInfoAccessor) {
|
||||
((DatabaseInfoAccessor) result)._$PINPOINT$_setDatabaseInfo(databaseInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-3
@@ -126,13 +126,11 @@ public class ZookeeperProfilerClusterManager implements ServerStateChangeEventHa
|
||||
|
||||
if (SocketStateCode.RUN_DUPLEX == stateCode) {
|
||||
UpdateJob job = new UpdateJob(pinpointServer, new byte[0]);
|
||||
worker.putJob(job);
|
||||
|
||||
profileCluster.addClusterPoint(new PinpointServerClusterPoint(pinpointServer));
|
||||
worker.putJob(job);
|
||||
} else if (SocketStateCode.isClosed(stateCode)) {
|
||||
DeleteJob job = new DeleteJob(pinpointServer);
|
||||
worker.putJob(job);
|
||||
|
||||
profileCluster.removeClusterPoint(new PinpointServerClusterPoint(pinpointServer));
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -271,13 +271,6 @@ public class TCPReceiver {
|
||||
SocketAddress remoteAddress = pinpointSocket.getRemoteAddress();
|
||||
try {
|
||||
TBase<?, ?> tBase = SerializationUtils.deserialize(bytes, deserializerFactory);
|
||||
if (tBase instanceof L4Packet) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
L4Packet packet = (L4Packet) tBase;
|
||||
logger.debug("tcp l4 packet {}", packet.getHeader());
|
||||
}
|
||||
return;
|
||||
}
|
||||
TBase result = dispatchHandler.dispatchRequestMessage(tBase);
|
||||
if (result != null) {
|
||||
byte[] resultBytes = SerializationUtils.serialize(result, serializerFactory);
|
||||
|
||||
+63
-3
@@ -20,16 +20,23 @@ import com.navercorp.pinpoint.collector.receiver.DispatchHandler;
|
||||
import com.navercorp.pinpoint.collector.util.PacketUtils;
|
||||
import com.navercorp.pinpoint.thrift.io.*;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.thrift.TBase;
|
||||
import org.apache.thrift.TException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.net.*;
|
||||
import java.net.DatagramPacket;
|
||||
import java.net.InetAddress;
|
||||
import java.net.SocketAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author emeroad
|
||||
* @author netspider
|
||||
* @author minwoo.jung
|
||||
*/
|
||||
public class BaseUDPHandlerFactory<T extends DatagramPacket> implements PacketHandlerFactory<T> {
|
||||
|
||||
@@ -42,8 +49,10 @@ public class BaseUDPHandlerFactory<T extends DatagramPacket> implements PacketHa
|
||||
private final TBaseFilter<SocketAddress> filter;
|
||||
|
||||
private final PacketHandler<T> dispatchPacket = new DispatchPacket();
|
||||
|
||||
private final InetAddress[] ignoreAddresses;
|
||||
|
||||
public BaseUDPHandlerFactory(DispatchHandler dispatchHandler, TBaseFilter<SocketAddress> filter) {
|
||||
public BaseUDPHandlerFactory(DispatchHandler dispatchHandler, TBaseFilter<SocketAddress> filter, List<String> l4IpList) {
|
||||
if (dispatchHandler == null) {
|
||||
throw new NullPointerException("dispatchHandler must not be null");
|
||||
}
|
||||
@@ -52,6 +61,34 @@ public class BaseUDPHandlerFactory<T extends DatagramPacket> implements PacketHa
|
||||
}
|
||||
this.dispatchHandler = dispatchHandler;
|
||||
this.filter = filter;
|
||||
this.ignoreAddresses = setIgnoreAddressList(l4IpList);
|
||||
}
|
||||
|
||||
private InetAddress[] setIgnoreAddressList(List<String> l4IpList) {
|
||||
if (l4IpList == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
List<InetAddress> inetAddressList = new ArrayList<InetAddress>();
|
||||
for (int i = 0; i < l4IpList.size(); i++) {
|
||||
String l4Ip = l4IpList.get(i);
|
||||
if (StringUtils.isBlank(l4Ip)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
InetAddress address = InetAddress.getByName(l4Ip);
|
||||
if (address != null) {
|
||||
inetAddressList.add(address);
|
||||
}
|
||||
}
|
||||
|
||||
InetAddress[] inetAddressArray = new InetAddress[inetAddressList.size()];
|
||||
return inetAddressList.toArray(inetAddressArray);
|
||||
} catch (UnknownHostException e) {
|
||||
logger.warn("l4ipList error {}", l4IpList, e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -67,9 +104,14 @@ public class BaseUDPHandlerFactory<T extends DatagramPacket> implements PacketHa
|
||||
|
||||
@Override
|
||||
public void receive(T packet) {
|
||||
if (isIgnoreAddress(packet.getAddress())) {
|
||||
return;
|
||||
}
|
||||
|
||||
final HeaderTBaseDeserializer deserializer = deserializerFactory.createDeserializer();
|
||||
TBase<?, ?> tBase = null;
|
||||
SocketAddress socketAddress = packet.getSocketAddress();
|
||||
TBase<?, ?> tBase = null;
|
||||
|
||||
try {
|
||||
tBase = deserializer.deserialize(packet.getData());
|
||||
if (filter.filter(tBase, socketAddress) == TBaseFilter.BREAK) {
|
||||
@@ -94,6 +136,24 @@ public class BaseUDPHandlerFactory<T extends DatagramPacket> implements PacketHa
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isIgnoreAddress(InetAddress remoteAddress) {
|
||||
if (ignoreAddresses == null) {
|
||||
return false;
|
||||
}
|
||||
if (remoteAddress == null) {
|
||||
return false;
|
||||
}
|
||||
for (InetAddress ignore : ignoreAddresses) {
|
||||
if (ignore.equals(remoteAddress)) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("UDP Connected ignore address. IP : " + remoteAddress.getHostAddress());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
-42
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright 2014 NAVER Corp.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.navercorp.pinpoint.collector.receiver.udp;
|
||||
|
||||
import com.navercorp.pinpoint.thrift.io.L4Packet;
|
||||
import org.apache.thrift.TBase;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* @author emeroad
|
||||
*/
|
||||
public class L4PacketFilter<T> implements TBaseFilter<T> {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(this.getClass());
|
||||
|
||||
@Override
|
||||
public boolean filter(TBase<?, ?> tBase, T remoteAddress) {
|
||||
if (tBase instanceof L4Packet) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
L4Packet l4Packet = (L4Packet) tBase;
|
||||
logger.debug("udp l4 packet {} {}", l4Packet.getHeader(), remoteAddress);
|
||||
}
|
||||
return BREAK;
|
||||
}
|
||||
return CONTINUE;
|
||||
}
|
||||
}
|
||||
@@ -206,18 +206,17 @@
|
||||
<bean id="udpSpanBasePacketHandler" class="com.navercorp.pinpoint.collector.receiver.udp.BaseUDPHandlerFactory">
|
||||
<constructor-arg index="0" ref="udpSpanDispatchHandlerWrapper"/>
|
||||
<constructor-arg index="1" ref="tBaseFilterChain"/>
|
||||
<constructor-arg index="2" value="#{collectorConfiguration.l4IpList}"/>
|
||||
</bean>
|
||||
|
||||
<bean id="tBaseFilterChain" class="com.navercorp.pinpoint.collector.receiver.udp.TBaseFilterChain">
|
||||
<constructor-arg>
|
||||
<list>
|
||||
<ref bean="l4PacketFilter"/>
|
||||
<ref bean="networkAvailabilityCheckPacketFilter"/>
|
||||
</list>
|
||||
</constructor-arg>
|
||||
</bean>
|
||||
|
||||
<bean id="l4PacketFilter" class="com.navercorp.pinpoint.collector.receiver.udp.L4PacketFilter"/>
|
||||
<bean id="networkAvailabilityCheckPacketFilter" class="com.navercorp.pinpoint.collector.receiver.udp.NetworkAvailabilityCheckPacketFilter"/>
|
||||
|
||||
|
||||
@@ -237,6 +236,7 @@
|
||||
<bean id="udpStatBasePacketHandler" class="com.navercorp.pinpoint.collector.receiver.udp.BaseUDPHandlerFactory">
|
||||
<constructor-arg index="0" ref="udpDispatchHandlerWrapper"/>
|
||||
<constructor-arg index="1" ref="tBaseFilterChain"/>
|
||||
<constructor-arg index="2" value="#{collectorConfiguration.l4IpList}"/>
|
||||
</bean>
|
||||
|
||||
<bean id="udpStatReceiver" class="com.navercorp.pinpoint.collector.receiver.udp.UDPReceiver">
|
||||
|
||||
+5
-3
@@ -37,9 +37,11 @@ public class AddOpInterceptor implements AroundInterceptor {
|
||||
if (isDebug) {
|
||||
logger.beforeInterceptor(target, args);
|
||||
}
|
||||
|
||||
String serviceCode = ((ServiceCodeAccessor)target)._$PINPOINT$_getServiceCode();
|
||||
((ServiceCodeAccessor)args[1])._$PINPOINT$_setServiceCode(serviceCode);
|
||||
final Object serviceCodeAccessor = args[1];
|
||||
if (target instanceof ServiceCodeAccessor && serviceCodeAccessor instanceof ServiceCodeAccessor) {
|
||||
String serviceCode = ((ServiceCodeAccessor) target)._$PINPOINT$_getServiceCode();
|
||||
((ServiceCodeAccessor) serviceCodeAccessor)._$PINPOINT$_setServiceCode(serviceCode);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
@@ -162,6 +162,7 @@ public class ApiInterceptor implements AroundInterceptor {
|
||||
this.traceContext.getAsyncId();
|
||||
final AsyncTraceId asyncTraceId = trace.getAsyncTraceId();
|
||||
recorder.recordNextAsyncId(asyncTraceId.getAsyncId());
|
||||
// type check isAsynchronousInvocation
|
||||
((AsyncTraceIdAccessor)result)._$PINPOINT$_setAsyncTraceId(asyncTraceId);
|
||||
if (isDebug) {
|
||||
logger.debug("Set asyncTraceId metadata {}", asyncTraceId);
|
||||
|
||||
+3
-2
@@ -41,7 +41,8 @@ public class CacheManagerConstructInterceptor implements AroundInterceptor {
|
||||
if (isDebug) {
|
||||
logger.afterInterceptor(target, args, result, throwable);
|
||||
}
|
||||
|
||||
((ServiceCodeAccessor)target)._$PINPOINT$_setServiceCode((String)args[1]);
|
||||
if (target instanceof ServiceCodeAccessor) {
|
||||
((ServiceCodeAccessor) target)._$PINPOINT$_setServiceCode((String) args[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+10
-5
@@ -47,11 +47,16 @@ public class FrontCacheGetFutureConstructInterceptor implements AroundIntercepto
|
||||
}
|
||||
|
||||
try {
|
||||
((CacheNameAccessor)target)._$PINPOINT$_setCacheName(DEFAULT_FRONTCACHE_NAME);
|
||||
|
||||
if (args[0] instanceof Element) {
|
||||
Element element = (Element) args[0];
|
||||
((CacheKeyAccessor)target)._$PINPOINT$_setCacheKey(element.getObjectKey());
|
||||
if (target instanceof CacheNameAccessor) {
|
||||
((CacheNameAccessor) target)._$PINPOINT$_setCacheName(DEFAULT_FRONTCACHE_NAME);
|
||||
}
|
||||
|
||||
final Object elementArg = args[0];
|
||||
if (elementArg instanceof Element) {
|
||||
final Element element = (Element) elementArg;
|
||||
if (target instanceof CacheKeyAccessor) {
|
||||
((CacheKeyAccessor) target)._$PINPOINT$_setCacheKey(element.getObjectKey());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("failed to add metadata: {}", e);
|
||||
|
||||
+5
-3
@@ -70,9 +70,11 @@ public class FrontCacheGetFutureGetInterceptor implements AroundInterceptor {
|
||||
try {
|
||||
final SpanEventRecorder recorder = trace.currentSpanEventRecorder();
|
||||
recorder.recordApi(methodDescriptor);
|
||||
String cacheName = ((CacheNameAccessor)target)._$PINPOINT$_getCacheName();
|
||||
if (cacheName != null) {
|
||||
recorder.recordDestinationId(cacheName);
|
||||
if (target instanceof CacheNameAccessor) {
|
||||
final String cacheName = ((CacheNameAccessor) target)._$PINPOINT$_getCacheName();
|
||||
if (cacheName != null) {
|
||||
recorder.recordDestinationId(cacheName);
|
||||
}
|
||||
}
|
||||
|
||||
recorder.recordServiceType(ArcusConstants.ARCUS_EHCACHE_FUTURE_GET);
|
||||
|
||||
+3
-1
@@ -37,7 +37,9 @@ public class FutureSetOperationInterceptor implements AroundInterceptor {
|
||||
logger.beforeInterceptor(target, args);
|
||||
}
|
||||
|
||||
((OperationAccessor)target)._$PINPOINT$_setOperation((Operation)args[0]);
|
||||
if (target instanceof OperationAccessor) {
|
||||
((OperationAccessor) target)._$PINPOINT$_setOperation((Operation) args[0]);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+5
-2
@@ -38,8 +38,11 @@ public class SetCacheManagerInterceptor implements AroundInterceptor {
|
||||
logger.beforeInterceptor(target, args);
|
||||
}
|
||||
|
||||
String serviceCode = ((ServiceCodeAccessor)args[0])._$PINPOINT$_getServiceCode();
|
||||
((ServiceCodeAccessor)target)._$PINPOINT$_setServiceCode(serviceCode);
|
||||
final Object serviceCodeObject = args[0];
|
||||
if (serviceCodeObject instanceof ServiceCodeAccessor && target instanceof ServiceCodeAccessor) {
|
||||
String serviceCode = ((ServiceCodeAccessor) serviceCodeObject)._$PINPOINT$_getServiceCode();
|
||||
((ServiceCodeAccessor) target)._$PINPOINT$_setServiceCode(serviceCode);
|
||||
}
|
||||
}
|
||||
|
||||
@IgnoreMethod
|
||||
|
||||
+1
@@ -58,6 +58,7 @@ public class HttpRequestExecuteAsyncMethodInnerClassConstructorInterceptor imple
|
||||
final InterceptorScopeInvocation transaction = interceptorScope.getCurrentInvocation();
|
||||
if (transaction != null && transaction.getAttachment() != null) {
|
||||
final AsyncTraceId asyncTraceId = (AsyncTraceId) transaction.getAttachment();
|
||||
// type check validate();
|
||||
((AsyncTraceIdAccessor)target)._$PINPOINT$_setAsyncTraceId(asyncTraceId);
|
||||
// clear.
|
||||
transaction.removeAttachment();
|
||||
|
||||
+1
@@ -152,6 +152,7 @@ public class DefaultClientExchangeHandlerImplStartMethodInterceptor implements A
|
||||
// set asynchronous trace
|
||||
final AsyncTraceId asyncTraceId = trace.getAsyncTraceId();
|
||||
recorder.recordNextAsyncId(asyncTraceId.getAsyncId());
|
||||
// check type isAsynchronousInvocation()
|
||||
((AsyncTraceIdAccessor)((ResultFutureGetter)target)._$PINPOINT$_getResultFuture())._$PINPOINT$_setAsyncTraceId(asyncTraceId);
|
||||
if (isDebug) {
|
||||
logger.debug("Set asyncTraceId metadata {}", asyncTraceId);
|
||||
|
||||
+2
@@ -62,6 +62,7 @@ public class HttpRequestExecutorDoSendRequestAndDoReceiveResponseMethodIntercept
|
||||
|
||||
InterceptorScopeInvocation invocation = interceptorScope.getCurrentInvocation();
|
||||
if(invocation != null && invocation.getAttachment() != null) {
|
||||
// TODO type check
|
||||
HttpCallContext callContext = (HttpCallContext) invocation.getAttachment();
|
||||
if(methodDescriptor.getMethodName().equals("doSendRequest")) {
|
||||
callContext.setWriteBeginTime(System.currentTimeMillis());
|
||||
@@ -85,6 +86,7 @@ public class HttpRequestExecutorDoSendRequestAndDoReceiveResponseMethodIntercept
|
||||
|
||||
InterceptorScopeInvocation invocation = interceptorScope.getCurrentInvocation();
|
||||
if(invocation != null && invocation.getAttachment() != null) {
|
||||
// TODO type check
|
||||
HttpCallContext callContext = (HttpCallContext) invocation.getAttachment();
|
||||
if(methodDescriptor.getMethodName().equals("doSendRequest")) {
|
||||
callContext.setWriteEndTime(System.currentTimeMillis());
|
||||
|
||||
+10
-4
@@ -79,10 +79,16 @@ public class HttpURLConnectionInterceptor implements AroundInterceptor {
|
||||
return;
|
||||
}
|
||||
|
||||
HttpURLConnection request = (HttpURLConnection) target;
|
||||
|
||||
boolean connected = ((ConnectedGetter)target)._$PINPOINT$_isConnected();
|
||||
boolean connecting = (target instanceof ConnectingGetter) && ((ConnectingGetter)target)._$PINPOINT$_isConnecting();
|
||||
final HttpURLConnection request = (HttpURLConnection) target;
|
||||
|
||||
boolean connected = false;
|
||||
if (target instanceof ConnectedGetter) {
|
||||
connected = ((ConnectedGetter) target)._$PINPOINT$_isConnected();
|
||||
}
|
||||
boolean connecting = false;
|
||||
if (target instanceof ConnectingGetter) {
|
||||
connecting = ((ConnectingGetter) target)._$PINPOINT$_isConnecting();
|
||||
}
|
||||
|
||||
if (connected || connecting) {
|
||||
return;
|
||||
|
||||
+21
-17
@@ -14,6 +14,8 @@ import java.lang.reflect.Method;
|
||||
@TargetMethod(name = "handle", paramTypes = { "org.eclipse.jetty.server.AbstractHttpConnection" })
|
||||
public class Jetty8ServerHandleInterceptor extends AbstractServerHandleInterceptor {
|
||||
|
||||
private volatile Method getRequestMethod;
|
||||
|
||||
public Jetty8ServerHandleInterceptor(TraceContext traceContext, MethodDescriptor descriptor, Filter<String> excludeFilter) {
|
||||
super(traceContext, descriptor, excludeFilter);
|
||||
}
|
||||
@@ -23,7 +25,7 @@ public class Jetty8ServerHandleInterceptor extends AbstractServerHandleIntercept
|
||||
try {
|
||||
Object object = args[0];
|
||||
|
||||
Method getRequestMethod = getMethod(object.getClass(), "getRequest");
|
||||
Method getRequestMethod = getGetRequestMethod(object.getClass());
|
||||
Request request = (Request) getRequestMethod.invoke(object);
|
||||
return request;
|
||||
} catch (Exception e) {
|
||||
@@ -33,24 +35,26 @@ public class Jetty8ServerHandleInterceptor extends AbstractServerHandleIntercept
|
||||
return null;
|
||||
}
|
||||
|
||||
private Method getMethod(Class clazz, String methodName) {
|
||||
Class targetClazz = clazz;
|
||||
|
||||
while (targetClazz != null) {
|
||||
try {
|
||||
Method method = targetClazz.getMethod(methodName);
|
||||
if (method != null) {
|
||||
return method;
|
||||
}
|
||||
|
||||
} catch (NoSuchMethodException e) {
|
||||
Class superclass = targetClazz.getSuperclass();
|
||||
if (superclass != null) {
|
||||
targetClazz = superclass;
|
||||
}
|
||||
}
|
||||
private Method getGetRequestMethod(Class clazz) {
|
||||
if (getRequestMethod != null) {
|
||||
return getRequestMethod;
|
||||
}
|
||||
|
||||
synchronized (this) {
|
||||
if (getRequestMethod != null) {
|
||||
return getRequestMethod;
|
||||
}
|
||||
|
||||
try {
|
||||
Method findedMethod = clazz.getMethod("getRequest");
|
||||
if (findedMethod != null) {
|
||||
getRequestMethod = findedMethod;
|
||||
return getRequestMethod;
|
||||
}
|
||||
} catch (NoSuchMethodException e) {
|
||||
logger.warn(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
|
||||
+5
-1
@@ -19,7 +19,11 @@ public class ServerHandleInterceptor extends AbstractServerHandleInterceptor {
|
||||
|
||||
@Override
|
||||
protected Request getRequest(Object[] args) {
|
||||
final HttpChannel<?> channel = (HttpChannel<?>) args[0];
|
||||
final Object httpChannelObject = args[0];
|
||||
if (!(httpChannelObject instanceof HttpChannel)) {
|
||||
return null;
|
||||
}
|
||||
final HttpChannel<?> channel = (HttpChannel<?>) httpChannelObject;
|
||||
final Request request = channel.getRequest();
|
||||
return request;
|
||||
}
|
||||
|
||||
+1
-2
@@ -69,8 +69,7 @@ public class ParsingInterceptor implements AroundInterceptor {
|
||||
recorder.recordServiceType(JsonLibConstants.SERVICE_TYPE);
|
||||
recorder.recordApi(descriptor);
|
||||
recorder.recordException(throwable);
|
||||
|
||||
if (args.length > 0 && args[0] instanceof String) {
|
||||
if (args != null && args.length > 0 && args[0] instanceof String) {
|
||||
recorder.recordAttribute(JsonLibConstants.JSON_LIB_ANNOTATION_KEY_JSON_LENGTH, ((String) args[0]).length());
|
||||
}
|
||||
} finally {
|
||||
|
||||
+1
@@ -67,6 +67,7 @@ public class DispatcherEnqueueMethodInterceptor implements AroundInterceptor {
|
||||
recorder.recordNextAsyncId(asyncTraceId.getAsyncId());
|
||||
|
||||
// set async id.
|
||||
// AsyncTraceIdAccessor typeCheck validate();
|
||||
((AsyncTraceIdAccessor)args[0])._$PINPOINT$_setAsyncTraceId(asyncTraceId);
|
||||
if (isDebug) {
|
||||
logger.debug("Set asyncTraceId metadata {}", asyncTraceId);
|
||||
|
||||
+1
@@ -104,6 +104,7 @@ public class HttpEngineReadResponseMethodInterceptor implements AroundIntercepto
|
||||
recorder.recordException(throwable);
|
||||
|
||||
if (statusCode) {
|
||||
// type check validate();
|
||||
Response response = ((UserResponseGetter) target)._$PINPOINT$_getUserResponse();
|
||||
if (response != null) {
|
||||
recorder.recordAttribute(AnnotationKey.HTTP_STATUS_CODE, response.code());
|
||||
|
||||
+1
-1
@@ -143,7 +143,7 @@ public class HttpEngineSendRequestMethodInterceptor implements AroundInterceptor
|
||||
SpanEventRecorder recorder = trace.currentSpanEventRecorder();
|
||||
recorder.recordApi(methodDescriptor);
|
||||
recorder.recordException(throwable);
|
||||
|
||||
// typeCheck validate();
|
||||
Request request = ((UserRequestGetter) target)._$PINPOINT$_getUserRequest();
|
||||
if (request != null) {
|
||||
try {
|
||||
|
||||
+3
@@ -60,6 +60,9 @@ public class RequestBuilderBuildMethodBackwardCompatibilityInterceptor implement
|
||||
}
|
||||
|
||||
try {
|
||||
if (!(target instanceof Request.Builder)) {
|
||||
return;
|
||||
}
|
||||
final Request.Builder builder = ((Request.Builder) target);
|
||||
if (!trace.canSampled()) {
|
||||
if (isDebug) {
|
||||
|
||||
+3
@@ -58,6 +58,9 @@ public class RequestBuilderBuildMethodInterceptor implements AroundInterceptor {
|
||||
}
|
||||
|
||||
try {
|
||||
if(!(target instanceof Request.Builder)) {
|
||||
return;
|
||||
}
|
||||
final Request.Builder builder = ((Request.Builder) target);
|
||||
if (!trace.canSampled()) {
|
||||
if (isDebug) {
|
||||
|
||||
-3
@@ -56,9 +56,6 @@ public class PostgreSQLConnectionCreateInterceptor implements AroundInterceptor
|
||||
return;
|
||||
}
|
||||
|
||||
for(Object o:args) {
|
||||
logger.info("test: "+o.toString());
|
||||
}
|
||||
|
||||
Properties properties = getProperties(args[3]);
|
||||
|
||||
|
||||
+7
-4
@@ -39,8 +39,11 @@ public class PostgreSqlPreparedStatementCreateInterceptor1 extends SpanEventSimp
|
||||
|
||||
@Override
|
||||
public void doInBeforeTrace(SpanEventRecorder recorder, Object target, Object[] args) {
|
||||
DatabaseInfo databaseInfo = (target instanceof DatabaseInfoAccessor) ? ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo() : null;
|
||||
|
||||
DatabaseInfo databaseInfo = null;
|
||||
if (target instanceof DatabaseInfoAccessor) {
|
||||
databaseInfo = ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo();
|
||||
}
|
||||
|
||||
if (databaseInfo == null) {
|
||||
databaseInfo = UnKnownDatabaseInfo.INSTANCE;
|
||||
}
|
||||
@@ -56,7 +59,7 @@ public class PostgreSqlPreparedStatementCreateInterceptor1 extends SpanEventSimp
|
||||
if (success) {
|
||||
if (target instanceof DatabaseInfoAccessor) {
|
||||
// set databaseInfo to PreparedStatement only when preparedStatement is generated successfully.
|
||||
DatabaseInfo databaseInfo = ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo();
|
||||
final DatabaseInfo databaseInfo = ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo();
|
||||
if (databaseInfo != null) {
|
||||
if (result instanceof DatabaseInfoAccessor) {
|
||||
((DatabaseInfoAccessor)result)._$PINPOINT$_setDatabaseInfo(databaseInfo);
|
||||
@@ -67,7 +70,7 @@ public class PostgreSqlPreparedStatementCreateInterceptor1 extends SpanEventSimp
|
||||
// 1. Don't check traceContext. preparedStatement can be created in other thread.
|
||||
// 2. While sampling is active, the thread which creates preparedStatement could not be a sampling target. So record sql anyway.
|
||||
String sql = (String) args[0];
|
||||
ParsingResult parsingResult = traceContext.parseSql(sql);
|
||||
final ParsingResult parsingResult = traceContext.parseSql(sql);
|
||||
if (parsingResult != null) {
|
||||
((ParsingResultAccessor)result)._$PINPOINT$_setParsingResult(parsingResult);
|
||||
} else {
|
||||
|
||||
+5
-2
@@ -42,8 +42,11 @@ public class PostgreSqlPreparedStatementCreateInterceptor2 extends SpanEventSimp
|
||||
|
||||
@Override
|
||||
public void doInBeforeTrace(SpanEventRecorder recorder, Object target, Object[] args) {
|
||||
DatabaseInfo databaseInfo = (target instanceof DatabaseInfoAccessor) ? ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo() : null;
|
||||
|
||||
DatabaseInfo databaseInfo = null;
|
||||
if (target instanceof DatabaseInfoAccessor) {
|
||||
databaseInfo = ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo();
|
||||
}
|
||||
|
||||
if (databaseInfo == null) {
|
||||
databaseInfo = UnKnownDatabaseInfo.INSTANCE;
|
||||
}
|
||||
|
||||
+5
-2
@@ -39,8 +39,11 @@ public class PostgreSqlPreparedStatementCreateInterceptor3 extends SpanEventSimp
|
||||
|
||||
@Override
|
||||
public void doInBeforeTrace(SpanEventRecorder recorder, Object target, Object[] args) {
|
||||
DatabaseInfo databaseInfo = (target instanceof DatabaseInfoAccessor) ? ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo() : null;
|
||||
|
||||
DatabaseInfo databaseInfo = null;
|
||||
if (target instanceof DatabaseInfoAccessor) {
|
||||
databaseInfo = ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo();
|
||||
}
|
||||
|
||||
if (databaseInfo == null) {
|
||||
databaseInfo = UnKnownDatabaseInfo.INSTANCE;
|
||||
}
|
||||
|
||||
+5
-3
@@ -93,9 +93,11 @@ public class ProcessFunctionProcessInterceptor implements AroundInterceptor {
|
||||
logger.afterInterceptor(target, args, result, throwable);
|
||||
}
|
||||
// Unset server marker
|
||||
Object iprot = args[1];
|
||||
if (validateInputProtocol(iprot)) {
|
||||
((ServerMarkerFlagFieldAccessor)iprot)._$PINPOINT$_setServerMarkerFlag(false);
|
||||
if (args.length != 4) {
|
||||
Object iprot = args[1];
|
||||
if (validateInputProtocol(iprot)) {
|
||||
((ServerMarkerFlagFieldAccessor) iprot)._$PINPOINT$_setServerMarkerFlag(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+9
-7
@@ -74,13 +74,15 @@ public abstract class FrameBufferTransportInjectInterceptor implements AroundInt
|
||||
|
||||
// Retrieve the socket information from the trans_ field of the given instance.
|
||||
protected final Socket getRootSocket(Object target) {
|
||||
TNonblockingTransport inTrans = ((TNonblockingTransportFieldGetter)target)._$PINPOINT$_getTNonblockingTransport();
|
||||
if (inTrans != null) {
|
||||
if (inTrans instanceof SocketFieldAccessor) {
|
||||
return ((SocketFieldAccessor)inTrans)._$PINPOINT$_getSocket();
|
||||
} else {
|
||||
if (isDebug) {
|
||||
logger.debug("Invalid target object. Need field accessor({}).", SocketFieldAccessor.class.getName());
|
||||
if (target instanceof TNonblockingTransportFieldGetter) {
|
||||
TNonblockingTransport inTrans = ((TNonblockingTransportFieldGetter) target)._$PINPOINT$_getTNonblockingTransport();
|
||||
if (inTrans != null) {
|
||||
if (inTrans instanceof SocketFieldAccessor) {
|
||||
return ((SocketFieldAccessor) inTrans)._$PINPOINT$_getSocket();
|
||||
} else {
|
||||
if (isDebug) {
|
||||
logger.debug("Invalid target object. Need field accessor({}).", SocketFieldAccessor.class.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-3
@@ -47,8 +47,9 @@ public class ConnectorInitializeInterceptor implements AroundInterceptor {
|
||||
if (isDebug) {
|
||||
logger.afterInterceptor(target, args, result, throwable);
|
||||
}
|
||||
|
||||
Connector connector = (Connector)target;
|
||||
this.traceContext.getServerMetaDataHolder().addConnector(connector.getProtocol(), connector.getPort());
|
||||
if (target instanceof Connector) {
|
||||
final Connector connector = (Connector) target;
|
||||
this.traceContext.getServerMetaDataHolder().addConnector(connector.getProtocol(), connector.getPort());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
@@ -77,6 +77,7 @@ public class RequestStartAsyncInterceptor implements AroundInterceptor {
|
||||
final AsyncTraceId asyncTraceId = trace.getAsyncTraceId();
|
||||
recorder.recordNextAsyncId(asyncTraceId.getAsyncId());
|
||||
// result is BasicFuture
|
||||
// type check validate()
|
||||
((AsyncTraceIdAccessor)result)._$PINPOINT$_setAsyncTraceId(asyncTraceId);
|
||||
if (isDebug) {
|
||||
logger.debug("Set asyncTraceId metadata {}", asyncTraceId);
|
||||
|
||||
+15
-16
@@ -16,13 +16,12 @@
|
||||
|
||||
package com.navercorp.pinpoint.profiler.sender;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
|
||||
import com.navercorp.pinpoint.common.util.PinpointThreadFactory;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.navercorp.pinpoint.common.util.PinpointThreadFactory;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
|
||||
/**
|
||||
* @author Taejin Koo
|
||||
@@ -37,8 +36,8 @@ public class StandbySpanStreamDataSendWorker implements Runnable {
|
||||
private final StandbySpanStreamDataStorage standbySpanStreamDataStorage;
|
||||
private final long blockTime;
|
||||
|
||||
private final Thread workerThread;
|
||||
private final Object lock = new Object();
|
||||
private Thread workerThread;
|
||||
|
||||
private boolean isStarted = false;
|
||||
|
||||
@@ -50,34 +49,34 @@ public class StandbySpanStreamDataSendWorker implements Runnable {
|
||||
this.flushHandler = flushHandler;
|
||||
this.standbySpanStreamDataStorage = dataStorage;
|
||||
this.blockTime = blockTime;
|
||||
|
||||
final ThreadFactory threadFactory = new PinpointThreadFactory(this.getClass().getSimpleName(), true);
|
||||
this.workerThread = threadFactory.newThread(this);
|
||||
}
|
||||
|
||||
public void start() {
|
||||
logger.info("{} initialization started.", this.getClass().getSimpleName());
|
||||
final ThreadFactory threadFactory = new PinpointThreadFactory(this.getClass().getSimpleName(), true);
|
||||
this.workerThread = threadFactory.newThread(this);
|
||||
|
||||
logger.info("start() started.");
|
||||
if (!workerThread.isAlive()) {
|
||||
this.isStarted = true;
|
||||
this.workerThread.start();
|
||||
logger.info("{} initialization completed.", this.getClass().getSimpleName());
|
||||
logger.info("start() completed.");
|
||||
} else {
|
||||
logger.info("{} already started.", this.getClass().getSimpleName());
|
||||
logger.info("start() failed. caused:already started.", this.getClass().getSimpleName());
|
||||
}
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
logger.info("{} destroying started.", this.getClass().getSimpleName());
|
||||
logger.info("stop() started.");
|
||||
|
||||
this.isStarted = false;
|
||||
|
||||
long startTimeMillis = System.currentTimeMillis();
|
||||
long maxWaitTimeMillis = 3000;
|
||||
|
||||
while (this.workerThread.isAlive()) {
|
||||
this.workerThread.interrupt();
|
||||
while (workerThread != null && workerThread.isAlive()) {
|
||||
workerThread.interrupt();
|
||||
try {
|
||||
this.workerThread.join(100L);
|
||||
workerThread.join(100L);
|
||||
|
||||
if (System.currentTimeMillis() - startTimeMillis > maxWaitTimeMillis) {
|
||||
break;
|
||||
@@ -86,7 +85,7 @@ public class StandbySpanStreamDataSendWorker implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("{} destroying completed.", this.getClass().getSimpleName());
|
||||
logger.info("stop() completed.");
|
||||
}
|
||||
|
||||
boolean addStandbySpanStreamData(SpanStreamSendData standbySpanStreamData) {
|
||||
|
||||
+1
-1
@@ -53,7 +53,7 @@ public class StandbySpanStreamDataStorage {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (standbySpanStreamData.getAvailableBufferCapacity() > 0 && standbySpanStreamData.getAvailableBufferCapacity() > 0) {
|
||||
if (standbySpanStreamData.getAvailableBufferCapacity() > 0 && standbySpanStreamData.getAvailableGatheringComponentsCount() > 0) {
|
||||
if (priorityQueue.size() >= capacity) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -76,7 +76,9 @@ public class AgentInfoSenderTest {
|
||||
|
||||
try {
|
||||
agentInfoSender.start();
|
||||
Thread.sleep(1000L);
|
||||
while (requestCount.get() < 1) {
|
||||
Thread.sleep(1000L);
|
||||
}
|
||||
} finally {
|
||||
closeAll(serverAcceptor, agentInfoSender, pinpointClient, clientFactory);
|
||||
}
|
||||
@@ -103,7 +105,9 @@ public class AgentInfoSenderTest {
|
||||
|
||||
try {
|
||||
agentInfoSender.start();
|
||||
Thread.sleep(agentInfoSendRetryIntervalMs * expectedTriesUntilSuccess);
|
||||
while (requestCount.get() < expectedTriesUntilSuccess) {
|
||||
Thread.sleep(1000L);
|
||||
}
|
||||
} finally {
|
||||
closeAll(serverAcceptor, agentInfoSender, pinpointClient, socketFactory);
|
||||
}
|
||||
@@ -116,7 +120,7 @@ public class AgentInfoSenderTest {
|
||||
final AtomicInteger requestCount = new AtomicInteger();
|
||||
final AtomicInteger successCount = new AtomicInteger();
|
||||
final long agentInfoSendRetryIntervalMs = 100L;
|
||||
final int expectedTriesUntilSuccess = 15;
|
||||
final int expectedTriesUntilSuccess = AgentInfoSender.DEFAULT_MAX_TRY_COUNT_PER_ATTEMPT * 5;
|
||||
|
||||
ResponseServerMessageListener serverListener = new ResponseServerMessageListener(requestCount, successCount, expectedTriesUntilSuccess);
|
||||
|
||||
@@ -130,7 +134,9 @@ public class AgentInfoSenderTest {
|
||||
|
||||
try {
|
||||
agentInfoSender.start();
|
||||
Thread.sleep(agentInfoSendRetryIntervalMs * expectedTriesUntilSuccess);
|
||||
while (requestCount.get() < expectedTriesUntilSuccess) {
|
||||
Thread.sleep(1000L);
|
||||
}
|
||||
} finally {
|
||||
closeAll(serverAcceptor, agentInfoSender, pinpointClient, socketFactory);
|
||||
}
|
||||
@@ -140,15 +146,17 @@ public class AgentInfoSenderTest {
|
||||
|
||||
@Test
|
||||
public void agentInfoShouldRetryUntilAttemptsAreExhaustedWhenRefreshing() throws InterruptedException {
|
||||
final AtomicInteger requestCount = new AtomicInteger();
|
||||
final AtomicInteger successServerRequestCount = new AtomicInteger();
|
||||
final AtomicInteger failServerRequestCount = new AtomicInteger();
|
||||
final AtomicInteger successCount = new AtomicInteger();
|
||||
final long agentInfoSendRetryIntervalMs = 100L;
|
||||
final long agentInfoSendRefreshIntervalMs = 1000L;
|
||||
final int expectedTries = AgentInfoSender.DEFAULT_MAX_TRY_COUNT_PER_ATTEMPT + 1;
|
||||
final int expectedSuccessServerTries = 1;
|
||||
final int expectedFailServerTries = AgentInfoSender.DEFAULT_MAX_TRY_COUNT_PER_ATTEMPT;
|
||||
final CountDownLatch agentReconnectLatch = new CountDownLatch(1);
|
||||
|
||||
ResponseServerMessageListener successServerListener = new ResponseServerMessageListener(requestCount, successCount);
|
||||
ResponseServerMessageListener failServerListener = new ResponseServerMessageListener(requestCount, successCount, Integer.MAX_VALUE);
|
||||
ResponseServerMessageListener successServerListener = new ResponseServerMessageListener(successServerRequestCount, successCount);
|
||||
ResponseServerMessageListener failServerListener = new ResponseServerMessageListener(failServerRequestCount, successCount, Integer.MAX_VALUE);
|
||||
|
||||
PinpointServerAcceptor successServerAcceptor = createServerAcceptor(successServerListener);
|
||||
PinpointServerAcceptor failServerAcceptor = null;
|
||||
@@ -169,48 +177,83 @@ public class AgentInfoSenderTest {
|
||||
.build();
|
||||
try {
|
||||
agentInfoSender.start();
|
||||
Thread.sleep(agentInfoSendRetryIntervalMs);
|
||||
while (successServerRequestCount.get() < expectedSuccessServerTries) {
|
||||
Thread.sleep(agentInfoSendRetryIntervalMs);
|
||||
}
|
||||
successServerAcceptor.close();
|
||||
// wait till agent reconnects
|
||||
failServerAcceptor = createServerAcceptor(failServerListener);
|
||||
// wait till agent reconnects
|
||||
agentReconnectLatch.await();
|
||||
Thread.sleep(agentInfoSendRefreshIntervalMs);
|
||||
while (failServerRequestCount.get() < expectedFailServerTries) {
|
||||
Thread.sleep(agentInfoSendRefreshIntervalMs);
|
||||
}
|
||||
failServerAcceptor.close();
|
||||
} finally {
|
||||
closeAll(failServerAcceptor, agentInfoSender, pinpointClient, socketFactory);
|
||||
closeAll(null, agentInfoSender, pinpointClient, socketFactory);
|
||||
}
|
||||
assertEquals(1, successCount.get());
|
||||
assertEquals(expectedTries, requestCount.get());
|
||||
assertEquals(expectedSuccessServerTries, successServerRequestCount.get());
|
||||
assertEquals(expectedFailServerTries, failServerRequestCount.get());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void agentInfoShouldBeSentOnlyOnceEvenAfterReconnect() throws InterruptedException {
|
||||
public void agentInfoShouldBeSentOnlyOnceEvenAfterReconnect() throws Exception {
|
||||
final AtomicInteger requestCount = new AtomicInteger();
|
||||
final AtomicInteger successCount = new AtomicInteger();
|
||||
final AtomicInteger reconnectCount = new AtomicInteger();
|
||||
final int expectedReconnectCount = 3;
|
||||
final long agentInfoSendRetryIntervalMs = 100L;
|
||||
final int maxTryCountPerAttempt = Integer.MAX_VALUE;
|
||||
|
||||
final CyclicBarrier reconnectEventBarrier = new CyclicBarrier(2);
|
||||
|
||||
ResponseServerMessageListener serverListener = new ResponseServerMessageListener(requestCount, successCount);
|
||||
|
||||
PinpointServerAcceptor serverAcceptor = createServerAcceptor(serverListener);
|
||||
|
||||
PinpointClientFactory clientFactory = createPinpointClientFactory();
|
||||
PinpointClient pinpointClient = ClientFactoryUtils.createPinpointClient(HOST, PORT, clientFactory);
|
||||
|
||||
TcpDataSender dataSender = new TcpDataSender(pinpointClient);
|
||||
dataSender.addReconnectEventListener(new PinpointClientReconnectEventListener() {
|
||||
@Override
|
||||
public void reconnectPerformed(PinpointClient client) {
|
||||
reconnectCount.incrementAndGet();
|
||||
try {
|
||||
reconnectEventBarrier.await();
|
||||
} catch (Exception e) {
|
||||
// just fail
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
});
|
||||
AgentInfoSender agentInfoSender = new AgentInfoSender.Builder(dataSender, getAgentInfo())
|
||||
.sendInterval(agentInfoSendRetryIntervalMs)
|
||||
.maxTryPerAttempt(maxTryCountPerAttempt)
|
||||
.build();
|
||||
|
||||
try {
|
||||
// initial connect
|
||||
agentInfoSender.start();
|
||||
createAndDeleteServer(serverListener, 1000L);
|
||||
Thread.sleep(500L);
|
||||
createAndDeleteServer(serverListener, 1000L);
|
||||
Thread.sleep(500L);
|
||||
createAndDeleteServer(serverListener, 1000L);
|
||||
while (requestCount.get() < 1) {
|
||||
Thread.sleep(1000L);
|
||||
}
|
||||
serverAcceptor.close();
|
||||
// reconnect
|
||||
for (int i = 0; i < expectedReconnectCount; ++i) {
|
||||
PinpointServerAcceptor reconnectServerAcceptor = createServerAcceptor(serverListener);
|
||||
// wait for agent to reconnect
|
||||
reconnectEventBarrier.await();
|
||||
// wait to see if AgentInfo is sent again (it shouldn't)
|
||||
Thread.sleep(1000L);
|
||||
reconnectServerAcceptor.close();
|
||||
reconnectEventBarrier.reset();
|
||||
}
|
||||
} finally {
|
||||
closeAll(null, agentInfoSender, pinpointClient, clientFactory);
|
||||
}
|
||||
assertEquals(1, successCount.get());
|
||||
assertEquals(expectedReconnectCount, reconnectCount.get());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -218,7 +261,7 @@ public class AgentInfoSenderTest {
|
||||
final AtomicInteger requestCount = new AtomicInteger();
|
||||
final AtomicInteger successCount = new AtomicInteger();
|
||||
final long agentInfoSendRetryIntervalMs = 100L;
|
||||
final long agentInfoSendRefreshIntervalMs = 1000L;
|
||||
final long agentInfoSendRefreshIntervalMs = 100L;
|
||||
final int expectedRefreshCount = 5;
|
||||
|
||||
ResponseServerMessageListener serverListener = new ResponseServerMessageListener(requestCount, successCount);
|
||||
@@ -236,7 +279,9 @@ public class AgentInfoSenderTest {
|
||||
|
||||
try {
|
||||
agentInfoSender.start();
|
||||
Thread.sleep(agentInfoSendRefreshIntervalMs * expectedRefreshCount);
|
||||
while (requestCount.get() < expectedRefreshCount) {
|
||||
Thread.sleep(1000L);
|
||||
}
|
||||
} finally {
|
||||
closeAll(serverAcceptor, agentInfoSender, pinpointClient, socketFactory);
|
||||
}
|
||||
|
||||
@@ -65,7 +65,6 @@ public class DefaultPinpointClientHandler extends SimpleChannelHandler implement
|
||||
private long timeoutMillis = DEFAULT_TIMEOUTMILLIS;
|
||||
private long pingDelay = DEFAULT_PING_DELAY;
|
||||
|
||||
private long handshakeRetryInterval = DEFAULT_ENABLE_WORKER_PACKET_DELAY;
|
||||
private int maxHandshakeCount = DEFAULT_ENABLE_WORKER_PACKET_RETRY_COUNT;
|
||||
|
||||
private final Timer channelTimer;
|
||||
|
||||
@@ -79,20 +79,20 @@ public class PinpointClientHandshaker {
|
||||
}
|
||||
|
||||
public void handshakeStart(Channel channel, Map<String, Object> handshakeData) {
|
||||
logger.info("{} handshakeStart method started. channel:{}", simpleClassNameAndHashCodeString(), channel);
|
||||
logger.info("{} handshakeStart() started. channel:{}", simpleClassNameAndHashCodeString(), channel);
|
||||
|
||||
if (channel == null) {
|
||||
logger.warn("{} handshakeStart method failed. caused:channel may not be null.", simpleClassNameAndHashCodeString());
|
||||
logger.warn("{} handshakeStart() failed. caused:channel may not be null.", simpleClassNameAndHashCodeString());
|
||||
return;
|
||||
}
|
||||
|
||||
if (!channel.isConnected()) {
|
||||
logger.warn("{} handshakeStart method failed. caused:channel is not connected.", simpleClassNameAndHashCodeString());
|
||||
logger.warn("{} handshakeStart() failed. caused:channel is not connected.", simpleClassNameAndHashCodeString());
|
||||
return;
|
||||
}
|
||||
|
||||
if (!state.compareAndSet(STATE_INIT, STATE_STARTED)) {
|
||||
logger.warn("{} handshakeStart method failed. caused:unexpected state.", simpleClassNameAndHashCodeString());
|
||||
logger.warn("{} handshakeStart() failed. caused:unexpected state.", simpleClassNameAndHashCodeString());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -104,14 +104,14 @@ public class PinpointClientHandshaker {
|
||||
}
|
||||
|
||||
if (handshakeJob == null) {
|
||||
logger.warn("{} handshakeStart method failed. caused:handshakeJob may not be null.", simpleClassNameAndHashCodeString());
|
||||
logger.warn("{} handshakeStart() failed. caused:handshakeJob may not be null.", simpleClassNameAndHashCodeString());
|
||||
handshakeAbort();
|
||||
return;
|
||||
}
|
||||
|
||||
handshake(handshakeJob);
|
||||
reserveHandshake(handshakeJob);
|
||||
logger.info("{} handshakeStart method completed. channel:{}, data:{}", simpleClassNameAndHashCodeString(), channel, handshakeData);
|
||||
logger.info("{} handshakeStart() completed. channel:{}, data:{}", simpleClassNameAndHashCodeString(), channel, handshakeData);
|
||||
}
|
||||
|
||||
private HandshakeJob createHandshakeJob(Channel channel, Map<String, Object> handshakeData) throws ProtocolException {
|
||||
@@ -136,22 +136,22 @@ public class PinpointClientHandshaker {
|
||||
|
||||
private void reserveHandshake(HandshakeJob handshake) {
|
||||
if (handshakeCount.get() >= maxHandshakeCount) {
|
||||
logger.warn("{} reserveHandshake method failed. caused:Retry count is over({}/{}).", simpleClassNameAndHashCodeString(), handshakeCount.get(), maxHandshakeCount);
|
||||
logger.warn("{} reserveHandshake() failed. caused:Retry count is over({}/{}).", simpleClassNameAndHashCodeString(), handshakeCount.get(), maxHandshakeCount);
|
||||
handshakeAbort();
|
||||
return;
|
||||
}
|
||||
|
||||
logger.debug("{} reserveHandshake method started.", simpleClassNameAndHashCodeString());
|
||||
logger.debug("{} reserveHandshake() started.", simpleClassNameAndHashCodeString());
|
||||
this.handshakerTimer.newTimeout(handshake, retryInterval, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
public boolean handshakeComplete(ControlHandshakeResponsePacket responsePacket) {
|
||||
logger.info("{} handshakeComplete method started. responsePacket:{}", simpleClassNameAndHashCodeString(), responsePacket);
|
||||
logger.info("{} handshakeComplete() started. responsePacket:{}", simpleClassNameAndHashCodeString(), responsePacket);
|
||||
|
||||
synchronized (lock) {
|
||||
if (!this.state.compareAndSet(STATE_STARTED, STATE_FINISHED)) {
|
||||
// state can be 0 or 2.
|
||||
logger.info("{} handshakeComplete method failed. caused:unexpected state.", simpleClassNameAndHashCodeString());
|
||||
logger.info("{} handshakeComplete() failed. caused:unexpected state.", simpleClassNameAndHashCodeString());
|
||||
this.state.set(STATE_FINISHED);
|
||||
return false;
|
||||
}
|
||||
@@ -164,7 +164,7 @@ public class PinpointClientHandshaker {
|
||||
ClusterOption clusterOption = getClusterOption(handshakeResponse);
|
||||
this.clusterOption.compareAndSet(null, clusterOption);
|
||||
|
||||
logger.info("{} handshakeComplete method completed. handshake-response:{}.", simpleClassNameAndHashCodeString(), handshakeResponse);
|
||||
logger.info("{} handshakeComplete() completed. handshake-response:{}.", simpleClassNameAndHashCodeString(), handshakeResponse);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -235,7 +235,7 @@ public class PinpointClientHandshaker {
|
||||
}
|
||||
|
||||
public void handshakeAbort() {
|
||||
logger.info("{} handshakeAbort method started.", simpleClassNameAndHashCodeString());
|
||||
logger.info("{} handshakeAbort() started.", simpleClassNameAndHashCodeString());
|
||||
|
||||
if (!state.compareAndSet(STATE_STARTED, STATE_FINISHED)) {
|
||||
// state can be 0 or 2.
|
||||
@@ -243,7 +243,7 @@ public class PinpointClientHandshaker {
|
||||
this.state.set(STATE_FINISHED);
|
||||
return;
|
||||
}
|
||||
logger.info("{} handshakeAbort method completed.", simpleClassNameAndHashCodeString());
|
||||
logger.info("{} handshakeAbort() completed.", simpleClassNameAndHashCodeString());
|
||||
}
|
||||
|
||||
public boolean isRun() {
|
||||
@@ -265,7 +265,7 @@ public class PinpointClientHandshaker {
|
||||
}
|
||||
|
||||
private boolean isFinished(int currentState) {
|
||||
return this.state.get() == STATE_FINISHED;
|
||||
return currentState == STATE_FINISHED;
|
||||
}
|
||||
|
||||
private int currentState() {
|
||||
|
||||
@@ -47,7 +47,7 @@ public final class ClientFactoryUtils {
|
||||
LOGGER.info("tcp connect success. remote:{}", connectAddress);
|
||||
return pinpointClient;
|
||||
} catch (PinpointSocketException e) {
|
||||
LOGGER.warn("tcp connect fail. retmoe:{} try reconnect, retryCount:{}", connectAddress, i);
|
||||
LOGGER.warn("tcp connect fail. remote:{} try reconnect, retryCount:{}", connectAddress, i);
|
||||
}
|
||||
}
|
||||
LOGGER.warn("change background tcp connect mode remote:{} ", connectAddress);
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
<FindBugsFilter>
|
||||
|
||||
<Match>
|
||||
<Package name="~com.navercorp.pinpoint.thrift.dto.*" />
|
||||
</Match>
|
||||
</FindBugsFilter>
|
||||
-3
@@ -79,9 +79,6 @@ public class ChunkHeaderTBaseDeserializer {
|
||||
}
|
||||
|
||||
final int validate = validate(header);
|
||||
if (validate == HeaderUtils.PASS_L4) {
|
||||
return new L4Packet(header);
|
||||
}
|
||||
|
||||
TBase<?, ?> base = locator.tBaseLookup(header.getType());
|
||||
base.read(protocol);
|
||||
|
||||
@@ -65,9 +65,6 @@ public class HeaderTBaseDeserializer {
|
||||
base.read(protocol);
|
||||
return base;
|
||||
}
|
||||
if (validate == HeaderUtils.PASS_L4) {
|
||||
return new L4Packet(header);
|
||||
}
|
||||
throw new IllegalStateException("invalid validate " + validate);
|
||||
} finally {
|
||||
trans.clear();
|
||||
@@ -87,8 +84,6 @@ public class HeaderTBaseDeserializer {
|
||||
TBase<?, ?> base = locator.tBaseLookup(header.getType());
|
||||
base.read(protocol);
|
||||
tBaseList.add(base);
|
||||
} else if (validate == HeaderUtils.PASS_L4) {
|
||||
tBaseList.add(new L4Packet(header));
|
||||
} else {
|
||||
throw new IllegalStateException("invalid validate " + validate);
|
||||
}
|
||||
|
||||
@@ -21,8 +21,6 @@ package com.navercorp.pinpoint.thrift.io;
|
||||
*/
|
||||
final class HeaderUtils {
|
||||
public static final int OK = Header.SIGNATURE;
|
||||
// TODO Maybe PASS_L4 should be a modifiable variable
|
||||
public static final int PASS_L4 = 85; // Udp
|
||||
public static final int FAIL = 0;
|
||||
|
||||
private HeaderUtils() {
|
||||
@@ -31,9 +29,7 @@ final class HeaderUtils {
|
||||
public static int validateSignature(byte signature) {
|
||||
if (Header.SIGNATURE == signature) {
|
||||
return OK;
|
||||
} else if (PASS_L4 == signature) {
|
||||
return PASS_L4;
|
||||
}
|
||||
}
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
/*
|
||||
* Copyright 2014 NAVER Corp.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.navercorp.pinpoint.thrift.io;
|
||||
|
||||
import org.apache.thrift.TBase;
|
||||
import org.apache.thrift.TException;
|
||||
import org.apache.thrift.TFieldIdEnum;
|
||||
import org.apache.thrift.protocol.TProtocol;
|
||||
|
||||
/**
|
||||
* @author emeroad
|
||||
*/
|
||||
public class L4Packet implements org.apache.thrift.TBase<L4Packet, org.apache.thrift.TFieldIdEnum>, java.io.Serializable, Cloneable, Comparable<L4Packet> {
|
||||
|
||||
private final transient Header header;
|
||||
|
||||
public L4Packet(Header header) {
|
||||
this.header = header;
|
||||
}
|
||||
|
||||
public Header getHeader() {
|
||||
return header;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(TProtocol tProtocol) throws TException {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(TProtocol tProtocol) throws TException {
|
||||
}
|
||||
|
||||
@Override
|
||||
public TFieldIdEnum fieldForId(int i) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSet(TFieldIdEnum tFieldIdEnum) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getFieldValue(TFieldIdEnum tFieldIdEnum) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFieldValue(TFieldIdEnum tFieldIdEnum, Object o) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public TBase deepCopy() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(L4Packet o) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -127,7 +127,7 @@ public class UserGroupController {
|
||||
@RequestMapping(value = "/member", method = RequestMethod.POST)
|
||||
@ResponseBody
|
||||
public Map<String, String> insertUserGroupMember(@RequestBody UserGroupMember userGroupMember) {
|
||||
if (StringUtils.isEmpty(userGroupMember.getMemberId()) || StringUtils.isEmpty(userGroupMember.getMemberId())) {
|
||||
if (StringUtils.isEmpty(userGroupMember.getMemberId()) || StringUtils.isEmpty(userGroupMember.getUserGroupId())) {
|
||||
Map<String, String> result = new HashMap<>();
|
||||
result.put("errorCode", "500");
|
||||
result.put("errorMessage", "there is not userGroupId or memberId in params to insert user group member");
|
||||
|
||||
@@ -27,7 +27,8 @@
|
||||
cst: {
|
||||
periodTypes: ['5m', '20m', '1h', '3h', '6h', '12h', '1d', '2d'],
|
||||
depthList: [ 1, 2, 3, 4, 5, 6, 7, 8],
|
||||
maxFavorite: 5000
|
||||
maxFavorite: 5000,
|
||||
maxPeriod: 2
|
||||
}
|
||||
});
|
||||
|
||||
@@ -63,6 +64,9 @@
|
||||
this.getPeriodTypes = function() {
|
||||
return cfg.cst.periodTypes;
|
||||
};
|
||||
this.getMaxPeriod = function() {
|
||||
return cfg.cst.maxPeriod;
|
||||
}
|
||||
|
||||
|
||||
function loadPreference() {
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
{
|
||||
"name": "angular-motion",
|
||||
"description": "AngularMotion - Fancy CSS3 animations for AngularJS 1.2+",
|
||||
"version": "0.3.2",
|
||||
"keywords": [
|
||||
"angular",
|
||||
"animation"
|
||||
],
|
||||
"homepage": "https://github.com/mgcrea/angular-motion",
|
||||
"bugs": "https://github.com/mgcrea/angular-motion/issues",
|
||||
"author": {
|
||||
"name": "Olivier Louvignes",
|
||||
"email": "olivier@mg-crea.com",
|
||||
"url": "https://github.com/mgcrea"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/mgcrea/angular-motion.git"
|
||||
},
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT"
|
||||
}
|
||||
],
|
||||
"main": [
|
||||
"dist/angular-motion.min.css"
|
||||
],
|
||||
"dependencies": {
|
||||
"angular": "~1.2.10",
|
||||
"angular-animate": "~1.2.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"bootstrap": ">=3.0.0",
|
||||
"angular-mocks": "~1.2.10",
|
||||
"angular-strap": "~2.0.0",
|
||||
"fastclick": "~0.6.11"
|
||||
},
|
||||
"_release": "0.3.2",
|
||||
"_resolution": {
|
||||
"type": "version",
|
||||
"tag": "v0.3.2",
|
||||
"commit": "077d33b040bc060599aaee8f417594bb6c7e9a30"
|
||||
},
|
||||
"_source": "git://github.com/mgcrea/angular-motion.git",
|
||||
"_target": "~0.3.2",
|
||||
"_originalSource": "angular-motion",
|
||||
"_direct": true
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
# http://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
@@ -1,11 +0,0 @@
|
||||
.dev/
|
||||
.tmp/
|
||||
.DS_Store
|
||||
*.sublime-project
|
||||
*.sublime-workspace
|
||||
bower_components/
|
||||
node_modules/
|
||||
/pages/
|
||||
/docs/
|
||||
/test/coverage/
|
||||
!.gitignore
|
||||
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"node": true,
|
||||
"browser": true,
|
||||
"devel": false,
|
||||
"esnext": true,
|
||||
"bitwise": true,
|
||||
"camelcase": true,
|
||||
"curly": false,
|
||||
"eqeqeq": true,
|
||||
"immed": true,
|
||||
"indent": 2,
|
||||
"latedef": true,
|
||||
"newcap": true,
|
||||
"noarg": true,
|
||||
"quotmark": "single",
|
||||
"regexp": true,
|
||||
"undef": true,
|
||||
"unused": false,
|
||||
"strict": true,
|
||||
"trailing": true,
|
||||
"smarttabs": true,
|
||||
"boss": false,
|
||||
"eqnull": false,
|
||||
"expr": true,
|
||||
"globals": {
|
||||
"angular": false
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "0.10"
|
||||
|
||||
before_script:
|
||||
- export DISPLAY=:99.0
|
||||
- export PHANTOMJS_BIN=/usr/local/phantomjs/bin/phantomjs
|
||||
- sh -e /etc/init.d/xvfb start
|
||||
- sleep 3 # give xvfb some time to start
|
||||
- npm install -gq grunt-cli bower coveralls
|
||||
- bower install --dev
|
||||
- date --rfc-2822
|
||||
|
||||
script:
|
||||
- grunt jshint test build
|
||||
@@ -1,28 +0,0 @@
|
||||
# Contributing
|
||||
|
||||
## Important notes
|
||||
Please don't edit files in the `dist` subdirectory as they are generated via Grunt. You'll find source code in the `src` subdirectory!
|
||||
|
||||
### Code style
|
||||
Regarding code style like indentation and whitespace, **follow the conventions you see used in the source already.**
|
||||
|
||||
## Modifying the code
|
||||
First, ensure that you have the latest [Node.js](http://nodejs.org/) and [npm](http://npmjs.org/) installed.
|
||||
|
||||
Test that Grunt's CLI and Bower are installed by running `grunt --version` and `bower --version`. If the commands aren't found, run `npm install -g grunt-cli bower`. For more information about installing the tools, see the [getting started with Grunt guide](http://gruntjs.com/getting-started) or [bower.io](http://bower.io/) respectively.
|
||||
|
||||
1. Fork and clone the repo.
|
||||
1. Run `npm install` to install all build dependencies (including Grunt).
|
||||
1. Run `bower install` to install the front-end dependencies.
|
||||
1. Run `grunt` to grunt this project.
|
||||
|
||||
Assuming that you don't see any red, you're ready to go. Just be sure to run `grunt` after making any changes, to ensure that nothing is broken.
|
||||
|
||||
## Submitting pull requests
|
||||
|
||||
1. Create a new branch, please don't work in your `master` branch directly.
|
||||
1. Add failing tests for the change you want to make. Run `grunt` to see the tests fail.
|
||||
1. Fix stuff.
|
||||
1. Run `grunt` to see if the tests pass. Repeat steps 2-4 until done.
|
||||
1. Update the documentation to reflect any changes.
|
||||
1. Push to your fork and submit a pull request.
|
||||
@@ -1,475 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
// # Globbing
|
||||
// for performance reasons we're only matching one level down:
|
||||
// 'test/spec/{,*/}*.js'
|
||||
// use this if you want to recursively match all subfolders:
|
||||
// 'test/spec/**/*.js'
|
||||
|
||||
module.exports = function (grunt) {
|
||||
|
||||
// Load grunt tasks automatically
|
||||
require('load-grunt-tasks')(grunt);
|
||||
|
||||
// Time how long tasks take. Can help when optimizing build times
|
||||
// require('time-grunt')(grunt);
|
||||
|
||||
// Define the configuration for all the tasks
|
||||
grunt.initConfig({
|
||||
|
||||
// Project settings
|
||||
pkg: require('./package.json'),
|
||||
bower: require('./bower.json'),
|
||||
yo: {
|
||||
src: 'src',
|
||||
dist: 'dist',
|
||||
docs: 'docs',
|
||||
pages: 'pages'
|
||||
},
|
||||
|
||||
// Project meta
|
||||
meta: {
|
||||
banner: '/**\n' +
|
||||
' * <%= pkg.name %>\n' +
|
||||
' * @version v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %>\n' +
|
||||
' * @link <%= pkg.homepage %>\n' +
|
||||
' * @author <%= pkg.author.name %> <<%= pkg.author.email %>>\n' +
|
||||
' * @license MIT License, http://www.opensource.org/licenses/MIT\n' +
|
||||
' */\n'
|
||||
},
|
||||
|
||||
// Watches files for changes and runs tasks based on the changed files
|
||||
watch: {
|
||||
|
||||
styles: {
|
||||
options: {
|
||||
spawn: false
|
||||
},
|
||||
files: ['src/{,*/}*.less', 'docs/styles/{,*/}*.less'],
|
||||
tasks: ['less:dev', 'autoprefixer']
|
||||
},
|
||||
gruntfile: {
|
||||
files: ['Gruntfile.js']
|
||||
},
|
||||
livereload: {
|
||||
options: {
|
||||
livereload: '<%= connect.options.livereload %>'
|
||||
},
|
||||
files: [
|
||||
'{docs,.dev,.tmp,<%= yo.src %>}/{,*/}{,docs/}*.html',
|
||||
'{docs,.dev,.tmp,<%= yo.src %>}/{,*/}*.css',
|
||||
'{docs,.dev,.tmp,<%= yo.src %>}/{,*/}*.js',
|
||||
'{docs,<%= yo.src %>}/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
// The actual grunt server settings
|
||||
connect: {
|
||||
options: {
|
||||
port: 9000,
|
||||
hostname: '0.0.0.0',
|
||||
livereload: 35729
|
||||
},
|
||||
livereload: {
|
||||
options: {
|
||||
open: true,
|
||||
base: ['docs', '.dev', '.tmp', '<%= yo.src %>']
|
||||
}
|
||||
},
|
||||
test: {
|
||||
options: {
|
||||
port: 9001,
|
||||
base: ['.tmp', 'test', '<%= yo.src %>']
|
||||
}
|
||||
},
|
||||
dist: {
|
||||
options: {
|
||||
base: '<%= yo.dist %>'
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Make sure code styles are up to par and there are no obvious mistakes
|
||||
jshint: {
|
||||
options: {
|
||||
jshintrc: '.jshintrc',
|
||||
reporter: require('jshint-stylish')
|
||||
},
|
||||
all: [
|
||||
'Gruntfile.js',
|
||||
'<%= yo.src %>/scripts/{,*/}*.js'
|
||||
],
|
||||
test: {
|
||||
options: {
|
||||
jshintrc: 'test/.jshintrc'
|
||||
},
|
||||
src: ['test/spec/{,*/}*.js']
|
||||
}
|
||||
},
|
||||
|
||||
// Empties folders to start fresh
|
||||
clean: {
|
||||
dist: {
|
||||
files: [{
|
||||
dot: true,
|
||||
src: [
|
||||
'.tmp',
|
||||
'<%= yo.dist %>/*',
|
||||
'!<%= yo.dist %>/.git*'
|
||||
]
|
||||
}]
|
||||
},
|
||||
docs: {
|
||||
files: [{
|
||||
dot: true,
|
||||
src: [
|
||||
'.tmp',
|
||||
'<%= yo.pages %>/*',
|
||||
'!<%= yo.pages %>/.git*'
|
||||
]
|
||||
}]
|
||||
},
|
||||
server: '.tmp'
|
||||
},
|
||||
|
||||
// Compile less stylesheets
|
||||
less: {
|
||||
dev: {
|
||||
options: {
|
||||
// dumpLineNumbers: 'comments',
|
||||
},
|
||||
files: [{
|
||||
expand: true,
|
||||
flatten: true,
|
||||
cwd: '<%= yo.src %>/',
|
||||
src: '{,*/}*.less',
|
||||
dest: '.tmp/styles/modules/',
|
||||
ext: '.css'
|
||||
}, {
|
||||
src: '<%= yo.src %>/{,*/}*.less',
|
||||
dest: '.tmp/styles/<%= bower.name %>.css',
|
||||
}]
|
||||
},
|
||||
dist: {
|
||||
options: {
|
||||
cleancss: true
|
||||
},
|
||||
files: [{
|
||||
expand: true,
|
||||
flatten: true,
|
||||
cwd: '<%= yo.src %>/',
|
||||
src: '{,*/}*.less',
|
||||
dest: '.tmp/styles/modules/',
|
||||
ext: '.min.css'
|
||||
}, {
|
||||
src: '<%= yo.src %>/{,*/}*.less',
|
||||
dest: '.tmp/styles/<%= bower.name %>.min.css',
|
||||
}]
|
||||
},
|
||||
docs: {
|
||||
options: {
|
||||
cleancss: false
|
||||
},
|
||||
files: [{
|
||||
expand: true,
|
||||
cwd: '<%= yo.docs %>/styles/',
|
||||
src: '*.less',
|
||||
dest: '.tmp/styles/',
|
||||
ext: '.css'
|
||||
}]
|
||||
}
|
||||
},
|
||||
|
||||
// Add vendor prefixed styles
|
||||
autoprefixer: {
|
||||
options: {
|
||||
browsers: ['last 2 versions']
|
||||
},
|
||||
all: {
|
||||
files: [{
|
||||
expand: true,
|
||||
cwd: '.tmp/styles/',
|
||||
src: '{,*/}*.css',
|
||||
dest: '.tmp/styles/'
|
||||
}]
|
||||
}
|
||||
},
|
||||
|
||||
// Reads HTML for usemin blocks to enable smart builds that automatically
|
||||
// concat, minify and revision files. Creates configurations in memory so
|
||||
// additional tasks can operate on them
|
||||
useminPrepare: {
|
||||
html: '<%= yo.docs %>/index.html',
|
||||
options: {
|
||||
dest: '<%= yo.pages %>'
|
||||
}
|
||||
},
|
||||
|
||||
// Performs rewrites based on rev and the useminPrepare configuration
|
||||
usemin: {
|
||||
html: '<%= yo.pages %>/index.html',
|
||||
css: ['<%= yo.pages %>/styles/{,*/}*.css'],
|
||||
options: {
|
||||
assetsDirs: ['<%= yo.pages %>', '<%= yo.pages %>/images']
|
||||
}
|
||||
},
|
||||
|
||||
// Embed static ngincludes
|
||||
nginclude: {
|
||||
docs: {
|
||||
files: [{
|
||||
src: '<%= yo.docs %>/index.html',
|
||||
dest: '<%= yo.pages %>/index.html'
|
||||
}],
|
||||
options: {
|
||||
assetsDirs: ['<%= yo.src %>', '<%= yo.docs %>']
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Minify html files
|
||||
htmlmin: {
|
||||
options: {
|
||||
collapseWhitespace: true,
|
||||
removeComments: false
|
||||
},
|
||||
docs: {
|
||||
files: [{
|
||||
expand: true,
|
||||
cwd: '<%= yo.pages %>',
|
||||
src: ['*.html'],//, 'views/{,*/}*.html'],
|
||||
dest: '<%= yo.pages %>'
|
||||
}]
|
||||
}
|
||||
},
|
||||
|
||||
// Copies remaining files to places other tasks can use
|
||||
copy: {
|
||||
dist: {
|
||||
files: [{
|
||||
expand: true,
|
||||
cwd: '.tmp/styles/',
|
||||
dest: '<%= yo.dist %>',
|
||||
src: '{,*/}*.css'
|
||||
}]
|
||||
},
|
||||
docs: {
|
||||
files: [{
|
||||
expand: true,
|
||||
cwd: '<%= yo.docs %>/',
|
||||
dest: '<%= yo.pages %>',
|
||||
src: [
|
||||
'images/*',
|
||||
'1.0/**/*'
|
||||
]
|
||||
}]
|
||||
}
|
||||
},
|
||||
|
||||
// Run some tasks in parallel to speed up the build process
|
||||
concurrent: {
|
||||
docs: [
|
||||
'less:docs',
|
||||
'uglify:generated',
|
||||
'cssmin:generated'
|
||||
],
|
||||
server: [
|
||||
'less:dev'
|
||||
],
|
||||
test: [
|
||||
'less:dev'
|
||||
],
|
||||
dist: [
|
||||
'less:dist',
|
||||
'imagemin',
|
||||
'svgmin',
|
||||
'htmlmin'
|
||||
]
|
||||
},
|
||||
|
||||
concat: {
|
||||
// generated: {
|
||||
// options: {
|
||||
// banner: '(function(window, document, $, undefined) {\n\'use strict\';\n',
|
||||
// footer: '\n})(window, document, window.jQuery);\n'
|
||||
// }
|
||||
// },
|
||||
dist: {
|
||||
options: {
|
||||
// Replace all 'use strict' statements in the code with a single one at the top
|
||||
banner: '(function(window, document, undefined) {\n\'use strict\';\n',
|
||||
footer: '\n})(window, document);\n',
|
||||
process: function(src, filepath) {
|
||||
return '// Source: ' + filepath + '\n' +
|
||||
src.replace(/(^|\n)[ \t]*('use strict'|"use strict");?\s*/g, '$1');
|
||||
}
|
||||
},
|
||||
files: [{
|
||||
src: ['<%= yo.src %>/module.js', '<%= yo.src %>/{,*/}*.js'],
|
||||
dest: '<%= yo.dist %>/<%= pkg.name %>.js'
|
||||
}, {
|
||||
src: ['<%= yo.dist %>/modules/{,*/}*.tpl.js'],
|
||||
dest: '<%= yo.dist %>/<%= pkg.name %>.tpl.js'
|
||||
}]
|
||||
},
|
||||
banner: {
|
||||
options: {
|
||||
banner: '<%= meta.banner %>',
|
||||
},
|
||||
files: [{
|
||||
expand: true,
|
||||
cwd: '<%= yo.dist %>',
|
||||
src: '{,*/}*.{js,css}',
|
||||
dest: '<%= yo.dist %>'
|
||||
}]
|
||||
},
|
||||
docs: {
|
||||
options: {
|
||||
banner: '<%= meta.banner %>',
|
||||
},
|
||||
files: [{
|
||||
expand: true,
|
||||
cwd: '<%= yo.pages %>',
|
||||
src: ['scripts/{demo,docs,angular-strap}*', 'styles/{main}*'],
|
||||
dest: '<%= yo.pages %>'
|
||||
}]
|
||||
}
|
||||
},
|
||||
|
||||
// Allow the use of non-minsafe AngularJS files. Automatically makes it
|
||||
// minsafe compatible so Uglify does not destroy the ng references
|
||||
ngmin: {
|
||||
dist: {
|
||||
files: [{
|
||||
src: '<%= yo.dist %>/<%= pkg.name %>.js',
|
||||
dest: '<%= yo.dist %>/<%= pkg.name %>.js'
|
||||
}]
|
||||
},
|
||||
modules: {
|
||||
files: [{
|
||||
expand: true,
|
||||
flatten: true,
|
||||
cwd: '<%= yo.src %>',
|
||||
src: '{,*/}*.js',
|
||||
dest: '<%= yo.dist %>/modules'
|
||||
}]
|
||||
},
|
||||
docs: {
|
||||
files: [{
|
||||
expand: true,
|
||||
cwd: '.tmp/concat/scripts',
|
||||
src: '*.js',
|
||||
dest: '.tmp/concat/scripts'
|
||||
}]
|
||||
}
|
||||
},
|
||||
|
||||
ngtemplates: {
|
||||
docs: {
|
||||
options: {
|
||||
module: 'mgcrea.ngMotionDocs',
|
||||
usemin: 'scripts/docs.tpl.min.js'
|
||||
},
|
||||
files: [{
|
||||
cwd: '<%= yo.src %>',
|
||||
src: '{,*/}docs/*.html',
|
||||
dest: '.tmp/ngtemplates/src-docs.tpl.js'
|
||||
},
|
||||
{
|
||||
cwd: '<%= yo.docs %>',
|
||||
src: 'views/sidebar.html',
|
||||
dest: '.tmp/ngtemplates/docs-views.tpl.js'
|
||||
},
|
||||
{
|
||||
cwd: '<%= yo.docs %>',
|
||||
src: 'views/partials/{,*/}*.html',
|
||||
dest: '.tmp/ngtemplates/docs-partials.tpl.js'
|
||||
}]
|
||||
}
|
||||
},
|
||||
|
||||
// Test settings
|
||||
karma: {
|
||||
options: {
|
||||
configFile: 'test/karma.conf.js',
|
||||
browsers: ['PhantomJS']
|
||||
},
|
||||
unit: {
|
||||
singleRun: true,
|
||||
options: {
|
||||
reporters: ['dots']
|
||||
}
|
||||
},
|
||||
server: {
|
||||
autoWatch: true
|
||||
}
|
||||
},
|
||||
|
||||
uglify: {
|
||||
generated: {
|
||||
options: {
|
||||
compress: false,
|
||||
mangle: false,
|
||||
beautify: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
grunt.registerTask('serve', function (target) {
|
||||
if (target === 'dist') {
|
||||
return grunt.task.run(['build', 'connect:dist:keepalive']);
|
||||
}
|
||||
|
||||
grunt.task.run([
|
||||
'clean:server',
|
||||
'concurrent:server',
|
||||
'autoprefixer',
|
||||
'connect:livereload',
|
||||
'watch'
|
||||
]);
|
||||
});
|
||||
|
||||
grunt.registerTask('test', [
|
||||
'clean:server',
|
||||
'connect:test',
|
||||
'karma:unit'
|
||||
]);
|
||||
|
||||
grunt.registerTask('build', [
|
||||
'clean:dist',
|
||||
'less:dev',
|
||||
'less:dist',
|
||||
'autoprefixer',
|
||||
'copy:dist',
|
||||
'concat:banner'
|
||||
]);
|
||||
|
||||
grunt.registerTask('docs', [
|
||||
'clean:docs',
|
||||
'useminPrepare',
|
||||
'less:dev',
|
||||
'less:docs',
|
||||
'autoprefixer',
|
||||
'nginclude:docs',
|
||||
'ngtemplates:docs',
|
||||
'concat:generated',
|
||||
'ngmin:docs',
|
||||
'copy:docs',
|
||||
'cssmin:generated',
|
||||
'uglify:generated',
|
||||
'concat:docs',
|
||||
'usemin',
|
||||
// 'htmlmin:docs' // breaks code preview
|
||||
]);
|
||||
|
||||
grunt.registerTask('default', [
|
||||
'newer:jshint',
|
||||
'test',
|
||||
'build'
|
||||
]);
|
||||
|
||||
};
|
||||
@@ -1,21 +0,0 @@
|
||||
The MIT License
|
||||
|
||||
Copyright (c) 2014 Olivier Louvignes http://olouv.com
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
@@ -1,95 +0,0 @@
|
||||
# [AngularMotion](http://mgcrea.github.io/angular-motion) [](http://travis-ci.org/#!/mgcrea/angular-motion) [](https://gemnasium.com/mgcrea/angular-motion) [](https://github.com/igrigorik/ga-beacon)
|
||||
|
||||
[](http://mgcrea.github.io/angular-motion)
|
||||
|
||||
AngularMotion is an animation starter-kit built for [AngularJS 1.2.0+](https://github.com/angular/angular.js).
|
||||
|
||||
It's a spin off from [AngularStrap](http://mgcrea.github.io/angular-strap) v2 release work.
|
||||
|
||||
|
||||
## Documentation and examples
|
||||
|
||||
+ Check the [documentation](http://mgcrea.github.io/angular-motion) and [changelog](https://github.com/mgcrea/angular-motion/releases).
|
||||
|
||||
|
||||
|
||||
## Quick start
|
||||
|
||||
+ Include the required libraries (cdn/local)
|
||||
|
||||
>
|
||||
``` html
|
||||
<link rel="stylesheet" href="//rawgithub.com/mgcrea/angular-motion/master/dist/angular-motion.min.css">
|
||||
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.9/angular.min.js"></script>
|
||||
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.9/angular-animate.min.js"></script>
|
||||
```
|
||||
|
||||
+ Inject the `ngAnimate` module into your app
|
||||
|
||||
>
|
||||
``` javascript
|
||||
angular.module('myApp', ['ngAnimate']);
|
||||
```
|
||||
|
||||
|
||||
## Developers
|
||||
|
||||
Clone the repo, `git clone git://github.com/mgcrea/angular-motion.git`, [download the latest release](https://github.com/mgcrea/angular-motion/zipball/master) or install with bower `bower install angular-motion --save`.
|
||||
|
||||
AngularMotion is tested with `karma` against the latest stable release of AngularJS.
|
||||
|
||||
>
|
||||
$ npm install grunt-cli --global
|
||||
$ npm install --dev
|
||||
$ grunt test
|
||||
|
||||
You can build the latest version using `grunt`.
|
||||
|
||||
>
|
||||
$ grunt build
|
||||
|
||||
You can quickly hack around (the docs) with:
|
||||
|
||||
>
|
||||
$ grunt serve
|
||||
|
||||
|
||||
|
||||
## Contributing
|
||||
|
||||
Please submit all pull requests the against master branch. If your unit test contains JavaScript patches or features, you should include relevant unit tests. Thanks!
|
||||
|
||||
|
||||
|
||||
## Authors
|
||||
|
||||
**Olivier Louvignes**
|
||||
|
||||
+ http://olouv.com
|
||||
+ http://github.com/mgcrea
|
||||
|
||||
|
||||
|
||||
## Copyright and license
|
||||
|
||||
The MIT License
|
||||
|
||||
Copyright (c) 2012 Olivier Louvignes
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
@@ -1,38 +0,0 @@
|
||||
{
|
||||
"name": "angular-motion",
|
||||
"description": "AngularMotion - Fancy CSS3 animations for AngularJS 1.2+",
|
||||
"version": "0.3.2",
|
||||
"keywords": [
|
||||
"angular",
|
||||
"animation"
|
||||
],
|
||||
"homepage": "https://github.com/mgcrea/angular-motion",
|
||||
"bugs": "https://github.com/mgcrea/angular-motion/issues",
|
||||
"author": {
|
||||
"name": "Olivier Louvignes",
|
||||
"email": "olivier@mg-crea.com",
|
||||
"url": "https://github.com/mgcrea"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/mgcrea/angular-motion.git"
|
||||
},
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT"
|
||||
}
|
||||
],
|
||||
"main": [
|
||||
"dist/angular-motion.min.css"
|
||||
],
|
||||
"dependencies": {
|
||||
"angular": "~1.2.10",
|
||||
"angular-animate": "~1.2.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"bootstrap": ">=3.0.0",
|
||||
"angular-mocks": "~1.2.10",
|
||||
"angular-strap": "~2.0.0",
|
||||
"fastclick": "~0.6.11"
|
||||
}
|
||||
}
|
||||
@@ -1,810 +0,0 @@
|
||||
/**
|
||||
* angular-motion
|
||||
* @version v0.3.2 - 2014-02-11
|
||||
* @link https://github.com/mgcrea/angular-motion
|
||||
* @author Olivier Louvignes <olivier@mg-crea.com>
|
||||
* @license MIT License, http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
.am-fade-and-scale {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-fade-and-scale.ng-enter,
|
||||
.am-fade-and-scale.am-fade-and-scale-add,
|
||||
.am-fade-and-scale.ng-hide-remove,
|
||||
.am-fade-and-scale.ng-move {
|
||||
-webkit-animation-name: fadeAndScaleIn;
|
||||
animation-name: fadeAndScaleIn;
|
||||
}
|
||||
.am-fade-and-scale.ng-leave,
|
||||
.am-fade-and-scale.am-fade-and-scale-remove,
|
||||
.am-fade-and-scale.ng-hide {
|
||||
-webkit-animation-name: fadeAndScaleOut;
|
||||
animation-name: fadeAndScaleOut;
|
||||
}
|
||||
.am-fade-and-scale.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: fadeAndScaleIn;
|
||||
animation-name: fadeAndScaleIn;
|
||||
}
|
||||
.am-fade-and-scale.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-fade-and-scale.ng-leave {
|
||||
-webkit-animation-name: fadeAndScaleOut;
|
||||
animation-name: fadeAndScaleOut;
|
||||
}
|
||||
@-webkit-keyframes fadeAndScaleIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: scale(0.7);
|
||||
transform: scale(0.7);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndScaleIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: scale(0.7);
|
||||
transform: scale(0.7);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndScaleOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: scale(0.7);
|
||||
transform: scale(0.7);
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndScaleOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: scale(0.7);
|
||||
transform: scale(0.7);
|
||||
}
|
||||
}
|
||||
|
||||
.am-fade-and-slide-top {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-fade-and-slide-top.am-fade-and-slide-top-add,
|
||||
.am-fade-and-slide-top.ng-hide-remove,
|
||||
.am-fade-and-slide-top.ng-move {
|
||||
-webkit-animation-name: fadeAndSlideFromTop;
|
||||
animation-name: fadeAndSlideFromTop;
|
||||
}
|
||||
.am-fade-and-slide-top.am-fade-and-slide-top-remove,
|
||||
.am-fade-and-slide-top.ng-hide {
|
||||
-webkit-animation-name: fadeAndSlideToTop;
|
||||
animation-name: fadeAndSlideToTop;
|
||||
}
|
||||
.am-fade-and-slide-top.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: fadeAndSlideFromTop;
|
||||
animation-name: fadeAndSlideFromTop;
|
||||
}
|
||||
.am-fade-and-slide-top.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-fade-and-slide-top.ng-leave {
|
||||
-webkit-animation-name: fadeAndSlideToTop;
|
||||
animation-name: fadeAndSlideToTop;
|
||||
}
|
||||
.am-fade-and-slide-right {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-fade-and-slide-right.am-fade-and-slide-right-add,
|
||||
.am-fade-and-slide-right.ng-hide-remove,
|
||||
.am-fade-and-slide-right.ng-move {
|
||||
-webkit-animation-name: fadeAndSlideFromRight;
|
||||
animation-name: fadeAndSlideFromRight;
|
||||
}
|
||||
.am-fade-and-slide-right.am-fade-and-slide-right-remove,
|
||||
.am-fade-and-slide-right.ng-hide {
|
||||
-webkit-animation-name: fadeAndSlideToRight;
|
||||
animation-name: fadeAndSlideToRight;
|
||||
}
|
||||
.am-fade-and-slide-right.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: fadeAndSlideFromRight;
|
||||
animation-name: fadeAndSlideFromRight;
|
||||
}
|
||||
.am-fade-and-slide-right.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-fade-and-slide-right.ng-leave {
|
||||
-webkit-animation-name: fadeAndSlideToRight;
|
||||
animation-name: fadeAndSlideToRight;
|
||||
}
|
||||
.am-fade-and-slide-bottom {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-fade-and-slide-bottom.am-fade-and-slide-bottom-add,
|
||||
.am-fade-and-slide-bottom.ng-hide-remove,
|
||||
.am-fade-and-slide-bottom.ng-move {
|
||||
-webkit-animation-name: fadeAndSlideFromBottom;
|
||||
animation-name: fadeAndSlideFromBottom;
|
||||
}
|
||||
.am-fade-and-slide-bottom.am-fade-and-slide-bottom-remove,
|
||||
.am-fade-and-slide-bottom.ng-hide {
|
||||
-webkit-animation-name: fadeAndSlideToBottom;
|
||||
animation-name: fadeAndSlideToBottom;
|
||||
}
|
||||
.am-fade-and-slide-bottom.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: fadeAndSlideFromBottom;
|
||||
animation-name: fadeAndSlideFromBottom;
|
||||
}
|
||||
.am-fade-and-slide-bottom.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-fade-and-slide-bottom.ng-leave {
|
||||
-webkit-animation-name: fadeAndSlideToBottom;
|
||||
animation-name: fadeAndSlideToBottom;
|
||||
}
|
||||
.am-fade-and-slide-left {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-fade-and-slide-left.am-fade-and-slide-left-add,
|
||||
.am-fade-and-slide-left.ng-hide-remove,
|
||||
.am-fade-and-slide-left.ng-move {
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
-webkit-animation-name: fadeAndSlideFromLeft;
|
||||
animation-name: fadeAndSlideFromLeft;
|
||||
}
|
||||
.am-fade-and-slide-left.am-fade-and-slide-left-remove,
|
||||
.am-fade-and-slide-left.ng-hide {
|
||||
-webkit-animation-name: fadeAndSlideToLeft;
|
||||
animation-name: fadeAndSlideToLeft;
|
||||
}
|
||||
.am-fade-and-slide-left.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: fadeAndSlideFromLeft;
|
||||
animation-name: fadeAndSlideFromLeft;
|
||||
}
|
||||
.am-fade-and-slide-left.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-fade-and-slide-left.ng-leave {
|
||||
-webkit-animation-name: fadeAndSlideToLeft;
|
||||
animation-name: fadeAndSlideToLeft;
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideFromTop {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-20%);
|
||||
transform: translateY(-20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideFromTop {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-20%);
|
||||
transform: translateY(-20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideToTop {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-20%);
|
||||
transform: translateY(-20%);
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideToTop {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-20%);
|
||||
transform: translateY(-20%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideFromRight {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(20%);
|
||||
transform: translateX(20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideFromRight {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(20%);
|
||||
transform: translateX(20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideToRight {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(20%);
|
||||
transform: translateX(20%);
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideToRight {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(20%);
|
||||
transform: translateX(20%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideFromBottom {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(20%);
|
||||
transform: translateY(20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideFromBottom {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(20%);
|
||||
transform: translateY(20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideToBottom {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(20%);
|
||||
transform: translateY(20%);
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideToBottom {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(20%);
|
||||
transform: translateY(20%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideFromLeft {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(-20%);
|
||||
transform: translateX(-20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideFromLeft {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(-20%);
|
||||
transform: translateX(-20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideToLeft {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(-20%);
|
||||
transform: translateX(-20%);
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideToLeft {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(-20%);
|
||||
transform: translateX(-20%);
|
||||
}
|
||||
}
|
||||
|
||||
.am-fade {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: linear;
|
||||
animation-timing-function: linear;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
opacity: 1;
|
||||
}
|
||||
.am-fade.am-fade-add,
|
||||
.am-fade.ng-hide-remove,
|
||||
.am-fade.ng-move {
|
||||
-webkit-animation-name: fadeIn;
|
||||
animation-name: fadeIn;
|
||||
}
|
||||
.am-fade.am-fade-remove,
|
||||
.am-fade.ng-hide {
|
||||
-webkit-animation-name: fadeOut;
|
||||
animation-name: fadeOut;
|
||||
}
|
||||
.am-fade.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: fadeIn;
|
||||
animation-name: fadeIn;
|
||||
}
|
||||
.am-fade.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-fade.ng-leave {
|
||||
-webkit-animation-name: fadeOut;
|
||||
animation-name: fadeOut;
|
||||
}
|
||||
@-webkit-keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
@keyframes fadeOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
.modal-backdrop.am-fade,
|
||||
.aside-backdrop.am-fade {
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
-webkit-animation-duration: 0.15s;
|
||||
animation-duration: 0.15s;
|
||||
}
|
||||
|
||||
.am-flip-x {
|
||||
-webkit-animation-duration: 0.4s;
|
||||
animation-duration: 0.4s;
|
||||
-webkit-animation-timing-function: ease;
|
||||
animation-timing-function: ease;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-flip-x.am-flip-x-add,
|
||||
.am-flip-x.ng-hide-remove,
|
||||
.am-flip-x.ng-move {
|
||||
-webkit-animation-name: flipInXBounce;
|
||||
animation-name: flipInXBounce;
|
||||
}
|
||||
.am-flip-x.am-flip-x-remove,
|
||||
.am-flip-x.ng-hide {
|
||||
-webkit-animation-name: flipOutX;
|
||||
animation-name: flipOutX;
|
||||
}
|
||||
.am-flip-x.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: flipInXBounce;
|
||||
animation-name: flipInXBounce;
|
||||
}
|
||||
.am-flip-x.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-flip-x.ng-leave {
|
||||
-webkit-animation-name: flipOutX;
|
||||
animation-name: flipOutX;
|
||||
}
|
||||
.am-flip-x-linear {
|
||||
-webkit-animation-duration: 0.4s;
|
||||
animation-duration: 0.4s;
|
||||
-webkit-animation-timing-function: ease;
|
||||
animation-timing-function: ease;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-flip-x-linear.am-flip-x-add,
|
||||
.am-flip-x-linear.ng-hide-remove,
|
||||
.am-flip-x-linear.ng-move {
|
||||
-webkit-animation-name: flipInX;
|
||||
animation-name: flipInX;
|
||||
}
|
||||
.am-flip-x-linear.am-flip-x-remove,
|
||||
.am-flip-x-linear.ng-hide {
|
||||
-webkit-animation-name: flipOutX;
|
||||
animation-name: flipOutX;
|
||||
}
|
||||
.am-flip-x-linear.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: flipInX;
|
||||
animation-name: flipInX;
|
||||
}
|
||||
.am-flip-x-linear.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-flip-x-linear.ng-leave {
|
||||
-webkit-animation-name: flipOutX;
|
||||
animation-name: flipOutX;
|
||||
}
|
||||
@-webkit-keyframes flipInX {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: perspective(400px) rotateX(90deg);
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: perspective(400px) rotateX(0deg);
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
}
|
||||
@keyframes flipInX {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: perspective(400px) rotateX(90deg);
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: perspective(400px) rotateX(0deg);
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes flipInXBounce {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: perspective(400px) rotateX(90deg);
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
40% {
|
||||
-webkit-transform: perspective(400px) rotateX(-10deg);
|
||||
transform: perspective(400px) rotateX(-10deg);
|
||||
}
|
||||
70% {
|
||||
-webkit-transform: perspective(400px) rotateX(10deg);
|
||||
transform: perspective(400px) rotateX(10deg);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: perspective(400px) rotateX(0deg);
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
}
|
||||
@keyframes flipInXBounce {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: perspective(400px) rotateX(90deg);
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
40% {
|
||||
-webkit-transform: perspective(400px) rotateX(-10deg);
|
||||
transform: perspective(400px) rotateX(-10deg);
|
||||
}
|
||||
70% {
|
||||
-webkit-transform: perspective(400px) rotateX(10deg);
|
||||
transform: perspective(400px) rotateX(10deg);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: perspective(400px) rotateX(0deg);
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes flipOutX {
|
||||
from {
|
||||
opacity: 1;
|
||||
-webkit-transform: perspective(400px) rotateX(0deg);
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: perspective(400px) rotateX(90deg);
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
}
|
||||
@keyframes flipOutX {
|
||||
from {
|
||||
opacity: 1;
|
||||
-webkit-transform: perspective(400px) rotateX(0deg);
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: perspective(400px) rotateX(90deg);
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
}
|
||||
|
||||
.am-slide-top {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-slide-top.am-fade-and-slide-top-add,
|
||||
.am-slide-top.ng-hide-remove,
|
||||
.am-slide-top.ng-move {
|
||||
-webkit-animation-name: slideFromTop;
|
||||
animation-name: slideFromTop;
|
||||
}
|
||||
.am-slide-top.am-fade-and-slide-top-remove,
|
||||
.am-slide-top.ng-hide {
|
||||
-webkit-animation-name: slideToTop;
|
||||
animation-name: slideToTop;
|
||||
}
|
||||
.am-slide-top.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: slideFromTop;
|
||||
animation-name: slideFromTop;
|
||||
}
|
||||
.am-slide-top.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-slide-top.ng-leave {
|
||||
-webkit-animation-name: slideToTop;
|
||||
animation-name: slideToTop;
|
||||
}
|
||||
.am-slide-right {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-slide-right.am-fade-and-slide-right-add,
|
||||
.am-slide-right.ng-hide-remove,
|
||||
.am-slide-right.ng-move {
|
||||
-webkit-animation-name: slideFromRight;
|
||||
animation-name: slideFromRight;
|
||||
}
|
||||
.am-slide-right.am-fade-and-slide-right-remove,
|
||||
.am-slide-right.ng-hide {
|
||||
-webkit-animation-name: slideToRight;
|
||||
animation-name: slideToRight;
|
||||
}
|
||||
.am-slide-right.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: slideFromRight;
|
||||
animation-name: slideFromRight;
|
||||
}
|
||||
.am-slide-right.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-slide-right.ng-leave {
|
||||
-webkit-animation-name: slideToRight;
|
||||
animation-name: slideToRight;
|
||||
}
|
||||
.am-slide-bottom {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-slide-bottom.am-fade-and-slide-bottom-add,
|
||||
.am-slide-bottom.ng-hide-remove,
|
||||
.am-slide-bottom.ng-move {
|
||||
-webkit-animation-name: slideFromBottom;
|
||||
animation-name: slideFromBottom;
|
||||
}
|
||||
.am-slide-bottom.am-fade-and-slide-bottom-remove,
|
||||
.am-slide-bottom.ng-hide {
|
||||
-webkit-animation-name: slideToBottom;
|
||||
animation-name: slideToBottom;
|
||||
}
|
||||
.am-slide-bottom.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: slideFromBottom;
|
||||
animation-name: slideFromBottom;
|
||||
}
|
||||
.am-slide-bottom.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-slide-bottom.ng-leave {
|
||||
-webkit-animation-name: slideToBottom;
|
||||
animation-name: slideToBottom;
|
||||
}
|
||||
.am-slide-left {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-slide-left.am-fade-and-slide-left-add,
|
||||
.am-slide-left.ng-hide-remove,
|
||||
.am-slide-left.ng-move {
|
||||
-webkit-animation-name: slideFromLeft;
|
||||
animation-name: slideFromLeft;
|
||||
}
|
||||
.am-slide-left.am-fade-and-slide-left-remove,
|
||||
.am-slide-left.ng-hide {
|
||||
-webkit-animation-name: slideToLeft;
|
||||
animation-name: slideToLeft;
|
||||
}
|
||||
.am-slide-left.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: slideFromLeft;
|
||||
animation-name: slideFromLeft;
|
||||
}
|
||||
.am-slide-left.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-slide-left.ng-leave {
|
||||
-webkit-animation-name: slideToLeft;
|
||||
animation-name: slideToLeft;
|
||||
}
|
||||
@-webkit-keyframes slideFromTop {
|
||||
from {
|
||||
-webkit-transform: translateY(-100%);
|
||||
transform: translateY(-100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideFromTop {
|
||||
from {
|
||||
-webkit-transform: translateY(-100%);
|
||||
transform: translateY(-100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideToTop {
|
||||
to {
|
||||
-webkit-transform: translateY(-100%);
|
||||
transform: translateY(-100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideToTop {
|
||||
to {
|
||||
-webkit-transform: translateY(-100%);
|
||||
transform: translateY(-100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideFromRight {
|
||||
from {
|
||||
-webkit-transform: translateX(100%);
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideFromRight {
|
||||
from {
|
||||
-webkit-transform: translateX(100%);
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideToRight {
|
||||
to {
|
||||
-webkit-transform: translateX(100%);
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideToRight {
|
||||
to {
|
||||
-webkit-transform: translateX(100%);
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideFromBottom {
|
||||
from {
|
||||
-webkit-transform: translateY(100%);
|
||||
transform: translateY(100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideFromBottom {
|
||||
from {
|
||||
-webkit-transform: translateY(100%);
|
||||
transform: translateY(100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideToBottom {
|
||||
to {
|
||||
-webkit-transform: translateY(100%);
|
||||
transform: translateY(100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideToBottom {
|
||||
to {
|
||||
-webkit-transform: translateY(100%);
|
||||
transform: translateY(100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideFromLeft {
|
||||
from {
|
||||
-webkit-transform: translateX(-100%);
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideFromLeft {
|
||||
from {
|
||||
-webkit-transform: translateX(-100%);
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideToLeft {
|
||||
to {
|
||||
-webkit-transform: translateX(-100%);
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideToLeft {
|
||||
to {
|
||||
-webkit-transform: translateX(-100%);
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
-80
@@ -1,80 +0,0 @@
|
||||
/**
|
||||
* angular-motion
|
||||
* @version v0.3.2 - 2014-02-11
|
||||
* @link https://github.com/mgcrea/angular-motion
|
||||
* @author Olivier Louvignes <olivier@mg-crea.com>
|
||||
* @license MIT License, http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
.am-fade-and-scale {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-fade-and-scale.ng-enter,
|
||||
.am-fade-and-scale.am-fade-and-scale-add,
|
||||
.am-fade-and-scale.ng-hide-remove,
|
||||
.am-fade-and-scale.ng-move {
|
||||
-webkit-animation-name: fadeAndScaleIn;
|
||||
animation-name: fadeAndScaleIn;
|
||||
}
|
||||
.am-fade-and-scale.ng-leave,
|
||||
.am-fade-and-scale.am-fade-and-scale-remove,
|
||||
.am-fade-and-scale.ng-hide {
|
||||
-webkit-animation-name: fadeAndScaleOut;
|
||||
animation-name: fadeAndScaleOut;
|
||||
}
|
||||
.am-fade-and-scale.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: fadeAndScaleIn;
|
||||
animation-name: fadeAndScaleIn;
|
||||
}
|
||||
.am-fade-and-scale.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-fade-and-scale.ng-leave {
|
||||
-webkit-animation-name: fadeAndScaleOut;
|
||||
animation-name: fadeAndScaleOut;
|
||||
}
|
||||
@-webkit-keyframes fadeAndScaleIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: scale(0.7);
|
||||
transform: scale(0.7);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndScaleIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: scale(0.7);
|
||||
transform: scale(0.7);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndScaleOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: scale(0.7);
|
||||
transform: scale(0.7);
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndScaleOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: scale(0.7);
|
||||
transform: scale(0.7);
|
||||
}
|
||||
}
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
/**
|
||||
* angular-motion
|
||||
* @version v0.3.2 - 2014-02-11
|
||||
* @link https://github.com/mgcrea/angular-motion
|
||||
* @author Olivier Louvignes <olivier@mg-crea.com>
|
||||
* @license MIT License, http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
.am-fade-and-scale{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-fade-and-scale.ng-enter,.am-fade-and-scale.am-fade-and-scale-add,.am-fade-and-scale.ng-hide-remove,.am-fade-and-scale.ng-move{-webkit-animation-name:fadeAndScaleIn;animation-name:fadeAndScaleIn}.am-fade-and-scale.ng-leave,.am-fade-and-scale.am-fade-and-scale-remove,.am-fade-and-scale.ng-hide{-webkit-animation-name:fadeAndScaleOut;animation-name:fadeAndScaleOut}.am-fade-and-scale.ng-enter{visibility:hidden;-webkit-animation-name:fadeAndScaleIn;animation-name:fadeAndScaleIn}.am-fade-and-scale.ng-enter.ng-enter-active{visibility:visible}.am-fade-and-scale.ng-leave{-webkit-animation-name:fadeAndScaleOut;animation-name:fadeAndScaleOut}@-webkit-keyframes fadeAndScaleIn{from{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}to{opacity:1}}@keyframes fadeAndScaleIn{from{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}to{opacity:1}}@-webkit-keyframes fadeAndScaleOut{from{opacity:1}to{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}}@keyframes fadeAndScaleOut{from{opacity:1}to{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}}
|
||||
-293
@@ -1,293 +0,0 @@
|
||||
/**
|
||||
* angular-motion
|
||||
* @version v0.3.2 - 2014-02-11
|
||||
* @link https://github.com/mgcrea/angular-motion
|
||||
* @author Olivier Louvignes <olivier@mg-crea.com>
|
||||
* @license MIT License, http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
.am-fade-and-slide-top {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-fade-and-slide-top.am-fade-and-slide-top-add,
|
||||
.am-fade-and-slide-top.ng-hide-remove,
|
||||
.am-fade-and-slide-top.ng-move {
|
||||
-webkit-animation-name: fadeAndSlideFromTop;
|
||||
animation-name: fadeAndSlideFromTop;
|
||||
}
|
||||
.am-fade-and-slide-top.am-fade-and-slide-top-remove,
|
||||
.am-fade-and-slide-top.ng-hide {
|
||||
-webkit-animation-name: fadeAndSlideToTop;
|
||||
animation-name: fadeAndSlideToTop;
|
||||
}
|
||||
.am-fade-and-slide-top.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: fadeAndSlideFromTop;
|
||||
animation-name: fadeAndSlideFromTop;
|
||||
}
|
||||
.am-fade-and-slide-top.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-fade-and-slide-top.ng-leave {
|
||||
-webkit-animation-name: fadeAndSlideToTop;
|
||||
animation-name: fadeAndSlideToTop;
|
||||
}
|
||||
.am-fade-and-slide-right {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-fade-and-slide-right.am-fade-and-slide-right-add,
|
||||
.am-fade-and-slide-right.ng-hide-remove,
|
||||
.am-fade-and-slide-right.ng-move {
|
||||
-webkit-animation-name: fadeAndSlideFromRight;
|
||||
animation-name: fadeAndSlideFromRight;
|
||||
}
|
||||
.am-fade-and-slide-right.am-fade-and-slide-right-remove,
|
||||
.am-fade-and-slide-right.ng-hide {
|
||||
-webkit-animation-name: fadeAndSlideToRight;
|
||||
animation-name: fadeAndSlideToRight;
|
||||
}
|
||||
.am-fade-and-slide-right.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: fadeAndSlideFromRight;
|
||||
animation-name: fadeAndSlideFromRight;
|
||||
}
|
||||
.am-fade-and-slide-right.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-fade-and-slide-right.ng-leave {
|
||||
-webkit-animation-name: fadeAndSlideToRight;
|
||||
animation-name: fadeAndSlideToRight;
|
||||
}
|
||||
.am-fade-and-slide-bottom {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-fade-and-slide-bottom.am-fade-and-slide-bottom-add,
|
||||
.am-fade-and-slide-bottom.ng-hide-remove,
|
||||
.am-fade-and-slide-bottom.ng-move {
|
||||
-webkit-animation-name: fadeAndSlideFromBottom;
|
||||
animation-name: fadeAndSlideFromBottom;
|
||||
}
|
||||
.am-fade-and-slide-bottom.am-fade-and-slide-bottom-remove,
|
||||
.am-fade-and-slide-bottom.ng-hide {
|
||||
-webkit-animation-name: fadeAndSlideToBottom;
|
||||
animation-name: fadeAndSlideToBottom;
|
||||
}
|
||||
.am-fade-and-slide-bottom.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: fadeAndSlideFromBottom;
|
||||
animation-name: fadeAndSlideFromBottom;
|
||||
}
|
||||
.am-fade-and-slide-bottom.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-fade-and-slide-bottom.ng-leave {
|
||||
-webkit-animation-name: fadeAndSlideToBottom;
|
||||
animation-name: fadeAndSlideToBottom;
|
||||
}
|
||||
.am-fade-and-slide-left {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-fade-and-slide-left.am-fade-and-slide-left-add,
|
||||
.am-fade-and-slide-left.ng-hide-remove,
|
||||
.am-fade-and-slide-left.ng-move {
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
-webkit-animation-name: fadeAndSlideFromLeft;
|
||||
animation-name: fadeAndSlideFromLeft;
|
||||
}
|
||||
.am-fade-and-slide-left.am-fade-and-slide-left-remove,
|
||||
.am-fade-and-slide-left.ng-hide {
|
||||
-webkit-animation-name: fadeAndSlideToLeft;
|
||||
animation-name: fadeAndSlideToLeft;
|
||||
}
|
||||
.am-fade-and-slide-left.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: fadeAndSlideFromLeft;
|
||||
animation-name: fadeAndSlideFromLeft;
|
||||
}
|
||||
.am-fade-and-slide-left.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-fade-and-slide-left.ng-leave {
|
||||
-webkit-animation-name: fadeAndSlideToLeft;
|
||||
animation-name: fadeAndSlideToLeft;
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideFromTop {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-20%);
|
||||
transform: translateY(-20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideFromTop {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-20%);
|
||||
transform: translateY(-20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideToTop {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-20%);
|
||||
transform: translateY(-20%);
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideToTop {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-20%);
|
||||
transform: translateY(-20%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideFromRight {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(20%);
|
||||
transform: translateX(20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideFromRight {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(20%);
|
||||
transform: translateX(20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideToRight {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(20%);
|
||||
transform: translateX(20%);
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideToRight {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(20%);
|
||||
transform: translateX(20%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideFromBottom {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(20%);
|
||||
transform: translateY(20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideFromBottom {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(20%);
|
||||
transform: translateY(20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideToBottom {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(20%);
|
||||
transform: translateY(20%);
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideToBottom {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(20%);
|
||||
transform: translateY(20%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideFromLeft {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(-20%);
|
||||
transform: translateX(-20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideFromLeft {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(-20%);
|
||||
transform: translateX(-20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeAndSlideToLeft {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(-20%);
|
||||
transform: translateX(-20%);
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideToLeft {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateX(-20%);
|
||||
transform: translateX(-20%);
|
||||
}
|
||||
}
|
||||
-8
File diff suppressed because one or more lines are too long
@@ -1,77 +0,0 @@
|
||||
/**
|
||||
* angular-motion
|
||||
* @version v0.3.2 - 2014-02-11
|
||||
* @link https://github.com/mgcrea/angular-motion
|
||||
* @author Olivier Louvignes <olivier@mg-crea.com>
|
||||
* @license MIT License, http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
.am-fade {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: linear;
|
||||
animation-timing-function: linear;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
opacity: 1;
|
||||
}
|
||||
.am-fade.am-fade-add,
|
||||
.am-fade.ng-hide-remove,
|
||||
.am-fade.ng-move {
|
||||
-webkit-animation-name: fadeIn;
|
||||
animation-name: fadeIn;
|
||||
}
|
||||
.am-fade.am-fade-remove,
|
||||
.am-fade.ng-hide {
|
||||
-webkit-animation-name: fadeOut;
|
||||
animation-name: fadeOut;
|
||||
}
|
||||
.am-fade.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: fadeIn;
|
||||
animation-name: fadeIn;
|
||||
}
|
||||
.am-fade.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-fade.ng-leave {
|
||||
-webkit-animation-name: fadeOut;
|
||||
animation-name: fadeOut;
|
||||
}
|
||||
@-webkit-keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fadeOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
@keyframes fadeOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
.modal-backdrop.am-fade,
|
||||
.aside-backdrop.am-fade {
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
-webkit-animation-duration: 0.15s;
|
||||
animation-duration: 0.15s;
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
/**
|
||||
* angular-motion
|
||||
* @version v0.3.2 - 2014-02-11
|
||||
* @link https://github.com/mgcrea/angular-motion
|
||||
* @author Olivier Louvignes <olivier@mg-crea.com>
|
||||
* @license MIT License, http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
.am-fade{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards;opacity:1}.am-fade.am-fade-add,.am-fade.ng-hide-remove,.am-fade.ng-move{-webkit-animation-name:fadeIn;animation-name:fadeIn}.am-fade.am-fade-remove,.am-fade.ng-hide{-webkit-animation-name:fadeOut;animation-name:fadeOut}.am-fade.ng-enter{visibility:hidden;-webkit-animation-name:fadeIn;animation-name:fadeIn}.am-fade.ng-enter.ng-enter-active{visibility:visible}.am-fade.ng-leave{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeOut{from{opacity:1}to{opacity:0}}@keyframes fadeOut{from{opacity:1}to{opacity:0}}.modal-backdrop.am-fade,.aside-backdrop.am-fade{background:rgba(0,0,0,.5);-webkit-animation-duration:.15s;animation-duration:.15s}
|
||||
@@ -1,157 +0,0 @@
|
||||
/**
|
||||
* angular-motion
|
||||
* @version v0.3.2 - 2014-02-11
|
||||
* @link https://github.com/mgcrea/angular-motion
|
||||
* @author Olivier Louvignes <olivier@mg-crea.com>
|
||||
* @license MIT License, http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
.am-flip-x {
|
||||
-webkit-animation-duration: 0.4s;
|
||||
animation-duration: 0.4s;
|
||||
-webkit-animation-timing-function: ease;
|
||||
animation-timing-function: ease;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-flip-x.am-flip-x-add,
|
||||
.am-flip-x.ng-hide-remove,
|
||||
.am-flip-x.ng-move {
|
||||
-webkit-animation-name: flipInXBounce;
|
||||
animation-name: flipInXBounce;
|
||||
}
|
||||
.am-flip-x.am-flip-x-remove,
|
||||
.am-flip-x.ng-hide {
|
||||
-webkit-animation-name: flipOutX;
|
||||
animation-name: flipOutX;
|
||||
}
|
||||
.am-flip-x.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: flipInXBounce;
|
||||
animation-name: flipInXBounce;
|
||||
}
|
||||
.am-flip-x.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-flip-x.ng-leave {
|
||||
-webkit-animation-name: flipOutX;
|
||||
animation-name: flipOutX;
|
||||
}
|
||||
.am-flip-x-linear {
|
||||
-webkit-animation-duration: 0.4s;
|
||||
animation-duration: 0.4s;
|
||||
-webkit-animation-timing-function: ease;
|
||||
animation-timing-function: ease;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-flip-x-linear.am-flip-x-add,
|
||||
.am-flip-x-linear.ng-hide-remove,
|
||||
.am-flip-x-linear.ng-move {
|
||||
-webkit-animation-name: flipInX;
|
||||
animation-name: flipInX;
|
||||
}
|
||||
.am-flip-x-linear.am-flip-x-remove,
|
||||
.am-flip-x-linear.ng-hide {
|
||||
-webkit-animation-name: flipOutX;
|
||||
animation-name: flipOutX;
|
||||
}
|
||||
.am-flip-x-linear.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: flipInX;
|
||||
animation-name: flipInX;
|
||||
}
|
||||
.am-flip-x-linear.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-flip-x-linear.ng-leave {
|
||||
-webkit-animation-name: flipOutX;
|
||||
animation-name: flipOutX;
|
||||
}
|
||||
@-webkit-keyframes flipInX {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: perspective(400px) rotateX(90deg);
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: perspective(400px) rotateX(0deg);
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
}
|
||||
@keyframes flipInX {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: perspective(400px) rotateX(90deg);
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: perspective(400px) rotateX(0deg);
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes flipInXBounce {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: perspective(400px) rotateX(90deg);
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
40% {
|
||||
-webkit-transform: perspective(400px) rotateX(-10deg);
|
||||
transform: perspective(400px) rotateX(-10deg);
|
||||
}
|
||||
70% {
|
||||
-webkit-transform: perspective(400px) rotateX(10deg);
|
||||
transform: perspective(400px) rotateX(10deg);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: perspective(400px) rotateX(0deg);
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
}
|
||||
@keyframes flipInXBounce {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: perspective(400px) rotateX(90deg);
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
40% {
|
||||
-webkit-transform: perspective(400px) rotateX(-10deg);
|
||||
transform: perspective(400px) rotateX(-10deg);
|
||||
}
|
||||
70% {
|
||||
-webkit-transform: perspective(400px) rotateX(10deg);
|
||||
transform: perspective(400px) rotateX(10deg);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: perspective(400px) rotateX(0deg);
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes flipOutX {
|
||||
from {
|
||||
opacity: 1;
|
||||
-webkit-transform: perspective(400px) rotateX(0deg);
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: perspective(400px) rotateX(90deg);
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
}
|
||||
@keyframes flipOutX {
|
||||
from {
|
||||
opacity: 1;
|
||||
-webkit-transform: perspective(400px) rotateX(0deg);
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: perspective(400px) rotateX(90deg);
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
/**
|
||||
* angular-motion
|
||||
* @version v0.3.2 - 2014-02-11
|
||||
* @link https://github.com/mgcrea/angular-motion
|
||||
* @author Olivier Louvignes <olivier@mg-crea.com>
|
||||
* @license MIT License, http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
.am-flip-x{-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-flip-x.am-flip-x-add,.am-flip-x.ng-hide-remove,.am-flip-x.ng-move{-webkit-animation-name:flipInXBounce;animation-name:flipInXBounce}.am-flip-x.am-flip-x-remove,.am-flip-x.ng-hide{-webkit-animation-name:flipOutX;animation-name:flipOutX}.am-flip-x.ng-enter{visibility:hidden;-webkit-animation-name:flipInXBounce;animation-name:flipInXBounce}.am-flip-x.ng-enter.ng-enter-active{visibility:visible}.am-flip-x.ng-leave{-webkit-animation-name:flipOutX;animation-name:flipOutX}.am-flip-x-linear{-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-flip-x-linear.am-flip-x-add,.am-flip-x-linear.ng-hide-remove,.am-flip-x-linear.ng-move{-webkit-animation-name:flipInX;animation-name:flipInX}.am-flip-x-linear.am-flip-x-remove,.am-flip-x-linear.ng-hide{-webkit-animation-name:flipOutX;animation-name:flipOutX}.am-flip-x-linear.ng-enter{visibility:hidden;-webkit-animation-name:flipInX;animation-name:flipInX}.am-flip-x-linear.ng-enter.ng-enter-active{visibility:visible}.am-flip-x-linear.ng-leave{-webkit-animation-name:flipOutX;animation-name:flipOutX}@-webkit-keyframes flipInX{from{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}to{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}}@keyframes flipInX{from{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}to{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}}@-webkit-keyframes flipInXBounce{from{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}40%{-webkit-transform:perspective(400px) rotateX(-10deg);transform:perspective(400px) rotateX(-10deg)}70%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)}to{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}}@keyframes flipInXBounce{from{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}40%{-webkit-transform:perspective(400px) rotateX(-10deg);transform:perspective(400px) rotateX(-10deg)}70%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)}to{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}}@-webkit-keyframes flipOutX{from{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}to{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}}@keyframes flipOutX{from{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}to{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}}
|
||||
@@ -1,227 +0,0 @@
|
||||
/**
|
||||
* angular-motion
|
||||
* @version v0.3.2 - 2014-02-11
|
||||
* @link https://github.com/mgcrea/angular-motion
|
||||
* @author Olivier Louvignes <olivier@mg-crea.com>
|
||||
* @license MIT License, http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
.am-slide-top {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-slide-top.am-fade-and-slide-top-add,
|
||||
.am-slide-top.ng-hide-remove,
|
||||
.am-slide-top.ng-move {
|
||||
-webkit-animation-name: slideFromTop;
|
||||
animation-name: slideFromTop;
|
||||
}
|
||||
.am-slide-top.am-fade-and-slide-top-remove,
|
||||
.am-slide-top.ng-hide {
|
||||
-webkit-animation-name: slideToTop;
|
||||
animation-name: slideToTop;
|
||||
}
|
||||
.am-slide-top.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: slideFromTop;
|
||||
animation-name: slideFromTop;
|
||||
}
|
||||
.am-slide-top.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-slide-top.ng-leave {
|
||||
-webkit-animation-name: slideToTop;
|
||||
animation-name: slideToTop;
|
||||
}
|
||||
.am-slide-right {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-slide-right.am-fade-and-slide-right-add,
|
||||
.am-slide-right.ng-hide-remove,
|
||||
.am-slide-right.ng-move {
|
||||
-webkit-animation-name: slideFromRight;
|
||||
animation-name: slideFromRight;
|
||||
}
|
||||
.am-slide-right.am-fade-and-slide-right-remove,
|
||||
.am-slide-right.ng-hide {
|
||||
-webkit-animation-name: slideToRight;
|
||||
animation-name: slideToRight;
|
||||
}
|
||||
.am-slide-right.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: slideFromRight;
|
||||
animation-name: slideFromRight;
|
||||
}
|
||||
.am-slide-right.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-slide-right.ng-leave {
|
||||
-webkit-animation-name: slideToRight;
|
||||
animation-name: slideToRight;
|
||||
}
|
||||
.am-slide-bottom {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-slide-bottom.am-fade-and-slide-bottom-add,
|
||||
.am-slide-bottom.ng-hide-remove,
|
||||
.am-slide-bottom.ng-move {
|
||||
-webkit-animation-name: slideFromBottom;
|
||||
animation-name: slideFromBottom;
|
||||
}
|
||||
.am-slide-bottom.am-fade-and-slide-bottom-remove,
|
||||
.am-slide-bottom.ng-hide {
|
||||
-webkit-animation-name: slideToBottom;
|
||||
animation-name: slideToBottom;
|
||||
}
|
||||
.am-slide-bottom.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: slideFromBottom;
|
||||
animation-name: slideFromBottom;
|
||||
}
|
||||
.am-slide-bottom.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-slide-bottom.ng-leave {
|
||||
-webkit-animation-name: slideToBottom;
|
||||
animation-name: slideToBottom;
|
||||
}
|
||||
.am-slide-left {
|
||||
-webkit-animation-duration: 0.3s;
|
||||
animation-duration: 0.3s;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out;
|
||||
-webkit-animation-fill-mode: backwards;
|
||||
animation-fill-mode: backwards;
|
||||
}
|
||||
.am-slide-left.am-fade-and-slide-left-add,
|
||||
.am-slide-left.ng-hide-remove,
|
||||
.am-slide-left.ng-move {
|
||||
-webkit-animation-name: slideFromLeft;
|
||||
animation-name: slideFromLeft;
|
||||
}
|
||||
.am-slide-left.am-fade-and-slide-left-remove,
|
||||
.am-slide-left.ng-hide {
|
||||
-webkit-animation-name: slideToLeft;
|
||||
animation-name: slideToLeft;
|
||||
}
|
||||
.am-slide-left.ng-enter {
|
||||
visibility: hidden;
|
||||
-webkit-animation-name: slideFromLeft;
|
||||
animation-name: slideFromLeft;
|
||||
}
|
||||
.am-slide-left.ng-enter.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
.am-slide-left.ng-leave {
|
||||
-webkit-animation-name: slideToLeft;
|
||||
animation-name: slideToLeft;
|
||||
}
|
||||
@-webkit-keyframes slideFromTop {
|
||||
from {
|
||||
-webkit-transform: translateY(-100%);
|
||||
transform: translateY(-100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideFromTop {
|
||||
from {
|
||||
-webkit-transform: translateY(-100%);
|
||||
transform: translateY(-100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideToTop {
|
||||
to {
|
||||
-webkit-transform: translateY(-100%);
|
||||
transform: translateY(-100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideToTop {
|
||||
to {
|
||||
-webkit-transform: translateY(-100%);
|
||||
transform: translateY(-100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideFromRight {
|
||||
from {
|
||||
-webkit-transform: translateX(100%);
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideFromRight {
|
||||
from {
|
||||
-webkit-transform: translateX(100%);
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideToRight {
|
||||
to {
|
||||
-webkit-transform: translateX(100%);
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideToRight {
|
||||
to {
|
||||
-webkit-transform: translateX(100%);
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideFromBottom {
|
||||
from {
|
||||
-webkit-transform: translateY(100%);
|
||||
transform: translateY(100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideFromBottom {
|
||||
from {
|
||||
-webkit-transform: translateY(100%);
|
||||
transform: translateY(100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideToBottom {
|
||||
to {
|
||||
-webkit-transform: translateY(100%);
|
||||
transform: translateY(100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideToBottom {
|
||||
to {
|
||||
-webkit-transform: translateY(100%);
|
||||
transform: translateY(100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideFromLeft {
|
||||
from {
|
||||
-webkit-transform: translateX(-100%);
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideFromLeft {
|
||||
from {
|
||||
-webkit-transform: translateX(-100%);
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes slideToLeft {
|
||||
to {
|
||||
-webkit-transform: translateX(-100%);
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideToLeft {
|
||||
to {
|
||||
-webkit-transform: translateX(-100%);
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
/**
|
||||
* angular-motion
|
||||
* @version v0.3.2 - 2014-02-11
|
||||
* @link https://github.com/mgcrea/angular-motion
|
||||
* @author Olivier Louvignes <olivier@mg-crea.com>
|
||||
* @license MIT License, http://www.opensource.org/licenses/MIT
|
||||
*/
|
||||
.am-slide-top{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-slide-top.am-fade-and-slide-top-add,.am-slide-top.ng-hide-remove,.am-slide-top.ng-move{-webkit-animation-name:slideFromTop;animation-name:slideFromTop}.am-slide-top.am-fade-and-slide-top-remove,.am-slide-top.ng-hide{-webkit-animation-name:slideToTop;animation-name:slideToTop}.am-slide-top.ng-enter{visibility:hidden;-webkit-animation-name:slideFromTop;animation-name:slideFromTop}.am-slide-top.ng-enter.ng-enter-active{visibility:visible}.am-slide-top.ng-leave{-webkit-animation-name:slideToTop;animation-name:slideToTop}.am-slide-right{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-slide-right.am-fade-and-slide-right-add,.am-slide-right.ng-hide-remove,.am-slide-right.ng-move{-webkit-animation-name:slideFromRight;animation-name:slideFromRight}.am-slide-right.am-fade-and-slide-right-remove,.am-slide-right.ng-hide{-webkit-animation-name:slideToRight;animation-name:slideToRight}.am-slide-right.ng-enter{visibility:hidden;-webkit-animation-name:slideFromRight;animation-name:slideFromRight}.am-slide-right.ng-enter.ng-enter-active{visibility:visible}.am-slide-right.ng-leave{-webkit-animation-name:slideToRight;animation-name:slideToRight}.am-slide-bottom{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-slide-bottom.am-fade-and-slide-bottom-add,.am-slide-bottom.ng-hide-remove,.am-slide-bottom.ng-move{-webkit-animation-name:slideFromBottom;animation-name:slideFromBottom}.am-slide-bottom.am-fade-and-slide-bottom-remove,.am-slide-bottom.ng-hide{-webkit-animation-name:slideToBottom;animation-name:slideToBottom}.am-slide-bottom.ng-enter{visibility:hidden;-webkit-animation-name:slideFromBottom;animation-name:slideFromBottom}.am-slide-bottom.ng-enter.ng-enter-active{visibility:visible}.am-slide-bottom.ng-leave{-webkit-animation-name:slideToBottom;animation-name:slideToBottom}.am-slide-left{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-slide-left.am-fade-and-slide-left-add,.am-slide-left.ng-hide-remove,.am-slide-left.ng-move{-webkit-animation-name:slideFromLeft;animation-name:slideFromLeft}.am-slide-left.am-fade-and-slide-left-remove,.am-slide-left.ng-hide{-webkit-animation-name:slideToLeft;animation-name:slideToLeft}.am-slide-left.ng-enter{visibility:hidden;-webkit-animation-name:slideFromLeft;animation-name:slideFromLeft}.am-slide-left.ng-enter.ng-enter-active{visibility:visible}.am-slide-left.ng-leave{-webkit-animation-name:slideToLeft;animation-name:slideToLeft}@-webkit-keyframes slideFromTop{from{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideFromTop{from{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes slideToTop{to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideToTop{to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes slideFromRight{from{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideFromRight{from{-webkit-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes slideToRight{to{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideToRight{to{-webkit-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes slideFromBottom{from{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideFromBottom{from{-webkit-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes slideToBottom{to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideToBottom{to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes slideFromLeft{from{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideFromLeft{from{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes slideToLeft{to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideToLeft{to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}
|
||||
@@ -1,57 +0,0 @@
|
||||
{
|
||||
"name": "angular-motion",
|
||||
"description": "AngularMotion - Fancy CSS3 animations for AngularJS 1.2+",
|
||||
"version": "0.3.2",
|
||||
"keywords": [
|
||||
"angular",
|
||||
"animation"
|
||||
],
|
||||
"homepage": "https://github.com/mgcrea/angular-motion",
|
||||
"bugs": "https://github.com/mgcrea/angular-motion/issues",
|
||||
"author": {
|
||||
"name": "Olivier Louvignes",
|
||||
"email": "olivier@mg-crea.com",
|
||||
"url": "https://github.com/mgcrea"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/mgcrea/angular-motion.git"
|
||||
},
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT"
|
||||
}
|
||||
],
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"grunt": "~0.4.2",
|
||||
"grunt-angular-templates": "~0.5.1",
|
||||
"grunt-autoprefixer": "~0.6.5",
|
||||
"grunt-concurrent": "~0.4.3",
|
||||
"grunt-contrib-clean": "~0.5.0",
|
||||
"grunt-contrib-concat": "~0.3.0",
|
||||
"grunt-contrib-connect": "~0.6.0",
|
||||
"grunt-contrib-copy": "~0.5.0",
|
||||
"grunt-contrib-cssmin": "~0.7.0",
|
||||
"grunt-contrib-htmlmin": "~0.2.0",
|
||||
"grunt-contrib-jshint": "~0.8.0",
|
||||
"grunt-contrib-less": "~0.9.0",
|
||||
"grunt-contrib-uglify": "~0.3.2",
|
||||
"grunt-contrib-watch": "~0.5.3",
|
||||
"grunt-karma": "~0.6.2",
|
||||
"grunt-newer": "~0.6.1",
|
||||
"grunt-nginclude": "~0.3.1",
|
||||
"grunt-ngmin": "0.0.3",
|
||||
"grunt-rev": "~0.1.0",
|
||||
"grunt-usemin": "~2.0.2",
|
||||
"jshint-stylish": "~0.1.5",
|
||||
"karma-coverage": "~0.1.5",
|
||||
"load-grunt-tasks": "~0.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "grunt test"
|
||||
}
|
||||
}
|
||||
-29
@@ -1,29 +0,0 @@
|
||||
<div class="bs-docs-section">
|
||||
|
||||
<div class="page-header">
|
||||
<h1 id="fade-and-scale">FadeAndScale <a class="small" href="//github.com/mgcrea/angular-strap/blob/master/src/fade-and-scale/fade-and-scale.less" target="_blank">fade-and-scale.less</a></h1>
|
||||
<code>mgcrea.ngMotion.fade-and-scale</code>
|
||||
</div>
|
||||
|
||||
<p>Fancy scale animation that leverages <code>CSS3 keyframes</code>, see <a href="http://caniuse.com/#search=keyframes" target="_blank">browser support</a>.</p>
|
||||
<p>This animation works with <code>scale, opacity</code> animating respectively from <code>.7 to 1, 0 to 1</code>.</p>
|
||||
|
||||
<h3 id="fade-and-scale-examples">Live demo <a class="small edit-plunkr" data-module-name="mgcrea.ngStrapDocs" data-content-html-url="aside/docs/aside.demo.html" data-content-js-url="aside/docs/aside.demo.js" ng-plunkr data-title="edit in plunker" data-placement="right" bs-tooltip></a></h3>
|
||||
<!-- <pre class="bs-example-scope">$scope.aside = {{aside | json}};</pre> -->
|
||||
<div class="bs-example" append-source>
|
||||
|
||||
<h5>fade-and-scale</h5>
|
||||
|
||||
<button type="button" class="btn btn-danger" data-animation="am-fade-and-scale" data-placement="center" bs-modal="modal">modal from center<br><small>(am-fade-and-scale)</small></button>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<h2 id="fade-and-scale-usage">Usage</h2>
|
||||
<p>Append one of theses classes <code>am-fade-and-scale</code> to enable theses transitions.</p>
|
||||
<div class="callout callout-info">
|
||||
<h4>AngularStrap integration</h4>
|
||||
<p>You should use the <code>data-animation</code> attribute with AngularStrap.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1,56 +0,0 @@
|
||||
|
||||
// Fade & Slide
|
||||
//
|
||||
|
||||
@fade-and-scale-duration: .3s;
|
||||
@fade-and-scale-timing-function: ease-in-out;
|
||||
|
||||
.am-fade-and-scale {
|
||||
|
||||
animation-duration: @fade-and-scale-duration;
|
||||
animation-timing-function: @fade-and-scale-timing-function;
|
||||
animation-fill-mode: backwards;
|
||||
|
||||
&.ng-enter, &.am-fade-and-scale-add, &.ng-hide-remove, &.ng-move {
|
||||
animation-name: fadeAndScaleIn;
|
||||
}
|
||||
&.ng-leave, &.am-fade-and-scale-remove, &.ng-hide {
|
||||
animation-name: fadeAndScaleOut;
|
||||
}
|
||||
|
||||
&.ng-enter {
|
||||
visibility: hidden;
|
||||
animation-name: fadeAndScaleIn;
|
||||
&.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
&.ng-leave {
|
||||
animation-name: fadeAndScaleOut;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Keyframes
|
||||
//
|
||||
|
||||
@keyframes fadeAndScaleIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: scale(0.7);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeAndScaleOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
transform: scale(0.7);
|
||||
}
|
||||
}
|
||||
-35
@@ -1,35 +0,0 @@
|
||||
<div class="bs-docs-section">
|
||||
|
||||
<div class="page-header">
|
||||
<h1 id="fade-and-slide">FadeAndSlide <a class="small" href="//github.com/mgcrea/angular-strap/blob/master/src/fade-and-slide/fade-and-slide.less" target="_blank">fade-and-slide.less</a></h1>
|
||||
<code>mgcrea.ngMotion.fade-and-slide</code>
|
||||
</div>
|
||||
|
||||
<p>Fancy slide animation that leverages <code>CSS3 keyframes</code>, see <a href="http://caniuse.com/#search=keyframes" target="_blank">browser support</a>.</p>
|
||||
<p>This animation works with <code>translateX/Y, opacity</code> animating respectively from <code>0% to 20%, 0 to 1</code>.</p>
|
||||
|
||||
<h3 id="fade-and-slide-examples">Live demo <a class="small edit-plunkr" data-module-name="mgcrea.ngStrapDocs" data-content-html-url="aside/docs/aside.demo.html" data-content-js-url="aside/docs/aside.demo.js" ng-plunkr data-title="edit in plunker" data-placement="right" bs-tooltip></a></h3>
|
||||
<!-- <pre class="bs-example-scope">$scope.aside = {{aside | json}};</pre> -->
|
||||
<div class="bs-example" append-source>
|
||||
|
||||
<h5>fade-and-slide</h5>
|
||||
|
||||
<button type="button" class="btn btn-primary" data-animation="am-fade-and-slide-left" data-placement="left" bs-aside="aside">aside from left<br><small>(am-fade-and-slide-left)</small></button>
|
||||
|
||||
<button type="button" class="btn btn-success" data-animation="am-fade-and-slide-right" data-placement="right" bs-aside="aside">aside from right<br><small>(am-fade-and-slide-right)</small></button><br><br>
|
||||
|
||||
<button type="button" class="btn btn-primary" data-animation="am-fade-and-slide-top" bs-modal="modal">modal from top<br><small>(am-fade-and-slide-top)</small></button>
|
||||
|
||||
<button type="button" class="btn btn-success" data-animation="am-fade-and-slide-bottom" data-placement="center" bs-modal="modal">modal from bottom<br><small>(am-fade-and-slide-bottom)</small></button>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<h2 id="fade-and-slide-usage">Usage</h2>
|
||||
<p>Append one of theses classes <code>am-fade-and-slide-top</code>, <code>am-fade-and-slide-right</code>, <code>am-fade-and-slide-bottom</code>, <code>am-fade-and-slide-left</code> to enable theses transitions.</p>
|
||||
<div class="callout callout-info">
|
||||
<h4>AngularStrap integration</h4>
|
||||
<p>You should use the <code>data-animation</code> attribute with AngularStrap.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1,194 +0,0 @@
|
||||
|
||||
// Fade & Slide
|
||||
//
|
||||
|
||||
@fade-and-slide-duration: .3s;
|
||||
@fade-and-slide-timing-function: ease-in-out;
|
||||
|
||||
.am-fade-and-slide-top {
|
||||
|
||||
animation-duration: @fade-and-slide-duration;
|
||||
animation-timing-function: @fade-and-slide-timing-function;
|
||||
animation-fill-mode: backwards;
|
||||
|
||||
&.am-fade-and-slide-top-add, &.ng-hide-remove, &.ng-move {
|
||||
animation-name: fadeAndSlideFromTop;
|
||||
}
|
||||
&.am-fade-and-slide-top-remove, &.ng-hide {
|
||||
animation-name: fadeAndSlideToTop;
|
||||
}
|
||||
|
||||
&.ng-enter {
|
||||
visibility: hidden;
|
||||
animation-name: fadeAndSlideFromTop;
|
||||
&.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
&.ng-leave {
|
||||
animation-name: fadeAndSlideToTop;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.am-fade-and-slide-right {
|
||||
|
||||
animation-duration: @fade-and-slide-duration;
|
||||
animation-timing-function: @fade-and-slide-timing-function;
|
||||
animation-fill-mode: backwards;
|
||||
|
||||
&.am-fade-and-slide-right-add, &.ng-hide-remove, &.ng-move {
|
||||
animation-name: fadeAndSlideFromRight;
|
||||
}
|
||||
&.am-fade-and-slide-right-remove, &.ng-hide {
|
||||
animation-name: fadeAndSlideToRight;
|
||||
}
|
||||
|
||||
&.ng-enter {
|
||||
visibility: hidden;
|
||||
animation-name: fadeAndSlideFromRight;
|
||||
&.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
&.ng-leave {
|
||||
animation-name: fadeAndSlideToRight;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.am-fade-and-slide-bottom {
|
||||
|
||||
animation-duration: @fade-and-slide-duration;
|
||||
animation-timing-function: @fade-and-slide-timing-function;
|
||||
animation-fill-mode: backwards;
|
||||
|
||||
&.am-fade-and-slide-bottom-add, &.ng-hide-remove, &.ng-move {
|
||||
animation-name: fadeAndSlideFromBottom;
|
||||
}
|
||||
&.am-fade-and-slide-bottom-remove, &.ng-hide {
|
||||
animation-name: fadeAndSlideToBottom;
|
||||
}
|
||||
|
||||
&.ng-enter {
|
||||
visibility: hidden;
|
||||
animation-name: fadeAndSlideFromBottom;
|
||||
&.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
&.ng-leave {
|
||||
animation-name: fadeAndSlideToBottom;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.am-fade-and-slide-left {
|
||||
|
||||
animation-duration: @fade-and-slide-duration;
|
||||
animation-timing-function: @fade-and-slide-timing-function;
|
||||
animation-fill-mode: backwards;
|
||||
|
||||
&.am-fade-and-slide-left-add, &.ng-hide-remove, &.ng-move {
|
||||
animation-fill-mode: backwards;
|
||||
animation-name: fadeAndSlideFromLeft;
|
||||
}
|
||||
&.am-fade-and-slide-left-remove, &.ng-hide {
|
||||
animation-name: fadeAndSlideToLeft;
|
||||
}
|
||||
|
||||
&.ng-enter {
|
||||
visibility: hidden;
|
||||
animation-name: fadeAndSlideFromLeft;
|
||||
&.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
&.ng-leave {
|
||||
animation-name: fadeAndSlideToLeft;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Keyframes
|
||||
//
|
||||
|
||||
@keyframes fadeAndSlideFromTop {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(-20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeAndSlideToTop {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
transform: translateY(-20%);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeAndSlideFromRight {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fadeAndSlideToRight {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
transform: translateX(20%);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeAndSlideFromBottom {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeAndSlideToBottom {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
transform: translateY(20%);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeAndSlideFromLeft {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(-20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeAndSlideToLeft {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
transform: translateX(-20%);
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
<div class="bs-docs-section">
|
||||
|
||||
<div class="page-header">
|
||||
<h1 id="fade">Fade <a class="small" href="//github.com/mgcrea/angular-strap/blob/master/src/fade/fade.less" target="_blank">fade.less</a></h1>
|
||||
<code>mgcrea.ngMotion.fade</code>
|
||||
</div>
|
||||
|
||||
<p>Basic fade animation that leverages <code>CSS3 keyframes</code>, see <a href="http://caniuse.com/#search=keyframes" target="_blank">browser support</a>.</p>
|
||||
<p>This animation works with <code>opacity</code> animating respectively from <code>0 to 1</code>.</p>
|
||||
|
||||
<h3 id="fade-examples">Live demo <a class="small edit-plunkr" data-module-name="mgcrea.ngStrapDocs" data-content-html-url="aside/docs/aside.demo.html" data-content-js-url="aside/docs/aside.demo.js" ng-plunkr data-title="edit in plunker" data-placement="right" bs-tooltip></a></h3>
|
||||
<!-- <pre class="bs-example-scope">$scope.aside = {{aside | json}};</pre> -->
|
||||
<div class="bs-example" append-source>
|
||||
|
||||
<h5>fade</h5>
|
||||
|
||||
<button type="button" class="btn btn-primary" data-animation="am-fade" data-placement="left" bs-popover="popover">popover from left<br><small>(am-fade)</small></button>
|
||||
|
||||
<button type="button" class="btn btn-success" data-animation="am-fade" data-placement="right" bs-popover="popover">popover from right<br><small>(am-fade)</small></button><br><br>
|
||||
|
||||
<button type="button" class="btn btn-primary" data-animation="am-fade" data-placement="top" bs-tooltip="tooltip">tooltip from top<br><small>(am-fade)</small></button>
|
||||
|
||||
<button type="button" class="btn btn-success" data-animation="am-fade" data-placement="bottom" bs-tooltip="tooltip">tooltip from bottom<br><small>(am-fade)</small></button>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<h2 id="fade-usage">Usage</h2>
|
||||
<p>Append one of theses classes <code>am-fade</code> to enable theses transitions.</p>
|
||||
<div class="callout callout-info">
|
||||
<h4>AngularStrap integration</h4>
|
||||
<p>You should use the <code>data-animation</code> attribute with AngularStrap.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1,69 +0,0 @@
|
||||
|
||||
// Fade
|
||||
//
|
||||
|
||||
@fade-duration: .3s;
|
||||
@fade-timing-function: linear;
|
||||
|
||||
.am-fade {
|
||||
|
||||
animation-duration: @fade-duration;
|
||||
animation-timing-function: @fade-timing-function;
|
||||
animation-fill-mode: backwards;
|
||||
opacity: 1;
|
||||
|
||||
&.am-fade-add, &.ng-hide-remove, &.ng-move {
|
||||
animation-name: fadeIn;
|
||||
}
|
||||
&.am-fade-remove, &.ng-hide {
|
||||
animation-name: fadeOut;
|
||||
}
|
||||
|
||||
&.ng-enter {
|
||||
visibility: hidden;
|
||||
animation-name: fadeIn;
|
||||
&.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
&.ng-leave {
|
||||
animation-name: fadeOut;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Keyframes
|
||||
//
|
||||
|
||||
@keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Bootstrap 3
|
||||
//
|
||||
|
||||
.modal-backdrop, .aside-backdrop {
|
||||
|
||||
&.am-fade {
|
||||
|
||||
background: rgba(0, 0, 0, .5);
|
||||
animation-duration: @fade-duration / 2;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
<div class="bs-docs-section">
|
||||
|
||||
<div class="page-header">
|
||||
<h1 id="flip">FadeAndScale <a class="small" href="//github.com/mgcrea/angular-strap/blob/master/src/flip/flip.less" target="_blank">flip.less</a></h1>
|
||||
<code>mgcrea.ngMotion.flip</code>
|
||||
</div>
|
||||
|
||||
<p>Fancy flip animation that leverages <code>CSS3 keyframes</code>, see <a href="http://caniuse.com/#search=keyframes" target="_blank">browser support</a>.</p>
|
||||
<p>This animation works with <code>perspective, rotate</code> animating respectively from <code>to 400px, 90 to 0</code>.</p>
|
||||
|
||||
<h3 id="flip-examples">Live demo <a class="small edit-plunkr" data-module-name="mgcrea.ngStrapDocs" data-content-html-url="aside/docs/aside.demo.html" data-content-js-url="aside/docs/aside.demo.js" ng-plunkr data-title="edit in plunker" data-placement="right" bs-tooltip></a></h3>
|
||||
<!-- <pre class="bs-example-scope">$scope.aside = {{aside | json}};</pre> -->
|
||||
<div class="bs-example" append-source>
|
||||
|
||||
<h5>flip</h5>
|
||||
|
||||
<button type="button" class="btn btn-primary" data-animation="am-flip-x" data-placement="bottom" bs-popover="popover">popover from bottom<br><small>(am-flip-x)</small></button>
|
||||
|
||||
<button type="button" class="btn btn-success" data-animation="am-flip-x" data-placement="center" bs-modal="modal">modal from center<br><small>(am-flip-x)</small></button>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<h2 id="flip-usage">Usage</h2>
|
||||
<p>Append one of theses classes <code>am-flip-x</code> to enable theses transitions.</p>
|
||||
<div class="callout callout-info">
|
||||
<h4>AngularStrap integration</h4>
|
||||
<p>You should use the <code>data-animation</code> attribute with AngularStrap.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1,101 +0,0 @@
|
||||
|
||||
|
||||
// Fade
|
||||
//
|
||||
|
||||
@flip-duration: .4s;
|
||||
@flip-timing-function: ease;
|
||||
|
||||
.am-flip-x {
|
||||
|
||||
animation-duration: @flip-duration;
|
||||
animation-timing-function: @flip-timing-function;
|
||||
animation-fill-mode: backwards;
|
||||
|
||||
&.am-flip-x-add, &.ng-hide-remove, &.ng-move {
|
||||
animation-name: flipInXBounce;
|
||||
}
|
||||
&.am-flip-x-remove, &.ng-hide {
|
||||
animation-name: flipOutX;
|
||||
}
|
||||
|
||||
&.ng-enter {
|
||||
visibility: hidden;
|
||||
animation-name: flipInXBounce;
|
||||
&.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
&.ng-leave {
|
||||
animation-name: flipOutX;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.am-flip-x-linear {
|
||||
|
||||
animation-duration: @flip-duration;
|
||||
animation-timing-function: @flip-timing-function;
|
||||
animation-fill-mode: backwards;
|
||||
|
||||
&.am-flip-x-add, &.ng-hide-remove, &.ng-move {
|
||||
animation-name: flipInX;
|
||||
}
|
||||
&.am-flip-x-remove, &.ng-hide {
|
||||
animation-name: flipOutX;
|
||||
}
|
||||
|
||||
&.ng-enter {
|
||||
visibility: hidden;
|
||||
animation-name: flipInX;
|
||||
&.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
&.ng-leave {
|
||||
animation-name: flipOutX;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Keyframes
|
||||
//
|
||||
|
||||
@keyframes flipInX {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes flipInXBounce {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
40% {
|
||||
transform: perspective(400px) rotateX(-10deg);
|
||||
}
|
||||
70% {
|
||||
transform: perspective(400px) rotateX(10deg);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes flipOutX {
|
||||
from {
|
||||
opacity: 1;
|
||||
transform: perspective(400px) rotateX(0deg);
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
transform: perspective(400px) rotateX(90deg);
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
<div class="bs-docs-section">
|
||||
|
||||
<div class="page-header">
|
||||
<h1 id="slide">Slide <a class="small" href="//github.com/mgcrea/angular-strap/blob/master/src/slide/slide.less" target="_blank">slide.less</a>
|
||||
</h1>
|
||||
<code>mgcrea.ngMotion.slide</code>
|
||||
</div>
|
||||
|
||||
<p>Basic slide animation that leverages <code>CSS3 keyframes</code>, see <a href="http://caniuse.com/#search=keyframes" target="_blank">browser support</a>.</p>
|
||||
<p>This animation works with <code>translateX/Y</code> animating from <code>0% to 100%</code>.</p>
|
||||
|
||||
<h3 id="slide-examples">Live demo <a class="small edit-plunkr" data-module-name="mgcrea.ngStrapDocs" data-content-html-url="aside/docs/aside.demo.html" data-content-js-url="aside/docs/aside.demo.js" ng-plunkr data-title="edit in plunker" data-placement="right" bs-tooltip></a></h3>
|
||||
<!-- <pre class="bs-example-scope">$scope.aside = {{aside | json}};</pre> -->
|
||||
<div class="bs-example" append-source>
|
||||
|
||||
<h5>slide</h5>
|
||||
|
||||
<button type="button" class="btn btn-primary" data-animation="am-slide-left" data-placement="left" bs-aside="aside">aside from left<br><small>(slide-left)</small></button>
|
||||
|
||||
<button type="button" class="btn btn-success" data-animation="am-slide-right" data-placement="right" bs-aside="aside">aside from right<br><small>(slide-right)</small></button>
|
||||
|
||||
<button type="button" class="btn btn-primary" data-animation="am-slide-top" bs-modal="modal">modal from top<br><small>(am-slide-top)</small></button>
|
||||
|
||||
<button type="button" class="btn btn-success" data-animation="am-slide-bottom" data-placement="center" bs-modal="modal">modal from bottom<br><small>(am-slide-bottom)</small></button>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<h2 id="slide-usage">Usage</h2>
|
||||
<p>Append one of theses classes <code>am-slide-top</code>, <code>am-slide-right</code>, <code>am-slide-bottom</code>, <code>am-slide-left</code> to enable theses transitions, </p>
|
||||
<div class="callout callout-info">
|
||||
<h4>AngularStrap integration</h4>
|
||||
<p>You should use the <code>data-animation</code> attribute with AngularStrap.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1,19 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
angular.module('mgcrea.ngStrapDocs')
|
||||
|
||||
.config(function($asideProvider, $modalProvider) {
|
||||
angular.extend($modalProvider.defaults, {
|
||||
container: 'body',
|
||||
html: true
|
||||
});
|
||||
angular.extend($asideProvider.defaults, {
|
||||
container: 'body',
|
||||
html: true
|
||||
});
|
||||
})
|
||||
|
||||
.controller('SlideDemoCtrl', function($scope) {
|
||||
$scope.aside = {title: 'Title', content: 'Hello Aside<br />This is a multiline message!'};
|
||||
$scope.modal = {title: 'Title', content: 'Hello Modal<br />This is a multiline message!'};
|
||||
});
|
||||
@@ -1,160 +0,0 @@
|
||||
|
||||
// Slide
|
||||
//
|
||||
|
||||
@slide-duration: .3s;
|
||||
@slide-timing-function: ease-in-out;
|
||||
|
||||
.am-slide-top {
|
||||
|
||||
animation-duration: @slide-duration;
|
||||
animation-timing-function: @slide-timing-function;
|
||||
animation-fill-mode: backwards;
|
||||
|
||||
&.am-fade-and-slide-top-add, &.ng-hide-remove, &.ng-move {
|
||||
animation-name: slideFromTop;
|
||||
}
|
||||
&.am-fade-and-slide-top-remove, &.ng-hide {
|
||||
animation-name: slideToTop;
|
||||
}
|
||||
|
||||
&.ng-enter {
|
||||
visibility: hidden;
|
||||
animation-name: slideFromTop;
|
||||
&.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
&.ng-leave, {
|
||||
animation-name: slideToTop;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.am-slide-right {
|
||||
|
||||
animation-duration: @slide-duration;
|
||||
animation-timing-function: @slide-timing-function;
|
||||
animation-fill-mode: backwards;
|
||||
|
||||
&.am-fade-and-slide-right-add, &.ng-hide-remove, &.ng-move {
|
||||
animation-name: slideFromRight;
|
||||
}
|
||||
&.am-fade-and-slide-right-remove, &.ng-hide {
|
||||
animation-name: slideToRight;
|
||||
}
|
||||
|
||||
&.ng-enter {
|
||||
visibility: hidden;
|
||||
animation-name: slideFromRight;
|
||||
&.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
&.ng-leave, {
|
||||
animation-name: slideToRight;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.am-slide-bottom {
|
||||
|
||||
animation-duration: @slide-duration;
|
||||
animation-timing-function: @slide-timing-function;
|
||||
animation-fill-mode: backwards;
|
||||
|
||||
&.am-fade-and-slide-bottom-add, &.ng-hide-remove, &.ng-move {
|
||||
animation-name: slideFromBottom;
|
||||
}
|
||||
&.am-fade-and-slide-bottom-remove, &.ng-hide {
|
||||
animation-name: slideToBottom;
|
||||
}
|
||||
|
||||
&.ng-enter {
|
||||
visibility: hidden;
|
||||
animation-name: slideFromBottom;
|
||||
&.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
&.ng-leave, {
|
||||
animation-name: slideToBottom;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.am-slide-left {
|
||||
|
||||
animation-duration: @slide-duration;
|
||||
animation-timing-function: @slide-timing-function;
|
||||
animation-fill-mode: backwards;
|
||||
|
||||
&.am-fade-and-slide-left-add, &.ng-hide-remove, &.ng-move {
|
||||
animation-name: slideFromLeft;
|
||||
}
|
||||
&.am-fade-and-slide-left-remove, &.ng-hide {
|
||||
animation-name: slideToLeft;
|
||||
}
|
||||
|
||||
&.ng-enter {
|
||||
visibility: hidden;
|
||||
animation-name: slideFromLeft;
|
||||
&.ng-enter-active {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
&.ng-leave, {
|
||||
animation-name: slideToLeft;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Keyframes
|
||||
//
|
||||
|
||||
@keyframes slideFromTop {
|
||||
from {
|
||||
transform: translateY(-100%);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideToTop {
|
||||
to {
|
||||
transform: translateY(-100%);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideFromRight {
|
||||
from {
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideToRight {
|
||||
to {
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideFromBottom {
|
||||
from {
|
||||
transform: translateY(100%);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideToBottom {
|
||||
to {
|
||||
transform: translateY(100%);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideFromLeft {
|
||||
from {
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
}
|
||||
@keyframes slideToLeft {
|
||||
to {
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"node": true,
|
||||
"browser": true,
|
||||
"esnext": true,
|
||||
"bitwise": true,
|
||||
"camelcase": false,
|
||||
"curly": false,
|
||||
"eqeqeq": true,
|
||||
"immed": true,
|
||||
"indent": 2,
|
||||
"latedef": true,
|
||||
"newcap": true,
|
||||
"noarg": true,
|
||||
"quotmark": "single",
|
||||
"regexp": true,
|
||||
"undef": true,
|
||||
"unused": false,
|
||||
"strict": true,
|
||||
"globalstrict": true,
|
||||
"trailing": true,
|
||||
"smarttabs": true,
|
||||
"predef": [
|
||||
"$",
|
||||
"angular",
|
||||
"describe",
|
||||
"beforeEach",
|
||||
"afterEach",
|
||||
"inject",
|
||||
"it",
|
||||
"expect"
|
||||
]
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
// Karma configuration
|
||||
'use strict';
|
||||
|
||||
module.exports = function(config) {
|
||||
|
||||
config.set({
|
||||
|
||||
// base path, that will be used to resolve files and exclude
|
||||
basePath: './..',
|
||||
|
||||
// frameworks to use
|
||||
frameworks: ['jasmine'],
|
||||
|
||||
// list of files / patterns to load in the browser
|
||||
files: [
|
||||
'bower_components/angular/angular.js',
|
||||
'bower_components/angular-mocks/angular-mocks.js',
|
||||
'bower_components/angular-animate/angular-animate.js',
|
||||
'src/{,*/}*.js',
|
||||
'bower_components/jquery/jquery.js',
|
||||
'test/spec/*.js'
|
||||
],
|
||||
|
||||
// list of files / patterns to exclude
|
||||
exclude: [
|
||||
],
|
||||
|
||||
// test results reporter to use
|
||||
// possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
|
||||
reporters: ['progress'],
|
||||
|
||||
// web server port
|
||||
port: 9876,
|
||||
|
||||
// enable / disable colors in the output (reporters and logs)
|
||||
colors: true,
|
||||
|
||||
// level of logging
|
||||
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
||||
logLevel: config.LOG_INFO,
|
||||
|
||||
// enable / disable watching file and executing tests whenever any file changes
|
||||
autoWatch: false,
|
||||
|
||||
// Start these browsers, currently available:
|
||||
// - Chrome
|
||||
// - ChromeCanary
|
||||
// - Firefox
|
||||
// - Opera (has to be installed with `npm install karma-opera-launcher`)
|
||||
// - Safari (only Mac; has to be installed with `npm install karma-safari-launcher`)
|
||||
// - PhantomJS
|
||||
// - IE (only Windows; has to be installed with `npm install karma-ie-launcher`)
|
||||
browsers: ['PhantomJS'],
|
||||
|
||||
// If browser does not capture in given timeout [ms], kill it
|
||||
captureTimeout: 60000,
|
||||
|
||||
// Continuous Integration mode
|
||||
// if true, it capture browsers, run tests and exit
|
||||
singleRun: false
|
||||
|
||||
});
|
||||
};
|
||||
@@ -1,19 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
describe('Animations', function() {
|
||||
|
||||
beforeEach(module('ngAnimate'));
|
||||
|
||||
var scope, $animate;
|
||||
|
||||
// Load ngAnimate and a mock scope
|
||||
beforeEach(inject(function($rootScope, _$animate_) {
|
||||
scope = $rootScope.$new();
|
||||
$animate = _$animate_;
|
||||
}));
|
||||
|
||||
it('the animate service should be properly defined', function() {
|
||||
expect($animate).toBeDefined();
|
||||
});
|
||||
|
||||
});
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"name": "angular-scenario",
|
||||
"version": "1.2.18",
|
||||
"main": "./angular-scenario.js",
|
||||
"dependencies": {
|
||||
"angular": "1.2.18"
|
||||
},
|
||||
"homepage": "https://github.com/angular/bower-angular-scenario",
|
||||
"_release": "1.2.18",
|
||||
"_resolution": {
|
||||
"type": "version",
|
||||
"tag": "v1.2.18",
|
||||
"commit": "ced796ccc54bd2d9942216aecd499a672cec6e2c"
|
||||
},
|
||||
"_source": "git://github.com/angular/bower-angular-scenario.git",
|
||||
"_target": "1.2.18",
|
||||
"_originalSource": "angular-scenario"
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
# bower-angular-scenario
|
||||
|
||||
This repo is for distribution on `bower`. The source for this module is in the
|
||||
[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngScenario).
|
||||
Please file issues and pull requests against that repo.
|
||||
|
||||
## Install
|
||||
|
||||
Install with `bower`:
|
||||
|
||||
```shell
|
||||
bower install angular-scenario
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
Documentation is available on the
|
||||
[AngularJS docs site](http://docs.angularjs.org/).
|
||||
|
||||
## License
|
||||
|
||||
The MIT License
|
||||
|
||||
Copyright (c) 2010-2012 Google, Inc. http://angularjs.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"name": "angular-scenario",
|
||||
"version": "1.2.18",
|
||||
"main": "./angular-scenario.js",
|
||||
"dependencies": {
|
||||
"angular": "1.2.18"
|
||||
}
|
||||
}
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
/**
|
||||
* Configuration for jstd scenario adapter
|
||||
*/
|
||||
var jstdScenarioAdapter = {
|
||||
relativeUrlPrefix: '/build/docs/'
|
||||
};
|
||||
@@ -1,185 +0,0 @@
|
||||
/**
|
||||
* @license AngularJS v1.0.4
|
||||
* (c) 2010-2012 Google, Inc. http://angularjs.org
|
||||
* License: MIT
|
||||
*/
|
||||
(function(window) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* JSTestDriver adapter for angular scenario tests
|
||||
*
|
||||
* Example of jsTestDriver.conf for running scenario tests with JSTD:
|
||||
<pre>
|
||||
server: http://localhost:9877
|
||||
|
||||
load:
|
||||
- lib/angular-scenario.js
|
||||
- lib/jstd-scenario-adapter-config.js
|
||||
- lib/jstd-scenario-adapter.js
|
||||
# your test files go here #
|
||||
|
||||
proxy:
|
||||
- {matcher: "/your-prefix/*", server: "http://localhost:8000/"}
|
||||
</pre>
|
||||
*
|
||||
* For more information on how to configure jstd proxy, see {@link http://code.google.com/p/js-test-driver/wiki/Proxy}
|
||||
* Note the order of files - it's important !
|
||||
*
|
||||
* Example of jstd-scenario-adapter-config.js
|
||||
<pre>
|
||||
var jstdScenarioAdapter = {
|
||||
relativeUrlPrefix: '/your-prefix/'
|
||||
};
|
||||
</pre>
|
||||
*
|
||||
* Whenever you use <code>browser().navigateTo('relativeUrl')</code> in your scenario test, the relativeUrlPrefix will be prepended.
|
||||
* You have to configure this to work together with JSTD proxy.
|
||||
*
|
||||
* Let's assume you are using the above configuration (jsTestDriver.conf and jstd-scenario-adapter-config.js):
|
||||
* Now, when you call <code>browser().navigateTo('index.html')</code> in your scenario test, the browser will open /your-prefix/index.html.
|
||||
* That matches the proxy, so JSTD will proxy this request to http://localhost:8000/index.html.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Custom type of test case
|
||||
*
|
||||
* @const
|
||||
* @see jstestdriver.TestCaseInfo
|
||||
*/
|
||||
var SCENARIO_TYPE = 'scenario';
|
||||
|
||||
/**
|
||||
* Plugin for JSTestDriver
|
||||
* Connection point between scenario's jstd output and jstestdriver.
|
||||
*
|
||||
* @see jstestdriver.PluginRegistrar
|
||||
*/
|
||||
function JstdPlugin() {
|
||||
var nop = function() {};
|
||||
|
||||
this.reportResult = nop;
|
||||
this.reportEnd = nop;
|
||||
this.runScenario = nop;
|
||||
|
||||
this.name = 'Angular Scenario Adapter';
|
||||
|
||||
/**
|
||||
* Called for each JSTD TestCase
|
||||
*
|
||||
* Handles only SCENARIO_TYPE test cases. There should be only one fake TestCase.
|
||||
* Runs all scenario tests (under one fake TestCase) and report all results to JSTD.
|
||||
*
|
||||
* @param {jstestdriver.TestRunConfiguration} configuration
|
||||
* @param {Function} onTestDone
|
||||
* @param {Function} onAllTestsComplete
|
||||
* @returns {boolean} True if this type of test is handled by this plugin, false otherwise
|
||||
*/
|
||||
this.runTestConfiguration = function(configuration, onTestDone, onAllTestsComplete) {
|
||||
if (configuration.getTestCaseInfo().getType() != SCENARIO_TYPE) return false;
|
||||
|
||||
this.reportResult = onTestDone;
|
||||
this.reportEnd = onAllTestsComplete;
|
||||
this.runScenario();
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
this.getTestRunsConfigurationFor = function(testCaseInfos, expressions, testRunsConfiguration) {
|
||||
testRunsConfiguration.push(
|
||||
new jstestdriver.TestRunConfiguration(
|
||||
new jstestdriver.TestCaseInfo(
|
||||
'Angular Scenario Tests', function() {}, SCENARIO_TYPE), []));
|
||||
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Singleton instance of the plugin
|
||||
* Accessed using closure by:
|
||||
* - jstd output (reports to this plugin)
|
||||
* - initScenarioAdapter (register the plugin to jstd)
|
||||
*/
|
||||
var plugin = new JstdPlugin();
|
||||
|
||||
/**
|
||||
* Initialise scenario jstd-adapter
|
||||
* (only if jstestdriver is defined)
|
||||
*
|
||||
* @param {Object} jstestdriver Undefined when run from browser (without jstd)
|
||||
* @param {Function} initScenarioAndRun Function that inits scenario and runs all the tests
|
||||
* @param {Object=} config Configuration object, supported properties:
|
||||
* - relativeUrlPrefix: prefix for all relative links when navigateTo()
|
||||
*/
|
||||
function initScenarioAdapter(jstestdriver, initScenarioAndRun, config) {
|
||||
if (jstestdriver) {
|
||||
// create and register ScenarioPlugin
|
||||
jstestdriver.pluginRegistrar.register(plugin);
|
||||
plugin.runScenario = initScenarioAndRun;
|
||||
|
||||
/**
|
||||
* HACK (angular.scenario.Application.navigateTo)
|
||||
*
|
||||
* We need to navigate to relative urls when running from browser (without JSTD),
|
||||
* because we want to allow running scenario tests without creating its own virtual host.
|
||||
* For example: http://angular.local/build/docs/docs-scenario.html
|
||||
*
|
||||
* On the other hand, when running with JSTD, we need to navigate to absolute urls,
|
||||
* because of JSTD proxy. (proxy, because of same domain policy)
|
||||
*
|
||||
* So this hack is applied only if running with JSTD and change all relative urls to absolute.
|
||||
*/
|
||||
var appProto = angular.scenario.Application.prototype,
|
||||
navigateTo = appProto.navigateTo,
|
||||
relativeUrlPrefix = config && config.relativeUrlPrefix || '/';
|
||||
|
||||
appProto.navigateTo = function(url, loadFn, errorFn) {
|
||||
if (url.charAt(0) != '/' && url.charAt(0) != '#' &&
|
||||
url != 'about:blank' && !url.match(/^https?/)) {
|
||||
url = relativeUrlPrefix + url;
|
||||
}
|
||||
|
||||
return navigateTo.call(this, url, loadFn, errorFn);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds proper TestResult object from given model spec
|
||||
*
|
||||
* TODO(vojta) report error details
|
||||
*
|
||||
* @param {angular.scenario.ObjectModel.Spec} spec
|
||||
* @returns {jstestdriver.TestResult}
|
||||
*/
|
||||
function createTestResultFromSpec(spec) {
|
||||
var map = {
|
||||
success: 'PASSED',
|
||||
error: 'ERROR',
|
||||
failure: 'FAILED'
|
||||
};
|
||||
|
||||
return new jstestdriver.TestResult(
|
||||
spec.fullDefinitionName,
|
||||
spec.name,
|
||||
jstestdriver.TestResult.RESULT[map[spec.status]],
|
||||
spec.error || '',
|
||||
spec.line || '',
|
||||
spec.duration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates JSTD output (jstestdriver.TestResult)
|
||||
*/
|
||||
angular.scenario.output('jstd', function(context, runner, model) {
|
||||
model.on('SpecEnd', function(spec) {
|
||||
plugin.reportResult(createTestResultFromSpec(spec));
|
||||
});
|
||||
|
||||
model.on('RunnerEnd', function() {
|
||||
plugin.reportEnd();
|
||||
});
|
||||
});
|
||||
initScenarioAdapter(window.jstestdriver, angular.scenario.setUpAndRun, window.jstdScenarioAdapter);
|
||||
})(window);
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "autotype",
|
||||
"_cacheHeaders": {
|
||||
"ETag": "\"4fc86fb680c427f7883d2f4dfacbe0d84ba76a92\"",
|
||||
"Content-Length": "13286",
|
||||
"Content-Type": "text/plain; charset=utf-8"
|
||||
},
|
||||
"_release": "e-tag:4fc86fb68",
|
||||
"main": "index.js",
|
||||
"_source": "https://raw.github.com/mmonteleone/jquery.autotype/master/jquery.autotype.js",
|
||||
"_target": "*",
|
||||
"_originalSource": "https://raw.github.com/mmonteleone/jquery.autotype/master/jquery.autotype.js"
|
||||
}
|
||||
@@ -1,283 +0,0 @@
|
||||
/**
|
||||
* jQuery.autotype - Simple, accurate, typing simulation for jQuery
|
||||
*
|
||||
* version 0.5.0
|
||||
*
|
||||
* http://michaelmonteleone.net/projects/autotype
|
||||
* http://github.com/mmonteleone/jquery.autotype
|
||||
*
|
||||
* Copyright (c) 2009 Michael Monteleone
|
||||
* Licensed under terms of the MIT License (README.markdown)
|
||||
*/
|
||||
(function($){
|
||||
|
||||
// code type constants
|
||||
var CHARACTER = 1,
|
||||
NON_CHARACTER = 2,
|
||||
MODIFIER_BEGIN = 3,
|
||||
MODIFIER_END = 4,
|
||||
isNullOrEmpty = function(val) { return val === null || val.length === 0; },
|
||||
isUpper = function(char) { return char.toUpperCase() === char; },
|
||||
isLower = function(char) { return char.toLowerCase() === char; },
|
||||
areDifferentlyCased = function(char1,char2) {
|
||||
return (isUpper(char1) && isLower(char2)) ||
|
||||
(isLower(char1) && isUpper(char2));
|
||||
},
|
||||
convertCase = function(char) {
|
||||
return isUpper(char) ? char.toLowerCase() : char.toUpperCase();
|
||||
},
|
||||
parseCodes = function(value, codeMap) {
|
||||
// buffer to hold a collection of key/char code pairs corresponding to input string value
|
||||
var codes = [],
|
||||
// buffer to hold the name of a control key as it's being parsed
|
||||
definingControlKey = false,
|
||||
// hold a collection of currently pushed modifier keys
|
||||
activeModifiers = {
|
||||
alt: false,
|
||||
meta: false,
|
||||
shift: false,
|
||||
ctrl: false
|
||||
},
|
||||
explicitModifiers = $.extend({}, activeModifiers),
|
||||
// buffer to hold construction of current control key
|
||||
currentControlKey = '',
|
||||
previousChar = '',
|
||||
pushCode = function(opts) {
|
||||
codes.push($.extend({}, opts, activeModifiers));
|
||||
},
|
||||
pushModifierBeginCode = function(modifierName) {
|
||||
activeModifiers[modifierName] = true;
|
||||
pushCode({
|
||||
keyCode: codeMap[modifierName],
|
||||
charCode: 0,
|
||||
char: '',
|
||||
type: MODIFIER_BEGIN
|
||||
});
|
||||
},
|
||||
pushModifierEndCode = function(modifierName) {
|
||||
activeModifiers[modifierName] = false;
|
||||
pushCode({
|
||||
keyCode: codeMap[modifierName],
|
||||
charCode: 0,
|
||||
char: '',
|
||||
type: MODIFIER_END
|
||||
});
|
||||
};
|
||||
|
||||
for(var i=0;i<value.length;i++) {
|
||||
// if the character is about to define a control key
|
||||
if(!definingControlKey &&
|
||||
i <= value.length - 5 &&
|
||||
value.charAt(i) === '{' &&
|
||||
value.charAt(i+1) === '{')
|
||||
{
|
||||
// skip the next "{"
|
||||
i++;
|
||||
|
||||
definingControlKey = true;
|
||||
}
|
||||
// if the character is about to end definition of control key
|
||||
else if (definingControlKey &&
|
||||
i <= value.length - 2 &&
|
||||
value.charAt(i) === '}' &&
|
||||
value.charAt(i+1) === '}')
|
||||
{
|
||||
// skip the next "}"
|
||||
i++;
|
||||
|
||||
// check if this key is a modifier-opener (is a ctrl,alt,del,shift)
|
||||
if(activeModifiers[currentControlKey] !== undefined)
|
||||
{
|
||||
explicitModifiers[currentControlKey] = true;
|
||||
pushModifierBeginCode(currentControlKey);
|
||||
}
|
||||
// check if this key is a modifier-closer (is a /ctrl,/alt,/del,.shift)
|
||||
else if(activeModifiers[currentControlKey.substring(1)] !== undefined)
|
||||
{
|
||||
explicitModifiers[currentControlKey] = false;
|
||||
pushModifierEndCode(currentControlKey.substring(1));
|
||||
}
|
||||
// otherwise is some other kind of non-modifier control key
|
||||
else
|
||||
{
|
||||
pushCode({
|
||||
keyCode: codeMap[currentControlKey],
|
||||
charCode: 0,
|
||||
char: '',
|
||||
type: NON_CHARACTER,
|
||||
controlKeyName: currentControlKey
|
||||
});
|
||||
}
|
||||
|
||||
definingControlKey = false;
|
||||
currentControlKey = '';
|
||||
}
|
||||
// currently defining control key
|
||||
else if (definingControlKey)
|
||||
{
|
||||
currentControlKey += value.charAt(i);
|
||||
}
|
||||
// otherwise is just a text character
|
||||
else
|
||||
{
|
||||
var character = value.charAt(i);
|
||||
|
||||
// check for any implicitly changing of cases, and register presses/releases
|
||||
// of the shift key in accord with them.
|
||||
if(
|
||||
(!isNullOrEmpty(previousChar) && areDifferentlyCased(previousChar, character)) ||
|
||||
(isNullOrEmpty(previousChar) && isUpper(character))
|
||||
)
|
||||
{
|
||||
if(isUpper(character) && !activeModifiers.shift) {
|
||||
pushModifierBeginCode("shift");
|
||||
} else if (isLower(character) && activeModifiers.shift && !explicitModifiers.shift){
|
||||
pushModifierEndCode("shift");
|
||||
}
|
||||
}
|
||||
|
||||
// modify the current character if there are active modifiers
|
||||
if((activeModifiers.shift && isLower(character)) ||
|
||||
(!activeModifiers.shift && isUpper(character))) {
|
||||
// shift converts case
|
||||
character = convertCase(character);
|
||||
}
|
||||
|
||||
var code = {
|
||||
// if can't identify a keycode, just fudge with the char code.
|
||||
// nope, this isn't ideal by any means.
|
||||
keyCode: codeMap[character] || character.charCodeAt(0),
|
||||
charCode: character.charCodeAt(0),
|
||||
char: character,
|
||||
type: CHARACTER
|
||||
};
|
||||
|
||||
// modify the current character if there are active modifiers
|
||||
if(activeModifiers.alt ||
|
||||
activeModifiers.ctrl ||
|
||||
activeModifiers.meta) {
|
||||
// alt, ctrl, meta make it so nothing is typed
|
||||
code.char = '';
|
||||
}
|
||||
pushCode(code);
|
||||
if(code.char !== '') { previousChar = code.char; }
|
||||
}
|
||||
}
|
||||
return codes;
|
||||
},
|
||||
triggerCodeOnField = function(code, field) {
|
||||
// build up base content that every event should contain
|
||||
// with information about whether certain chord keys are
|
||||
// simulated as being pressed
|
||||
var evnt = {
|
||||
altKey: code.alt,
|
||||
metaKey: code.meta,
|
||||
shiftKey: code.shift,
|
||||
ctrlKey: code.ctrl
|
||||
};
|
||||
|
||||
// build out 3 event instances for all the steps of a key entry
|
||||
var keyDownEvent = $.extend($.Event(), evnt, {type:'keydown', keyCode: code.keyCode, charCode: 0, which: code.keyCode});
|
||||
var keyPressEvent = $.extend($.Event(), evnt, {type:'keypress', keyCode: 0, charCode: code.charCode, which: code.charCode || code.keyCode});
|
||||
var keyUpEvent = $.extend($.Event(), evnt, {type:'keyup', keyCode: code.keyCode, charCode: 0, which: code.keyCode});
|
||||
|
||||
// go ahead and trigger the first 2 (down and press)
|
||||
// a keyup of a modifier shouldn't also re-trigger a keydown
|
||||
if(code.type !== MODIFIER_END) {
|
||||
field.trigger(keyDownEvent);
|
||||
}
|
||||
|
||||
// modifier keys don't have a keypress event, only down or up
|
||||
if(code.type !== MODIFIER_BEGIN && code.type !== MODIFIER_END) {
|
||||
field.trigger(keyPressEvent);
|
||||
}
|
||||
|
||||
// only actually add the new character to the input if the keydown or keypress events
|
||||
// weren't cancelled by any consuming event handlers
|
||||
if(!keyDownEvent.isPropagationStopped() &&
|
||||
!keyPressEvent.isPropagationStopped()) {
|
||||
if(code.type === NON_CHARACTER) {
|
||||
switch(code.controlKeyName) {
|
||||
case 'enter':
|
||||
field.val(field.val() + "\n");
|
||||
break;
|
||||
case 'back':
|
||||
field.val(field.val().substring(0,field.val().length-1));
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
field.val(field.val() + code.char);
|
||||
}
|
||||
}
|
||||
|
||||
// then also trigger the 3rd event (up)
|
||||
// a keydown of a modifier shouldn't also trigger a keyup until coded
|
||||
if(code.type !== MODIFIER_BEGIN) {
|
||||
field.trigger(keyUpEvent);
|
||||
}
|
||||
},
|
||||
triggerCodesOnField = function(codes, field, delay, global) {
|
||||
if(delay > 0) {
|
||||
codes = codes.reverse();
|
||||
var keyInterval = global.setInterval(function(){
|
||||
var code = codes.pop();
|
||||
triggerCodeOnField(code, field);
|
||||
if(codes.length === 0) {
|
||||
global.clearInterval(keyInterval);
|
||||
field.trigger('autotyped');
|
||||
}
|
||||
}, delay);
|
||||
} else {
|
||||
$.each(codes,function(){
|
||||
triggerCodeOnField(this, field);
|
||||
});
|
||||
field.trigger('autotyped');
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.autotype = function(value, options) {
|
||||
if(value === undefined || value === null) { throw("Value is required by jQuery.autotype plugin"); }
|
||||
var settings = $.extend({}, $.fn.autotype.defaults, options);
|
||||
|
||||
// 1st Pass
|
||||
// step through the input string and convert it into
|
||||
// a logical sequence of steps, key, and charcodes to apply to the inputs
|
||||
var codes = parseCodes(value, settings.keyCodes[settings.keyBoard]);
|
||||
|
||||
// 2nd Pass
|
||||
// Run the translated codes against each input through a realistic
|
||||
// and cancelable series of key down/press/up events
|
||||
return this.each(function(){ triggerCodesOnField(codes, $(this), settings.delay, settings.global); });
|
||||
};
|
||||
|
||||
$.fn.autotype.defaults = {
|
||||
version: '0.5.0',
|
||||
keyBoard: 'enUs',
|
||||
delay: 0,
|
||||
global: window,
|
||||
keyCodes: {
|
||||
enUs: { 'back':8,'ins':45,'del':46,'enter':13,'shift':16,'ctrl':17,'meta':224,
|
||||
'alt':18,'pause':19,'caps':20,'esc':27,'pgup':33,'pgdn':34,
|
||||
'end':35,'home':36,'left':37,'up':38,'right':39,'down':40,
|
||||
'printscr':44,'num0':96,'num1':97,'num2':98,'num3':99,'num4':100,
|
||||
'num5':101,'num6':102,'num7':103,'num8':104,'num9':105,
|
||||
'multiply':106,'add':107,'subtract':109,'decimal':110,
|
||||
'divide':111,'f1':112,'f2':113,'f3':114,'f4':115,'f5':116,
|
||||
'f6':117,'f7':118,'f8':119,'f9':120,'f10':121,'f11':122,
|
||||
'f12':123,'numlock':144,'scrolllock':145,' ':9,' ':32,
|
||||
'tab':9,'space':32,'0':48,'1':49,'2':50,'3':51,'4':52,
|
||||
'5':53,'6':54,'7':55,'8':56,'9':57,')':48,'!':49,'@':50,
|
||||
'#':51,'$':52,'%':53,'^':54,'&':55,'*':56,'(':57,';':186,
|
||||
'=':187,',':188,'-':189,'.':190,'/':191,'[':219,'\\':220,
|
||||
']':221,"'":222,':':186,'+':187,'<':188,'_':189,'>':190,
|
||||
'?':191,'{':219,'|':220,'}':221,'"':222,'a':65,'b':66,'c':67,
|
||||
'd':68,'e':69,'f':70,'g':71,'h':72,'i':73,'j':74,'k':75,
|
||||
'l':76,'m':77,'n':78,'o':79,'p':80,'q':81,'r':82,'s':83,
|
||||
't':84,'u':85,'v':86,'w':87,'x':88,'y':89,'z':90,'A':65,
|
||||
'B':66,'C':67,'D':68,'E':69,'F':70,'G':71,'H':72,'I':73,
|
||||
'J':74,'K':75,'L':76,'M':77,'N':78,'O':79,'P':80,'Q':81,
|
||||
'R':82,'S':83,'T':84,'U':85,'V':86,'W':87,'X':88,'Y':89,'Z':90 }
|
||||
}
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"name": "bootstrap-datepicker",
|
||||
"version": "1.3.0",
|
||||
"main": [
|
||||
"js/bootstrap-datepicker.js",
|
||||
"css/datepicker.css",
|
||||
"css/datepicker3.css"
|
||||
],
|
||||
"dependencies": {
|
||||
"jquery": ">=1.7.1",
|
||||
"bootstrap": ">=3.0 <4.0"
|
||||
},
|
||||
"homepage": "https://github.com/eternicode/bootstrap-datepicker",
|
||||
"_release": "1.3.0",
|
||||
"_resolution": {
|
||||
"type": "version",
|
||||
"tag": "1.3.0",
|
||||
"commit": "37db99f95ff3a32ccc76b7122b2b73f3b0b9fe42"
|
||||
},
|
||||
"_source": "git://github.com/eternicode/bootstrap-datepicker.git",
|
||||
"_target": ">= 1.0.0",
|
||||
"_originalSource": "bootstrap-datepicker"
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
instrumented/
|
||||
tests/coverage.html
|
||||
docs/_build
|
||||
@@ -1,3 +0,0 @@
|
||||
instrumented/
|
||||
tests/coverage.html
|
||||
docs/_build
|
||||
@@ -1,18 +0,0 @@
|
||||
b965e03abfcb10d66c8dad96d54d6f8e1c5d8501 v1.0.0
|
||||
7a490672b362af7640bbeb68553a0e0a5a95cb9e v1.0.1
|
||||
9a730557f14d79c2ce2d28eacb24bdf52ac2e042 1.0.2-rc.1
|
||||
62604d506e5ba9d85ee6c2d86723b9b3d817e7bd 1.0.2-rc.1.1
|
||||
f6211e251c021331decc16bfbcf25577dd354ef4 1.0.2-rc.2
|
||||
493d2332f0cb7f2dd308c442920da86063ff2e0f 1.0.2
|
||||
77a6755dc3df3ada745024648535562587fab630 1.1.0
|
||||
fe9e4106def42741adba1606245ab0eab32acb55 1.1.1
|
||||
e37ab4f7d0d30a45ee80a7019fd2bcf8c1765de7 1.1.2
|
||||
0596a9619e30c5f52d0f56c9cba9daf0d69d29ab 1.1.3
|
||||
ba267071688d93d973bee4ddb11344971e851e9e 1.2.0-rc.1
|
||||
57e2f78d70dc5c6a265869cff3b885a78123300c 1.2.0
|
||||
68703f4d535efdeb865eba0c0b3d3b4acfb76121 1.3.0-rc.1
|
||||
abfc042e74af3e944a0819296260a8c96c6169c1 1.3.0-rc.2
|
||||
2687213f73e257375fcc3c35c1a3d23284e17341 1.3.0-rc.3
|
||||
0e5bbe72a69c9d75edbfce775943e2f7eb719eeb 1.3.0-rc.4
|
||||
3d6c7937e3f7b7e1cdb7db22fbd504e853ee776b 1.3.0-rc.5
|
||||
5bc760304871bb691a613b79c86ba9a91735007f 1.3.0-rc.6
|
||||
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"requireSpaceAfterKeywords": [
|
||||
"if", "else", "for", "while", "do", "switch", "return"
|
||||
],
|
||||
"disallowSpacesInFunctionExpression": {
|
||||
"beforeOpeningRoundBrace": true,
|
||||
"beforeOpeningCurlyBrace": true
|
||||
},
|
||||
"disallowSpacesInsideObjectBrackets": true,
|
||||
"disallowSpacesInsideArrayBrackets": true,
|
||||
"disallowSpacesInsideParentheses": true,
|
||||
"disallowQuotedKeysInObjects": "allButReserved",
|
||||
"disallowSpaceAfterObjectKeys": true,
|
||||
"disallowLeftStickedOperators": [
|
||||
"?", "==", "===", "!=", "!==", ">", ">=", "<", "<="
|
||||
],
|
||||
"disallowRightStickedOperators": [
|
||||
"?", "==", "===", "!=", "!==", ">", ">=", "<", "<="
|
||||
],
|
||||
"requireLeftStickedOperators": [","],
|
||||
"requireRightStickedOperators": ["!"],
|
||||
"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~"],
|
||||
"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
|
||||
"validateLineBreaks": "LF",
|
||||
"requireKeywordsOnNewLine": ["else", "return", "break", "delete"],
|
||||
"requireLineFeedAtFileEnd": true
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"jquery": true,
|
||||
"browser": true,
|
||||
|
||||
"eqeqeq": true,
|
||||
"freeze": true,
|
||||
//"indent": 4, // when we move to spaces
|
||||
"latedef": true,
|
||||
"undef": true,
|
||||
"unused": true,
|
||||
"immed": true,
|
||||
"trailing": true,
|
||||
"maxcomplexity": 50, // Can we get this under 5?
|
||||
//"maxlen": 120,
|
||||
|
||||
"-W014": false, // Bad line breaking before ? (in tertiary operator)
|
||||
"-W065": false, // Missing radix parameter to parseInt (defaults to 10)
|
||||
"-W069": false, // Literal accessor is better written in dot notation
|
||||
"-W100": false // Silently deleted characters (in locales)
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
install:
|
||||
- npm install -g jshint jscs
|
||||
before_script:
|
||||
- cd ./tests
|
||||
- echo "new Date().toString();" | phantomjs
|
||||
script:
|
||||
- jshint ../js/bootstrap-datepicker.js ../js/locales/*.js
|
||||
- jscs -c ../.jscs.json ../js/bootstrap-datepicker.js ../js/locales/*.js
|
||||
- phantomjs run-qunit.js tests.html
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user