diff --git a/.travis.yml b/.travis.yml index b3681d5..8e6bb1c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,26 +9,31 @@ cache: - $HOME/.gradle/caches/ env: + global: + MALLOC_ARENA_MAX=2 matrix: - - ANDROID_TARGET=android-19 ANDROID_ABI=armeabi-v7a + - ANDROID_TARGET=android-18 ANDROID_ABI=armeabi-v7a android: components: + - tools - platform-tools - - build-tools-21.1.2 - - android-21 + - build-tools-25.0.2 + - android-25 - extra-google-m2repository - extra-android-m2repository - - sys-img-armeabi-v7a-android-19 + - sys-img-armeabi-v7a-android-18 before_script: - - ls -l /usr/lib/jvm/ - - ls -l /usr/lib/jvm/java-7-oracle + - export "JAVA_OPTS=-Xmx1024m" - export "JAVA7_HOME=/usr/lib/jvm/java-7-oracle" - export "JAVA8_HOME=/usr/lib/jvm/java-8-oracle" - - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI - - emulator -avd test -no-skin -no-audio -no-window & - - android-wait-for-emulator - - adb shell input keyevent 82 & +# - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI --skin WVGA800 +# - ./gradlew :app:assembleDebug +# - emulator -avd test -no-skin -no-audio -no-window & +# - android-wait-for-emulator +# - adb shell input keyevent 82 & -script: ./gradlew connectedAndroidTest testDebug mergeTestCodeCoverageResults jacocoTestReport coveralls --stacktrace \ No newline at end of file +script: + - ./gradlew :app:test :app:jacocoUnitTestReport :app:coveralls --stacktrace +# - ./gradlew :app:test :app:connectedAndroidTest :app:jacocoTestReport :app:jacocoUnitTestReport :app:coveralls --stacktrace \ No newline at end of file diff --git a/ObjectGraphHolder/.gitignore b/ObjectGraphHolder/.gitignore deleted file mode 100644 index e8fa30f..0000000 --- a/ObjectGraphHolder/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build -*.iml diff --git a/ObjectGraphHolder/build.gradle b/ObjectGraphHolder/build.gradle deleted file mode 100644 index d105428..0000000 --- a/ObjectGraphHolder/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -apply plugin: 'com.android.library' - -apply plugin: 'me.tatarka.retrolambda' - -android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" - - defaultConfig { - minSdkVersion 9 - targetSdkVersion 21 - versionCode 1 - versionName "1.0" - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - lintOptions { - abortOnError false - } -} -dependencies { - compile 'com.squareup.dagger:dagger:1.2.2' -} \ No newline at end of file diff --git a/ObjectGraphHolder/src/main/AndroidManifest.xml b/ObjectGraphHolder/src/main/AndroidManifest.xml deleted file mode 100644 index 048b558..0000000 --- a/ObjectGraphHolder/src/main/AndroidManifest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/DaggerApplication.java b/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/DaggerApplication.java deleted file mode 100644 index c744a6a..0000000 --- a/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/DaggerApplication.java +++ /dev/null @@ -1,18 +0,0 @@ -package it.cosenonjaviste.lib.mvp.dagger; - -import android.app.Application; - -import dagger.ObjectGraph; - -public abstract class DaggerApplication extends Application { - @Override public void onCreate() { - ObjectGraphHolder.setObjectGraphCreator(new ObjectGraphCreator() { - @Override public ObjectGraph create(DaggerApplication app) { - return ObjectGraph.create(app.getModules()); - } - }); - super.onCreate(); - } - - public abstract Object[] getModules(); -} diff --git a/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphCreator.java b/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphCreator.java deleted file mode 100644 index 321defc..0000000 --- a/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphCreator.java +++ /dev/null @@ -1,7 +0,0 @@ -package it.cosenonjaviste.lib.mvp.dagger; - -import dagger.ObjectGraph; - -public interface ObjectGraphCreator { - ObjectGraph create(DaggerApplication app); -} \ No newline at end of file diff --git a/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphHolder.java b/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphHolder.java deleted file mode 100644 index 7d8a4a7..0000000 --- a/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphHolder.java +++ /dev/null @@ -1,44 +0,0 @@ -package it.cosenonjaviste.lib.mvp.dagger; - -import dagger.ObjectGraph; - -public class ObjectGraphHolder { - private static ObjectGraph objectGraph; - - private static ObjectGraphCreator objectGraphCreator; - - private static OnCreateListener onCreateListener; - - public static ObjectGraph getObjectGraph(DaggerApplication application) { - if (objectGraph == null) { - objectGraph = objectGraphCreator.create(application); - if (onCreateListener != null) { - onCreateListener.onCreate(objectGraph); - } - } - return objectGraph; - } - - public static void setObjectGraphCreator(ObjectGraphCreator objectGraphCreator) { - if (ObjectGraphHolder.objectGraphCreator == null) { - ObjectGraphHolder.objectGraphCreator = objectGraphCreator; - } - } - - public static void forceObjectGraphCreator(ObjectGraphCreator objectGraphCreator) { - ObjectGraphHolder.objectGraphCreator = objectGraphCreator; - objectGraph = null; - } - - public static void setOnCreateListener(OnCreateListener onCreateListener) { - ObjectGraphHolder.onCreateListener = onCreateListener; - } - - public interface OnCreateListener { - void onCreate(ObjectGraph objectGraph); - } - - public static void inject(DaggerApplication app, Object obj) { - ObjectGraphHolder.getObjectGraph(app).inject(obj); - } -} \ No newline at end of file diff --git a/PausableSubscription/.gitignore b/PausableSubscription/.gitignore deleted file mode 100644 index d0b97c6..0000000 --- a/PausableSubscription/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build -*.iml \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..fb500ad --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# CodingJamAndroidApp +Android app of blog [codingjam.it](http://codingjam.it) + +[![Build Status](https://travis-ci.org/coding-jam/CodingJamAndroidApp.svg?branch=master)](https://travis-ci.org/coding-jam/CodingJamAndroidApp) +[![Coverage Status](https://coveralls.io/repos/github/coding-jam/CodingJamAndroidApp/badge.svg?branch=master)](https://coveralls.io/github/coding-jam/CodingJamAndroidApp?branch=master) diff --git a/SuperListviewLibrary/.gitignore b/SuperListviewLibrary/.gitignore deleted file mode 100644 index e8fa30f..0000000 --- a/SuperListviewLibrary/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build -*.iml diff --git a/SuperListviewLibrary/build.gradle b/SuperListviewLibrary/build.gradle deleted file mode 100644 index b260fd5..0000000 --- a/SuperListviewLibrary/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ -apply plugin: 'com.android.library' - -dependencies { - compile 'com.android.support:support-v4:21.0.0' - compile 'com.nineoldandroids:library:2.4.0' -} - -android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" - - defaultConfig { - minSdkVersion 4 - targetSdkVersion 21 - versionCode 1 - versionName "1.0" - } - buildTypes { - release { - minifyEnabled false - } - } - lintOptions { - abortOnError true - } -} - -//apply from: 'https://raw.githubusercontent.com/jpardogo/gradle-mvn-push/master/gradle-mvn-push.gradle' \ No newline at end of file diff --git a/SuperListviewLibrary/gradle.properties b/SuperListviewLibrary/gradle.properties deleted file mode 100644 index 12e9a5b..0000000 --- a/SuperListviewLibrary/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -POM_NAME=SuperListview -POM_ARTIFACT_ID=library -POM_PACKAGING=aar diff --git a/SuperListviewLibrary/proguard-rules.txt b/SuperListviewLibrary/proguard-rules.txt deleted file mode 100644 index 99778d6..0000000 --- a/SuperListviewLibrary/proguard-rules.txt +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /Users/kentin/Desktop/adt-bundle-mac-x86_64-20130522/sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the ProGuard -# include property in project.properties. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} \ No newline at end of file diff --git a/SuperListviewLibrary/src/main/AndroidManifest.xml b/SuperListviewLibrary/src/main/AndroidManifest.xml deleted file mode 100644 index a077d9b..0000000 --- a/SuperListviewLibrary/src/main/AndroidManifest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/BaseSuperAbsListview.java b/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/BaseSuperAbsListview.java deleted file mode 100644 index 59ea691..0000000 --- a/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/BaseSuperAbsListview.java +++ /dev/null @@ -1,381 +0,0 @@ -package com.quentindommerc.superlistview; - -import android.content.Context; -import android.content.res.TypedArray; -import android.database.DataSetObserver; -import android.support.v4.widget.SwipeRefreshLayout; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewStub; -import android.widget.AbsListView; -import android.widget.AdapterView; -import android.widget.FrameLayout; -import android.widget.ListAdapter; - -import com.quentindommerc.superlistview.superlistview.R; - - -/** - * Created by kentin on 24/04/14. - */ -public abstract class BaseSuperAbsListview extends FrameLayout implements AbsListView.OnScrollListener { - - protected int ITEM_LEFT_TO_LOAD_MORE = 10; - - protected ViewStub mProgress; - protected ViewStub mMoreProgress; - protected ViewStub mMoreError; - protected AbsListView mList; - protected ViewStub mEmpty; - protected ViewStub mError; - protected View mErrorView; - protected View mMoreErrorView; - protected View mMoreLayout; - - protected float mDividerHeight; - protected int mDivider; - protected boolean mClipToPadding; - protected int mPadding; - protected int mPaddingTop; - protected int mPaddingBottom; - protected int mPaddingLeft; - protected int mPaddingRight; - protected int mScrollbarStyle; - protected int mEmptyId; - protected int mErrorId; - protected int mMoreProgressId; - protected int mMoreErrorId; - - protected AbsListView.OnScrollListener mOnScrollListener; - - protected OnMoreListener mOnMoreListener; - protected boolean isLoadingMore; - protected boolean mMoreItemsAvailable = true; - protected int mSelector; - protected SwipeRefreshLayout mPtrLayout; - - protected int mSuperListViewMainLayout; - private int mProgressId; - - public SwipeRefreshLayout getSwipeToRefresh() { - return mPtrLayout; - } - - public AbsListView getList() { - return mList; - } - - public BaseSuperAbsListview(Context context) { - super(context); - initView(); - } - - public BaseSuperAbsListview(Context context, AttributeSet attrs) { - super(context, attrs); - initAttrs(attrs); - initView(); - } - - public BaseSuperAbsListview(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - initAttrs(attrs); - initView(); - } - - protected void initAttrs(AttributeSet attrs) { - TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.superlistview); - try { - mClipToPadding = a.getBoolean(R.styleable.superlistview_superlv__listClipToPadding, false); - mDivider = a.getColor(R.styleable.superlistview_superlv__listDivider, 0); - mDividerHeight = a.getDimension(R.styleable.superlistview_superlv__listDividerHeight, 0.0f); - mPadding = (int) a.getDimension(R.styleable.superlistview_superlv__listPadding, -1.0f); - mPaddingTop = (int) a.getDimension(R.styleable.superlistview_superlv__listPaddingTop, 0.0f); - mPaddingBottom = (int) a.getDimension(R.styleable.superlistview_superlv__listPaddingBottom, 0.0f); - mPaddingLeft = (int) a.getDimension(R.styleable.superlistview_superlv__listPaddingLeft, 0.0f); - mPaddingRight = (int) a.getDimension(R.styleable.superlistview_superlv__listPaddingRight, 0.0f); - mScrollbarStyle = a.getInt(R.styleable.superlistview_superlv__scrollbarStyle, -1); - mEmptyId = a.getResourceId(R.styleable.superlistview_superlv__empty, 0); - mErrorId = a.getResourceId(R.styleable.superlistview_superlv__error, 0); - mMoreProgressId = a.getResourceId(R.styleable.superlistview_superlv__moreProgress, R.layout.view_more_progress); - mMoreErrorId = a.getResourceId(R.styleable.superlistview_superlv__moreError, R.layout.view_more_progress); - mProgressId = a.getResourceId(R.styleable.superlistview_superlv__progress, R.layout.view_progress); - mSelector = a.getResourceId(R.styleable.superlistview_superlv__listSelector, 0); - } finally { - a.recycle(); - } - } - - private void initView() { - if (isInEditMode()) { - return; - } - View v = LayoutInflater.from(getContext()).inflate(mSuperListViewMainLayout, this); - mPtrLayout = (SwipeRefreshLayout) v.findViewById(R.id.ptr_layout); - mPtrLayout.setEnabled(false); - - mProgress = (ViewStub) v.findViewById(android.R.id.progress); - - mProgress.setLayoutResource(mProgressId); - mProgress.inflate(); - - mMoreLayout = v.findViewById(R.id.more_progress_layout); - mMoreLayout.setVisibility(GONE); - - mMoreProgress = (ViewStub) v.findViewById(R.id.more_progress); - mMoreProgress.setLayoutResource(mMoreProgressId); - if (mMoreProgressId != 0) - mMoreProgress.inflate(); - - mMoreError = (ViewStub) v.findViewById(R.id.more_progress_error); - mMoreError.setLayoutResource(mMoreErrorId); - if (mMoreErrorId != 0) - mMoreErrorView = mMoreError.inflate(); - - mEmpty = (ViewStub) v.findViewById(R.id.empty); - mEmpty.setLayoutResource(mEmptyId); - if (mEmptyId != 0) - mEmpty.inflate(); - mEmpty.setVisibility(View.GONE); - - mError = (ViewStub) v.findViewById(R.id.error); - mError.setLayoutResource(mErrorId); - if (mErrorId != 0) - mErrorView = mError.inflate(); - mError.setVisibility(View.GONE); - - initAbsListView(v); - } - - /** - * Implement this method to customize the AbsListView - */ - protected abstract void initAbsListView(View view); - - - /** - * Set the adapter to the listview - * Automativally hide the progressbar - * Set the refresh to false - * If adapter is empty, then the emptyview is shown - * @param adapter - */ - public void setAdapter(ListAdapter adapter) { - mProgress.setVisibility(View.GONE); - if (mEmpty != null && mEmptyId != 0) - mList.setEmptyView(mEmpty); - mList.setVisibility(View.VISIBLE); - mPtrLayout.setRefreshing(false); - adapter.registerDataSetObserver(new DataSetObserver() { - @Override - public void onChanged() { - super.onChanged(); - mProgress.setVisibility(View.GONE); - isLoadingMore = false; - mPtrLayout.setRefreshing(false); - if (mList.getAdapter().getCount() == 0 && mEmptyId != 0) { - mEmpty.setVisibility(View.VISIBLE); - } else if (mEmptyId != 0) { - mEmpty.setVisibility(View.GONE); - } - } - }); - if ((adapter == null || adapter.getCount() == 0) && mEmptyId != 0) { - mEmpty.setVisibility(View.VISIBLE); - } - } - - /** - * Remove the adapter from the listview - */ - public abstract void clear(); - - /** - * Show the progressbar - */ - public void showProgress() { - hideList(); - if(mEmptyId != 0 ) mEmpty.setVisibility(View.INVISIBLE); - if(mErrorId != 0 ) mError.setVisibility(View.INVISIBLE); - mProgress.setVisibility(View.VISIBLE); - } - - /** - * Show the progressbar - */ - public void showError() { - hideList(); - if(mEmptyId != 0 ) mEmpty.setVisibility(View.INVISIBLE); - if(mErrorId != 0 ) mError.setVisibility(View.VISIBLE); - mProgress.setVisibility(View.INVISIBLE); - } - - /** - * Hide the progressbar and show the listview - */ - public void showList() { - hideProgress(); - mList.setVisibility(View.VISIBLE); - } - - public void showMoreProgress() { - mMoreLayout.setVisibility(VISIBLE); - mMoreProgress.setVisibility(View.VISIBLE); - mMoreError.setVisibility(GONE); - } - - public void showMoreError() { - mMoreLayout.setVisibility(VISIBLE); - mMoreProgress.setVisibility(View.GONE); - mMoreError.setVisibility(VISIBLE); - mMoreItemsAvailable = false; - } - - @Deprecated - public void hideMoreProgress() { - hideMoreProgress(true); - } - - public void hideMoreProgress(boolean moreItemsAvailable) { - isLoadingMore = false; - mMoreItemsAvailable = moreItemsAvailable; - mMoreLayout.setVisibility(View.GONE); - } - - /** - * Set the listener when refresh is triggered and enable the SwipeRefreshLayout - * @param listener - */ - public void setRefreshListener(SwipeRefreshLayout.OnRefreshListener listener) { - mPtrLayout.setEnabled(true); - mPtrLayout.setOnRefreshListener(listener); - } - - /** - * Set the colors for the SwipeRefreshLayout states - * @param col1 - * @param col2 - * @param col3 - * @param col4 - */ - public void setRefreshingColor(int col1, int col2, int col3, int col4) { - mPtrLayout.setColorScheme(col1, col2, col3, col4); - } - - /** - * Hide the progressbar - */ - public void hideProgress() { - mProgress.setVisibility(View.GONE); - } - - /** - * Hide the listview - */ - public void hideList() { - mList.setVisibility(View.GONE); - } - - /** - * Set the scroll listener for the listview - * @param listener - */ - public void setOnScrollListener(AbsListView.OnScrollListener listener) { - mOnScrollListener = listener; - } - - /** - * Set the onItemClickListener for the listview - * @param listener - */ - public void setOnItemClickListener(AdapterView.OnItemClickListener listener) { - mList.setOnItemClickListener(listener); - } - - /** - * - * @return the listview adapter - */ - public ListAdapter getAdapter() { - return mList.getAdapter(); - } - - private int getFirstVisiblePosition() { - return mList.getFirstVisiblePosition(); - } - - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - if(mOnScrollListener != null) mOnScrollListener.onScrollStateChanged(view, scrollState); - } - - /** - * Sets the More listener - * @param onMoreListener - * @param max Number of items before loading more - */ - public void setupMoreListener(OnMoreListener onMoreListener, int max) { - setOnMoreListener(onMoreListener); - ITEM_LEFT_TO_LOAD_MORE = max; - } - - public void setOnMoreListener(OnMoreListener onMoreListener) { - mOnMoreListener = onMoreListener; - if (mMoreErrorView != null) { - mMoreErrorView.setOnClickListener(new OnClickListener() { - @Override public void onClick(View v) { - showMoreProgress(); - mOnMoreListener.onMoreAsked(mList.getAdapter().getCount(), ITEM_LEFT_TO_LOAD_MORE, getFirstVisiblePosition()); - } - }); - } - } - - public void setNumberBeforeMoreIsCalled(int max) { - ITEM_LEFT_TO_LOAD_MORE = max; - } - - public boolean isLoadingMore() { - return isLoadingMore; - } - - /** - * Enable/Disable the More event - * @param isLoadingMore - */ - public void setLoadingMore(boolean isLoadingMore) { - this.isLoadingMore = isLoadingMore; - } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, - int totalItemCount) { - if (!isLoadingMore && mMoreItemsAvailable) { - if (((totalItemCount - firstVisibleItem - visibleItemCount) == ITEM_LEFT_TO_LOAD_MORE || (totalItemCount - firstVisibleItem - visibleItemCount) == 0 && totalItemCount > visibleItemCount)) { - isLoadingMore = true; - if (mOnMoreListener != null) { - showMoreProgress(); - mOnMoreListener.onMoreAsked(mList.getAdapter().getCount(), ITEM_LEFT_TO_LOAD_MORE, firstVisibleItem); - - } - } - } - if(mOnScrollListener != null) mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); - } - - /** - * Remove the moreListener - */ - public void removeMoreListener() { - mOnMoreListener = null; - } - - - public void setOnTouchListener(OnTouchListener listener) { - mList.setOnTouchListener(listener); - } - - public void setRefreshing(boolean refreshing) { - mPtrLayout.setRefreshing(refreshing); - } -} diff --git a/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/OnMoreListener.java b/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/OnMoreListener.java deleted file mode 100644 index 0415a93..0000000 --- a/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/OnMoreListener.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.quentindommerc.superlistview; - -/** - * Created by kentin on 24/04/14. - */ -public interface OnMoreListener { - /** - * @param numberOfItems - * @param numberBeforeMore - * @param currentItemPos - */ - public void onMoreAsked(int numberOfItems, int numberBeforeMore, int currentItemPos); -} diff --git a/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/SuperGridview.java b/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/SuperGridview.java deleted file mode 100644 index 7b6d38d..0000000 --- a/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/SuperGridview.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.quentindommerc.superlistview; - -import android.content.Context; -import android.content.res.TypedArray; -import android.util.AttributeSet; -import android.view.View; -import android.widget.GridView; -import android.widget.ListAdapter; - -import com.quentindommerc.superlistview.superlistview.R; - - -/** - * Created by kentin on 24/04/14. - */ -public class SuperGridview extends BaseSuperAbsListview { - - //------------------------------------------------------- - // Custom Grid attributes - //------------------------------------------------------- - private int mColumns; - private int mHorizontalSpacing; - private int mVerticalSpacing; - - - public SuperGridview(Context context) { - super(context); - } - - public SuperGridview(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public SuperGridview(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - @Override - public GridView getList(){ - return (GridView) mList; - } - - @Override - protected void initAttrs(AttributeSet attrs) { - super.initAttrs(attrs); - - TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.superlistview); - try { - mSuperListViewMainLayout = a.getResourceId(R.styleable.superlistview_superlv_mainLayoutID, R.layout.view_progress_gridview); - } finally { - a.recycle(); - } - - TypedArray ag = getContext().obtainStyledAttributes(attrs, R.styleable.supergridview); - try { - mColumns = ag.getInt(R.styleable.supergridview_supergv__columns, 1); - mVerticalSpacing = (int) ag.getDimension(R.styleable.supergridview_supergv__verticalSpacing, 1); - mHorizontalSpacing = (int) ag.getDimension(R.styleable.supergridview_supergv__horizontalSpacing, 1); - } finally { - ag.recycle(); - } - } - - @Override - protected void initAbsListView(View v) { - - View listView = v.findViewById(android.R.id.list); - if (listView instanceof GridView) - mList = (GridView) listView; - else - throw new IllegalArgumentException(listView.getClass().getName()); - - if (mList!=null) { - - getList().setNumColumns(mColumns); - getList().setVerticalSpacing(mVerticalSpacing); - getList().setHorizontalSpacing(mHorizontalSpacing); - getList().setHorizontalSpacing((int) mDividerHeight); - getList().setVerticalSpacing((int) mDividerHeight); - - mList.setClipToPadding(mClipToPadding); - - mList.setOnScrollListener(this); - if (mSelector != 0) - mList.setSelector(mSelector); - - if (mPadding != -1.0f) { - mList.setPadding(mPadding, mPadding, mPadding, mPadding); - } else { - mList.setPadding(mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom); - } - - mList.setScrollBarStyle(mScrollbarStyle); - } - } - - @Override - public void setAdapter(ListAdapter adapter) { - getList().setAdapter(adapter); - super.setAdapter(adapter); - } - - @Override - public void clear() { - getList().setAdapter(null); - } - -} diff --git a/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/SuperListview.java b/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/SuperListview.java deleted file mode 100644 index da707da..0000000 --- a/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/SuperListview.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.quentindommerc.superlistview; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.drawable.ColorDrawable; -import android.util.AttributeSet; -import android.view.View; -import android.widget.ArrayAdapter; -import android.widget.ListAdapter; -import android.widget.ListView; - -import com.quentindommerc.superlistview.superlistview.R; - - -/** - * Created by kentin on 24/04/14. - */ -public class SuperListview extends BaseSuperAbsListview { - - public SuperListview(Context context) { - super(context); - } - - - public SuperListview(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public SuperListview(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - @Override - public ListView getList(){ - return (ListView) mList; - } - - @Override - protected void initAttrs(AttributeSet attrs) { - super.initAttrs(attrs); - TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.superlistview); - try { - mSuperListViewMainLayout = a.getResourceId(R.styleable.superlistview_superlv_mainLayoutID, R.layout.view_progress_listview); - } finally { - a.recycle(); - } - } - - @Override - protected void initAbsListView(View v) { - - View listView = v.findViewById(android.R.id.list); - - if (listView instanceof ListView) - mList = (ListView) listView; - else - throw new IllegalArgumentException("SuperListView works with a List!"); - - - if (mList!=null) { - - - mList.setClipToPadding(mClipToPadding); - - getList().setDivider(new ColorDrawable(mDivider)); - getList().setDividerHeight((int) mDividerHeight); - - mList.setOnScrollListener(this); - if (mSelector != 0) - mList.setSelector(mSelector); - - if (mPadding != -1.0f) { - mList.setPadding(mPadding, mPadding, mPadding, mPadding); - } else { - mList.setPadding(mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom); - } - - if (mScrollbarStyle != -1) - mList.setScrollBarStyle(mScrollbarStyle); - } - } - - @Override - public void setAdapter(ListAdapter adapter) { - getList().setAdapter(adapter); - super.setAdapter(adapter); - } - - @Override - public void clear() { - getList().setAdapter(null); - } - - public void setupSwipeToDismiss(final SwipeDismissListViewTouchListener.DismissCallbacks listener, final boolean autoRemove) { - SwipeDismissListViewTouchListener touchListener = - new SwipeDismissListViewTouchListener((ListView) mList, new SwipeDismissListViewTouchListener.DismissCallbacks() { - @Override - public boolean canDismiss(int position) { - return listener.canDismiss(position); - } - - @Override - public void onDismiss(ListView listView, int[] reverseSortedPositions) { - if (autoRemove) { - for (int position : reverseSortedPositions) { - - ((ArrayAdapter)mList.getAdapter()).remove(mList.getAdapter().getItem(position)); - } - ((ArrayAdapter)mList.getAdapter()).notifyDataSetChanged(); - } - listener.onDismiss(listView, reverseSortedPositions); - } - }); - mList.setOnTouchListener(touchListener); - } -} diff --git a/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/SwipeDismissListViewTouchListener.java b/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/SwipeDismissListViewTouchListener.java deleted file mode 100644 index 0dda2e8..0000000 --- a/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/SwipeDismissListViewTouchListener.java +++ /dev/null @@ -1,413 +0,0 @@ -/* - * Copyright 2013 Google Inc. - * - * 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.quentindommerc.superlistview; - -import android.graphics.Rect; -import android.os.SystemClock; -import android.support.v4.view.MotionEventCompat; -import android.view.MotionEvent; -import android.view.VelocityTracker; -import android.view.View; -import android.view.ViewConfiguration; -import android.view.ViewGroup; -import android.view.ViewPropertyAnimator; -import android.widget.AbsListView; -import android.widget.ListView; - -import com.nineoldandroids.animation.Animator; -import com.nineoldandroids.animation.AnimatorListenerAdapter; -import com.nineoldandroids.animation.ValueAnimator; -import com.nineoldandroids.view.animation.AnimatorProxy; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static com.nineoldandroids.view.ViewPropertyAnimator.animate; - -/** - * A {@link View.OnTouchListener} that makes the list items in a {@link ListView} - * dismissable. {@link ListView} is given special treatment because by default it handles touches - * for its list items... i.e. it's in charge of drawing the pressed state (the list selector), - * handling list item clicks, etc. - * - *

After creating the listener, the caller should also call - * {@link ListView#setOnScrollListener(AbsListView.OnScrollListener)}, passing - * in the scroll listener returned by {@link #makeScrollListener()}. If a scroll listener is - * already assigned, the caller should still pass scroll changes through to this listener. This will - * ensure that this {@link com.quentindommerc.superlistview.SwipeDismissListViewTouchListener} is paused during list view - * scrolling.

- * - *

Example usage:

- * - *
- * SwipeDismissListViewTouchListener touchListener =
- *         new SwipeDismissListViewTouchListener(
- *                 listView,
- *                 new SwipeDismissListViewTouchListener.OnDismissCallback() {
- *                     public void onDismiss(ListView listView, int[] reverseSortedPositions) {
- *                         for (int position : reverseSortedPositions) {
- *                             adapter.remove(adapter.getItem(position));
- *                         }
- *                         adapter.notifyDataSetChanged();
- *                     }
- *                 });
- * listView.setOnTouchListener(touchListener);
- * listView.setOnScrollListener(touchListener.makeScrollListener());
- * 
- * - *

This class Requires API level 12 or later due to use of {@link - * ViewPropertyAnimator}.

- * - *

For a generalized {@link View.OnTouchListener} that makes any view dismissable, - * see {@link SwipeDismissTouchListener}.

- * - * @see SwipeDismissTouchListener - */ -public class SwipeDismissListViewTouchListener implements View.OnTouchListener { - // Cached ViewConfiguration and system-wide constant values - private int mSlop; - private int mMinFlingVelocity; - private int mMaxFlingVelocity; - private long mAnimationTime; - - // Fixed properties - private ListView mListView; - private DismissCallbacks mCallbacks; - private int mViewWidth = 1; // 1 and not 0 to prevent dividing by zero - - // Transient properties - private List mPendingDismisses = new ArrayList(); - private int mDismissAnimationRefCount = 0; - private float mDownX; - private float mDownY; - private boolean mSwiping; - private int mSwipingSlop; - private VelocityTracker mVelocityTracker; - private int mDownPosition; - private View mDownView; - private AnimatorProxy mDownViewProxy; - private boolean mPaused; - - /** - * The callback interface used by {@link com.quentindommerc.superlistview.SwipeDismissListViewTouchListener} to inform its client - * about a successful dismissal of one or more list item positions. - */ - public interface DismissCallbacks { - /** - * Called to determine whether the given position can be dismissed. - */ - boolean canDismiss(int position); - - /** - * Called when the user has indicated they she would like to dismiss one or more list item - * positions. - * - * @param listView The originating {@link ListView}. - * @param reverseSortedPositions An array of positions to dismiss, sorted in descending - * order for convenience. - */ - void onDismiss(ListView listView, int[] reverseSortedPositions); - } - - /** - * Constructs a new swipe-to-dismiss touch listener for the given list view. - * - * @param listView The list view whose items should be dismissable. - * @param callbacks The callback to trigger when the user has indicated that she would like to - * dismiss one or more list items. - */ - public SwipeDismissListViewTouchListener(ListView listView, DismissCallbacks callbacks) { - ViewConfiguration vc = ViewConfiguration.get(listView.getContext()); - mSlop = vc.getScaledTouchSlop(); - mMinFlingVelocity = vc.getScaledMinimumFlingVelocity() * 16; - mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity(); - mAnimationTime = listView.getContext().getResources().getInteger( - android.R.integer.config_shortAnimTime); - mListView = listView; - mCallbacks = callbacks; - } - - /** - * Enables or disables (pauses or resumes) watching for swipe-to-dismiss gestures. - * - * @param enabled Whether or not to watch for gestures. - */ - public void setEnabled(boolean enabled) { - mPaused = !enabled; - } - - /** - * Returns an {@link AbsListView.OnScrollListener} to be added to the {@link - * ListView} using {@link ListView#setOnScrollListener(AbsListView.OnScrollListener)}. - * If a scroll listener is already assigned, the caller should still pass scroll changes through - * to this listener. This will ensure that this {@link com.quentindommerc.superlistview.SwipeDismissListViewTouchListener} is - * paused during list view scrolling.

- * - * @see com.quentindommerc.superlistview.SwipeDismissListViewTouchListener - */ - public AbsListView.OnScrollListener makeScrollListener() { - return new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView absListView, int scrollState) { - setEnabled(scrollState != AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); - } - - @Override - public void onScroll(AbsListView absListView, int i, int i1, int i2) { - } - }; - } - - @Override - public boolean onTouch(View view, MotionEvent motionEvent) { - if (mViewWidth < 2) { - mViewWidth = mListView.getWidth(); - } - - switch (MotionEventCompat.getActionMasked(motionEvent)) { - case MotionEvent.ACTION_DOWN: { - if (mPaused) { - return false; - } - - // TODO: ensure this is a finger, and set a flag - - // Find the child view that was touched (perform a hit test) - Rect rect = new Rect(); - int childCount = mListView.getChildCount(); - int[] listViewCoords = new int[2]; - mListView.getLocationOnScreen(listViewCoords); - int x = (int) motionEvent.getRawX() - listViewCoords[0]; - int y = (int) motionEvent.getRawY() - listViewCoords[1]; - View child; - for (int i = 0; i < childCount; i++) { - child = mListView.getChildAt(i); - child.getHitRect(rect); - if (rect.contains(x, y)) { - mDownView = child; - mDownViewProxy = AnimatorProxy.wrap(child); - break; - } - } - - if (mDownView != null) { - mDownX = motionEvent.getRawX(); - mDownY = motionEvent.getRawY(); - mDownPosition = mListView.getPositionForView(mDownView); - if (mCallbacks.canDismiss(mDownPosition)) { - mVelocityTracker = VelocityTracker.obtain(); - mVelocityTracker.addMovement(motionEvent); - } else { - mDownView = null; - mDownViewProxy= null; - } - } - return false; - } - - case MotionEvent.ACTION_CANCEL: { - if (mVelocityTracker == null) { - break; - } - - if (mDownView != null && mSwiping) { - // cancel - animate(mDownView) - .translationX(0) - .alpha(1) - .setDuration(mAnimationTime) - .setListener(null); - } - mVelocityTracker.recycle(); - mVelocityTracker = null; - mDownX = 0; - mDownY = 0; - mDownView = null; - mDownViewProxy= null; - mDownPosition = ListView.INVALID_POSITION; - mSwiping = false; - break; - } - - case MotionEvent.ACTION_UP: { - if (mVelocityTracker == null) { - break; - } - - float deltaX = motionEvent.getRawX() - mDownX; - mVelocityTracker.addMovement(motionEvent); - mVelocityTracker.computeCurrentVelocity(1000); - float velocityX = mVelocityTracker.getXVelocity(); - float absVelocityX = Math.abs(velocityX); - float absVelocityY = Math.abs(mVelocityTracker.getYVelocity()); - boolean dismiss = false; - boolean dismissRight = false; - if (Math.abs(deltaX) > mViewWidth / 2 && mSwiping) { - dismiss = true; - dismissRight = deltaX > 0; - } else if (mMinFlingVelocity <= absVelocityX && absVelocityX <= mMaxFlingVelocity - && absVelocityY < absVelocityX && mSwiping) { - // dismiss only if flinging in the same direction as dragging - dismiss = (velocityX < 0) == (deltaX < 0); - dismissRight = mVelocityTracker.getXVelocity() > 0; - } - if (dismiss && mDownPosition != ListView.INVALID_POSITION) { - // dismiss - final View downView = mDownView; // mDownView gets null'd before animation ends - final int downPosition = mDownPosition; - ++mDismissAnimationRefCount; - animate(mDownView) - .translationX(dismissRight ? mViewWidth : -mViewWidth) - .alpha(0) - .setDuration(mAnimationTime) - .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - performDismiss(downView, downPosition); - } - }); - } else { - animate(mDownView) - .translationX(0) - .alpha(1) - .setDuration(mAnimationTime) - .setListener(null); - } - mVelocityTracker.recycle(); - mVelocityTracker = null; - mDownX = 0; - mDownY = 0; - mDownView = null; - mDownViewProxy= null; - mDownPosition = ListView.INVALID_POSITION; - mSwiping = false; - break; - } - - case MotionEvent.ACTION_MOVE: { - if (mVelocityTracker == null || mPaused) { - break; - } - - mVelocityTracker.addMovement(motionEvent); - float deltaX = motionEvent.getRawX() - mDownX; - float deltaY = motionEvent.getRawY() - mDownY; - if (Math.abs(deltaX) > mSlop && Math.abs(deltaY) < Math.abs(deltaX) / 2) { - mSwiping = true; - mSwipingSlop = (deltaX > 0 ? mSlop : -mSlop); - mListView.requestDisallowInterceptTouchEvent(true); - - // Cancel ListView's touch (un-highlighting the item) - MotionEvent cancelEvent = MotionEvent.obtain(motionEvent); - cancelEvent.setAction(MotionEvent.ACTION_CANCEL | - (MotionEventCompat.getActionIndex(motionEvent) - << MotionEventCompat.ACTION_POINTER_INDEX_SHIFT)); - mListView.onTouchEvent(cancelEvent); - cancelEvent.recycle(); - } - - if (mSwiping) { - mDownViewProxy.setTranslationX(deltaX - mSwipingSlop); - mDownViewProxy.setAlpha(Math.max(0f, Math.min(1f, - 1f - 2f * Math.abs(deltaX) / mViewWidth))); - return true; - } - break; - } - } - return false; - } - - class PendingDismissData implements Comparable { - public int position; - public View view; - - public PendingDismissData(int position, View view) { - this.position = position; - this.view = view; - } - - @Override - public int compareTo(PendingDismissData other) { - // Sort by descending position - return other.position - position; - } - } - - private void performDismiss(final View dismissView, final int dismissPosition) { - // Animate the dismissed list item to zero-height and fire the dismiss callback when - // all dismissed list item animations have completed. This triggers layout on each animation - // frame; in the future we may want to do something smarter and more performant. - - final ViewGroup.LayoutParams lp = dismissView.getLayoutParams(); - final int originalHeight = dismissView.getHeight(); - - ValueAnimator animator = ValueAnimator.ofInt(originalHeight, 1).setDuration(mAnimationTime); - - animator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - --mDismissAnimationRefCount; - if (mDismissAnimationRefCount == 0) { - // No active animations, process all pending dismisses. - // Sort by descending position - Collections.sort(mPendingDismisses); - - int[] dismissPositions = new int[mPendingDismisses.size()]; - for (int i = mPendingDismisses.size() - 1; i >= 0; i--) { - dismissPositions[i] = mPendingDismisses.get(i).position; - } - mCallbacks.onDismiss(mListView, dismissPositions); - - // Reset mDownPosition to avoid MotionEvent.ACTION_UP trying to start a dismiss - // animation with a stale position - mDownPosition = ListView.INVALID_POSITION; - - ViewGroup.LayoutParams lp; - for (PendingDismissData pendingDismiss : mPendingDismisses) { - // Reset view presentation - AnimatorProxy.wrap(pendingDismiss.view).setAlpha(1f); - AnimatorProxy.wrap(pendingDismiss.view).setTranslationX(0); - lp = pendingDismiss.view.getLayoutParams(); - lp.height = originalHeight; - pendingDismiss.view.setLayoutParams(lp); - } - - // Send a cancel event - long time = SystemClock.uptimeMillis(); - MotionEvent cancelEvent = MotionEvent.obtain(time, time, - MotionEvent.ACTION_CANCEL, 0, 0, 0); - mListView.dispatchTouchEvent(cancelEvent); - - mPendingDismisses.clear(); - } - } - }); - - animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator valueAnimator) { - lp.height = (Integer) valueAnimator.getAnimatedValue(); - dismissView.setLayoutParams(lp); - } - }); - - mPendingDismisses.add(new PendingDismissData(dismissPosition, dismissView)); - animator.start(); - } -} \ No newline at end of file diff --git a/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/SwipeDismissTouchListener.java b/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/SwipeDismissTouchListener.java deleted file mode 100644 index d4fe765..0000000 --- a/SuperListviewLibrary/src/main/java/com/quentindommerc/superlistview/SwipeDismissTouchListener.java +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright 2013 Google Inc. - * - * 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.quentindommerc.superlistview; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ValueAnimator; -import android.annotation.TargetApi; -import android.app.ListActivity; -import android.app.ListFragment; -import android.os.Build; -import android.view.MotionEvent; -import android.view.VelocityTracker; -import android.view.View; -import android.view.ViewConfiguration; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ListView; - -/** - * A {@link View.OnTouchListener} that makes any {@link View} dismissable when the - * user swipes (drags her finger) horizontally across the view. - * - *

For {@link ListView} list items that don't manage their own touch events - * (i.e. you're using - * {@link ListView#setOnItemClickListener(AdapterView.OnItemClickListener)} - * or an equivalent listener on {@link ListActivity} or - * {@link ListFragment}, use {@link SwipeDismissListViewTouchListener} instead.

- * - *

Example usage:

- * - *
- * view.setOnTouchListener(new SwipeDismissTouchListener(
- *         view,
- *         null, // Optional token/cookie object
- *         new SwipeDismissTouchListener.OnDismissCallback() {
- *             public void onDismiss(View view, Object token) {
- *                 parent.removeView(view);
- *             }
- *         }));
- * 
- * - *

This class Requires API level 12 or later due to use of {@link - * android.view.ViewPropertyAnimator}.

- * - * @see SwipeDismissListViewTouchListener - */ -public class SwipeDismissTouchListener implements View.OnTouchListener { - // Cached ViewConfiguration and system-wide constant values - private int mSlop; - private int mMinFlingVelocity; - private int mMaxFlingVelocity; - private long mAnimationTime; - - // Fixed properties - private View mView; - private DismissCallbacks mCallbacks; - private int mViewWidth = 1; // 1 and not 0 to prevent dividing by zero - - // Transient properties - private float mDownX; - private float mDownY; - private boolean mSwiping; - private int mSwipingSlop; - private Object mToken; - private VelocityTracker mVelocityTracker; - private float mTranslationX; - - /** - * The callback interface used by {@link com.quentindommerc.superlistview.SwipeDismissTouchListener} to inform its client - * about a successful dismissal of the view for which it was created. - */ - public interface DismissCallbacks { - /** - * Called to determine whether the view can be dismissed. - */ - boolean canDismiss(Object token); - - /** - * Called when the user has indicated they she would like to dismiss the view. - * - * @param view The originating {@link View} to be dismissed. - * @param token The optional token passed to this object's constructor. - */ - void onDismiss(View view, Object token); - } - - /** - * Constructs a new swipe-to-dismiss touch listener for the given view. - * - * @param view The view to make dismissable. - * @param token An optional token/cookie object to be passed through to the callback. - * @param callbacks The callback to trigger when the user has indicated that she would like to - * dismiss this view. - */ - @TargetApi(Build.VERSION_CODES.DONUT) - public SwipeDismissTouchListener(View view, Object token, DismissCallbacks callbacks) { - ViewConfiguration vc = ViewConfiguration.get(view.getContext()); - mSlop = vc.getScaledTouchSlop(); - mMinFlingVelocity = vc.getScaledMinimumFlingVelocity() * 16; - mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity(); - mAnimationTime = view.getContext().getResources().getInteger( - android.R.integer.config_shortAnimTime); - mView = view; - mToken = token; - mCallbacks = callbacks; - } - - @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) - @Override - public boolean onTouch(View view, MotionEvent motionEvent) { - // offset because the view is translated during swipe - motionEvent.offsetLocation(mTranslationX, 0); - - if (mViewWidth < 2) { - mViewWidth = mView.getWidth(); - } - - switch (motionEvent.getActionMasked()) { - case MotionEvent.ACTION_DOWN: { - // TODO: ensure this is a finger, and set a flag - mDownX = motionEvent.getRawX(); - mDownY = motionEvent.getRawY(); - if (mCallbacks.canDismiss(mToken)) { - mVelocityTracker = VelocityTracker.obtain(); - mVelocityTracker.addMovement(motionEvent); - } - return false; - } - - case MotionEvent.ACTION_UP: { - if (mVelocityTracker == null) { - break; - } - - float deltaX = motionEvent.getRawX() - mDownX; - mVelocityTracker.addMovement(motionEvent); - mVelocityTracker.computeCurrentVelocity(1000); - float velocityX = mVelocityTracker.getXVelocity(); - float absVelocityX = Math.abs(velocityX); - float absVelocityY = Math.abs(mVelocityTracker.getYVelocity()); - boolean dismiss = false; - boolean dismissRight = false; - if (Math.abs(deltaX) > mViewWidth / 2 && mSwiping) { - dismiss = true; - dismissRight = deltaX > 0; - } else if (mMinFlingVelocity <= absVelocityX && absVelocityX <= mMaxFlingVelocity - && absVelocityY < absVelocityX - && absVelocityY < absVelocityX && mSwiping) { - // dismiss only if flinging in the same direction as dragging - dismiss = (velocityX < 0) == (deltaX < 0); - dismissRight = mVelocityTracker.getXVelocity() > 0; - } - if (dismiss) { - // dismiss - mView.animate() - .translationX(dismissRight ? mViewWidth : -mViewWidth) - .alpha(0) - .setDuration(mAnimationTime) - .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - performDismiss(); - } - }); - } else if (mSwiping) { - // cancel - mView.animate() - .translationX(0) - .alpha(1) - .setDuration(mAnimationTime) - .setListener(null); - } - mVelocityTracker.recycle(); - mVelocityTracker = null; - mTranslationX = 0; - mDownX = 0; - mDownY = 0; - mSwiping = false; - break; - } - - case MotionEvent.ACTION_CANCEL: { - if (mVelocityTracker == null) { - break; - } - - mView.animate() - .translationX(0) - .alpha(1) - .setDuration(mAnimationTime) - .setListener(null); - mVelocityTracker.recycle(); - mVelocityTracker = null; - mTranslationX = 0; - mDownX = 0; - mDownY = 0; - mSwiping = false; - break; - } - - case MotionEvent.ACTION_MOVE: { - if (mVelocityTracker == null) { - break; - } - - mVelocityTracker.addMovement(motionEvent); - float deltaX = motionEvent.getRawX() - mDownX; - float deltaY = motionEvent.getRawY() - mDownY; - if (Math.abs(deltaX) > mSlop && Math.abs(deltaY) < Math.abs(deltaX) / 2) { - mSwiping = true; - mSwipingSlop = (deltaX > 0 ? mSlop : -mSlop); - mView.getParent().requestDisallowInterceptTouchEvent(true); - - // Cancel listview's touch - MotionEvent cancelEvent = MotionEvent.obtain(motionEvent); - cancelEvent.setAction(MotionEvent.ACTION_CANCEL | - (motionEvent.getActionIndex() << - MotionEvent.ACTION_POINTER_INDEX_SHIFT)); - mView.onTouchEvent(cancelEvent); - cancelEvent.recycle(); - } - - if (mSwiping) { - mTranslationX = deltaX; - mView.setTranslationX(deltaX - mSwipingSlop); - // TODO: use an ease-out interpolator or such - mView.setAlpha(Math.max(0f, Math.min(1f, - 1f - 2f * Math.abs(deltaX) / mViewWidth))); - return true; - } - break; - } - } - return false; - } - - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - private void performDismiss() { - // Animate the dismissed view to zero-height and then fire the dismiss callback. - // This triggers layout on each animation frame; in the future we may want to do something - // smarter and more performant. - - final ViewGroup.LayoutParams lp = mView.getLayoutParams(); - final int originalHeight = mView.getHeight(); - - ValueAnimator animator = ValueAnimator.ofInt(originalHeight, 1).setDuration(mAnimationTime); - - animator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mCallbacks.onDismiss(mView, mToken); - // Reset view presentation - mView.setAlpha(1f); - mView.setTranslationX(0); - lp.height = originalHeight; - mView.setLayoutParams(lp); - } - }); - - animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator valueAnimator) { - lp.height = (Integer) valueAnimator.getAnimatedValue(); - mView.setLayoutParams(lp); - } - }); - - animator.start(); - } -} \ No newline at end of file diff --git a/SuperListviewLibrary/src/main/res/drawable-hdpi/ic_launcher.png b/SuperListviewLibrary/src/main/res/drawable-hdpi/ic_launcher.png deleted file mode 100644 index 96a442e..0000000 Binary files a/SuperListviewLibrary/src/main/res/drawable-hdpi/ic_launcher.png and /dev/null differ diff --git a/SuperListviewLibrary/src/main/res/drawable-mdpi/ic_launcher.png b/SuperListviewLibrary/src/main/res/drawable-mdpi/ic_launcher.png deleted file mode 100644 index 359047d..0000000 Binary files a/SuperListviewLibrary/src/main/res/drawable-mdpi/ic_launcher.png and /dev/null differ diff --git a/SuperListviewLibrary/src/main/res/drawable-xhdpi/ic_launcher.png b/SuperListviewLibrary/src/main/res/drawable-xhdpi/ic_launcher.png deleted file mode 100644 index 71c6d76..0000000 Binary files a/SuperListviewLibrary/src/main/res/drawable-xhdpi/ic_launcher.png and /dev/null differ diff --git a/SuperListviewLibrary/src/main/res/drawable-xxhdpi/ic_launcher.png b/SuperListviewLibrary/src/main/res/drawable-xxhdpi/ic_launcher.png deleted file mode 100644 index 4df1894..0000000 Binary files a/SuperListviewLibrary/src/main/res/drawable-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/SuperListviewLibrary/src/main/res/layout/view_more_progress.xml b/SuperListviewLibrary/src/main/res/layout/view_more_progress.xml deleted file mode 100644 index 6ebd8a4..0000000 --- a/SuperListviewLibrary/src/main/res/layout/view_more_progress.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/SuperListviewLibrary/src/main/res/layout/view_progress.xml b/SuperListviewLibrary/src/main/res/layout/view_progress.xml deleted file mode 100644 index 6ebd8a4..0000000 --- a/SuperListviewLibrary/src/main/res/layout/view_progress.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/SuperListviewLibrary/src/main/res/layout/view_progress_gridview.xml b/SuperListviewLibrary/src/main/res/layout/view_progress_gridview.xml deleted file mode 100644 index a12ca16..0000000 --- a/SuperListviewLibrary/src/main/res/layout/view_progress_gridview.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/SuperListviewLibrary/src/main/res/layout/view_progress_listview.xml b/SuperListviewLibrary/src/main/res/layout/view_progress_listview.xml deleted file mode 100644 index 44cabf1..0000000 --- a/SuperListviewLibrary/src/main/res/layout/view_progress_listview.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/SuperListviewLibrary/src/main/res/values/attrs.xml b/SuperListviewLibrary/src/main/res/values/attrs.xml deleted file mode 100644 index a51440a..0000000 --- a/SuperListviewLibrary/src/main/res/values/attrs.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SuperListviewLibrary/src/main/res/values/dimens.xml b/SuperListviewLibrary/src/main/res/values/dimens.xml deleted file mode 100644 index 21e7b42..0000000 --- a/SuperListviewLibrary/src/main/res/values/dimens.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 8dp - \ No newline at end of file diff --git a/SuperListviewLibrary/src/main/res/values/strings.xml b/SuperListviewLibrary/src/main/res/values/strings.xml deleted file mode 100644 index b579173..0000000 --- a/SuperListviewLibrary/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - SuperListview - diff --git a/androidMvp/.gitignore b/androidMvp/.gitignore deleted file mode 100644 index e8fa30f..0000000 --- a/androidMvp/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build -*.iml diff --git a/androidMvp/build.gradle b/androidMvp/build.gradle deleted file mode 100644 index 5254892..0000000 --- a/androidMvp/build.gradle +++ /dev/null @@ -1,36 +0,0 @@ -apply plugin: 'com.android.library' - -apply plugin: 'me.tatarka.retrolambda' - -android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" - - defaultConfig { - minSdkVersion 9 - targetSdkVersion 21 - versionCode 1 - versionName "1.0" - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - lintOptions { - abortOnError false - } -} - -dependencies { - compile 'io.reactivex:rxandroid:0.24.0' - compile 'com.android.support:appcompat-v7:21.0.3' - compile 'com.android.support:support-annotations:20.0.0' - compile 'org.parceler:parceler-api:0.2.14' -} diff --git a/androidMvp/src/main/AndroidManifest.xml b/androidMvp/src/main/AndroidManifest.xml deleted file mode 100644 index 95dd0ca..0000000 --- a/androidMvp/src/main/AndroidManifest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java deleted file mode 100644 index 4d6dd01..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java +++ /dev/null @@ -1,56 +0,0 @@ -package it.cosenonjaviste.lib.mvp; - -import android.os.Bundle; -import android.support.v4.app.Fragment; - -import org.parceler.Parcels; - -import it.cosenonjaviste.lib.mvp.utils.PresenterSaverFragment; - -public abstract class MvpFragment

, M> extends Fragment implements MvpView { - - private static final String PRESENTER_ID = "presenterId"; - public static final String MODEL = "model"; - - protected P presenter; - - @Override public void onCreate(Bundle state) { - super.onCreate(state); - - long presenterId = 0; - M restoredModel = null; - if (state != null) { - presenterId = state.getLong(PRESENTER_ID, 0); - restoredModel = Parcels.unwrap(state.getParcelable(MODEL)); - } - if (restoredModel == null && getArguments() != null) { - restoredModel = Parcels.unwrap(getArguments().getParcelable(MODEL)); - } - - presenter = PresenterSaverFragment.

load(getFragmentManager(), presenterId); - if (presenter == null) { - presenter = createPresenter(); - } - presenter.init(restoredModel); - - PresenterSaverFragment.save(getFragmentManager(), presenter); - } - - @Override public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putParcelable(MODEL, Parcels.wrap(presenter.getModel())); - outState.putLong(PRESENTER_ID, presenter.getId()); - } - - @Override public void onStart() { - super.onStart(); - presenter.subscribe(this); - } - - @Override public void onStop() { - presenter.pause(); - super.onStop(); - } - - protected abstract P createPresenter(); -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java deleted file mode 100644 index a73f3ea..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java +++ /dev/null @@ -1,50 +0,0 @@ -package it.cosenonjaviste.lib.mvp; - -import java.util.concurrent.atomic.AtomicLong; - -public abstract class MvpPresenter { - protected M model; - - protected MvpView view; - - private long id; - - private static AtomicLong sequence = new AtomicLong(1); - - protected MvpPresenter() { - id = sequence.getAndIncrement(); - } - - public void init(M model) { - this.model = model; - } - - public void initAndSubscribe(M model, MvpView view) { - init(model); - subscribe(view); - } - - public long getId() { - return id; - } - - public M getModel() { - return model; - } - - public void destroy() { - } - - public void subscribe(MvpView view) { - this.view = view; - view.update(model); - } - - public void pause() { - view = null; - } - - public MvpView getView() { - return view; - } -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java deleted file mode 100644 index 48f24d3..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java +++ /dev/null @@ -1,7 +0,0 @@ -package it.cosenonjaviste.lib.mvp; - -public interface MvpView { - void update(M model); - - void open(Class> viewClass, MM model); -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java deleted file mode 100644 index 79e69e1..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ /dev/null @@ -1,99 +0,0 @@ -package it.cosenonjaviste.lib.mvp; - - -import java.util.ArrayList; -import java.util.List; - -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import rx.Observable; -import rx.Subscriber; -import rx.functions.Action0; -import rx.functions.Action1; -import rx.functions.Actions; -import rx.functions.Func0; -import rx.observables.ConnectableObservable; -import rx.subscriptions.CompositeSubscription; - -public abstract class RxMvpPresenter extends MvpPresenter { - - private SchedulerManager schedulerManager; - - private final CompositeSubscription connectableSubscriptions = new CompositeSubscription(); - - private CompositeSubscription subscriptions = new CompositeSubscription(); - - private final List observables = new ArrayList<>(); - - public RxMvpPresenter(SchedulerManager schedulerManager) { - this.schedulerManager = schedulerManager; - } - - public void pause() { - super.pause(); - subscriptions.unsubscribe(); - subscriptions = new CompositeSubscription(); - } - - @Override public void subscribe(MvpView view) { - super.subscribe(view); - for (ObservableWithFactory observableWithFactory : observables) { - subscribe(observableWithFactory); - } - } - - public void destroy() { - connectableSubscriptions.unsubscribe(); - } - - protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { - ConnectableObservable replay = schedulerManager.bindObservable(observable).replay(); - connectableSubscriptions.add(replay.connect()); - Func0> factory = () -> new Subscriber() { - @Override public void onStart() { - if (onAttach != null) { - onAttach.call(); - } - } - - @Override public void onCompleted() { - - } - - @Override public void onError(Throwable e) { - if (onError != null) { - onError.call(e); - } - } - - @Override public void onNext(T t) { - if (onNext != null) { - onNext.call(t); - } - } - }; - ObservableWithFactory observableWithFactory = new ObservableWithFactory<>(replay, factory); - observables.add(observableWithFactory); - subscribe(observableWithFactory); - } - - private void subscribe(ObservableWithFactory observableWithFactory) { - Observable observable = observableWithFactory.observable; - Subscriber subscriber = observableWithFactory.subscriberFactory.call(); - subscriptions.add(observable.subscribe( - Actions.empty(), - t -> observables.remove(observableWithFactory), - () -> observables.remove(observableWithFactory))); - subscriptions.add(observable.subscribe(subscriber)); - } - - public static class ObservableWithFactory { - public final Observable observable; - - public final Func0> subscriberFactory; - - ObservableWithFactory(Observable observable, Func0> subscriberFactory) { - this.observable = observable; - this.subscriberFactory = subscriberFactory; - } - } -} \ No newline at end of file diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalItem.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalItem.java deleted file mode 100644 index c0c5791..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalItem.java +++ /dev/null @@ -1,106 +0,0 @@ -package it.cosenonjaviste.lib.mvp.utils; - -import android.os.Parcel; -import android.os.Parcelable; - -import org.parceler.Parcels; -import org.parceler.Transient; - -import rx.functions.Action0; -import rx.functions.Action1; - -public class OptionalItem implements Parcelable { - - @Transient - T object; - - Throwable throwable; - - public OptionalItem() { - } - - public OptionalItem(T object) { - this.object = object; - } - - public OptionalItem(T object, Throwable throwable) { - this.object = object; - this.throwable = throwable; - } - - public T getObject() { - return object; - } - - public void done(T object) { - throwable = null; - this.object = object; - } - - public Throwable getThrowable() { - return throwable; - } - - public void error(Throwable throwable) { - this.throwable = throwable; - } - - public boolean isEmpty() { - return throwable == null && object == null; - } - - public boolean isError() { - return throwable != null; - } - - public boolean isValueAvalaible() { - return !isError() && !isEmpty(); - } - - public OptionalItem call(Action1 action) { - if (!isEmpty() && !isError()) { - action.call(object); - } - return this; - } - - public OptionalItem whenEmpty(Action0 action) { - if (isEmpty()) { - action.call(); - } - return this; - } - - public OptionalItem whenError(Action1 action) { - if (isError()) { - action.call(throwable); - } - return this; - } - - @Override public int describeContents() { - return 0; - } - - @Override public void writeToParcel(Parcel parcel, int flags) { - parcel.writeParcelable(Parcels.wrap(object), 0); - parcel.writeSerializable(throwable); - } - - protected void readFromParcel(Parcel in) { - object = Parcels.unwrap(in.readParcelable(getClass().getClassLoader())); - throwable = (Throwable) in.readSerializable(); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public OptionalItem createFromParcel(Parcel in) { - OptionalItem person = new OptionalItem<>(); - person.readFromParcel(in); - return person; - } - - public OptionalItem[] newArray(int size) { - return new OptionalItem[size]; - } - }; -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalList.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalList.java deleted file mode 100644 index 80b8503..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalList.java +++ /dev/null @@ -1,58 +0,0 @@ -package it.cosenonjaviste.lib.mvp.utils; - -import android.os.Parcel; -import android.os.Parcelable; - -import java.util.ArrayList; -import java.util.List; - -public class OptionalList extends OptionalItem> implements Parcelable { - public OptionalList() { - this(new ArrayList<>()); - } - - public OptionalList(List object) { - super(object); - } - - public OptionalList(List object, Throwable throwable) { - super(object, throwable); - } - - @Override public boolean isEmpty() { - return super.isEmpty() || getObject().isEmpty(); - } - - public int size() { - if (isValueAvalaible()) { - return getObject().size(); - } else { - return 0; - } - } - - public T get(int index) { - if (isValueAvalaible()) { - return getObject().get(index); - } else { - return null; - } - } - - public void append(List object) { - throwable = null; - this.object.addAll(object); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public OptionalList createFromParcel(Parcel in) { - OptionalList person = new OptionalList<>(); - person.readFromParcel(in); - return person; - } - - public OptionalList[] newArray(int size) { - return new OptionalList[size]; - } - }; -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java deleted file mode 100644 index 54ab192..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java +++ /dev/null @@ -1,50 +0,0 @@ -package it.cosenonjaviste.lib.mvp.utils; - -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; - -import java.util.HashMap; -import java.util.Map; - -import it.cosenonjaviste.lib.mvp.MvpPresenter; - -public class PresenterSaverFragment extends Fragment { - - private static final String TAG = PresenterSaverFragment.class.getName(); - - private Map> presenters = new HashMap<>(); - - public PresenterSaverFragment() { - setRetainInstance(true); - } - - public static void save(FragmentManager fragmentManager, MvpPresenter presenter) { - PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); - fragment.presenters.put(presenter.getId(), presenter); - } - - private static PresenterSaverFragment getPresenterSaverFragment(FragmentManager fragmentManager) { - PresenterSaverFragment fragment = (PresenterSaverFragment) fragmentManager.findFragmentByTag(TAG); - if (fragment == null) { - fragment = new PresenterSaverFragment(); - fragmentManager.beginTransaction().add(fragment, TAG).commit(); - } - return fragment; - } - - public static

> P load(FragmentManager fragmentManager, long id) { - if (id != 0) { - PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); - return (P) fragment.presenters.get(id); - } else { - return null; - } - } - - @Override public void onDestroy() { - super.onDestroy(); - for (MvpPresenter presenter : presenters.values()) { - presenter.destroy(); - } - } -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java deleted file mode 100644 index 66814b0..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java +++ /dev/null @@ -1,23 +0,0 @@ -package it.cosenonjaviste.lib.mvp.utils; - -import rx.Observable; -import rx.Scheduler; -import rx.schedulers.Schedulers; - -import static rx.android.schedulers.AndroidSchedulers.mainThread; - -public class SchedulerManager { - public static Scheduler io = Schedulers.io(); - - public static Observable background(Observable observable) { - return observable.subscribeOn(io).observeOn(mainThread()); - } - - public static void setIo(Scheduler io) { - SchedulerManager.io = io; - } - - public Observable bindObservable(Observable observable) { - return background(observable); - } -} diff --git a/app/build.gradle b/app/build.gradle index 4ce69d5..1e89460 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,26 +1,24 @@ repositories { mavenCentral() + maven { url 'https://maven.fabric.io/public' } } buildscript { repositories { mavenCentral() + maven { url 'https://maven.fabric.io/public' } } dependencies { - classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+' - classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.0.1x' + classpath 'io.fabric.tools:gradle:1.+' } } -apply plugin: 'android-sdk-manager' - apply plugin: 'com.android.application' +apply plugin: 'io.fabric' apply plugin: 'me.tatarka.retrolambda' -apply plugin: 'com.neenbedankt.android-apt' - apply plugin: "jacoco" apply plugin: 'com.github.kt3k.coveralls' @@ -31,11 +29,11 @@ retrolambda { } jacoco { - toolVersion = "0.7.2.201409121644" + toolVersion = "0.7.5.201505241946" } -coveralls.jacocoReportPath = 'build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml' +coveralls.jacocoReportPath = 'build/reports/jacoco/jacocoUnitTestReport/jacocoUnitTestReport.xml' android { compileOptions { @@ -44,22 +42,24 @@ android { } jacoco { - version = '0.7.2.201409121644' + version = '0.7.5.201505241946' } - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion 25 + buildToolsVersion '25.0.2' defaultConfig { applicationId "it.cosenonjaviste" minSdkVersion 14 - targetSdkVersion 21 - versionCode 11 - versionName "2.0" + targetSdkVersion 25 + versionCode 14 + versionName "2.1.2" buildConfigField "String", "CONSUMER_KEY", project.oauth_consumerKey buildConfigField "String", "CONSUMER_SECRET", project.oauth_consumerSecret buildConfigField "String", "ACCESS_TOKEN", project.oauth_accessToken buildConfigField "String", "ACCESS_TOKEN_SECRET", project.oauth_accessTokenSecret + buildConfigField "String", "MAILJET_USERNAME", project.mailjet_userName + buildConfigField "String", "MAILJET_PASSWORD", project.mailJetPassword testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -75,50 +75,87 @@ android { exclude 'META-INF/services/javax.annotation.processing.Processor' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' + exclude 'META-INF/rxjava.properties' exclude 'LICENSE.txt' } lintOptions { abortOnError false } + sourceSets { + androidTest.java.srcDirs = ['src/androidTest/java', 'src/sharedTest/java'] + test.java.srcDirs = ['src/test/java', 'src/sharedTest/java'] + } + dataBinding { + enabled = true + } } dependencies { - compile project(':androidMvp') - compile project(':ObjectGraphHolder') - compile project(':SuperListviewLibrary') - compile 'com.squareup.okhttp:okhttp:2.0.0' - compile 'com.squareup.retrofit:retrofit:1.9.0' - compile 'com.squareup.dagger:dagger:1.2.2' - compile 'org.twitter4j:twitter4j-core:4.0.2' - compile 'com.android.support:cardview-v7:21.0.3' - compile 'io.reactivex:rxandroid-framework:0.24.0' - compile 'com.jakewharton:butterknife:6.1.0' + annotationProcessor 'com.github.fabioCollini.lifecyclebinder:lifecyclebinder-processor:0.3.3' + compile 'com.github.fabioCollini.lifecyclebinder:lifecyclebinder-lib:0.3.3' + compile 'com.squareup.okhttp3:okhttp:3.6.0' + compile 'io.reactivex.rxjava2:rxandroid:2.0.1' + compile 'io.reactivex.rxjava2:rxjava:2.0.8' + compile 'com.android.support:cardview-v7:25.3.1' compile 'com.squareup.picasso:picasso:2.5.0' - apt 'com.squareup.dagger:dagger-compiler:1.2.2' - apt 'org.parceler:parceler:0.2.14' - - androidTestApt 'com.squareup.dagger:dagger-compiler:1.2.2' - androidTestCompile(project(':mvp-test')) { - exclude group: 'com.squareup.dagger' - exclude group: 'org.mockito' - exclude group: 'io.reactivex' - exclude group: 'com.squareup.okhttp', module: 'okhttp' - } - androidTestCompile 'com.google.dexmaker:dexmaker:1.0' - androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.0') { + compile 'com.android.support:recyclerview-v7:25.3.1' + compile 'com.android.support:design:25.3.1' + compile 'com.google.dagger:dagger:2.10' + compile 'org.glassfish:javax.annotation:10.0-b28' + annotationProcessor 'com.google.dagger:dagger-compiler:2.10' + compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.2' + annotationProcessor 'com.hannesdorfmann.parcelableplease:processor:1.0.2' + provided 'com.google.auto.value:auto-value:1.3' + annotationProcessor 'com.google.auto.value:auto-value:1.3' + annotationProcessor 'com.ryanharter.auto.value:auto-value-gson:0.4.5' + provided 'com.ryanharter.auto.value:auto-value-gson:0.4.5' + annotationProcessor 'com.ryanharter.auto.value:auto-value-parcel:0.2.5' + compile 'com.ryanharter.auto.value:auto-value-parcel-adapter:0.2.5' + + compile 'com.squareup.retrofit2:retrofit:2.2.0' + compile 'com.squareup.retrofit2:converter-gson:2.1.0' + compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' + compile 'org.twitter4j:twitter4j-core:4.0.2' + compile 'com.annimon:stream:1.0.3' + + compile 'com.nytimes.android:store2:0.0.1-SNAPSHOT' + compile 'com.nytimes.android:cache:0.0.1-SNAPSHOT' + compile 'com.nytimes.android:middleware2:0.0.1-SNAPSHOT' + compile 'com.nytimes.android:filesystem2:0.0.1-SNAPSHOT' + +// debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' + debugCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' + releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' + + testCompile 'junit:junit:4.12' + testCompile 'org.mockito:mockito-core:1.9.5' + testCompile 'org.assertj:assertj-core:1.7.0' + testCompile 'com.github.fabioCollini:DaggerMock:0.6.3' + + androidTestCompile 'com.github.fabioCollini:DaggerMock:0.6.3' + androidTestCompile 'com.google.dexmaker:dexmaker:1.2' + androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.2') { exclude group: 'org.hamcrest', module: 'hamcrest-core' } androidTestCompile 'com.squareup.spoon:spoon-client:1.0.5' - androidTestCompile('com.android.support.test.espresso:espresso-core:2.0') { + androidTestCompile 'com.android.support.test:runner:0.5' + androidTestCompile 'com.android.support.test:rules:0.5' + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') { exclude group: 'javax.inject', module: 'javax.inject' exclude group: 'com.squareup', module: 'javawriter' } - androidTestCompile 'com.android.support.test:testing-support-lib:0.1' - - testCompile project(':mvp-test') - testCompile 'junit:junit:4.12' - testCompile 'org.mockito:mockito-core:1.9.5' - testCompile 'org.assertj:assertj-core:1.7.0' + androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.2.2') { + exclude group: 'com.android.support', module: 'support-v4' + exclude group: 'com.android.support', module: 'appcompat-v7' + exclude group: 'com.android.support', module: 'design' + exclude group: 'com.android.support', module: 'recyclerview-v7' + exclude group: 'com.android.support.test.espresso', module: 'espresso-core' + } + androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.2' + androidTestCompile 'com.squareup.okhttp3:mockwebserver:3.6.0' + compile('com.crashlytics.sdk.android:crashlytics:2.5.2@aar') { + transitive = true; + } } // Define coverage source. @@ -135,19 +172,23 @@ task jacocoUnitTestReport(type: JacocoReport) { xml.enabled = true // coveralls plugin depends on xml format report html.enabled = true } - // class R is used, but usage will not be covered, so ignore this class from report - // This differs per plugin version (0.10 -> 0.11) - // have very different fileTrees. - // I have added rules to Ignore Dagger/Butterknife classDirectories = fileTree( dir: './build/intermediates/classes/debug', - excludes: ['it/cosenonjaviste/R*.class', - '**/*$InjectAdapter.class', - '**/*$ModuleAdapter.class', - '**/*$ViewInjector*.class' + excludes: ['**/R.class', + '**/R$*.class', + '**/BR.class', + '**/BuildConfig.class', + 'it/cosenonjaviste/databinding/**/*.class', + 'com/android/**/*.class', + 'android/**/*.class', + '**/*_MembersInjector.class', + '**/*_Factory.class', + '**/*_Provide*.class', + '**/*ParcelablePlease.class', + 'it/cosenonjaviste/ui/**/*.class', ]) sourceDirectories = files(coverageSourceDirs) - executionData = files('build/jacoco/testDebug.exec') + executionData = files('build/jacoco/testDebugUnitTest.exec') // Bit hacky but fixes https://code.google.com/p/android/issues/detail?id=69174. // We iterate through the compiled .class tree and rename $$ to $. doFirst { @@ -157,17 +198,13 @@ task jacocoUnitTestReport(type: JacocoReport) { } } } - afterEvaluate { - // just clean up coveralls dashboard, following reports are not of interest - testDebug.reports.junitXml.enabled = false - } } task mergeTestCodeCoverageResults(type: JacocoMerge) { description = 'Merge test code coverage results from junit and instrumentation test' destinationFile = file("build/outputs/code-coverage/merged-coverage.exec") doFirst {delete destinationFile} - executionData = files('build/outputs/code-coverage/connected/coverage.ec', 'build/jacoco/testDebug.exec') + executionData = files('build/outputs/code-coverage/connected/coverage.ec', 'build/jacoco/testDebugUnitTest.exec') } task jacocoTestReport(type: JacocoReport) { @@ -178,23 +215,22 @@ task jacocoTestReport(type: JacocoReport) { html.enabled = true } classDirectories = fileTree( - dir: 'build/intermediates/classes', + dir: 'build/intermediates/classes/debug', excludes: ['**/R.class', '**/R$*.class', - '**/BuildConfig.*', - '**/Manifest*.*', - '**/*$InjectAdapter.class', - '**/*$ModuleAdapter.class', - '**/*$ViewInjector*.class', - '**/*$Provide*.class', - '**/*Parceler$*.class', - '**/*$Parcelable*.class', - '**/androidtest/**/*.class' - ] - ) + '**/BR.class', + '**/BuildConfig.class', + 'it/cosenonjaviste/databinding/**/*.class', + 'com/android/**/*.class', + 'android/**/*.class', + '**/*_MembersInjector.class', + '**/*_Factory.class', + '**/*_Provide*.class', + '**/*ParcelablePlease.class' + ]) sourceDirectories = files(coverageSourceDirs) additionalSourceDirs = files(coverageSourceDirs) - executionData = files('build/outputs/code-coverage/merged-coverage.exec') + executionData = files('build/outputs/code-coverage/connected/coverage.ec') // Bit hacky but fixes https://code.google.com/p/android/issues/detail?id=69174. // We iterate through the compiled .class tree and rename $$ to $. doFirst { diff --git a/app/gradle.properties b/app/gradle.properties index 0facf18..b344a2f 100644 --- a/app/gradle.properties +++ b/app/gradle.properties @@ -1,4 +1,6 @@ oauth_consumerKey="123" oauth_consumerSecret="456" oauth_accessToken="789" -oauth_accessTokenSecret="012" \ No newline at end of file +oauth_accessTokenSecret="012" +mailjet_userName="" +mailJetPassword="" diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java deleted file mode 100644 index 82ab3e0..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package it.cosenonjaviste.androidtest; - -import javax.inject.Inject; - -import dagger.Module; -import it.cosenonjaviste.androidtest.base.CnjFragmentTest; -import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; -import it.cosenonjaviste.author.AuthorListFragment; -import it.cosenonjaviste.author.AuthorListModel; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; - -public class AuthorListTest extends CnjFragmentTest { - - @Inject MockWebServerWrapper server; - - public AuthorListTest() { - super(AuthorListFragment.class, new AuthorListModel()); - } - - @Override protected Object getTestModule() { - return new TestModule(); - } - - @Override protected void initAfterInject() { - super.initAfterInject(); - server.initDispatcher(JsonStubs.AUTHORS); - } - - public void testAuthorList() { - showUi(); - } - - @Module(injects = AuthorListTest.class, includes = MvpEspressoTestModule.class, overrides = true, library = true) - public static class TestModule { - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java deleted file mode 100644 index 09e5110..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package it.cosenonjaviste.androidtest; - -import javax.inject.Inject; - -import dagger.Module; -import it.cosenonjaviste.androidtest.base.CnjFragmentTest; -import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; -import it.cosenonjaviste.category.CategoryListFragment; -import it.cosenonjaviste.category.CategoryListModel; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; - -public class CategoryListTest extends CnjFragmentTest { - - @Inject MockWebServerWrapper server; - - public CategoryListTest() { - super(CategoryListFragment.class, new CategoryListModel()); - } - - @Override protected Object getTestModule() { - return new TestModule(); - } - - @Override protected void initAfterInject() { - super.initAfterInject(); - server.initDispatcher(JsonStubs.CATEGORIES); - } - - public void testCategoryList() throws InterruptedException { - showUi(); - } - - @Module(injects = {CategoryListTest.class}, includes = MvpEspressoTestModule.class) - public static class TestModule { - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java deleted file mode 100644 index e2c0435..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package it.cosenonjaviste.androidtest; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; -import it.cosenonjaviste.androidtest.base.CnjFragmentTest; -import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; -import it.cosenonjaviste.page.PageFragment; -import it.cosenonjaviste.page.PageModel; -import it.cosenonjaviste.page.PageUrlManager; -import it.cosenonjaviste.stubs.MockWebServerWrapper; - -public class PageTest extends CnjFragmentTest { - - @Inject MockWebServerWrapper server; - - public PageTest() { - super(PageFragment.class, new PageModel("url")); - } - - @Override protected void initAfterInject() { - super.initAfterInject(); - server.initDispatcher("CoseNonJaviste"); - } - - @Override protected Object getTestModule() { - return new TestModule(); - } - - public void testDetailFragment() { - showUi(); - } - - @Module(injects = {PageTest.class}, includes = MvpEspressoTestModule.class, library = true) - public static class TestModule { - @Provides @Singleton PageUrlManager providePostDetailUrlManager(MockWebServerWrapper server) { - return new PageUrlManager() { - @Override public String getUrl(String url) { - return server.getUrl(true); - } - }; - } - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java deleted file mode 100644 index c2e5ff4..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package it.cosenonjaviste.androidtest; - -import javax.inject.Inject; - -import dagger.Module; -import it.cosenonjaviste.androidtest.base.CnjFragmentTest; -import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; -import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.post.PostListFragment; -import it.cosenonjaviste.post.PostListModel; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; - -public class PostListTest extends CnjFragmentTest { - - @Inject MockWebServerWrapper server; - - public PostListTest() { - super(PostListFragment.class, new PostListModel()); - } - - @Override protected Object getTestModule() { - return new TestModule(); - } - - @Override protected void initAfterInject() { - super.initAfterInject(); - server.initDispatcher(JsonStubs.getPostList(WordPressService.POST_PAGE_SIZE)); - } - - public void testPostList() throws InterruptedException { - showUi(); - } - - @Module(injects = {PostListTest.class}, includes = MvpEspressoTestModule.class) - public static class TestModule { - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java deleted file mode 100644 index 4ae3af6..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package it.cosenonjaviste.androidtest; - -import dagger.Module; -import it.cosenonjaviste.androidtest.base.CnjFragmentTest; -import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; -import it.cosenonjaviste.twitter.TweetListFragment; -import it.cosenonjaviste.twitter.TweetListModel; - -public class TweetListTest extends CnjFragmentTest { - - public TweetListTest() { - super(TweetListFragment.class, new TweetListModel()); - } - - @Override protected Object getTestModule() { - return new TestModule(); - } - - public void testPostList() throws InterruptedException { - showUi(); - } - - @Module(injects = TweetListTest.class, includes = MvpEspressoTestModule.class) - public static class TestModule { - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseActivityTest.java deleted file mode 100644 index 7be1280..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseActivityTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package it.cosenonjaviste.androidtest.base; - -import android.app.Activity; -import android.content.Intent; -import android.test.ActivityInstrumentationTestCase2; - -import org.mockito.MockitoAnnotations; - -import dagger.ObjectGraph; -import it.cosenonjaviste.lib.mvp.dagger.DaggerApplication; -import it.cosenonjaviste.lib.mvp.dagger.ObjectGraphCreator; -import it.cosenonjaviste.lib.mvp.dagger.ObjectGraphHolder; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import rx.schedulers.Schedulers; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.Espresso.registerIdlingResources; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.scrollTo; -import static android.support.test.espresso.action.ViewActions.typeText; -import static android.support.test.espresso.matcher.ViewMatchers.withId; - -public class BaseActivityTest extends ActivityInstrumentationTestCase2 { - - private final boolean injectTest; - - public BaseActivityTest(Class activityClass) { - this(activityClass, false); - } - - public BaseActivityTest(Class activityClass, boolean injectTest) { - super(activityClass); - this.injectTest = injectTest; - } - - public void setUp() throws Exception { - super.setUp(); - Intent activityIntent = createActivityIntent(); - if (activityIntent != null) { - setActivityIntent(activityIntent); - } - setupDexmaker(); - - MockitoAnnotations.initMocks(this); - - final EspressoExecutor espressoExecutor = EspressoExecutor.newCachedThreadPool(); - - ObjectGraphHolder.forceObjectGraphCreator(new ObjectGraphCreator() { - @Override public ObjectGraph create(DaggerApplication app) { - Object[] modules = mergeArrays(app.getModules(), getTestModules()); - ObjectGraph objectGraph = ObjectGraph.create(modules); - if (injectTest) { - objectGraph.inject(BaseActivityTest.this); - initAfterInject(); - } - return objectGraph; - } - }); - - registerIdlingResources(espressoExecutor); - - SchedulerManager.setIo(Schedulers.from(espressoExecutor)); - - // Espresso will not launch our activity for us, we must launch it via getActivity(). - getActivity(); - } - - protected Intent createActivityIntent() { - return null; - } - - protected void initAfterInject() { - } - - @Override public T getActivity() { - return super.getActivity(); - } - - private Object[] mergeArrays(Object[] appModules, Object[] testModules) { - Object[] modules = new Object[testModules.length + appModules.length]; - System.arraycopy(appModules, 0, modules, 0, appModules.length); - System.arraycopy(testModules, 0, modules, appModules.length, testModules.length); - return modules; - } - - protected Object[] getTestModules() { - return new Object[0]; - } - - /** - * Workaround for Mockito and JB-MR2 incompatibility to avoid - * java.lang.IllegalArgumentException: dexcache == null - * - * @see - * https://code.google.com/p/dexmaker/issues/detail?id=2 - */ - private void setupDexmaker() { - // Explicitly set the Dexmaker cache, so tests that use mockito work - final String dexCache = getInstrumentation().getTargetContext().getCacheDir().getPath(); - System.setProperty("dexmaker.dexcache", dexCache); - } - - protected void clickOnView(int id) { - onView(withId(id)).perform(scrollTo(), click()); - } - - protected void clickOnViewNoScroll(int id) { - onView(withId(id)).perform(click()); - } - - protected void enterText(int id, String text) { - onView(withId(id)).perform(scrollTo(), typeText(text)); - } - - protected void showUi() { -// if (BuildConfig.ESPRESSO_DEBUG) -// { -// try { -// Thread.sleep(60000); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseFragmentTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseFragmentTest.java deleted file mode 100644 index 8e7aa7e..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseFragmentTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package it.cosenonjaviste.androidtest.base; - -import android.content.Intent; - -import it.cosenonjaviste.lib.mvp.MvpView; -import it.cosenonjaviste.utils.SingleFragmentActivity; - -public abstract class BaseFragmentTest extends BaseActivityTest { - private final Class> viewClass; - - public BaseFragmentTest(Class> viewClass) { - this(viewClass, false); - } - - public BaseFragmentTest(Class> viewClass, boolean injectTest) { - super(SingleFragmentActivity.class, injectTest); - this.viewClass = viewClass; - } - - @Override protected Intent createActivityIntent() { - return SingleFragmentActivity.createIntent(viewClass); - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/CnjFragmentTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/CnjFragmentTest.java deleted file mode 100644 index 8439693..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/CnjFragmentTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package it.cosenonjaviste.androidtest.base; - -import android.content.Intent; - -import org.parceler.Parcels; - -import it.cosenonjaviste.lib.mvp.MvpFragment; -import it.cosenonjaviste.lib.mvp.MvpView; - -public abstract class CnjFragmentTest extends BaseFragmentTest { - private final M model; - - public CnjFragmentTest(Class> viewClass, M model) { - super(viewClass, true); - this.model = model; - } - - @Override protected final Object[] getTestModules() { - return new Object[]{getTestModule()}; - } - - @Override protected Intent createActivityIntent() { - Intent activityIntent = super.createActivityIntent(); - activityIntent.putExtra(MvpFragment.MODEL, Parcels.wrap(model)); - return activityIntent; - } - - protected abstract Object getTestModule(); -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoExecutor.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoExecutor.java deleted file mode 100644 index 010b11b..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoExecutor.java +++ /dev/null @@ -1,66 +0,0 @@ -package it.cosenonjaviste.androidtest.base; - -import android.support.test.espresso.IdlingResource; - -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -public class EspressoExecutor extends ThreadPoolExecutor implements IdlingResource { - - private int runningTasks; - private ResourceCallback resourceCallback; - - private static EspressoExecutor singleton; - - public EspressoExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) { - super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); - } - - public static EspressoExecutor newCachedThreadPool() { - if (singleton == null) { - singleton = new EspressoExecutor(0, Integer.MAX_VALUE, - 60L, TimeUnit.SECONDS, - new SynchronousQueue()); - } - return singleton; - } - - @Override public void execute(final Runnable command) { - super.execute(new Runnable() { - @Override public void run() { - try { - incrementRunningTasks(); - command.run(); - } finally { - decrementRunningTasks(); - } - } - }); - } - - private synchronized void decrementRunningTasks() { - runningTasks--; - if (runningTasks == 0 && resourceCallback != null) { - resourceCallback.onTransitionToIdle(); - } - } - - private synchronized void incrementRunningTasks() { - runningTasks++; - } - - @Override public String getName() { - return "EspressoExecutor"; - } - - @Override public boolean isIdleNow() { - return runningTasks == 0; - } - - @Override - public void registerIdleTransitionCallback(ResourceCallback resourceCallback) { - this.resourceCallback = resourceCallback; - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java new file mode 100644 index 0000000..68f9a47 --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -0,0 +1,43 @@ +package it.cosenonjaviste.androidtest.base; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Parcelable; +import android.support.test.InstrumentationRegistry; +import android.support.test.rule.ActivityTestRule; +import android.support.v4.app.Fragment; + +import it.cosenonjaviste.core.base.ViewModel; +import it.cosenonjaviste.ui.utils.SingleFragmentActivity; + +public class FragmentRule extends ActivityTestRule { + private Class fragmentClass; + + public FragmentRule(Class fragmentClass) { + super(SingleFragmentActivity.class, false, false); + this.fragmentClass = fragmentClass; + } + + public SingleFragmentActivity launchFragment() { + return launchFragment(null); + } + + public void launchFragment(Parcelable model) { + Bundle bundle = new Bundle(); + bundle.putParcelable(ViewModel.MODEL, model); + launchFragment(bundle); + } + + public SingleFragmentActivity launchFragment(Bundle b) { + Intent intent = SingleFragmentActivity.populateIntent(new Intent(), fragmentClass); + if (b != null) { + intent.putExtras(b); + } + return launchActivity(intent); + } + + public T getApplication() { + return (T) InstrumentationRegistry.getTargetContext().getApplicationContext(); + } +} diff --git a/mvp-test/src/main/java/it/cosenonjaviste/stubs/MockWebServerWrapper.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MockWebServerWrapper.java similarity index 72% rename from mvp-test/src/main/java/it/cosenonjaviste/stubs/MockWebServerWrapper.java rename to app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MockWebServerWrapper.java index 4bdada6..7910f2d 100644 --- a/mvp-test/src/main/java/it/cosenonjaviste/stubs/MockWebServerWrapper.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MockWebServerWrapper.java @@ -1,34 +1,30 @@ -package it.cosenonjaviste.stubs; +package it.cosenonjaviste.androidtest.base; -import com.squareup.okhttp.mockwebserver.Dispatcher; -import com.squareup.okhttp.mockwebserver.MockResponse; -import com.squareup.okhttp.mockwebserver.MockWebServer; -import com.squareup.okhttp.mockwebserver.RecordedRequest; import java.io.IOException; import java.util.LinkedList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.function.Function; -import javax.inject.Inject; -import javax.inject.Singleton; +import okhttp3.mockwebserver.Dispatcher; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; -import rx.functions.Func1; - -@Singleton public class MockWebServerWrapper { private static MockWebServer server; private static LinkedList requests = new LinkedList<>(); - private static Func1 dispatchFunction; + private static Function dispatchFunction; - @Inject public MockWebServerWrapper() { + public MockWebServerWrapper() { if (server == null) { server = new MockWebServer(); try { - server.play(); + server.start(); } catch (IOException e) { throw new RuntimeException(e); } @@ -36,6 +32,10 @@ public class MockWebServerWrapper { } } + public static void initDispatcher(Function dispatchFunction) { + MockWebServerWrapper.dispatchFunction = dispatchFunction; + } + public void initDispatcher(String responseBody) { dispatchFunction = recordedRequest -> new MockResponse().setBody(responseBody); requests = new LinkedList<>(); @@ -45,7 +45,7 @@ private void initDispatcher() { server.setDispatcher(new Dispatcher() { @Override public MockResponse dispatch(RecordedRequest request) throws InterruptedException { requests.add(request); - return dispatchFunction.call(request); + return dispatchFunction.apply(request); } }); } @@ -64,7 +64,7 @@ public String getUrl(boolean initInBackgroundThread) { } private String getUrlSync() { - return server.getUrl("/").toString(); + return server.url("/").toString(); } public void shutdown() { diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java deleted file mode 100644 index a0e6222..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java +++ /dev/null @@ -1,23 +0,0 @@ -package it.cosenonjaviste.androidtest.base; - -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; -import it.cosenonjaviste.MvpTestModule; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.model.WordPressServiceFactory; -import it.cosenonjaviste.stubs.MockWebServerWrapper; - -@Module(library = true, overrides = true, includes = MvpTestModule.class) -public class MvpEspressoTestModule { - - @Provides @Singleton WordPressService provideWordPressService(MockWebServerWrapper mockWebServer) { - return WordPressServiceFactory.create(mockWebServer.getUrl(true), true); - } - - @Provides @Singleton SchedulerManager provideSchedulerManager() { - return new SchedulerManager(); - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/OrientationChangeAction.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/OrientationChangeAction.java new file mode 100644 index 0000000..988a44a --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/OrientationChangeAction.java @@ -0,0 +1,80 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2015 - Nathan Barraille + * + * 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. + * + */ +package it.cosenonjaviste.androidtest.base; + +import android.app.Activity; +import android.content.pm.ActivityInfo; +import android.support.test.espresso.UiController; +import android.support.test.espresso.ViewAction; +import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry; +import android.support.test.runner.lifecycle.Stage; +import android.view.View; + +import org.hamcrest.Matcher; + +import java.util.Collection; + +import static android.support.test.espresso.matcher.ViewMatchers.isRoot; + +/** + * An Espresso ViewAction that changes the orientation of the screen + */ +public class OrientationChangeAction implements ViewAction { + private final int orientation; + + private OrientationChangeAction(int orientation) { + this.orientation = orientation; + } + + @Override + public Matcher getConstraints() { + return isRoot(); + } + + @Override + public String getDescription() { + return "change orientation to " + orientation; + } + + @Override + public void perform(UiController uiController, View view) { + uiController.loopMainThreadUntilIdle(); + final Activity activity = (Activity) view.getContext(); + activity.setRequestedOrientation(orientation); + + Collection resumedActivities = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED); + if (resumedActivities.isEmpty()) { + throw new RuntimeException("Could not change orientation"); + } + } + + public static ViewAction orientationLandscape() { + return new OrientationChangeAction(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + } + + public static ViewAction orientationPortrait() { + return new OrientationChangeAction(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/utils/TestUtils.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/utils/TestUtils.java new file mode 100644 index 0000000..d07329b --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/utils/TestUtils.java @@ -0,0 +1,18 @@ +package it.cosenonjaviste.androidtest.utils; + + +import com.annimon.stream.function.Consumer; + +public class TestUtils { + + public static Consumer sleepAction() { + return o -> sleep(1); + } + + public static void sleep(int seconds) { +// try { +// Thread.sleep(seconds * 1000); +// } catch (InterruptedException ignored) { +// } + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/ui/CnjDaggerRule.java b/app/src/androidTest/java/it/cosenonjaviste/ui/CnjDaggerRule.java new file mode 100644 index 0000000..663128a --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/ui/CnjDaggerRule.java @@ -0,0 +1,48 @@ +package it.cosenonjaviste.ui; + +import android.os.AsyncTask; +import android.support.test.InstrumentationRegistry; + +import org.junit.runners.model.FrameworkMethod; +import org.junit.runners.model.Statement; + +import io.reactivex.Scheduler; +import io.reactivex.plugins.RxJavaPlugins; +import io.reactivex.schedulers.Schedulers; +import it.cosenonjaviste.daggermock.DaggerMockRule; +import it.cosenonjaviste.model.TwitterService; +import it.cosenonjaviste.model.WordPressService; + +public class CnjDaggerRule extends DaggerMockRule { + public CnjDaggerRule() { + super(ApplicationComponent.class, new AppModule(getApp())); + providesMock(WordPressService.class, TwitterService.class); + set(component -> getApp().setComponent(component)); + } + + public static CoseNonJavisteApp getApp() { + return (CoseNonJavisteApp) InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + } + + @Override public Statement apply(Statement base, FrameworkMethod method, Object target) { + Statement superStatement = super.apply(base, method, target); + Scheduler asyncTaskScheduler = + Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR); + return new Statement() { + @Override public void evaluate() throws Throwable { + RxJavaPlugins.setIoSchedulerHandler( + scheduler -> asyncTaskScheduler); + RxJavaPlugins.setComputationSchedulerHandler( + scheduler -> asyncTaskScheduler); + RxJavaPlugins.setNewThreadSchedulerHandler( + scheduler -> asyncTaskScheduler); + + try { + superStatement.evaluate(); + } finally { + RxJavaPlugins.reset(); + } + } + }; + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/ui/MainActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/ui/MainActivityTest.java new file mode 100644 index 0000000..94f7455 --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/ui/MainActivityTest.java @@ -0,0 +1,63 @@ +package it.cosenonjaviste.ui; + +//@RunWith(AndroidJUnit4.class) +public class MainActivityTest { +// @Inject WordPressService wordPressService; +// +// @Inject MockWebServerWrapper server; +// +// @Inject TwitterService twitterService; +// +// @Rule public ActivityTestRule activityRule = new ActivityTestRule<>(MainActivity.class, false, false); +// +// @Before public void setUp() { +// DaggerUtils.createTestComponent().inject(this); +// +// when(wordPressService.listPosts(eq(1))) +// .thenReturn(TestData.postResponse(10)); +// when(wordPressService.listCategories()) +// .thenReturn(TestData.categoryResponse(3)); +// when(wordPressService.listAuthors()) +// .thenReturn(TestData.authorResponse(2)); +// when(wordPressService.listAuthorPosts(anyLong(), anyInt())) +// .thenReturn(TestData.postResponse(1)); +// +// when(twitterService.loadTweets(eq(1))) +// .thenReturn(TestData.tweets()); +// +// server.initDispatcher("CoseNonJaviste"); +// } +// +// @Test public void showMainActivity() { +// activityRule.launchActivity(null); +// } +// +// @Test public void showCategories() { +// activityRule.launchActivity(null); +// clickOnDrawer(R.string.categories); +//// onView(withText("cat 0")).check(matches(isDisplayed())); +// } +// +// @Test public void showAuthors() { +// activityRule.launchActivity(null); +// clickOnDrawer(R.string.authors); +//// onView(withText("name 0")).check(matches(isDisplayed())); +// } +// +// @Test public void showTweets() { +// activityRule.launchActivity(null); +// clickOnDrawer(R.string.twitter); +//// onView(withText("tweet text 1")).check(matches(isDisplayed())); +// } +// +// @Test public void showContactForm() { +// activityRule.launchActivity(null); +// clickOnDrawer(R.string.contacts); +// } +// +// private void clickOnDrawer(int text) { +// onView(withClassName(endsWith("ImageButton"))).perform(click()); +// +//// onView(withText(text)).perform(click()); +// } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/ui/author/AuthorListFragmentTest.java b/app/src/androidTest/java/it/cosenonjaviste/ui/author/AuthorListFragmentTest.java new file mode 100644 index 0000000..6f6ab20 --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/ui/author/AuthorListFragmentTest.java @@ -0,0 +1,36 @@ +package it.cosenonjaviste.ui.author; + +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; + +import it.cosenonjaviste.TestData; +import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.core.author.AuthorListModel; +import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.ui.CnjDaggerRule; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static org.mockito.Mockito.when; + +public class AuthorListFragmentTest { + + @Mock WordPressService wordPressService; + + @Rule public FragmentRule fragmentRule = new FragmentRule(AuthorListFragment.class); + + @Rule public final CnjDaggerRule daggerRule = new CnjDaggerRule(); + + @Test + public void testAuthorList() { + when(wordPressService.listAuthors()) + .thenReturn(TestData.authorResponse(8)); + + fragmentRule.launchFragment(new AuthorListModel()); + + onView(withText("name 1")).check(matches(isDisplayed())); + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/ui/category/CategoryListFragmentTest.java b/app/src/androidTest/java/it/cosenonjaviste/ui/category/CategoryListFragmentTest.java new file mode 100644 index 0000000..672c1d8 --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/ui/category/CategoryListFragmentTest.java @@ -0,0 +1,48 @@ +package it.cosenonjaviste.ui.category; + +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; + +import java.io.IOException; + +import io.reactivex.Single; +import it.cosenonjaviste.TestData; +import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.core.category.CategoryListModel; +import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.ui.CnjDaggerRule; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class CategoryListFragmentTest { + + @Mock WordPressService wordPressService; + + @Rule public FragmentRule fragmentRule = new FragmentRule(CategoryListFragment.class); + + @Rule public final CnjDaggerRule daggerRule = new CnjDaggerRule(); + + @Test public void testCategoryList() { + when(wordPressService.listCategories()) + .thenReturn(TestData.categoryResponse(3)); + + fragmentRule.launchFragment(new CategoryListModel()); + + onView(withText("cat 1")).check(matches(isDisplayed())); + } + + @Test public void testCategoryError() { + when(wordPressService.listCategories()) + .thenReturn(Single.error(new IOException("bla bla bla"))); + + fragmentRule.launchFragment(new CategoryListModel()); + + verify(wordPressService).listCategories(); + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/ui/contact/ContactFragmentTest.java b/app/src/androidTest/java/it/cosenonjaviste/ui/contact/ContactFragmentTest.java new file mode 100644 index 0000000..bca4df7 --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/ui/contact/ContactFragmentTest.java @@ -0,0 +1,44 @@ +package it.cosenonjaviste.ui.contact; + +import android.support.test.espresso.action.ViewActions; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; + +import io.reactivex.Completable; +import it.cosenonjaviste.R; +import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.model.MailJetService; +import it.cosenonjaviste.ui.CnjDaggerRule; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.action.ViewActions.scrollTo; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.when; + +public class ContactFragmentTest { + @Rule public FragmentRule fragmentRule = new FragmentRule(ContactFragment.class); + + @Mock MailJetService mailJetService; + + @Rule public final CnjDaggerRule daggerRule = new CnjDaggerRule(); + + @Before public void setUp() { + when(mailJetService.sendEmail(anyString(), anyString(), anyString(), anyString())) + .thenReturn(Completable.complete()); + } + + @Test public void testContactFragment() { + fragmentRule.launchFragment(); + + onView(withId(R.id.name)).perform(ViewActions.typeText("name")); + onView(withId(R.id.email)).perform(ViewActions.typeText("email@email.it")); + onView(withId(R.id.message)).perform(ViewActions.typeText("message")); + + onView(withId(R.id.send_button)).perform(scrollTo(), click()); + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/it/cosenonjaviste/ui/page/PageFragmentTest.java b/app/src/androidTest/java/it/cosenonjaviste/ui/page/PageFragmentTest.java new file mode 100644 index 0000000..f494177 --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/ui/page/PageFragmentTest.java @@ -0,0 +1,29 @@ +package it.cosenonjaviste.ui.page; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import it.cosenonjaviste.TestData; +import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; +import it.cosenonjaviste.androidtest.utils.TestUtils; +import it.cosenonjaviste.ui.CnjDaggerRule; + +public class PageFragmentTest { + + MockWebServerWrapper server = new MockWebServerWrapper(); + + @Rule public FragmentRule fragmentRule = new FragmentRule(PageFragment.class); + + @Rule public final CnjDaggerRule daggerRule = new CnjDaggerRule(); + + @Before public void setUp() { + server.initDispatcher("CoseNonJaviste
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A"); + } + + @Test public void testDetailFragment() { + fragmentRule.launchFragment(TestData.createPost(1, server.getUrl(false) + "abc")); + TestUtils.sleep(100); + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/ui/post/PostListFragmentTest.java b/app/src/androidTest/java/it/cosenonjaviste/ui/post/PostListFragmentTest.java new file mode 100644 index 0000000..a5da543 --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/ui/post/PostListFragmentTest.java @@ -0,0 +1,53 @@ +package it.cosenonjaviste.ui.post; + +import android.support.test.espresso.contrib.RecyclerViewActions; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; + +import it.cosenonjaviste.R; +import it.cosenonjaviste.TestData; +import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.core.post.PostListModel; +import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.ui.CnjDaggerRule; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; + +public class PostListFragmentTest { + + @Mock WordPressService wordPressService; + + @Rule public FragmentRule fragmentRule = new FragmentRule(PostListFragment.class); + + @Rule public final CnjDaggerRule daggerRule = new CnjDaggerRule(); + + @Before public void setUp() { + when(wordPressService.listPosts(eq(1))) + .thenReturn(TestData.postResponse(0, 10)); + when(wordPressService.listPosts(eq(2))) + .thenReturn(TestData.postResponse(10, 10)); + } + + @Test public void testPostList() throws InterruptedException { + fragmentRule.launchFragment(new PostListModel()); + + onView(withText("post title 1")).check(matches(isDisplayed())); + } + + @Test public void testGoToPostDetail() { + fragmentRule.launchFragment(new PostListModel()); + + onView(withId(R.id.list)) + .perform(RecyclerViewActions.actionOnItemAtPosition(3, click())); + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/ui/twitter/TweetListFragmentTest.java b/app/src/androidTest/java/it/cosenonjaviste/ui/twitter/TweetListFragmentTest.java new file mode 100644 index 0000000..e85d40b --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/ui/twitter/TweetListFragmentTest.java @@ -0,0 +1,40 @@ +package it.cosenonjaviste.ui.twitter; + +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; + +import it.cosenonjaviste.TestData; +import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.core.twitter.TweetListModel; +import it.cosenonjaviste.model.TwitterService; +import it.cosenonjaviste.ui.CnjDaggerRule; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; + +@RunWith(AndroidJUnit4.class) +public class TweetListFragmentTest { + + @Mock TwitterService twitterService; + + @Rule public FragmentRule fragmentRule = new FragmentRule(TweetListFragment.class); + + @Rule public final CnjDaggerRule daggerRule = new CnjDaggerRule(); + + @Test public void testTweetList() { + when(twitterService.loadTweets(eq(1))) + .thenReturn(TestData.tweets(10)); + + fragmentRule.launchFragment(new TweetListModel()); + + onView(withText("tweet text 1")).check(matches(isDisplayed())); + } +} diff --git a/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java b/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java deleted file mode 100644 index b3812d2..0000000 --- a/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java +++ /dev/null @@ -1,15 +0,0 @@ -package it.cosenonjaviste; - -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; -import it.cosenonjaviste.model.TwitterService; -import it.cosenonjaviste.stubs.TwitterServiceStub; - -@Module(library = true, overrides = true) -public class MvpTestModule { - @Provides @Singleton TwitterService provideTwitterService(TwitterServiceStub twitterServiceStub) { - return twitterServiceStub; - } -} diff --git a/app/src/debug/java/it/cosenonjaviste/stubs/TestSchedulerManager.java b/app/src/debug/java/it/cosenonjaviste/stubs/TestSchedulerManager.java deleted file mode 100644 index 77bd308..0000000 --- a/app/src/debug/java/it/cosenonjaviste/stubs/TestSchedulerManager.java +++ /dev/null @@ -1,17 +0,0 @@ -package it.cosenonjaviste.stubs; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import rx.Observable; - -@Singleton -public class TestSchedulerManager extends SchedulerManager { - @Inject public TestSchedulerManager() { - } - - @Override public Observable bindObservable(Observable observable) { - return observable; - } -} diff --git a/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java b/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java deleted file mode 100644 index c9223b9..0000000 --- a/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java +++ /dev/null @@ -1,30 +0,0 @@ -package it.cosenonjaviste.stubs; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import javax.inject.Inject; - -import it.cosenonjaviste.model.Tweet; -import it.cosenonjaviste.model.TwitterService; -import rx.Observable; - -public class TwitterServiceStub implements TwitterService { - - @Inject public TwitterServiceStub() { - } - - @Override public Observable> loadTweets(int page) { - List list = new ArrayList<>(); - for (int i = 0; i < 10; i++) { - Tweet tweet = new Tweet(); - tweet.setId(123); - tweet.setAuthor("author"); - tweet.setCreatedAt(new Date()); - tweet.setText("text"); - list.add(tweet); - } - return Observable.just(list); - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5c1cd9c..0afa3b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,19 +7,22 @@ - + - + + \ No newline at end of file diff --git a/app/src/main/assets/style.css b/app/src/main/assets/style.css index cdc7236..0b80cd6 100644 --- a/app/src/main/assets/style.css +++ b/app/src/main/assets/style.css @@ -1,7217 +1,3972 @@ -#top-bar { - display: none; +#cookie-notice { + display: none !important; } - -#header-section { - display: none; -} - -div.nr_related_placeholder { - display: none; -} - -div.yarpp-related { - display: none; -} - -div.share-links { - display: none; -} - -div.related-wrap { - display: none; -} - -div.pagination-wrap.blog-pagination { - display: none; -} - -aside.sidebar.right-sidebar { - display: none; -} - -#footer { - display: none; -} - -#comment-area { - display: none; -} - -#copyright { - display: none; -} - -div.author-info-wrap.clearfix { - display: none; -} - -div.inner-page-wrap.has-right-sidebar.has-one-sidebar.row.clearfix { - margin-top: 0px; -} - -div.page-heading h1 { - font-size: 24px; - line-height: 32px; -} - -/* LICENSE & DETAILS - ================================================== - - Theme Name: Flexform - Theme URI: http://flexform.swiftideas.net - Description: A Retina Responsive Multi-Purpose WordPress Theme - Designed & Developed by Swift Ideas ( www.swiftideas.net ) - License: GNU General Public License version 3.0 - License URI: http://www.gnu.org/licenses/gpl-3.0.html - Version: 1.62 - Author: Swift Ideas - Author URI: www.swiftideas.net - - All files, unless otherwise stated, are released under the GNU General Public License - version 3.0 (http://www.gnu.org/licenses/gpl-3.0.html) - - ================================================== -*/ - -/* Table of Contents -================================================== - - #Custom Boostrap Classes - #Page Builder Override Classes - #General - #Header - #Footer - #Home - #Swift Slider - #Portfolio - #Blog - #Team - #Sidebar - #Comments - #Contact - #Shortcodes - #WooCommerce - #Retina Styles - #Responsive Styles - - ================================================== -*/ - -/* #Custom Bootstrap Classes -================================================== - Support for columns width sidebars -================================================== */ - -.span-third { - width: 193px; -} -.span-twothirds { - width: 407px; -} -.span-bs-quarter { - width: 100px; -} -.span-bs-threequarter { - width: 340px; -} - -@media only screen and (min-width: 1200px) { - .span-third { - width: 236px; - } - .span-twothirds { - width: 504px; - } - .span-bs-quarter { - width: 120px; - } - .span-bs-threequarter { - width: 420px; - } -} - -@media only screen and (max-width: 979px) and (min-width: 768px) { - - .span-third { - width: 145px; - } - .span-twothirds { - width: 310px; - } - - .span-bs-quarter, .span-bs-threequarter { - width: 342px; - } - -} - -@media only screen and (max-width: 979px) { - - .span-third { - width: 100%; - } - .span-twothirds { - width: 100%; - } - .span-bs-quarter { - width: 100%; - } - .span-bs-threequarter { - width: 100%; - } - -} - -/* #Page Builder Override Classes -================================================== - Classes to override asset styling -================================================== */ - -.mt0 { /* Clear Margin Top */ - margin-top: 0!important; -} -.mb0 { /* Clear Margin Bottom */ - margin-bottom: 0!important; -} -.mr0 { /* Clear Margin Right */ - margin-right: 0!important; -} -.ml0 { /* Clear Margin Left */ - margin-left: 0!important; -} -.pt0 { /* Clear Padding Top */ - padding-top: 0!important; -} -.pb0 { /* Clear Padding Bottom */ - padding-bottom: 0!important; -} -.pr0 { /* Clear Padding Right */ - padding-right: 0!important; -} -.pl0 { /* Clear Padding Left */ - padding-left: 0!important; -} -.bt0 { /* Clear Border Top */ - border-top: 0!important; -} -.bb0 { /* Clear Border Bottom */ - border-bottom: 0!important; -} -.no-arrow:after { /* Clear Full Width Text Arrow */ - display: none!important; -} -.pmb0 p { /* Clear Inner p Tags Margin Bottom */ - margin-bottom: 0!important; -} - - -/* #General -================================================== */ - -body { - padding: 0; - margin: 0; - font-size: 14px; -} -body * { - -webkit-font-smoothing: antialiased !important; - text-rendering: optimizelegibility; -} -a { - transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -webkit-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; -} -a:hover { - text-decoration: none; -} -body, h1, h2, h3, h4, h5, h6 { - font-family: "Myriad Pro", Arial, Helvetica, Tahoma, sans-serif; - font-weight: 300; -} -h1 { - font-size: 30px; - line-height: 42px; -} -h2 { - font-size: 24px; - line-height: 32px; -} -h3 { - font-size: 18px; - line-height: 24px; - font-weight: normal; - margin-bottom: 15px; -} -h4 { - font-size: 16px; - font-weight: normal; - line-height: 20px; - margin-bottom: 15px; -} -h5 { - font-size: 14px; - font-weight: normal; - line-height: 18px; - margin-bottom: 15px; -} -h6 { - font-size: 12px; - font-weight: bold; - line-height: 16px; - margin-bottom: 10px; - text-transform: uppercase; -} -p { - font-size: 14px; - line-height: 170%; -} -ul { - list-style: none; - margin: 0 0 20px; -} -p:empty { - /*display: none; - margin-bottom: 0;*/ -} -.wf-loading p, .wf-loading a, .wf-loading h1, .wf-loading h2, .wf-loading h3, .wf-loading h4, .wf-loading h5, .wf-loading h6 { - visibility: hidden; -} -.wf-inactive p, .wf-inactive a, .wf-inactive h1, .wf-inactive h2, .wf-inactive h3, .wf-inactive h4, .wf-inactive h5, .wf-inactive h6 { - visibility: visible; -} -.wf-active p, .wf-active a, .wf-active h1, .wf-active h2, .wf-active h3, .wf-active h4, .wf-active h5, .wf-active h6 { - visibility: visible; -} -ul ul, ul ol, ol ol, ol ul { - margin-left: 0; -} -.no-js-alert { - background: none repeat scroll 0 0 #222222; - color: #FFFFFF; - font-size: 24px; - height: 100%; - left: 0; - opacity: 0.95; - -moz-opacity: 0.95; - filter:alpha(opacity= 95); - padding: 20% 5% 0; - position: fixed; - text-align: center; - top: 0; - width: 90%; - z-index: 9999; -} -#container { - position: relative; -} -#page-bg-image { - position: fixed; - width: 100%; - height: 100%; - top: 0; - left: 0; - z-index: 1; -} -input { - border: 0; -} -input:focus, textarea:focus { - box-shadow: none!important; -} -iframe { - border: 0; -} - -/* -------------------------------------------- - STANDARD MEDIA STYLING --------------------------------------------- */ - -figure { - margin: 0; -} -figure img { - width: 100%; - height: auto; -} -figure a { - display: block; -} -figure .overlay { - width: 100%; - height: 100%; - position: absolute; - display: block; - z-index: 4; - opacity: 0; - -moz-opacity: 0; - filter:alpha(opacity=0); - -webkit-transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; - -ms-transition: all 0.3s ease-in-out; - transition: all 0.3s ease-in-out; - margin-left: -0.6px; - padding-right: 0.6px; -} -figure:hover > a > .overlay { - opacity: 0.9; - -moz-opacity: 0.9; - filter:alpha(opacity=90); - margin-top: -1.6px; /* GAP FIX */ - padding-bottom: 1.6px; /* GAP FIX */ -} -figure .thumb-info { - position: absolute; - width: 100%; - height: 100%; - opacity: 0; - -moz-opacity: 0; - filter:alpha(opacity=0); - -webkit-transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; - -ms-transition: all 0.3s ease-in-out; - transition: all 0.3s ease-in-out; - -webkit-transform: scale(0); - -moz-transform: scale(0); - -o-transform: scale(0); - -ms-transform: scale(0); - transform: scale(0); - -webkit-backface-visibility: hidden; /*for a smooth font */ -} -figure:hover .overlay .thumb-info { - opacity: 1; - -moz-opacity: 1; - filter:alpha(opacity=100); - -webkit-transform: scale(1); - -moz-transform: scale(1); - -o-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); -} -.overlay .thumb-info h4 { - position: absolute; - top: 53%; - line-height: 20px; - padding: 0 10%; - width: 80%; - text-align: center; - -moz-text-shadow: 0 0 5px rgba(0,0,0,.2); - -webkit-text-shadow: 0 0 5px rgba(0,0,0,.2); - text-shadow: 0 0 5px rgba(0,0,0,.2); -} -.overlay .thumb-info i { - width: 100%; - position: absolute; - top: 50%; - font-size: 44px; - margin-top: -15px; - height: 30px; - line-height: 33px; - -moz-text-shadow: 0 0 5px rgba(0,0,0,.2); - -webkit-text-shadow: 0 0 5px rgba(0,0,0,.2); - text-shadow: 0 0 5px rgba(0,0,0,.2); - text-align: center; -} -.overlay .thumb-info i.small-icon { - font-size: 32px; - top: 42%; -} - -/* -------------------------------------------- - FLEXSLIDER / REVSLIDER --------------------------------------------- */ - -/* Browser Resets */ -.wooslider-container a:active, -.wooslider a:active, -.wooslider-container a:focus, -.wooslider a:focus {outline: none;} -.slides, -.wooslider-control-nav, -.wooslider-direction-nav {margin: 0; padding: 0; list-style: none;} - -/* wooslider Necessary Styles -*********************************/ -.wooslider {margin: 0; padding: 0;} -.wooslider .slides > li { display: none; -webkit-backface-visibility: hidden; width: 100%; } /* Hide the slides before the JS is loaded. Avoids image jumping */ -.wooslider .slides img {width: 100%; display: block;} -.wooslider-pauseplay span {text-transform: capitalize;} - -/* Clearfix for the .slides element */ -.wooslider .slides:after { content: "."; display: block; clear: both; visibility: hidden; line-height: 0; height: 0; } -html[xmlns] .wooslider .slides { display: block; } -* html .wooslider .slides { height: 1%; } - -/* No JavaScript Fallback */ -/* If you are not using another script, such as Modernizr, make sure you - * include js that eliminates this class on page load */ -.no-js .wooslider .slides > li:first-child { display: block; } - - -/* wooslider Default Theme -*********************************/ -.wooslider {margin: 0 0 60px; background: #fff; border: 4px solid #fff; position: relative; -webkit-border-radius: 4px; -moz-border-radius: 4px; -o-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.2); -moz-box-shadow: 0 1px 4px rgba(0,0,0,.2); -o-box-shadow: 0 1px 4px rgba(0,0,0,.2); box-shadow: 0 1px 4px rgba(0,0,0,.2); zoom: 1; overflow: visible!important;} -.wooslider-viewport {max-height: 2000px; -webkit-transition: all 1s ease; -moz-transition: all 1s ease; transition: all 1s ease;} -.loading .wooslider-viewport {max-height: 300px;} -.wooslider .slides {zoom: 1;} - -.wooslider .carousel li { margin-right: 5px; } - -/* Direction Nav */ -.wooslider-direction-nav a {width: 30px; height: 30px; margin: -20px 0 0; display: block; background: url(../images/bg_direction_nav.png) no-repeat 0 0; position: absolute; top: 50%; cursor: pointer; text-indent: -9999px; opacity: 0; -webkit-transition: all .3s ease; -moz-transition: all .3s ease; -o-transition: all .3s ease; transition: all .3s ease;} -.wooslider-direction-nav .wooslider-next {background-position: 100% 0; right: -36px; } -.wooslider-direction-nav .wooslider-prev {left: -36px;} -.wooslider:hover .wooslider-next {opacity: 0.8; right: 5px;} -.wooslider:hover .wooslider-prev {opacity: 0.8; left: 5px;} -.wooslider:hover .wooslider-next:hover, .wooslider:hover .wooslider-prev:hover {opacity: 1;} -.wooslider-direction-nav .disabled {opacity: .3!important; filter:alpha(opacity=30); cursor: default;} - -/* Pause/Play */ -.wooslider-pauseplay a { width: 30px; height: 30px; text-indent: -9999px; background: url(../images/bg_play_pause.png) no-repeat 110% 0; position: absolute; bottom: 5px; left: 5px; opacity: 0.8; z-index: 9999; cursor: pointer; } -.wooslider-pauseplay a:hover { opacity: 1; } -.wooslider-pauseplay a.wooslider-play { background-position: 0 0; } - -/* Control Nav */ -.wooslider-control-nav {width: 100%; position: absolute; top: 100%; margin-top: 10px!important; text-align: center; z-index: 9999; } -.wooslider-control-nav li {margin: 0 6px; display: inline-block; zoom: 1; *display: inline;} -.wooslider-control-paging li a {width: 11px; height: 11px; display: block; background: #666; background: rgba(0,0,0,0.5); cursor: pointer; text-indent: -9999px; -webkit-border-radius: 20px; -moz-border-radius: 20px; -o-border-radius: 20px; border-radius: 20px; box-shadow: inset 0 0 3px rgba(0,0,0,0.3);} -.wooslider-control-paging li a:hover { background: #333; background: rgba(0,0,0,0.7); } -.wooslider-control-paging li a.wooslider-active { background: #000; background: rgba(0,0,0,0.9); cursor: default; } - -.wooslider-control-thumbs {margin: 5px 0 0; position: static; overflow: hidden;} -.wooslider-control-thumbs li {width: 25%; float: left; margin: 0;} -.wooslider-control-thumbs img {width: 100%; display: block; opacity: .7; cursor: pointer;} -.wooslider-control-thumbs img:hover {opacity: 1;} -.wooslider-control-thumbs .wooslider-active {opacity: 1; cursor: default;} - -@media screen and (max-width: 860px) { - .wooslider-direction-nav .wooslider-prev {opacity: 1; left: 0;} - .wooslider-direction-nav .wooslider-next {opacity: 1; right: 0;} -} - -/* Basic reset for better theme compatibility. */ -.wooslider .slides > li { list-style: none; float: left; margin: 0; padding: 0; } -.wooslider .slides > li img { border: 0; box-shadow: none; } -.wooslider .wooslider-control-nav > li { margin: 0 6px; padding: 0; } - -body .wooslider.wooslider-type-posts img, body .wooslider.wooslider-type-attachments img { border: 0; padding: 0; margin: 0; height: auto; } -body .wooslider .slides, body .wooslider .wooslider-control-nav, body .wooslider .wooslider-direction-nav { padding: 0; margin: 0; } -body .wooslider .wooslider-control-nav li, body .wooslider .wooslider-direction-nav li { list-style: none; } - -/* Layout styles for the "Posts" slideshow type. */ -/* Text Left and Text Right Options */ -.wooslider .layout-text-left img { float: right; width: 40%; } -.wooslider .layout-text-left .slide-excerpt { float: left; width: 50%; } - -.wooslider .layout-text-right img { float: left; width: 40%; } -.wooslider .layout-text-right .slide-excerpt { float: right; width: 50%; } - -/* Full overlay enabled */ -.wooslider .overlay-full { position: relative; } -.wooslider .overlay-full .slide-excerpt { background: #000; opacity: 0.8; color: #FFF; position: absolute; padding: 1em; } -.wooslider .overlay-full .slide-excerpt .slide-title { color: #FFF; } -.wooslider .overlay-full img { float: none; width: 100%; height: auto; } - -body .wooslider .overlay-full.layout-text-left .slide-excerpt { left: 0; top: 0; bottom: 0; width: 30%; padding: 1em; overflow: hidden; } -body .wooslider .overlay-full.layout-text-right .slide-excerpt { right: 0; top: 0; bottom: 0; width: 30%; padding: 1em; overflow: hidden; } -body .wooslider .overlay-full.layout-text-top .slide-excerpt { left: 0; right: 0; top: 0; height: auto; padding: 1em; overflow: hidden; } -body .wooslider .overlay-full.layout-text-bottom .slide-excerpt { left: 0; right: 0; bottom: 0; height: auto; padding: 1em; overflow: hidden; } - -/* Natural overlay enabled */ -.wooslider .overlay-natural { position: relative; } -.wooslider .overlay-natural .slide-excerpt { color: #FFF; position: absolute; float: left; padding: 0; } -.wooslider .overlay-natural .slide-excerpt .slide-title { color: #FFF; background: #000; opacity: 0.8; float: left; padding: 0.5em 1em; margin: 0; } -.wooslider .overlay-natural .slide-excerpt p { color: #FFF; background: #000; opacity: 0.8; float: left; padding: 0.5em 1em; } -.wooslider .overlay-natural img { float: none; width: 100%; height: auto; } - -body .wooslider .overlay-natural.layout-text-left .slide-excerpt { left: 0; top: 10%; overflow: hidden; } -body .wooslider .overlay-natural.layout-text-right .slide-excerpt { float: right; right: 0; top: 10%; overflow: hidden; } -body .wooslider .overlay-natural.layout-text-right .slide-excerpt .slide-title, -body .wooslider .overlay-natural.layout-text-right .slide-excerpt p { float: right; } -body .wooslider .overlay-natural.layout-text-top .slide-excerpt { left: 0; top: 0; overflow: hidden; } -body .wooslider .overlay-natural.layout-text-bottom .slide-excerpt { left: 0; bottom: 0; overflow: hidden; } - -/* "Slides" slideshow type */ -body .wooslider .slide-content { margin: 0.5em; padding: 0; border: 0; width: auto; height: auto; } - -/* Slide widget */ -.widget_wooslider_slideshow_attachments .wooslider-direction-nav a { padding: 0; } - -body .wooslider.wooslider-type-posts img, body .wooslider.wooslider-type-attachments img { max-width: 100%; border: none; } -body .wooslider-control-nav { margin: 0; padding: 0; } -body .wooslider-control-nav img { border: 0; background: none; margin: 0; padding: 0; } -body .wooslider-direction-nav, body .wooslider-direction-nav li { list-style: none; margin: 0; padding: 0; } -body .wooslider.wooslider-type-slides .has-featured-image img.featured-image { max-width: 100%; height: auto; } -body .wooslider.wooslider-type-slides img { max-width: 100%; } - -.flexslider { - background: transparent; - border: 0; - width: 100%; - z-index: 2; - display: block; - position: relative; - overflow: hidden; -} -.flexslider ul.slides { - background: #222; - margin: 0; - height: auto; - overflow: hidden; - list-style: none!important; -} -.flexslider .slides > li { - position: relative; - text-align: center; - overflow: hidden; - margin: 0; - display: none; - -webkit-backface-visibility: hidden; -} -.flexslider .slides li img { - max-width: 100%; - width: 100%; - height: auto; - display: block!important; -} -.flex-direction-nav, .flex-direction-nav li, .wooslider-direction-nav, .wooslider-direction-nav li { - margin: 0; - padding: 0; - list-style: none; -} -.flex-direction-nav a, .wooslider-direction-nav a { - width: 36px; - height: 36px; - margin: -18px 0 0; - display: block; - background: transparent url('images/showcase-nav.png') no-repeat center left; - position: absolute; - top: 50%; - cursor: pointer; - text-indent: -9999px; - opacity: 0; - filter: alpha(opacity=0); - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; - z-index: 999; -} -.flex-direction-nav .flex-next, .wooslider-direction-nav .wooslider-next { - background-position: center right; - right: -36px; -} -.flex-direction-nav .flex-prev, .wooslider-direction-nav .wooslider-prev { - left: -36px; -} -.rev_slider_wrapper .tp-leftarrow, .rev_slider_wrapper .tp-leftarrow.large, .rev_slider_wrapper .tp-leftarrow.square, .rev_slider_wrapper .tp-leftarrow.round, .rev_slider_wrapper .tp-leftarrow.default { - background: transparent url('images/showcase-nav.png') no-repeat center left; - width: 36px; - height: 36px; - display: block; - margin: 0; - position: absolute; - top: 50%!important; - left: -36px!important; - margin-top: -18px; - cursor: pointer; - text-indent: -9999px; - opacity: 0; - filter:alpha(opacity=0); - -webkit-transition: all .3s ease; -} -.rev_slider_wrapper .tp-rightarrow, .rev_slider_wrapper .tp-rightarrow.large, .rev_slider_wrapper .tp-rightarrow.square, .rev_slider_wrapper .tp-rightarrow.round, .rev_slider_wrapper .tp-rightarrow.default { - background: transparent url('images/showcase-nav.png') no-repeat 100% 0; - width: 36px; - height: 36px; - display: block; - margin: 0; - position: absolute; - top: 50%!important; - right: -36px!important; - margin-top: -18px; - left: auto!important; - cursor: pointer; - text-indent: -9999px; - opacity: 0; - filter:alpha(opacity=0); - -webkit-transition: all .3s ease; -} -.rev_slider_wrapper { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.tp-bannertimer { - z-index: 20!important; -} -.rev_slider iframe { - z-index: 999; -} -.content-slider { - position: static; -} -.content-slider .flex-direction-nav .flex-next { - right: 20px!important; -} -.content-slider .flex-direction-nav .flex-prev { - left: 20px!important; -} -.flexslider:hover .flex-next, .wooslider:hover .wooslider-next, .wpb_testimonial_slider_widget:hover .flexslider .flex-next { - opacity: 1; - filter:alpha(opacity=100); - right: 20px!important; -} -.rev_slider_wrapper:hover > .tp-rightarrow { - opacity: 1; - filter:alpha(opacity=100); - right: 50px!important; -} -.flexslider:hover .flex-prev, .wooslider:hover .wooslider-prev, .wpb_testimonial_slider_widget:hover .flexslider .flex-prev { - opacity: 1; - filter:alpha(opacity=100); - left: 20px!important; -} -.rev_slider_wrapper:hover > .tp-leftarrow { - opacity: 1; - filter:alpha(opacity=100); - left: 50px!important; -} -.tp-caption a.sf-button { - font-size: inherit; - padding: 6% 14%; - line-height: auto; -} -.tp-caption a.sf-button.medium { - font-size: inherit; - padding: 7% 16%; - line-height: auto; -} -.tp-caption a.sf-button.large { - font-size: inherit; - padding: 8% 18%; - line-height: auto; -} -.flex-direction-nav .disabled { - opacity: .3!important; - filter:alpha(opacity=30); - cursor: default; -} -.thumb-slider .flex-direction-nav a { - height: 37px; - background: transparent url('images/showcase-nav.png') no-repeat center left; -} -.thumb-slider .flex-direction-nav a.flex-next { - background-position: center right; -} -.thumb-slider:hover .flex-direction-nav a.flex-prev { - opacity: 0.8; - -moz-opacity: 0.8; - filter: alpha(opacity=80); -} -.thumb-slider:hover .flex-direction-nav a.flex-next { - opacity: 0.8; - -moz-opacity: 0.8; - filter: alpha(opacity=80); -} -.thumb-slider .open-item a { - width: 26px; - position: absolute; - right: 0; - bottom: 0; - opacity: 0.5; - -moz-opacity: 0.5; - filter: alpha(opacity=50); - display: block; - z-index: 99; - background-color: rgb(33, 33, 33); - background-color: rgba(33, 33, 33, 1); - color: white; - text-decoration: none; - text-align: center; - padding: 4px 0 2px; -} -.open-item a i { - vertical-align: 0; -} -.thumb-slider .open-item:hover > a { - opacity: 1!important; - -moz-opacity: 1!important; - filter:alpha(opacity=100)!important; -} -.flex-control-nav { - position: absolute; - bottom: 20px; - left: 40px; - margin: 0; - z-index: 4; - list-style: none!important; -} -.flex-control-nav li { - float: left; - display: inline-block; - margin-right: 5px; - margin-bottom: 0; -} -.flex-control-nav li a { - text-indent: 100%; - white-space: nowrap; - overflow: hidden; - background: #fff; - width: 10px; - height: 10px; - display: block; - webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - opacity: 0.5; - -moz-opacity: 0.5; - filter:alpha(opacity=50); -} -.flex-control-nav li a:hover { - cursor: pointer; -} -.flex-control-nav li a.flex-active { - opacity: 1; - -moz-opacity: 1; - filter:alpha(opacity=100); -} -.flex-pauseplay { - position: absolute; - color: #fff; - bottom: 18px; - left: 20px; - font-size: 13px; - height: 13px; -} -.flex-pauseplay span:before { - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: inline-block; - text-decoration: inherit; -} -.flex-pauseplay .pause:before { - content: "\f04c"; -} -.flex-pauseplay .play:before { - content: "\f04b"; -} -.blog-slider .flex-pauseplay, .thumb-slider .flex-pauseplay { - bottom: 16px; - font-size: 11px; - height: 13px; -} -.flex-pauseplay:hover { - cursor: pointer; -} -.flex-pauseplay span { - height: 11px; - display: block; - line-height: 13px; -} -.thumb-slider .flex-control-nav, .thumb-slider .flex-pauseplay { - display: none; -} -.tp-bullets { - width: 80%; - margin: 0 auto; - text-align: center; - z-index: 20; -} -.tp-bullets.simplebullets.round { - bottom: 25px!important; -} -.tp-bullets.simplebullets.round .bullet { - cursor: pointer; - position: relative; - background: white; - width: 10px; - height: 10px; - margin-right: 7px; - float: none; - display: inline-block; - margin-top: 0; - webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - opacity: 0.5; - border-radius: 5px; - opacity: 0.5; - -moz-opacity: 0.5; - filter:alpha(opacity=50); - -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2); - box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2); - margin-bottom: 13px; -} -.tp-bullets.simplebullets.round .bullet.selected { - opacity: 1; - -moz-opacity: 1; - filter:alpha(opacity=100); -} -.tp-bullets .tp-leftarrow { - float: none!important; - display: inline-block; - margin-right: 10px; - width: 36px; - height: 36px; -} -.tp-bullets .tp-rightarrow { - float: none!important; - display: inline-block; - margin-left: 12px; - width: 36px; - height: 36px; - background: top right; -} -.wooslider { - background: transparent!important; - border: 0!important; - -webkit-border-radius: 0!important; - -moz-border-radius: 0!important; - -o-border-radius: 0!important; - border-radius: 0!important; -} -body .wooslider .slide-content { - margin: 0!important; -} -.wooslider li .slide-content > p { - margin-bottom: 0; -} -.wooslider .slide-title { - font-size: 18px; - line-height: 24px; -} -.wooslider .slide-title a { - color: #fff; - text-decoration: none; -} -.wooslider-control-thumbs { - position: absolute; - z-index: 99; - text-align: center; -} -.wooslider-control-thumbs li { - width: 6%; - float: none; - min-height: 50px; - max-height: 50px; -} -body .wooslider-control-thumbs li > img { - border: 2px solid #fff!important; - min-height: 34px; - max-height: 34px; -} -p.flex-caption { - text-shadow: none; - background: rgba(0, 0, 0, .4); -} -.custom-caption { - position: absolute; - z-index: 2; - top: 60px; - left: 60px; - width: auto; - max-width: 500px -} -.custom-caption p { - text-align: left; - width: auto; - font-size: 24px; - padding: 0px 4px 2px; - line-height: 28px; - margin-bottom: 0; - text-decoration: underline; - text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4); -} - -/* -------------------------------------------- - WORDPRESS ASSET STYLING --------------------------------------------- */ - -.sticky, .bypostauthor {} -img.size-full { - max-width: 100%; - height: auto; -} -.aligncenter, div.aligncenter { - display:block; - margin: 5px auto 5px auto; -} -.alignright { - float:right; - margin: 5px 0 20px 20px; -} -.alignleft { - float:left; - margin: 5px 20px 20px 0; -} -.aligncenter { - display: block; - margin: 5px auto 5px auto; -} -a img.alignright { - float:right; - margin: 5px 0 20px 20px; -} -a img.alignleft { - float:left; - margin: 5px 20px 20px 0; -} -a img.aligncenter { - display: block; - margin-left: auto; - margin-right: auto -} -.wp-caption { - background: #fff; - border: 1px solid #f0f0f0; - max-width: 96%; /* Image does not overflow the content area */ - padding: 5px 3px 10px; - text-align: center; -} -.wp-caption.alignnone { - margin: 5px 20px 20px 0; -} -.wp-caption.alignleft { - margin: 5px 20px 20px 0; -} -.wp-caption.alignright { - margin: 5px 0 20px 20px; -} -.wp-caption img { - border: 0 none; - height: auto; - margin:0; - max-width: 98.5%; - padding:0; - width: auto; -} -.align-left { - text-align: left; -} -.align-right { - text-align: right; -} -.no-margin { - margin: 0; -} -.img-link { - display: block; -} -.wp-caption-text, .gallery-caption { - font-size: 1.2em; - padding: 10px 0; -} - -/* -------------------------------------------- - ISOTOPE --------------------------------------------- */ - -.isotope-item { - z-index: 2; -} -.isotope-hidden.isotope-item { - pointer-events: none; - z-index: 1; -} -.isotope, -.isotope .isotope-item { - /* change duration value to whatever you like */ - -webkit-transition-duration: 0.6s; - -moz-transition-duration: 0.6s; - -ms-transition-duration: 0.6s; - -o-transition-duration: 0.6s; - transition-duration: 0.6s; -} -.isotope { - -webkit-transition-property: height, width; - -moz-transition-property: height, width; - -ms-transition-property: height, width; - -o-transition-property: height, width; - transition-property: height, width; -} -.isotope .isotope-item { - -webkit-transition-property: -webkit-transform, opacity; - -moz-transition-property: -moz-transform, opacity; - -ms-transition-property: -ms-transform, opacity; - -o-transition-property: top, left, opacity; - transition-property: transform, opacity; -} - -/**** disabling Isotope CSS3 transitions ****/ - -.isotope.no-transition, -.isotope.no-transition .isotope-item, -.isotope .isotope-item.no-transition { - -webkit-transition-duration: 0s; - -moz-transition-duration: 0s; - -ms-transition-duration: 0s; - -o-transition-duration: 0s; - transition-duration: 0s; -} - -/* -------------------------------------------- - PRETTYPHOTO --------------------------------------------- */ - -div.pp_default .pp_top,div.pp_default .pp_top .pp_middle,div.pp_default .pp_top .pp_left,div.pp_default .pp_top .pp_right,div.pp_default .pp_bottom,div.pp_default .pp_bottom .pp_left,div.pp_default .pp_bottom .pp_middle,div.pp_default .pp_bottom .pp_right{height:13px} -div.pp_default .pp_top .pp_left{background:url(images/prettyPhoto/default/sprite.png) -78px -93px no-repeat} -div.pp_default .pp_top .pp_middle{background:url(images/prettyPhoto/default/sprite_x.png) top left repeat-x} -div.pp_default .pp_top .pp_right{background:url(images/prettyPhoto/default/sprite.png) -112px -93px no-repeat} -div.pp_default .pp_content .ppt{color:#f8f8f8} -div.pp_default .pp_content_container .pp_left{background:url(images/prettyPhoto/default/sprite_y.png) -7px 0 repeat-y;padding-left:13px} -div.pp_default .pp_content_container .pp_right{background:url(images/prettyPhoto/default/sprite_y.png) top right repeat-y;padding-right:13px} -div.pp_default .pp_next:hover{background:url(images/prettyPhoto/default/sprite_next.png) center right no-repeat;cursor:pointer} -div.pp_default .pp_previous:hover{background:url(images/prettyPhoto/default/sprite_prev.png) center left no-repeat;cursor:pointer} -div.pp_default .pp_expand{background:url(images/prettyPhoto/default/sprite.png) 0 -29px no-repeat;cursor:pointer;width:28px;height:28px} -div.pp_default .pp_expand:hover{background:url(images/prettyPhoto/default/sprite.png) 0 -56px no-repeat;cursor:pointer} -div.pp_default .pp_contract{background:url(images/prettyPhoto/default/sprite.png) 0 -84px no-repeat;cursor:pointer;width:28px;height:28px} -div.pp_default .pp_contract:hover{background:url(images/prettyPhoto/default/sprite.png) 0 -113px no-repeat;cursor:pointer} -div.pp_default .pp_close{width:30px;height:30px;background:url(images/prettyPhoto/default/sprite.png) 2px 1px no-repeat;cursor:pointer} -div.pp_default .pp_gallery ul li a{background:url(images/prettyPhoto/default/default_thumb.png) center center #f8f8f8;border:1px solid #aaa} -div.pp_default .pp_social{margin-top:7px} -div.pp_default .pp_gallery a.pp_arrow_previous,div.pp_default .pp_gallery a.pp_arrow_next{position:static;left:auto} -div.pp_default .pp_nav .pp_play,div.pp_default .pp_nav .pp_pause{background:url(images/prettyPhoto/default/sprite.png) -51px 1px no-repeat;height:30px;width:30px} -div.pp_default .pp_nav .pp_pause{background-position:-51px -29px} -div.pp_default a.pp_arrow_previous,div.pp_default a.pp_arrow_next{background:url(images/prettyPhoto/default/sprite.png) -31px -3px no-repeat;height:20px;width:20px;margin:4px 0 0} -div.pp_default a.pp_arrow_next{left:52px;background-position:-82px -3px} -div.pp_default .pp_content_container .pp_details{margin-top:5px} -div.pp_default .pp_nav{clear:none;height:30px;width:110px;position:relative} -div.pp_default .pp_nav .currentTextHolder{font-family:Georgia;font-style:italic;color:#999;font-size:11px;left:75px;line-height:25px;position:absolute;top:2px;margin:0;padding:0 0 0 10px} -div.pp_default .pp_close:hover,div.pp_default .pp_nav .pp_play:hover,div.pp_default .pp_nav .pp_pause:hover,div.pp_default .pp_arrow_next:hover,div.pp_default .pp_arrow_previous:hover{opacity:0.7} -div.pp_default .pp_description{font-size:11px;font-weight:700;line-height:14px;margin:5px 50px 5px 0} -div.pp_default .pp_bottom .pp_left{background:url(images/prettyPhoto/default/sprite.png) -78px -127px no-repeat} -div.pp_default .pp_bottom .pp_middle{background:url(images/prettyPhoto/default/sprite_x.png) bottom left repeat-x} -div.pp_default .pp_bottom .pp_right{background:url(images/prettyPhoto/default/sprite.png) -112px -127px no-repeat} -div.pp_default .pp_loaderIcon{background:url(images/prettyPhoto/default/loader.gif) center center no-repeat} -div.light_rounded .pp_top .pp_left{background:url(images/prettyPhoto/light_rounded/sprite.png) -88px -53px no-repeat} -div.light_rounded .pp_top .pp_right{background:url(images/prettyPhoto/light_rounded/sprite.png) -110px -53px no-repeat} -div.light_rounded .pp_next:hover{background:url(images/prettyPhoto/light_rounded/btnNext.png) center right no-repeat;cursor:pointer} -div.light_rounded .pp_previous:hover{background:url(images/prettyPhoto/light_rounded/btnPrevious.png) center left no-repeat;cursor:pointer} -div.light_rounded .pp_expand{background:url(images/prettyPhoto/light_rounded/sprite.png) -31px -26px no-repeat;cursor:pointer} -div.light_rounded .pp_expand:hover{background:url(images/prettyPhoto/light_rounded/sprite.png) -31px -47px no-repeat;cursor:pointer} -div.light_rounded .pp_contract{background:url(images/prettyPhoto/light_rounded/sprite.png) 0 -26px no-repeat;cursor:pointer} -div.light_rounded .pp_contract:hover{background:url(images/prettyPhoto/light_rounded/sprite.png) 0 -47px no-repeat;cursor:pointer} -div.light_rounded .pp_close{width:75px;height:22px;background:url(images/prettyPhoto/light_rounded/sprite.png) -1px -1px no-repeat;cursor:pointer} -div.light_rounded .pp_nav .pp_play{background:url(images/prettyPhoto/light_rounded/sprite.png) -1px -100px no-repeat;height:15px;width:14px} -div.light_rounded .pp_nav .pp_pause{background:url(images/prettyPhoto/light_rounded/sprite.png) -24px -100px no-repeat;height:15px;width:14px} -div.light_rounded .pp_arrow_previous{background:url(images/prettyPhoto/light_rounded/sprite.png) 0 -71px no-repeat} -div.light_rounded .pp_arrow_next{background:url(images/prettyPhoto/light_rounded/sprite.png) -22px -71px no-repeat} -div.light_rounded .pp_bottom .pp_left{background:url(images/prettyPhoto/light_rounded/sprite.png) -88px -80px no-repeat} -div.light_rounded .pp_bottom .pp_right{background:url(images/prettyPhoto/light_rounded/sprite.png) -110px -80px no-repeat} -div.dark_rounded .pp_top .pp_left{background:url(images/prettyPhoto/dark_rounded/sprite.png) -88px -53px no-repeat} -div.dark_rounded .pp_top .pp_right{background:url(images/prettyPhoto/dark_rounded/sprite.png) -110px -53px no-repeat} -div.dark_rounded .pp_content_container .pp_left{background:url(images/prettyPhoto/dark_rounded/contentPattern.png) top left repeat-y} -div.dark_rounded .pp_content_container .pp_right{background:url(images/prettyPhoto/dark_rounded/contentPattern.png) top right repeat-y} -div.dark_rounded .pp_next:hover{background:url(images/prettyPhoto/dark_rounded/btnNext.png) center right no-repeat;cursor:pointer} -div.dark_rounded .pp_previous:hover{background:url(images/prettyPhoto/dark_rounded/btnPrevious.png) center left no-repeat;cursor:pointer} -div.dark_rounded .pp_expand{background:url(images/prettyPhoto/dark_rounded/sprite.png) -31px -26px no-repeat;cursor:pointer} -div.dark_rounded .pp_expand:hover{background:url(images/prettyPhoto/dark_rounded/sprite.png) -31px -47px no-repeat;cursor:pointer} -div.dark_rounded .pp_contract{background:url(images/prettyPhoto/dark_rounded/sprite.png) 0 -26px no-repeat;cursor:pointer} -div.dark_rounded .pp_contract:hover{background:url(images/prettyPhoto/dark_rounded/sprite.png) 0 -47px no-repeat;cursor:pointer} -div.dark_rounded .pp_close{width:75px;height:22px;background:url(images/prettyPhoto/dark_rounded/sprite.png) -1px -1px no-repeat;cursor:pointer} -div.dark_rounded .pp_description{margin-right:85px;color:#fff} -div.dark_rounded .pp_nav .pp_play{background:url(images/prettyPhoto/dark_rounded/sprite.png) -1px -100px no-repeat;height:15px;width:14px} -div.dark_rounded .pp_nav .pp_pause{background:url(images/prettyPhoto/dark_rounded/sprite.png) -24px -100px no-repeat;height:15px;width:14px} -div.dark_rounded .pp_arrow_previous{background:url(images/prettyPhoto/dark_rounded/sprite.png) 0 -71px no-repeat} -div.dark_rounded .pp_arrow_next{background:url(images/prettyPhoto/dark_rounded/sprite.png) -22px -71px no-repeat} -div.dark_rounded .pp_bottom .pp_left{background:url(images/prettyPhoto/dark_rounded/sprite.png) -88px -80px no-repeat} -div.dark_rounded .pp_bottom .pp_right{background:url(images/prettyPhoto/dark_rounded/sprite.png) -110px -80px no-repeat} -div.dark_rounded .pp_loaderIcon{background:url(images/prettyPhoto/dark_rounded/loader.gif) center center no-repeat} -div.dark_square .pp_left,div.dark_square .pp_middle,div.dark_square .pp_right,div.dark_square .pp_content{background:#000} -div.dark_square .pp_description{color:#fff;margin:0 85px 0 0} -div.dark_square .pp_loaderIcon{background:url(images/prettyPhoto/dark_square/loader.gif) center center no-repeat} -div.dark_square .pp_expand{background:url(images/prettyPhoto/dark_square/sprite.png) -31px -26px no-repeat;cursor:pointer} -div.dark_square .pp_expand:hover{background:url(images/prettyPhoto/dark_square/sprite.png) -31px -47px no-repeat;cursor:pointer} -div.dark_square .pp_contract{background:url(images/prettyPhoto/dark_square/sprite.png) 0 -26px no-repeat;cursor:pointer} -div.dark_square .pp_contract:hover{background:url(images/prettyPhoto/dark_square/sprite.png) 0 -47px no-repeat;cursor:pointer} -div.dark_square .pp_close{width:75px;height:22px;background:url(images/prettyPhoto/dark_square/sprite.png) -1px -1px no-repeat;cursor:pointer} -div.dark_square .pp_nav{clear:none} -div.dark_square .pp_nav .pp_play{background:url(images/prettyPhoto/dark_square/sprite.png) -1px -100px no-repeat;height:15px;width:14px} -div.dark_square .pp_nav .pp_pause{background:url(images/prettyPhoto/dark_square/sprite.png) -24px -100px no-repeat;height:15px;width:14px} -div.dark_square .pp_arrow_previous{background:url(images/prettyPhoto/dark_square/sprite.png) 0 -71px no-repeat} -div.dark_square .pp_arrow_next{background:url(images/prettyPhoto/dark_square/sprite.png) -22px -71px no-repeat} -div.dark_square .pp_next:hover{background:url(images/prettyPhoto/dark_square/btnNext.png) center right no-repeat;cursor:pointer} -div.dark_square .pp_previous:hover{background:url(images/prettyPhoto/dark_square/btnPrevious.png) center left no-repeat;cursor:pointer} -div.light_square .pp_expand{background:url(images/prettyPhoto/light_square/sprite.png) -31px -26px no-repeat;cursor:pointer} -div.light_square .pp_expand:hover{background:url(images/prettyPhoto/light_square/sprite.png) -31px -47px no-repeat;cursor:pointer} -div.light_square .pp_contract{background:url(images/prettyPhoto/light_square/sprite.png) 0 -26px no-repeat;cursor:pointer} -div.light_square .pp_contract:hover{background:url(images/prettyPhoto/light_square/sprite.png) 0 -47px no-repeat;cursor:pointer} -div.light_square .pp_close{width:75px;height:22px;background:url(images/prettyPhoto/light_square/sprite.png) -1px -1px no-repeat;cursor:pointer} -div.light_square .pp_nav .pp_play{background:url(images/prettyPhoto/light_square/sprite.png) -1px -100px no-repeat;height:15px;width:14px} -div.light_square .pp_nav .pp_pause{background:url(images/prettyPhoto/light_square/sprite.png) -24px -100px no-repeat;height:15px;width:14px} -div.light_square .pp_arrow_previous{background:url(images/prettyPhoto/light_square/sprite.png) 0 -71px no-repeat} -div.light_square .pp_arrow_next{background:url(images/prettyPhoto/light_square/sprite.png) -22px -71px no-repeat} -div.light_square .pp_next:hover{background:url(images/prettyPhoto/light_square/btnNext.png) center right no-repeat;cursor:pointer} -div.light_square .pp_previous:hover{background:url(images/prettyPhoto/light_square/btnPrevious.png) center left no-repeat;cursor:pointer} -div.facebook .pp_top .pp_left{background:url(images/prettyPhoto/facebook/sprite.png) -88px -53px no-repeat} -div.facebook .pp_top .pp_middle{background:url(images/prettyPhoto/facebook/contentPatternTop.png) top left repeat-x} -div.facebook .pp_top .pp_right{background:url(images/prettyPhoto/facebook/sprite.png) -110px -53px no-repeat} -div.facebook .pp_content_container .pp_left{background:url(images/prettyPhoto/facebook/contentPatternLeft.png) top left repeat-y} -div.facebook .pp_content_container .pp_right{background:url(images/prettyPhoto/facebook/contentPatternRight.png) top right repeat-y} -div.facebook .pp_expand{background:url(images/prettyPhoto/facebook/sprite.png) -31px -26px no-repeat;cursor:pointer} -div.facebook .pp_expand:hover{background:url(images/prettyPhoto/facebook/sprite.png) -31px -47px no-repeat;cursor:pointer} -div.facebook .pp_contract{background:url(images/prettyPhoto/facebook/sprite.png) 0 -26px no-repeat;cursor:pointer} -div.facebook .pp_contract:hover{background:url(images/prettyPhoto/facebook/sprite.png) 0 -47px no-repeat;cursor:pointer} -div.facebook .pp_close{width:22px;height:22px;background:url(images/prettyPhoto/facebook/sprite.png) -1px -1px no-repeat;cursor:pointer} -div.facebook .pp_description{margin:0 37px 0 0} -div.facebook .pp_loaderIcon{background:url(images/prettyPhoto/facebook/loader.gif) center center no-repeat} -div.facebook .pp_arrow_previous{background:url(images/prettyPhoto/facebook/sprite.png) 0 -71px no-repeat;height:22px;margin-top:0;width:22px} -div.facebook .pp_arrow_previous.disabled{background-position:0 -96px;cursor:default} -div.facebook .pp_arrow_next{background:url(images/prettyPhoto/facebook/sprite.png) -32px -71px no-repeat;height:22px;margin-top:0;width:22px} -div.facebook .pp_arrow_next.disabled{background-position:-32px -96px;cursor:default} -div.facebook .pp_nav{margin-top:0} -div.facebook .pp_nav p{font-size:15px;padding:0 3px 0 4px} -div.facebook .pp_nav .pp_play{background:url(images/prettyPhoto/facebook/sprite.png) -1px -123px no-repeat;height:22px;width:22px} -div.facebook .pp_nav .pp_pause{background:url(images/prettyPhoto/facebook/sprite.png) -32px -123px no-repeat;height:22px;width:22px} -div.facebook .pp_next:hover{background:url(images/prettyPhoto/facebook/btnNext.png) center right no-repeat;cursor:pointer} -div.facebook .pp_previous:hover{background:url(images/prettyPhoto/facebook/btnPrevious.png) center left no-repeat;cursor:pointer} -div.facebook .pp_bottom .pp_left{background:url(images/prettyPhoto/facebook/sprite.png) -88px -80px no-repeat} -div.facebook .pp_bottom .pp_middle{background:url(images/prettyPhoto/facebook/contentPatternBottom.png) top left repeat-x} -div.facebook .pp_bottom .pp_right{background:url(images/prettyPhoto/facebook/sprite.png) -110px -80px no-repeat} -div.pp_pic_holder a:focus{outline:none} -div.pp_overlay{background:#000;display:none;left:0;position:absolute;top:0;width:100%;z-index:9500} -div.pp_pic_holder{display:none;position:absolute;width:100px;z-index:10000} -.pp_content{height:40px;min-width:40px} -* html .pp_content{width:40px} -.pp_content_container{position:relative;text-align:left;width:100%} -.pp_content_container .pp_left{padding-left:20px} -.pp_content_container .pp_right{padding-right:20px} -.pp_content_container .pp_details{float:left;margin:10px 0 2px} -.pp_description{display:none;margin:0} -.pp_social{float:left;margin:0} -.pp_social .facebook{float:left;margin-left:5px;width:55px;overflow:hidden} -.pp_social .twitter{float:left} -.pp_nav{clear:right;float:left;margin:3px 10px 0 0} -.pp_nav p{float:left;white-space:nowrap;margin:2px 4px} -.pp_nav .pp_play,.pp_nav .pp_pause{float:left;margin-right:4px;text-indent:-10000px} -a.pp_arrow_previous,a.pp_arrow_next{display:block;float:left;height:15px;margin-top:3px;overflow:hidden;text-indent:-10000px;width:14px} -.pp_hoverContainer{position:absolute;top:0;width:100%;z-index:2000} -.pp_gallery{display:none;left:50%;margin-top:-50px;position:absolute;z-index:10000} -.pp_gallery div{float:left;overflow:hidden;position:relative} -.pp_gallery ul{float:left;height:35px;position:relative;white-space:nowrap;margin:0 0 0 5px;padding:0} -.pp_gallery ul a{border:1px rgba(0,0,0,0.5) solid;display:block;float:left;height:33px;overflow:hidden} -.pp_gallery ul a img{border:0} -.pp_gallery li{display:block;float:left;margin:0 5px 0 0;padding:0} -.pp_gallery li.default a{background:url(images/prettyPhoto/facebook/default_thumbnail.gif) 0 0 no-repeat;display:block;height:33px;width:50px} -.pp_gallery .pp_arrow_previous,.pp_gallery .pp_arrow_next{margin-top:7px!important} -a.pp_next{background:url(images/prettyPhoto/light_rounded/btnNext.png) 10000px 10000px no-repeat;display:block;float:right;height:100%;text-indent:-10000px;width:49%} -a.pp_previous{background:url(images/prettyPhoto/light_rounded/btnNext.png) 10000px 10000px no-repeat;display:block;float:left;height:100%;text-indent:-10000px;width:49%} -a.pp_expand,a.pp_contract{cursor:pointer;display:none;height:20px;position:absolute;right:30px;text-indent:-10000px;top:10px;width:20px;z-index:20000} -a.pp_close{position:absolute;right:0;top:0;display:block;line-height:22px;text-indent:-10000px} -.pp_loaderIcon{display:block;height:24px;left:50%;position:absolute;top:50%;width:24px;margin:-12px 0 0 -12px} -#pp_full_res{line-height:1!important} -#pp_full_res .pp_inline{text-align:left} -#pp_full_res .pp_inline p{margin:0 0 15px} -div.ppt{color:#fff;display:none;font-size:17px;z-index:9999;margin:0 0 5px 15px} -div.pp_default .pp_content,div.light_rounded .pp_content{background-color:#fff} -div.pp_default #pp_full_res .pp_inline,div.light_rounded .pp_content .ppt,div.light_rounded #pp_full_res .pp_inline,div.light_square .pp_content .ppt,div.light_square #pp_full_res .pp_inline,div.facebook .pp_content .ppt,div.facebook #pp_full_res .pp_inline{color:#000} -div.pp_default .pp_gallery ul li a:hover,div.pp_default .pp_gallery ul li.selected a,.pp_gallery ul a:hover,.pp_gallery li.selected a{border-color:#fff} -div.pp_default .pp_details,div.light_rounded .pp_details,div.dark_rounded .pp_details,div.dark_square .pp_details,div.light_square .pp_details,div.facebook .pp_details{position:relative} -div.light_rounded .pp_top .pp_middle,div.light_rounded .pp_content_container .pp_left,div.light_rounded .pp_content_container .pp_right,div.light_rounded .pp_bottom .pp_middle,div.light_square .pp_left,div.light_square .pp_middle,div.light_square .pp_right,div.light_square .pp_content,div.facebook .pp_content{background:#fff} -div.light_rounded .pp_description,div.light_square .pp_description{margin-right:85px} -div.light_rounded .pp_gallery a.pp_arrow_previous,div.light_rounded .pp_gallery a.pp_arrow_next,div.dark_rounded .pp_gallery a.pp_arrow_previous,div.dark_rounded .pp_gallery a.pp_arrow_next,div.dark_square .pp_gallery a.pp_arrow_previous,div.dark_square .pp_gallery a.pp_arrow_next,div.light_square .pp_gallery a.pp_arrow_previous,div.light_square .pp_gallery a.pp_arrow_next{margin-top:12px!important} -div.light_rounded .pp_arrow_previous.disabled,div.dark_rounded .pp_arrow_previous.disabled,div.dark_square .pp_arrow_previous.disabled,div.light_square .pp_arrow_previous.disabled{background-position:0 -87px;cursor:default} -div.light_rounded .pp_arrow_next.disabled,div.dark_rounded .pp_arrow_next.disabled,div.dark_square .pp_arrow_next.disabled,div.light_square .pp_arrow_next.disabled{background-position:-22px -87px;cursor:default} -div.light_rounded .pp_loaderIcon,div.light_square .pp_loaderIcon{background:url(images/prettyPhoto/light_rounded/loader.gif) center center no-repeat} -div.dark_rounded .pp_top .pp_middle,div.dark_rounded .pp_content,div.dark_rounded .pp_bottom .pp_middle{background:url(images/prettyPhoto/dark_rounded/contentPattern.png) top left repeat} -div.dark_rounded .currentTextHolder,div.dark_square .currentTextHolder{color:#c4c4c4} -div.dark_rounded #pp_full_res .pp_inline,div.dark_square #pp_full_res .pp_inline{color:#fff} -.pp_top,.pp_bottom{height:20px;position:relative} -* html .pp_top,* html .pp_bottom{padding:0 20px} -.pp_top .pp_left,.pp_bottom .pp_left{height:20px;left:0;position:absolute;width:20px} -.pp_top .pp_middle,.pp_bottom .pp_middle{height:20px;left:20px;position:absolute;right:20px} -* html .pp_top .pp_middle,* html .pp_bottom .pp_middle{left:0;position:static} -.pp_top .pp_right,.pp_bottom .pp_right{height:20px;left:auto;position:absolute;right:0;top:0;width:20px} -.pp_fade,.pp_gallery li.default a img{display:none} - -/* -------------------------------------------- - LAYOUT --------------------------------------------- */ - -.boxed-layout { - width: 1000px; - margin: 0px auto; - background: #fff; -} -.page-shadow .boxed-layout { - -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, .3); - -moz-box-shadow: 0 0 4px rgba(0, 0, 0, .3); - box-shadow: 0 0 4px rgba(0, 0, 0, .3); -} -#not-found .page-text p { - margin-bottom: 50px; -} -#main-container { - display: block; - overflow: hidden; - position: relative; -} -.inner-page-wrap { - margin-top: 50px; - margin-bottom: 50px; -} -.single-portfolio .inner-page-wrap, .inner-page-wrap.no-bottom-spacing { - margin-bottom: 0; -} -.single-portfolio .media-wrap { - margin-top: 50px; - margin-bottom: 0; -} -.inner-page-wrap.no-top-spacing { - margin-top: 0; -} -.has-left-sidebar aside.sidebar { - float: left; -} -.has-left-sidebar article, .has-left-sidebar .type-page, .has-left-sidebar .archive-page, .has-left-sidebar > .type-product { - float: right!important; -} -.has-both-sidebars aside.left-sidebar { - float: left; -} -.has-both-sidebars aside.right-sidebar { - float: right; -} -.has-both-sidebars article, .has-both-sidebars .type-page, .has-both-sidebars .archive-page, .has-both-sidebars > .type-product { - float: left; -} -.has-both-sidebars .page-content { - float: right!important; -} -.page-content { - border-bottom: 0 solid transparent; -} -.page-content > ul { - list-style: disc inside none; -} -.has-both-sidebars aside.sidebar { - padding-top: 0; -} -.alt-bg { - margin: 40px 0; - margin-left: -180px; - padding-top: 30px; - padding-bottom: 30px; - padding-left: 200px; - padding-right: 200px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; -} -.pb-margin-bottom { - margin-bottom: 30px; -} -.pb-border-bottom { - border-bottom: 1px solid transparent; -} -.pb-border-top { - border-top: 1px solid transparent; -} -.wpb_wrapper .row-fluid { - border-bottom: 0; - margin-bottom: 10px; -} -.heading-wrap i { - font-size: 28px; - margin-right: 15px; - line-height: 30px; - float: left; - display: inline-block; -} -.slider-wrap .heading-wrap { - text-align: center; - margin-bottom: 10px; -} -h3.wpb_heading { - display: inline-block; - font-weight: normal; - margin-top: 0; - margin-bottom: 20px; - padding-bottom: 4px; - border-bottom: 2px solid transparent; -} -.help-text { - font-size: 18px; - line-height: 26px; - margin-bottom: 60px; -} -.help-text .search-form { - margin-bottom: 40px; -} -.help-text .search-form input { - font-size: 12px; -} - -/* -------------------------------------------- - PAGE HEADING --------------------------------------------- */ - -.page-heading { - padding-top: 30px; - padding-bottom: 30px; - margin-top: 0; - margin-bottom: 0!important; - position: relative; - text-align: center; - border-bottom: 1px solid transparent; - border-top: 0!important; -} -.page-heading h1 { - margin-top: 0; - margin-bottom: 0; -} -.page-heading h3 { - margin-bottom: 0; -} -#breadcrumbs { - font-size: 11px; - line-height: 22px; - margin-top: 0; - margin-bottom: 0; - border-top: 0; - padding-top: 6px; - padding-bottom: 6px; - z-index: 28; - position: relative; -} -#breadcrumbs a { - text-decoration: none; -} -#breadcrumbs i, .widget_breadcrumb_navxt i { - padding: 0 8px; - font-size: 11px; - width: 5px; -} - -/* -------------------------------------------- - PAGINATION --------------------------------------------- */ - -.pagination-wrap { - margin-top: 30px; -} -.single .pagination-wrap { - margin: 0; - padding: 15px 0; - margin-bottom: 20px; - margin-top: 10px!important; - border-bottom: 1px solid transparent; -} -.single .pagination-wrap.portfolio-pagination { - border-bottom: 0; - margin: 10px 0; -} -.single.single-team .portfolio-pagination.pagination-wrap { - border-top-width: 1px; - border-top-style: solid; -} - -/* -------------------------------------------- - SEARCH FORM --------------------------------------------- */ - -.search-form input { - border: 1px solid #ccc; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; - background: transparent; - width: 85%; - padding: 10px; - margin-top: 40px; -} - -/* -------------------------------------------- - TOOLTIPS --------------------------------------------- */ - -span.tooltip { - display: block; - background: #222; - color: #f7f7f7; - position: absolute; - left: 50%; - bottom: 25px; - padding: 3px 10px; - width: auto; - line-height: 20px; - white-space: nowrap; - z-index: 8; - opacity: 0; - -moz-opacity: 0; - filter:alpha(opacity=0); -} -span.tooltip .arrow { - position: absolute; - left: 50%; - bottom: -4px; - margin-left: -6px; - width: 0; - height: 0; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-top: 5px solid #222; -} -.grid-image span.tooltip { - bottom: 65px; -} - -/* #Header -================================================== */ - -.hide-header #top-bar, .hide-header #header-section, .hide-header #mini-header { - display: none; -} - -/* -------------------------------------------- - TOP BAR --------------------------------------------- */ - -#top-bar { - border-bottom: 1px solid transparent; -} -#top-bar #top-bar-menu { - position: relative; - z-index: 32; -} -#top-bar.top-bar-menu-right .top-menu { - float: right; -} -#top-bar.top-bar-menu-right .menu { - float: right; -} -.top-bar-menu-right #top-bar-menu > div { - float: right; -} -#top-bar.top-bar-menu-left #top-bar-menu > div { - float: left; - margin-left: 0; -} -#top-bar .menu > li { - font-size: 11px; - border-left: 1px solid transparent; -} -#top-bar .menu > li:first-child { - border-left-width: 0; - border-top-width: 1px; -} -#top-bar #aux-nav .menu > li:first-child { - border-left-width: 1px; -} -#top-bar.top-bar-menu-left #aux-nav .menu > li { - border-left: 0; - border-right: 1px solid #e4e4e4; -} -#top-bar .menu > li:before { - display: none; -} -#top-bar .menu > li.parent:after { - content: "\f107"; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: block; - font-size: 12px; - position: absolute; - top: 50%; - margin-top: -9px; - right: 9px; -} -#top-bar .menu > li.parent { - padding-right: 15px; -} -#top-bar .menu > li > a { - padding: 3px 10px 3px; - margin: 0; -} -nav#top-bar-menu .menu > li > ul { - top: 30px; - min-width: auto; -} -#top-bar.top-bar-menu-right .menu > li > ul { - left: auto; - right: -1px; -} -nav#mobile-top-bar-menu { - display: none; -} - -/* -------------------------------------------- - TOP BAR SOCIAL --------------------------------------------- */ - -.top-bar-menu-right #top-bar-social { - float: left; -} -.top-bar-menu-left #top-bar-social { - float: right; -} -#top-bar-social { - font-size: 11px; - line-height: 30px; - text-align: right; -} -#top-bar-social > ul { - float: right; - margin-top: 3px; - margin-bottom: 0; - -moz-opacity: 0.5; - filter: alpha(opacity= 50); - opacity: 0.5; -} -.top-bar-menu-right #top-bar-social > ul { - float: left; -} -#top-bar-social ul li { - margin-bottom: 0; -} -.top-bar-menu-right #top-bar-social { - text-align: left; -} - -/* -------------------------------------------- - TOP BAR SUBSCRIBE --------------------------------------------- */ - -#header-subscribe form { - margin: 20px; - height: auto; - overflow: hidden; -} -#header-subscribe label { - font-size: 12px; -} -#header-subscribe input { - font-size: 12px; -} -#header-subscribe .sf-button { - -moz-border-radius: 8px; - -webkit-border-radius: 8px; - border-radius: 8px; - float: right; - padding: 6px 12px; - margin-top: 5px; -} -#header-subscribe .sf-button:hover { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - - -/* -------------------------------------------- - TOP BAR LOGIN --------------------------------------------- */ - -#header-login form { - margin: 20px; -} -#header-login label { - font-size: 12px; -} -#header-login input { - font-size: 12px; -} -#header-login input#password { - margin-bottom: 15px; -} -#header-login .sf-button { - -moz-border-radius: 8px; - -webkit-border-radius: 8px; - border-radius: 8px; - float: right; - padding: 6px 12px; - margin-top: 5px; -} -#header-login .sf-button:hover { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -#header-login a { - display: inline; - padding: 0 5px; - line-height: 24px; -} -#header-login .logout-wrap { - margin: 20px; -} - -/* -------------------------------------------- - TOP BAR LANGUAGE SELECTOR --------------------------------------------- */ - -.aux-languages .languages-menu-item > img { - margin-right: 8px; - vertical-align: -2px; -} -#header-languages > li > a, #header-languages > li > div { - padding: 8px 12px; - display: block; - white-space: nowrap; -} -#header-languages img { - margin-right: 10px; - width: 18px; - height: 12px; - display: inline-block; - margin-top: -2px; -} - - -/* -------------------------------------------- - TOP BAR CART VIEW --------------------------------------------- */ - -#header-cart > li > div { - padding: 8px 12px; - display: block; - white-space: nowrap; -} - - -/* -------------------------------------------- - MAIN HEADER --------------------------------------------- */ - -#header-section { - padding: 15px 0; - border-bottom: 1px solid #e4e4e4; -} -#header-section .header-spacer { - display: block; - height: 20px; -} -#logo a, #mini-logo a { - height: auto; - overflow: hidden; - display: block; -} -#logo img, #mini-logo img { - display: block; - max-width: 100%; -} -.logo-fade #logo img { - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} -#logo img.retina, #mini-logo img.retina { - display: none; - max-width: 100%; -} -#mini-logo img { - max-height: 60px; - width: auto!important; - padding: 5px 0; -} -.logo-right #logo { - float: right; -} -.logo-right #logo img { - float: right; -} -.logo-fade #logo a:hover img { - -moz-opacity: 0.6; - filter: alpha(opacity= 60); - opacity: 0.6; -} -#nav-section { - min-height: 50px; - position: relative; - z-index: 30; -} -#nav-section.nav-shadow { - -moz-box-shadow: 0 2px 4px -2px rgba(0,0,0,.1); - -webkit-box-shadow: 0 2px 4px -2px rgba(0,0,0,.1); - box-shadow: 0 2px 4px -2px rgba(0,0,0,.1); -} -#main-navigation { - float: left; - margin-top: 1px; - position: relative; -} -.logo-right #main-navigation, .logo-right #mini-navigation { - margin-left: -10px; -} -.logo-left .nav-wrap { - float: right; -} -#main-navigation > div { - margin-left: 0; -} -#nav-pointer { - position: absolute; - bottom: 3px; - left: 0; - width: 0; - height: 2px; - display: none; - z-index: 2; -} -.nav-indicator #nav-pointer { - display: block; -} -.single #nav-pointer { - display: none; -} -.error404 #nav-pointer { - display: none; -} -nav .menu { - height: auto; - margin: 0; - position: relative; - padding: 0; -} -nav .menu li { - float: left; - display: inline-block; - margin: 0; - font-size: 14px; - padding: 2px 0; - position: relative; - z-index: 3; -} -nav .menu li:first-child { - background: none; -} -.menu-dividers nav .menu .sub-menu li { - background: none; -} -nav .menu li a { - text-decoration: none; - padding: 12px 0; - margin: 0 15px; - display: block; - white-space: nowrap; - background: transparent; -} -.menu-dividers nav .menu > li:before { - content: ''; - position: absolute; - left: 0; - top: 50%; - margin-left: -3px; - margin-top: -3px; - background: #ccc; - width: 6px; - height: 6px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; -} -nav .menu > li:first-child > a { - padding-left: 0; -} -nav .menu > li:first-child:before { - display: none; -} -nav .menu ul { - border: 1px solid transparent; - position: absolute; - height: auto; - z-index: 9995; - margin: 0; - top: 45px; - left: 15px; - min-width: 100px; - display: none; -} -nav .menu ul li { - width: 100%; - position: relative; - display: block; - background: none repeat scroll 0 0 transparent; - border-bottom: 1px solid transparent; - float: none; - margin: 0; - padding: 0; - font-weight: normal; - font-size: 11px; - text-transform: none; - height: auto; - z-index: 42; -} -nav .menu .sub-menu .parent > a:after { - content: ''; - width: 0; - height: 0; - border-top: 4px solid transparent; - border-bottom: 4px solid transparent; - border-left: 4px solid #CCC; - position: absolute; - right: 10px; - top: 50%; - margin-top: -4px; -} -nav .menu ul ul { - top: -1px; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -nav .menu ul ul li:first-child:after { - left: -8px; - top: 32%; - margin-top: 0; - border-top: 6px solid transparent; - border-right: 6px solid #444; - border-bottom: 6px solid transparent; -} -nav .menu ul li:last-child { - border: 0; -} -nav .menu ul li a { - padding: 8px 12px; - display: block; - margin: 0; - white-space: nowrap; - max-width: 220px; - text-overflow: ellipsis; - overflow: hidden; -} -nav .menu ul li.parent a { - padding-right: 24px; -} -nav .menu li:hover ul li a { - background-color: transparent; -} -.show-menu { - margin: 0 auto; - font-size: 12px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - padding: 10px 15px; - line-height: 20px; -} -#top-bar .show-menu { - width: 60%; - padding: 6px 10px; -} -.show-menu:hover { - text-decoration: none; -} -.show-menu i { - float: right; - line-height: 20px; - font-size: 18px; -} -#nav-search { - display: block; - text-decoration: none; - float: left; - border-radius: 30px; - padding: 4px 9px; - line-height: 11px; - height: 21px; - margin-top: 10px; - margin-left: 10px; -} -.logo-right #nav-search { - margin-left: 5px; - margin-right: 0; -} -#nav-search a { - text-decoration: none; - float: left; - padding-top: 4px; -} -#nav-search i { - display: inline-block; - font-size: 12px; -} -#nav-search form { - float: right; - margin-bottom: 0; -} -#nav-search input { - float: right; - width: 1px; - max-width: none; - text-align: left; - height: 18px; - border: 0; - margin: 0; - box-shadow: none; - padding: 0!important; - background: none; - font-size: 12px; - line-height: 18px; -} -#nav-search input:focus { - outline: none; - border: 0; - padding: 2px 5px 0!important; - box-shadow: none; -} -#header-shadow { - background: transparent url('images/header-shadow.png') no-repeat center top; - background-size: 100% auto; - width: 100%; - height: 30px; - position: absolute; - top: 0; - left: 0; - z-index: 27; -} - -/* -------------------------------------------- - MINI HEADER --------------------------------------------- */ - -#mini-header { - border-bottom: 1px solid #e4e4e4; - display: block; - position: fixed; - top: -120px; - z-index: 999; - width: 100%; -} -.boxed-layout #mini-header { - width: auto; - padding: 0 30px; -} -#mini-header #logo img { - height: 32px; - width: auto!important; - padding: 8px 0; -} -#mini-navigation { - float: left; -} -#mini-navigation .menu > li > ul { - top: 48px; - left: 0!important; -} -#mini-navigation .menu ul li ul { - top: 0; -} -#mini-search { - display: block; - text-decoration: none; - float: left; - border-radius: 30px; - padding: 4px 9px; - line-height: 11px; - height: 21px; - margin-top: 10px; - margin-left: 10px; -} -.logo-right #mini-search { - margin-left: 5px; - margin-right: 0; -} -#mini-search a { - text-decoration: none; - float: left; - padding-top: 4px; -} -#mini-search i { - display: inline-block; - font-size: 12px; -} -#mini-search form { - float: right; - margin-bottom: 0; -} -#mini-search input { - float: right; - display: none; - width: 1px; - max-width: none; - text-align: left; - height: 18px; - border: 0; - margin: 0; - box-shadow: none; - padding: 0!important; - background: none; - font-size: 12px; - line-height: 18px; -} -#mini-search input:focus { - outline: none; - border: 0; - padding: 2px 5px 0!important; - box-shadow: none; -} - -/* #Widgets -================================================== */ - -.widget { - padding-bottom: 45px; -} -.widget ul { - margin: 0; - list-style: none; -} -.widget ul li { - margin-bottom: 0; - line-height: 16px; -} -.widget_recent_comments ul li { - padding: 10px; -} -.widget ul li > a { - padding: 5px 0; - display: block; -} -.widget ul.flickr_images li a { - padding: 0; -} -.widget a { - text-decoration: none; -} -.widget a:hover { - text-decoration: underline; -} -.widget_categories ul, .widget_archive ul, .widget_nav_menu ul, .widget_recent_comments ul, .widget_meta ul, .widget_recent_entries ul, .widget_product_categories ul { - border: 1px solid #ececec; /* stroke */ - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; /* border radius */ - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; /* prevents bg color from leaking outside the border */ -} -.widget_categories ul > li, .widget_archive ul > li, .widget_nav_menu ul > li, .widget_recent_comments ul > li, .widget_meta ul > li, .widget_recent_entries ul > li, .widget_product_categories ul > li { - border-top: 1px solid transparent; -} -.widget_categories ul > li:first-child, .widget_archive ul > li:first-child, .widget_nav_menu ul > li:first-child, .widget_recent_comments ul > li:first-child, .widget_meta ul > li:first-child, .widget_recent_entries ul > li:first-child, .widget_product_categories ul > li:first-child { - border-top: 0; -} -.widget_categories ul > li a, .widget_archive ul > li a, .widget_nav_menu ul > li a, .widget_meta ul > li a, .widget_recent_entries ul > li a, .widget_product_categories ul > li a { - padding: 10px 15px; -} -.widget_categories ul > li a:hover, .widget_archive ul > li a:hover, .widget_nav_menu ul > li a:hover, .widget_meta ul > li a:hover, .widget_recent_entries ul > li a:hover, .widget_product_categories ul > li a:hover { - text-decoration: none; -} -.widget_categories ul > li a:before, .widget_archive ul > li a:before, .widget_nav_menu ul > li a:before, .widget_meta ul > li a:before, .widget_recent_entries ul > li a:before, .widget_product_categories ul > li a:before { - content: "\f105"; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: inline-block; - text-decoration: inherit; - font-size: 14px; - padding-right: 10px; -} -.widget_nav_menu ul.sub-menu { - -moz-border-radius: 0; - -webkit-border-radius: 0; - border-radius: 0; /* border radius */ - border-left: 0; - border-right: 0; - border-bottom: 0; -} -.widget_nav_menu ul.sub-menu li { - padding-left: 15px; -} -.widget .wp-tag-cloud { - margin: 0; - padding: 0; - list-style: none; - height: auto; - overflow: hidden; -} -.widget .wp-tag-cloud li { - float: left; - margin-bottom: 4px; -} -.widget ul.wp-tag-cloud li > a { - margin-right: 4px; - padding: 6px 8px; - text-decoration: none; - moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - border: 1px solid #e4e4e4; - font-size: 14px!important; -} -.widget .wp-tag-cloud li > a:hover { - border-color: transparent; -} -.widget-video iframe { - width: 100%; -} -.widget_search form { - position: relative; - margin-bottom: 0; -} -.widget_search form input { - margin: 0; - border: 0; - width: 100%; - height: 32px; - font-size: 12px; - moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; - background-color: #e4e4e4; - -moz-box-shadow: inset 0 1px 0 rgba(0,0,0,.1); - -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,.1); - box-shadow: inset 0 1px 0 rgba(0,0,0,.1); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.widget_search form:after { - content: "\f002"; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: inline-block; - text-decoration: inherit; - font-size: 14px; - padding-right: 10px; - position: absolute; - float: right; - top: 5px; - right: 0; - opacity: 0.3; - -moz-opacity: 0.3; - filter:alpha(opacity=30); -} -ul.recent-posts { - list-style: none; -} -.recent-post { - height: auto; - overflow: hidden; - float: left; - margin-bottom: 20px; - -moz-box-shadow: 0 1px 0 rgba(0,0,0,.1); - -webkit-box-shadow: 0 1px 0 rgba(0,0,0,.1); - box-shadow: 0 1px 0 rgba(0,0,0,.1); -} -.recent-post figure { - width: 100%; - height: auto; - position: relative; - background-color: #212121; - overflow: hidden; -} -.recent-post figure img { - width: 100%; - height: auto; - position: relative; - z-index: 3; - display: block!important; - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} -.recent-post figure iframe { - display: block; - width: 100%; -} -.recent-post figure:hover img { - -moz-transform: scale(1.2); - -webkit-transform: scale(1.2); - -o-transform: scale(1.2); - -ms-transform: scale(1.2); - transform: scale(1.2); -} -.recent-post .details-wrap { - display: inline-block; - vertical-align: top; - padding: 15px; -} -.recent-post .post-item-details { - padding: 15px; - border-top: 1px dashed transparent; -} -.recent-post .post-item-details .comments-likes, .recent-post .post-item-details .comments-likes i, .recent-post .post-item-details .comments-likes span { - font-weight: normal; -} -.recent-post .post-item-details .comments-likes .icon-comments { - margin-right: 3px; -} -.wpb_recent_posts_widget .recent-post .details-wrap, .wpb_posts_carousel_widget .recent-post .details-wrap { - padding: 15px 0; -} -.wpb_recent_posts_widget .recent-post .post-item-details, .wpb_posts_carousel_widget .recent-post .post-item-details { - padding: 15px 0; -} -.recent-post h4 { - margin-top: 0; - margin-bottom: 6px; -} -.recent-post h4 a { - text-decoration: none; -} -.recent-post .excerpt p { - margin-bottom: 0; -} -.recent-post.format-chat .chat { - margin-top: 20px; -} -.recent-post figure.quote { - background: transparent!important; -} -.blog-item.format-quote h2, .blog-item.format-status h2, .blog-item.format-aside h2, .blog-item.format-quote h3, .blog-item.format-status h3, .blog-item.format-aside h3, .blog-item.format-quote h4, .blog-item.format-status h4, .blog-item.format-aside h4 { - display: none; -} -.recent-post .post-date { - margin-right: 4px; -} -.read-more { - text-decoration: none; - display: block; - margin-top: 15px; -} -.read-more i, .read-more em { - margin-left: 4px; - margin-right: 6px; - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; - font-size: 0px; -} -.read-more i:before, .read-more em:before { - font-size: 12px!important; -} -.read-more:hover i, .read-more:hover em { - margin-left: 8px; -} -.read-more:hover { - text-decoration: none; -} -.read-more-link { - text-decoration: none; - margin-top: 5px; - font-weight: bold; - display: block; -} -.item-link { - text-decoration: none; -} -.item-link i { - margin-left: 5px; -} -.wpb_impact_text { - background: transparent; - clear: both; - height: auto; - overflow: hidden; -} -.wpb_impact_text.alt-bg { - padding-top: 20px; - padding-bottom: 20px; -} -.impact-text-wrap { - position: relative; -} -.wpb_impact_text.cta_align_right a.sf-button { - margin-right: 0; -} -.wpb_impact_text .wpb_call_text, .impact-text { - font-size: 24px; - line-height: 32px; - font-weight: 300; - margin-bottom: 0; -} -.wpb_impact_text .wpb_button { - margin-bottom: 0; -} -.cta_align_left .wpb_call_text, .cta_align_right .wpb_call_text { - width: 83%; -} -.cta_align_left .wpb_button { - position: absolute; - left: 0; - top: 50%; - margin-top: -15px; - max-width: 12%; - max-width: 15%; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - word-wrap: break-word; -} -.cta_align_right .wpb_button { - position: absolute; - right: 0; - top: 50%; - margin-top: -15px; - max-width: 12%; -} -.cta_align_left .wpb_button.large, .cta_align_right .wpb_button.large { - margin-top: -23px; -} -.cta_align_bottom .wpb_button { - margin: 15px 0 0 0; -} -.wpb_latest_tweet_bar_widget { - padding: 25px 0; -} -.wpb_latest_tweet_bar_widget .twitter-bird { - font-size: 14px; - line-height: 24px; - float: left; - margin-right: 10px; -} -.wpb_latest_tweet_bar_widget .tweet-text { - line-height: 24px; - display: block; - float: left; - margin-right: 5px; -} -.wpb_latest_tweet_bar_widget .tweet-text a { - font-weight: bold; - text-decoration: none; -} -.wpb_latest_tweet_bar_widget .twitter_intents { - display: inline-block; - line-height: 24px; - margin-left: 10px; -} -.wpb_latest_tweet_bar_widget .twitter_intents a { - margin-left: 5px; -} -.carousel-wrap { - position: relative; - overflow: hidden; -} -.carousel-wrap .heading-wrap { - height: auto; - overflow: hidden; - min-height: 50px; -} -.carousel-wrap .heading-wrap .carousel-nav { - position: absolute; - right: 0; - top: 0; -} -.carousel-wrap .carousel-items { - display: none; - list-style: none; -} -.caroufredsel_wrapper { - margin-left: -20px!important; -} -.carousel-wrap .carousel-items > li { - margin-bottom: 10px; - float: left; -} -.carousel-wrap a.prev { - position: absolute; - top: 14px; - right: 18px; -} -.carousel-wrap a.next { - position: absolute; - top: 14px; - right: 0; -} -.carousel-wrap a.hidden { - display: none; -} -.carousel-wrap > a:hover { - text-decoration: none; -} -.carousel-wrap > a > i { - font-size: 16px; -} -.wpb_single_image .wpb_wrapper.shadow { - padding: 0 0 1.8%; - background: transparent url('images/box_shadow_effect.png') no-repeat center bottom; - background-size: 100% auto; -} -.wpb_single_image { - margin-bottom: 30px; -} -.wpb_single_image img { - width: 100%; - height: auto; - display: block; -} -.wpb_single_image .image-caption { - text-align: center; - margin: 10px 0 20px; - font-style: italic; -} -.wpb_video_widget .wpb_wrapper.shadow { - padding: 0 0 1.6%; - margin-bottom: 20px; - background: transparent url('images/box_shadow_effect.png') no-repeat center bottom; - background-size: 100% auto; -} -figure.lightbox { - position: relative; -} -.widget.widget_lip_most_loved_widget li { - height: auto; - overflow: hidden; - margin-bottom: 10px; -} -.widget_lip_most_loved_widget .loved-item a { - line-height: 28px; - padding: 0; - display: block; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -.loved-item > br { - display: none; -} -.loved-item .loved-count { - background: #ccc; - float: left; - margin-right: 10px; - -moz-border-radius: 12px; - -webkit-border-radius: 12px; - border-radius: 12px; - padding: 6px 10px 6px 7px; - line-height: 16px; - font-weight: normal; - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} -.loved-item .loved-count > i { - vertical-align: 0px; - font-size: 13px; - margin-right: 2px; -} -.loved-item .loved-count > span { - margin-right: 5px; - vertical-align: 1px; -} -.widget .recent-posts-list > li { - height: auto; - overflow: hidden; - margin-bottom: 0; - padding-bottom: 10px; -} -.recent-posts-list li .recent-post-image { - padding: 0; - float: left; - width: 94px; - height: auto; - min-height: 70px; - background: #222; - border: 3px solid #fff; /* stroke */ - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; /* border radius */ - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; /* prevents bg color from leaking outside the border */ - background-color: #212121; /* layer fill content */ - -moz-box-shadow: 0 1px 1px rgba(0,0,0,.4); /* drop shadow */ - -webkit-box-shadow: 0 1px 1px rgba(0,0,0,.4); /* drop shadow */ - box-shadow: 0 1px 1px rgba(0,0,0,.4); /* drop shadow */ -} -.recent-posts-list li .recent-post-image img { - display: block; - width: 100%; - height: auto; -} -.recent-posts-list li .recent-post-details { - padding: 8px 10px; - margin-left: 100px; -} -.recent-posts-list li .recent-post-title { - display: block; - margin-bottom: 5px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -.recent-posts-list li .recent-post-details > span { - font-size: 12px; - font-style: italic; -} -.recent-posts-list li .recent-post-details .comments-likes { - float: none; - margin-top: 5px; - font-size: 12px!important; -} -.recentcomments { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} -.flickr_images { - margin-right: -2px; - margin-bottom: 30px; -} -.widget.flickr-widget li { - height: 77px; - width: 77px; - padding: 0; - border: 0; - overflow: hidden; - float: left; - display: inline-block; - margin: 0 10px 10px 0; - background-image: url("images/plus-icon.png"); - background-repeat: no-repeat; - background-position: center center; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; /* border radius */ - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; /* prevents bg color from leaking outside the border */ -} -.flickr-widget li img { - height: 77px; - width: auto; - min-height: 77px; - min-width: 77px; - display: block; - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} -.flickr-widget li:hover img { - opacity: 0.2; - -moz-opacity: 0.2; - filter:alpha(opacity=20); -} -.twitter-widget { - margin: 0; -} -.widget.twitter-widget li { - margin-bottom: 20px; - font-size: 12px; -} -.widget.twitter-widget li:before { - content: "\f10d"; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: block; - text-decoration: inherit; - font-size: 20px; - width: 30px; - height: auto; - float: left; - margin-top: 5px; -} -.twitter-widget .tweet-text { - padding-left: 30px; -} -.twitter-widget .twitter_intents { - margin: 10px 0 0 30px; -} -.twitter-date a, .twitter-link a, .widget .twitter-link a:hover { - text-decoration: none; -} -.twitter-link a { - display: inline-block; - font-weight: bold; - padding: 4px 12px; - line-height: 25px; - -moz-border-radius: 15px; - -webkit-border-radius: 15px; - border-radius: 15px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; /* prevents bg color from leaking outside the border */ - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} -.twitter-link a:hover { - text-decoration: none!important; - -moz-border-radius: 0; - -webkit-border-radius: 0; - border-radius: 0; -} -.sidebar .rev_slider_wrapper { - overflow: hidden; - padding-bottom: 40px!important; -} -.subscribers-list { - text-align: center; - padding: 15px 15px 9px; - border: 1px solid #e4e4e4; /* stroke */ - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; /* border radius */ - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; /* prevents bg color from leaking outside the border */ - background-color: #fff; /* layer fill content */ -} -.subscribers-list li { - display: inline-block; - width: 64px; - margin-left: 10px; -} -.subscribers-list li:first-child { - margin-left: 0; -} -.subscribers-list li > a.social-circle { - font-size: 27px; - background: #222; - -moz-border-radius: 40px; - -webkit-border-radius: 40px; - border-radius: 40px; - padding: 11px 7px; - width: 35px; - text-align: center; - margin: 0 auto 5px; -} -.subscribers-list li:hover > a.social-circle { - text-decoration: none; -} -.subscribers-list li > a.social-circle i { - width: 30px; -} -.subscribers-list li span { - display: block; - text-align: center; - font-size: 12px; -} -.subscribers-list li span.social-count { - font-weight: bold; - font-size: 14px; - margin-bottom: 4px; -} -.sidebar-ad-grid { - padding: 15px; - -moz-box-shadow: inset 0 0 10px rgba(0,0,0,.15); /* inner glow */ - -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,.15); /* inner glow */ - box-shadow: inset 0 0 10px rgba(0,0,0,.15); /* inner glow */ -} -.sidebar-ad-grid ul > li { - float: left; - margin: 5px; - max-width: 125px; -} -.sidebar-ad-grid ul > li img { - display: block; -} -.widget input[type="email"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - padding-right: 20px; -} -.widget #mc_embed_signup > form { - position: relative; -} -.widget #mc_embed_signup > form:after { - content: "\f0e0"; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: inline-block; - text-decoration: inherit; - font-size: 14px; - padding-right: 10px; - position: absolute; - float: right; - top: 5px; - right: 0; - opacity: 0.3; - -moz-opacity: 0.3; - filter:alpha(opacity=30); -} -#mc_embed_signup .clear { - display: block; - visibility: visible; - width: auto; - height: auto; -} -.widget_sf_infocus_widget .infocus-item { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; - background-color: #fff; - -moz-box-shadow: 0 0 5px rgba(0,0,0,.1); - -webkit-box-shadow: 0 0 5px rgba(0,0,0,.1); - box-shadow: 0 0 5px rgba(0,0,0,.1); -} -.widget_sf_infocus_widget .infocus-item iframe { - display: block; -} -.infocus-item figure { - position: relative; - overflow: hidden; -} -.widget_sf_infocus_widget .infocus-item img { - display: block; - height: auto; - width: 100%; -} -.widget_sf_infocus_widget .infocus-item .infocus-title { - position: relative; -} -.widget_sf_infocus_widget .infocus-item .infocus-title:before { - content: ''; - width: 15px; - height: 10px; - background-color: #fff; - position: absolute; - top: -3px; - left: 16px; - z-index: 99; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.widget_sf_infocus_widget .infocus-item h5 { - font-weight: normal; - margin: 0!important; - padding: 12px 16px; - max-width: 80%; - float: left; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - border: 0!important; -} -.widget.widget_sf_infocus_widget .infocus-item h5 a:hover { - text-decoration: none; -} -.infocus-title .love-it-wrapper { - display: block; - float: right; - margin: 10px 16px 10px 0; -} -.portfolio-grid li { - float: left; - height: 82px; - position: relative; - margin: 0 10px 10px 0!important; - background-image: url("images/plus-icon.png"); - background-repeat: no-repeat; - background-position: center center; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; /* border radius */ - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; /* prevents bg color from leaking outside the border */ -} -.portfolio-grid li a { - padding: 0!important; -} -.portfolio-grid li a img { - width: 82px; - height: 82px; - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} -.portfolio-grid li:hover img { - opacity: 0.2; - -moz-opacity: 0.2; - filter:alpha(opacity=20); -} - -/* #Footer -================================================== */ - -.hide-header #footer, .hide-header #copyright { - display: none; -} -#footer { - padding: 30px 0 0; - border-top: 0 solid transparent; -} -#footer.footer-divider { - border-top-width: 1px; -} -#footer h5 { - display: inline-block; - margin-bottom: 20px; - font-weight: normal; - border-bottom: 2px solid transparent; - padding-bottom: 3px; -} -#footer a, #footer a:hover { - text-decoration: none; -} -#footer-widgets .widget { - padding-bottom: 30px; -} -#copyright { - padding: 15px 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - height: auto; - overflow: hidden; - font-size: 12px; - border-top: 0 solid transparent; -} -#copyright.copyright-divider { - border-top-width: 1px; -} -#copyright p { - font-size: 11px; - float: left; - margin-bottom: 0; -} -#copyright a, #copyright a:hover { - text-decoration: none; -} -#copyright .beam-me-up { - float: right; - text-align: right; -} -.beam-me-up a { - text-decoration: none!important; - margin-right: 5px; - font-weight: bold; -} -.beam-me-up i { - margin-left: 4px; - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} - - -/* #Swift Slider -================================================== */ - -#swift-slider { - margin-bottom: 0; - position: relative; -} -#swift-slider .swift-slider-loading { - background:url('images/loader.gif') no-repeat center center; - background-color:#fff; - margin:-22px -22px; - top:50%; - left:50%; - z-index:10000; - position:absolute; - width:44px; - height:44px; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} -#swift-slider, #swift-slider ul.slides, #swift-slider ul.slides > li { - min-height: 450px; - max-height: 450px; -} -#swift-slider { - overflow: visible!important; -} -#swift-slider .slide-caption-container { - position: absolute; - right: 50%; - width: 940px; - height: 100%; - margin-right: -470px; -} -#swift-slider .flex-caption { - z-index: 99; - position: absolute; - bottom: -300px; - height: auto; - display: block; - text-align: left; - transition: all 0.5s ease-in-out; - -moz-transition: all 0.5s ease-in-out; - -webkit-transition: all 0.5s ease-in-out; - -o-transition: all 0.5s ease-in-out; - transition-delay: 1s; - -moz-transition-delay: 1s; - -webkit-transition-delay: 1s; - -o-transition-delay: 1s; -} -#swift-slider .flex-caption .flex-caption-details { - display: block; - -webkit-perspective: 500px; - -moz-perspective: 500px; - -ms-perspective: 500px; - -o-perspective: 500px; - perspective: 500px; -} -#swift-slider .flex-caption .flex-caption-details .caption-details-inner { - width: 100%; - padding: 15px 20px 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - background: #fff; - height: auto; - overflow: hidden; - opacity: 0; - -moz-opacity: 0; - filter:alpha(opacity= 0); - -webkit-transform-origin: 0 100%; - -moz-transform-origin: 0 100%; - -ms-transform-origin: 0 100%; - -o-transform-origin: 0 100%; - transform-origin: 0 100%; - -webkit-transform: rotateX(97deg); - -moz-transform: rotateX(97deg); - -ms-transform: rotateX(97deg); - -o-transform: rotateX(97deg); - transform: rotateX(97deg); - -webkit-transition: -webkit-transform .2s linear; - -moz-transition: -moz-transform .2s linear; - -ms-transition: -ms-transform .2s linear; - -o-transition: -o-transform .2s linear; - transition: transform .2s linear; - position: relative; - border-bottom: 1px dashed #e4e4e4; -} -#swift-slider .flex-caption .flex-caption-details.open .caption-details-inner, .browser-ie #swift-slider .flex-caption .flex-caption-details .caption-details-inner { - opacity: 1; - -moz-opacity: 1; - filter:alpha(opacity= 100); - -webkit-transform: rotateX(0); - -moz-transform: rotateX(0); - -ms-transform: rotateX(0); - -o-transform: rotateX(0); - transform: rotateX(0); -} -#swift-slider .flex-caption .flex-caption-details.closing .caption-details-inner { - opacity: 1; - -moz-opacity: 1; - filter:alpha(opacity= 100); - -webkit-transform: rotateX(97deg); - -moz-transform: rotateX(97deg); - -ms-transform: rotateX(97deg); - -o-transform: rotateX(97deg); - transform: rotateX(97deg); -} -#swift-slider.flexslider:hover .flex-next { - right: 60px!important; -} -#swift-slider.flexslider:hover .flex-prev { - left: 60px!important; -} -.caption-details-inner .details, .flex-caption-large .details { - float: left; - margin-top: 5px; -} -.caption-details-inner .details { - max-width: 50%; -} -.caption-details-inner .details span, .flex-caption-large .details span { - display: block; -} -.caption-details-inner .details span a:hover, .flex-caption-large .details span a:hover { - text-decoration: none; -} -.caption-details-inner .details span.item-client, .flex-caption-large .details span.item-client, .caption-details-inner .details span.item-author, .flex-caption-large .details span.item-author { - opacity: 0.6; - -moz-opacity: 0.6; - filter:alpha(opacity= 60); -} -#swift-slider .flex-caption .chart { - position: relative; - text-align: center; - float: right; -} -#swift-slider .flex-caption-large .chart { - position: relative; - text-align: center; - margin-right: 15px; -} -#swift-slider .flex-caption .chart canvas, #swift-slider .flex-caption-large .chart canvas { - position: absolute; - top: 0; - left: 0; - -webkit-transform: rotate(217deg); - -moz-transform: rotate(217deg); - -ms-transform: rotate(217deg); - -o-transform: rotate(217deg); - transform: rotate(217deg); -} -#swift-slider .flex-caption .chart span, #swift-slider .flex-caption-large .chart span { - font-size: 24px; - vertical-align: 0px; -} -#swift-slider .flex-caption .chart i, #swift-slider .flex-caption-large .chart i { - position: absolute; - bottom: 0; - text-align: center; - display: block; - width: 100%; - font-size: 16px; - -webkit-transform: scale(0); - -moz-transform: scale(0); - -ms-transform: scale(0); - -o-transform: scale(0); - transform: scale(0); - transition: all 0.25s ease-in-out; - -moz-transition: all 0.25s ease-in-out; - -webkit-transition: all 0.25s ease-in-out; - -o-transition: all 0.25s ease-in-out; - transition-delay: 1.25s; - -moz-transition-delay: 1.25s; - -webkit-transition-delay: 1.25s; - -o-transition-delay: 1.25s; -} -#swift-slider .flex-caption-large .chart i { - transition-delay: 2s; - -moz-transition-delay: 2s; - -webkit-transition-delay: 2s; - -o-transition-delay: 2s; -} -#swift-slider .flex-caption .flex-caption-details.open .caption-details-inner .chart i, #swift-slider .flex-active-slide .flex-caption-large .chart i, .browser-ie #swift-slider .flex-active-slide .flex-caption-large .chart i { - -webkit-transform: scale(1); - -moz-transform: scale(1); - -ms-transform: scale(1); - -o-transform: scale(1); - transform: scale(1); -} -#swift-slider .flex-caption .flex-caption-details.closing .caption-details-inner .chart i { - -webkit-transform: scale(0); - -moz-transform: scale(0); - -ms-transform: scale(0); - -o-transform: scale(0); - transform: scale(0); - transition-delay: 0s; - -moz-transition-delay: 0s; - -webkit-transition-delay: 0s; - -o-transition-delay: 0s; -} -#swift-slider .flex-caption .flex-caption-headline { - background: #fff; - padding: 18px 20px; -} -#swift-slider .flex-caption .flex-caption-headline h4 { - margin: 0; -} -.flex-caption.caption-right { - right: 0; - width: 370px; -} -.flex-caption.caption-left { - left: 0; - width: 370px; -} -#swift-slider .flex-active-slide .flex-caption { - bottom: 0; -} -#swift-slider .flex-caption h4 { - width: 100%; -} -#swift-slider .flex-caption h4 span { - text-decoration: none; - display: block; - text-overflow: ellipsis; - white-space: nowrap; - width: 88%; - overflow: hidden; - float: left; -} -#swift-slider .flex-caption h4 i { - float: right; - font-size: 20px; - opacity: 0.4; - -moz-opacity: 0.4; - filter:alpha(opacity= 40); -} -#swift-slider .flex-caption-large { - margin: 11% 20% 0; - text-align: left; -} -#swift-slider .flex-caption-large h1 a, #swift-slider .flex-caption-large h1 a:hover { - text-decoration: none; -} -#swift-slider .flex-caption-large .cl-charts { - float: left; - font-weight: normal; -} -#swift-slider .flex-caption-large .cl-charts .chart { - float: left; -} -#swift-slider .flex-control-nav { - position: relative; - margin: 0 auto; - list-style: none!important; - width: 940px; - height: auto; - padding: 12px 0; - text-align: center; - bottom: 0; - left: 0; - z-index: 1; -} -#swift-slider .flex-control-nav li { - float: none; -} -#swift-slider .flex-control-nav li a { - width: 6px; - height: 6px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; /* border radius */ - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; /* prevents bg color from leaking outside the border */ - background-color: #cbcbcb; /* layer fill content */ - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.15); /* inner shadow */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.15); /* inner shadow */ - box-shadow: inset 0 1px 1px rgba(0,0,0,.15); /* inner shadow */ -} -#swift-slider .flex-control-nav li a.flex-active { - background: #222; -} -#swift-slider .slider-shadow { - position: absolute; - left: 50%; - margin-left: -499px; - bottom: -63px; -} - -/* #Portfolio -================================================== */ - -.filter-wrap { - display: block; - margin-bottom: 20px; -} -.filter-wrap .select { - line-height: 30px; - margin-bottom: 10px; - display: block; - position: relative; - outline: none; -} -.has-no-sidebar .filter-wrap .select { - text-align: center; - padding-left: 20px; -} -.has-no-sidebar .wpb_portfolio_widget .filter-wrap { - margin-bottom: 40px; -} -.has-no-sidebar .wpb_portfolio_widget .filter-wrap .filter-slide-wrap { - margin-bottom: 20px; -} -.filter-wrap .select:hover { - text-decoration: none; -} -.filter-wrap .select i { - margin-right: 10px; -} -.filter-wrap .select:after { - content: ''; - width: 16px; - height: 10px; - position: absolute; - top: 34px; - left: 22px; - z-index: 99; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -.has-no-sidebar .filter-wrap .select:after { - left: 50%; - margin-left: 5px; -} -.filter-wrap .filter-slide-wrap { - display: none; - margin-top: 0; - padding-bottom: 12px; -} -.filter-wrap ul { - font-size: 13px; - list-style: none; - margin-top: 0; - margin-bottom: 0; -} -.filter-wrap ul.wp-tag-cloud li a { - font-size: 13px!important; -} -.filter-wrap ul li { - margin-bottom: 20px; - display: none; - float: left; - border-bottom: 1px solid #333; -} -.filter-wrap ul li.selected { - border-bottom-color: transparent; -} -.filter-wrap ul li.all, .filter-wrap ul li.has-items { - display: inline-block; -} -.filter-wrap ul li a { - display: block; - white-space: nowrap; - padding: 6px 12px; - text-decoration: none; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; - overflow: hidden; - outline: none; -} -.filter-wrap ul li a span.item-name { - max-width: 80%; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - display: inline-block; - float: left; -} -.filter-wrap ul li a span.item-count { - float: right; - opacity: 0.6; - -moz-opacity: 0.6; - filter:alpha(opacity= 60); -} -ul.portfolio-items { - margin-bottom: 0; - list-style: none; -} -.portfolio-items > li { - margin-bottom: 30px; -} -.portfolio-items.single-column > li { - margin-bottom: 100px; -} -.portfolio-items > li figure { - position: relative; -} -.portfolio-items:not(.single-column) > li figure:hover img { - -moz-transform: scale(1.2); - -webkit-transform: scale(1.2); - -o-transform: scale(1.2); - -ms-transform: scale(1.2); - transform: scale(1.2); -} -.masonry-items .portfolio-item { - border-bottom: 0; - padding-bottom: 0; -} -.wpb_portfolio_carousel_widget { - padding-bottom: 50px; -} -.wpb_portfolio_carousel_widget .portfolio-item { - height: auto; - overflow: hidden; - -moz-box-shadow: 0 1px 0 rgba(0,0,0,.1); - -webkit-box-shadow: 0 1px 0 rgba(0,0,0,.1); - box-shadow: 0 1px 0 rgba(0,0,0,.1); -} -.wpb_portfolio_carousel_widget .portfolio-item figure { - margin-bottom: 0; -} -.wpb_portfolio_carousel_widget .portfolio-item .item-details { - padding: 12px 15px 7px; -} -.wpb_portfolio_carousel_widget .portfolio-item h4.portfolio-item-title { - margin: 0 0 5px; - text-align: left; -} -.wpb_portfolio_carousel_widget .portfolio-item h4.portfolio-item-title a { - display: block; - height: auto; - overflow: hidden; -} -.wpb_portfolio_carousel_widget .portfolio-item h4 span { - display: inline-block; - float: left; - max-width: 82%; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -.wpb_portfolio_carousel_widget .portfolio-item h4.portfolio-item-title a:hover { - text-decoration: none; -} -.wpb_portfolio_carousel_widget .portfolio-item h4.portfolio-item-title a > i { - float: right; - text-align: right; - line-height: 20px; - opacity: 0.6; - -moz-opacity: 0.6; - filter:alpha(opacity= 60); -} -.portfolio-item.gallery { - border-bottom: 0; - padding-bottom: 0; - padding-top: 0; -} -.portfolio-item.gallery figure, .masonry-items .portfolio-item.standard figure { - margin-bottom: 0; -} -.portfolio-item figure { - margin-bottom: 16px; - overflow: hidden; -} -.single-column .portfolio-item figure { - margin-bottom: 30px; -} -.portfolio-item figure > a { - position: relative; -} -.portfolio-item figure img { - width: 100%; - height: auto; - position: relative; - z-index: 3; - display: block!important; - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} -.portfolio-item h4.portfolio-item-title { - font-weight: normal; - margin-bottom: 5px; - text-align: center; - margin-top: 6px; -} -.portfolio-item h1.portfolio-item-title { - font-weight: normal; - margin-bottom: 4px; - text-align: center; - margin-top: 10px; -} -.portfolio-item-title a:hover { - text-decoration: none; -} -.portfolio-item h5.portfolio-subtitle { - display: block; - margin-bottom: 5px; - text-align: center; - margin-top: 0; -} -.portfolio-item h3.portfolio-subtitle { - display: block; - text-align: center; - margin-top: 0; - margin-bottom: 8px; -} -.portfolio-item .portfolio-item-excerpt { - font-size: 12px; - margin-bottom: 20px; - text-align: center; -} -.portfolio-item.carousel-item .portfolio-item-excerpt { - text-align: left; - margin-top: 10px; - margin-bottom: 5px; -} -.single-column .portfolio-item .portfolio-item-excerpt { - margin-top: 15px; -} -.portfolio-item .portfolio-item-permalink { - font-size: 12px; - font-weight: bold; - display: block; - text-decoration: none; -} -.portfolio-details-wrap { - padding-bottom: 18px; - border-bottom: 1px solid transparent; -} -.portfolio-details-wrap .client, .portfolio-details-wrap .date { - margin-right: 20px; -} -.portfolio-details-wrap .item-link { - float: right; - margin-top: 0; -} -.portfolio-details-wrap .item-link:hover { - text-decoration: none; -} -.portfolio-details-wrap .item-link i { - margin-right: 5px; -} -.body-text { - margin-bottom: 30px; -} -.body-text ul { - list-style: disc inside; -} -.body-text .link-pages, .page-content .link-pages { - margin-top: 15px; -} -.body-text .link-pages:empty, .page-content .link-pages:empty { - display: none; -} -article.type-portfolio .body-text { - margin-top: 30px; -} -article.type-team .body-text > p { - margin-left: 0; -} - -/* PORTFOLIO MASONRY */ - -#home-masonry-elements { - margin: 10px auto; -} -#home-masonry-elements li { - margin: 5px; - width: 300px; -} -#home-masonry-elements li figure { - width: 300px; - background: #f4f4f4; -} - -/* #Blog -================================================== */ - -ul.blog-items { - list-style: none; -} -.blog-wrap .heading-wrap { - margin-bottom: 5px; -} -.blog-item { - margin-bottom: 60px; - padding-top: 60px; - border-top: 1px solid transparent; - height: auto; - overflow: hidden; -} -.blog-item:first-child { - border-top: 0; - padding-top: 0; -} -.has-both-sidebars .blog-item, .mini-items .blog-item { - margin-bottom: 50px; -} -.mini-items .blog-item h3 { - margin-top: 0; -} -.mini-items .blog-item-details { - margin-bottom: 5px; - padding-bottom: 0; -} -.mini-items .comments-likes { - float: none; - margin-bottom: 15px; -} - -/* -------------------------------------------- - BLOG AUX --------------------------------------------- */ - -.blog-aux-wrap { - margin-bottom: 5px; -} -.blog-aux-options { - text-align: center; - margin-bottom: 0; -} -.blog-aux-options li { - display: inline-block; - margin-left: 15px; - margin-bottom: 15px; -} -.blog-aux-options li:first-child { - margin-left: 0; -} -.blog-aux-options li a { - display: block; - font-size: 14px; - padding: 6px 10px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; - background-color: #e4e4e4; - -moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1); - -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1); - box-shadow: inset 0 -1px 0 rgba(0,0,0,.1); -} -.blog-aux-options li a i { - margin-right: 5px; -} -.blog-aux-options li a:hover { - text-decoration: none; -} -.blog-aux-options li form { - margin: 0; - position: relative; -} -.blog-aux-options li form input { - margin: 0; - border: 0; - height: 32px; - width: 200px; - font-size: 12px; - moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; - background-color: #e4e4e4; - -moz-box-shadow: inset 0 1px 0 rgba(0,0,0,.1); - -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,.1); - box-shadow: inset 0 1px 0 rgba(0,0,0,.1); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.blog-aux-options li form:after { - content: "\f002"; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: inline-block; - text-decoration: inherit; - font-size: 14px; - padding-right: 10px; - position: absolute; - float: right; - top: 5px; - right: 0; - opacity: 0.3; - -moz-opacity: 0.3; - filter:alpha(opacity=30); -} -.blog-filter-wrap { - margin-bottom: 20px; -} -.blog-filter-wrap.filter-wrap ul li { - display: block; -} -.blog-filter-wrap.filter-wrap ul li a { - padding: 6px 25px 6px 12px; - text-overflow: ellipsis; - max-width: 100%; - position: relative; -} -.blog-filter-wrap.filter-wrap ul li a span { - position: absolute; - right: 10px; -} - -/* -------------------------------------------- - STANDARD --------------------------------------------- */ - -.standard-post-author .author-avatar { - float: none; - margin-right: 0; - margin-bottom: 15px; -} -.standard-post-author .author-avatar img { - width: 100%; - height: auto; -} -.standard-post-author .standard-post-author-name { - text-align: center; - display: block; -} -.standard-post-content h1 { - margin-top: 0; -} -.standard-post-content h1 a:hover { - text-decoration: none; -} -.standard-post-details .standard-post-author { - margin-bottom: 15px; - padding-bottom: 15px; - border-bottom: 1px solid #e4e4e4; -} -.standard-post-details .standard-post-date { - text-transform: uppercase; - margin-bottom: 15px; - display: block; - width:75px; - -ms-word-break: break-all; - word-break: break-all; - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; -} -.standard-post-details .comments-likes { - float: none; - font-weight: normal; -} -.standard-post-details .comments-likes span.love-count { - font-weight: normal; -} -.standard-post-details .comments-likes .love-it-wrapper { - margin-left: 0; - margin-top: 5px; -} - -/* -------------------------------------------- - MASONRY --------------------------------------------- */ - -.blog-items.masonry-items { - opacity: 0; - -moz-opacity: 0; - filter:alpha(opacity=0); -} -.masonry-items .blog-item { - margin-bottom: 30px; - padding-top: 0; - border-top: 0; -} -.has-both-sidebars .masonry-items .blog-item { - margin-bottom: 30px; -} -.masonry-items .blog-item .quote-excerpt { - font-size: 12px; - line-height: 20px; -} - -/* -------------------------------------------- - BLOG MEDIA DISPLAY --------------------------------------------- */ - -.blog-item .quote-display { - text-align: center; - padding: 20px 10px 0; - font-size: 42px; -} -.standard-items .blog-item .quote-display { - padding: 0 10px 20px; -} -.blog-item figure { - position: relative; -} -.blog-item figure:empty { - display: none; -} -.blog-item figure img { - display: block; -} -.blog-items.standard-items .blog-item figure { - margin-bottom: 30px; -} -.mini-items .blog-item figure { - float: left; - width: 290px; - margin-right: 20px; -} -.has-no-sidebar .mini-items .blog-item figure { - width: 446px; -} -.mini-items .blog-item figure.quote { - float: none; - width: 100%; -} -figure.media-wrap { - height: auto; - overflow: hidden; - margin-bottom: 20px; - position: relative; -} -figure.media-wrap.full-width-detail { - margin-bottom: 30px; -} -figure.media-wrap a { - display: block; -} -figure.media-wrap img { - height: auto!important; - width: 100%; -} -figure.media-wrap iframe { - display: block; - width: 100%; -} - -/* -------------------------------------------- - DETAILS --------------------------------------------- */ - -.blog-item h2 { - margin-top: 0; -} -.blog-item h3 { - margin-bottom: 5px; -} -.blog-item h3 a, .blog-item h4 a { - text-decoration: none; -} -.blog-item-details { - font-style: italic; - padding-bottom: 11px; -} -.blog-item-details a { - text-decoration: none; -} -.blog-item-details a:hover { - text-decoration: underline; -} -.standard-items .blog-item-details { - padding-bottom: 15px; -} -.comments-likes { - float: right; - font-weight: bold; -} -.comments-likes a, .comments-likes a:hover { - text-decoration: none; -} -.comments-likes .icon-comments { - margin-right: 5px; -} -.comments-likes .love-it-wrapper { - display: inline-block; -} -.comments-likes .love-it-wrapper a:hover, .comments-likes .love-it-wrapper span:hover { - cursor: pointer; -} -.comments-likes .love-it-wrapper .loved span:hover { - cursor: default; -} -.love-it-wrapper:hover { - cursor: default; -} -.love-it-wrapper a { - text-decoration: none; -} -.comments-likes .love-it-wrapper { - margin-left: 5px; -} -.comments-likes .love-it-wrapper a { - text-decoration: none; -} -.comments-likes a span, .comments-likes a i { - margin: 0; - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} -.comments-likes .love-it-wrapper .loved { - margin: 0; -} -span.love-count { - font-weight: bold; - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} -.comments-likes span.love-count { - margin-left: 1px; -} -.blog-item .excerpt { - line-height: 22px; -} -.excerpt ul { - list-style: disc inside; -} -.blog-item .read-more { - text-decoration: none; - clear: both; - display: inline-block; - margin-top: 5px; -} -.blog-item .read-more-bar { - height: auto; - overflow: hidden; - margin-top: 20px; -} -.blog-item .read-more-bar .read-more { - margin-top: 0; -} -.blog-item .quote-excerpt { - font-style: italic; - padding-bottom: 15px; -} - -/* -------------------------------------------- - POST --------------------------------------------- */ - -.body-content.quote { - font-size: 14px; - text-transform: uppercase; - margin-bottom: 20px; -} -.body-content.quote p { - margin-bottom: 3px; -} -.body-content.quote cite { - font-weight: bold; - text-transform: uppercase; -} -.article-content.aside, .item-details.aside { - margin-top: 10px; -} -figure.media-wrap:empty, figure.media-wrap.full-width-detail:empty { - margin: 0; -} -figure.quote blockquote { - margin-bottom: 0; -} -.format-link figure.media-wrap { - text-align: center; - margin: 0 0 30px; -} -.format-link .link-post-link { - font-size: 18px; - line-height: 24px; - display: inline-block; -} -.format-link .link-post-link i { - margin-right: 8px; - vertical-align: -1px; -} -.format-chat figure.media-wrap { - margin-bottom: 40px; -} -.format-chat .chat { - margin-top: 0; -} -.format-chat .chat .chat-timestamp { - float: right; - font-size: 12px; - font-weight: normal; - margin: 0 10px; -} -.format-chat .chat .chat-text { - margin: 0 0 20px; -} -.format-status .body-text p { - font-size: 18px; - font-style: italic; - line-height: 24px; -} -.format-status .excerpt { - font-size: 18px; - font-style: italic; - line-height: 24px; -} -.single-format-aside .page-heading { - display: none; -} -.blog-excerpt p { - margin-bottom: 10px; -} -.navigation { - margin-top: 10px; - margin-bottom: 50px; - border-top: 1px solid #e4e4e4; - border-bottom: 1px solid #e4e4e4; - padding: 15px 0; -} -.blog-navigation { - border-bottom: 0; - margin-bottom: 0; - padding-bottom: 0; -} -.pagination-wrap.masonry-pagination { - display: none; -} -.pagination-wrap ul { - height: auto; - overflow: hidden; - margin: 15px 0; -} -.pagination-wrap li { - float: left; - display: inline-block; - margin-bottom: 0; -} -.pagination-wrap li:first-child { - border-left: 0; -} -.pagination-wrap li a, .pagination-wrap li span { - padding: 10px 16px; - border: 1px solid transparent; - display: block; - margin-right: -1px; - text-decoration: none; -} -.pagination-wrap li.next a { - margin-left: -1px; -} -.pagination-wrap li i { - width: 10px; -} -.pagination-wrap a, .pagination-wrap a:hover { - text-decoration: none; -} -.has-no-sidebar .pagination-wrap ul { - text-align: center; -} -.has-no-sidebar .pagination-wrap ul li { - float: none; -} -.pagination-wrap .nav-previous { - text-align: left; - float: left; - max-width: 45%; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} -.nav-next i, .nav-previous i { - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} -.single .blog-pagination div > a > i { - transition: all 0s ease-in-out; - -moz-transition: all 0s ease-in-out; - -webkit-transition: all 0s ease-in-out; - -o-transition: all 0s ease-in-out; -} -.blog-pagination { - border-top: 1px solid transparent; - margin-top: 30px!important; -} -.nav-previous i { - margin-right: 5px; -} -.nav-next i { - margin-left: 8px; -} -.pagination-wrap .nav-next { - text-align: right; - float: right; - max-width: 45%; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} -.author-info-wrap { - border-top: 1px solid transparent; - padding-top: 40px; - margin-bottom: 40px; -} -.author-avatar { - float: left; - margin-right: 20px; -} -.author-avatar img { - width: 82px; - height: 82px; -} -.author-avatar img, .comment-avatar img { - -moz-border-radius: 50px; - -webkit-border-radius: 50px; - border-radius: 50px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; - -moz-box-shadow: inset 0 0 10px rgba(0,0,0,.1); - -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,.1); - box-shadow: inset 0 0 10px rgba(0,0,0,.1); - display: block; -} -.post-info { - float: left; - width: 45%; - margin: 18px 0; -} -.post-info .author-name { - font-size: 18px; - margin-right: 10px; -} -.post-info .author-name a { - margin-left: 4px; - text-decoration: none; -} -.post-info .post-date { - margin-bottom: 2px; -} -.related-wrap { - border-top: 1px solid transparent; - height: auto; - overflow: hidden; - padding-top: 30px; -} -.related-wrap h4 { - border-bottom: 2px solid #000; - display: inline-block; - padding-bottom: 3px; - margin-bottom: 20px; -} -.related-item figure { - width: 100%; - min-height: 68px; - position: relative; - overflow: hidden; -} -.related-item figure img { - display: block; -} -.related-item h5 { - font-size: 14px; -} -.related-item h5 a { - text-decoration: none; -} -.share-links { - border-top: 1px solid #ccc; - padding: 20px 0 10px; -} -.single-portfolio .share-links { - border-bottom: 1px solid #ccc; -} -.share-links .share-text { - float: left; - margin-right: 10px; - line-height: 24px; -} -.share-links .share-text i { - margin-right: 5px; -} -.share-links > .share-buttons { - float: left; - margin-right: 12px; -} -.share-links > .share-buttons > span { - display: inline-block; - margin-bottom: 5px; -} -.has-one-sidebar .share-buttons, .has-both-sidebars .share-buttons { - margin-bottom: 5px; -} -.share-links .email-link { - display: inline-block; - float: left; - line-height: 26px; - margin-right: 15px; - margin-bottom: 10px; - font-size: 16px; -} -.share-links .permalink { - display: inline-block; - float: left; - line-height: 26px; - margin-right: 15px; - margin-bottom: 10px; - font-size: 16px; -} -.share-links a:hover { - text-decoration: none; -} -.tags-link-wrap { - border-top: 1px solid #ccc; - padding: 20px 0; -} -.tags-link-wrap .tags-wrap { - float: left; -} -.tags-link-wrap .comments-likes { - float: right; - text-align: right; - font-weight: normal; - width: 20%; -} -.tags-link-wrap .comments-likes .love-it-wrapper { - margin-left: 15px; - float: right; -} -.tags-link-wrap .comments-likes .love-it-wrapper span.love-count { - font-weight: normal; -} -.tags-link-wrap .comments-likes .comments-wrapper { - display: inline-block; - float: right; -} -.tags-wrap i { - margin-right: 5px; -} -.tags-wrap .tags { - margin-left: 5px; -} -.tags-wrap a:hover { - text-decoration: none; -} -.carousel-items .blog-item { - margin-bottom: 0; - padding-top: 0; - border-top: 0; -} -.carousel-items .blog-item h4.blog-item-title { - font-weight: normal; - margin-bottom: 8px; - border-bottom: 0; - padding-bottom: 0; -} -.carousel-items .blog-item figure { - margin-bottom: 16px; -} -.carousel-items .blog-item .blog-item-date { - display: block; - margin-bottom: 15px; -} -.carousel-items .blog-item .blog-item-excerpt { - margin-bottom: 20px; -} - -/* #Team -================================================== */ - -ul.team-members { - list-style: none; -} -.team_list_widget .team-members > li, .carousel-wrap .carousel-items.has-show-hide > li { - margin-bottom: 40px; -} -.team-member figure { - margin-bottom: 17px; -} -.team-member .team-member-name { - font-weight: bold; - margin: 0 0 5px 0; -} -.team-member .team-member-position { - font-weight: normal; - margin: 0 0 15px 0; -} -.team-member .team-member-bio { - margin-bottom: 15px; - padding-bottom: 10px; - border-bottom: 1px solid #e4e4e4; -} -.team-member .member-contact { - margin-bottom: 10px; - font-size: 12px; -} -article.type-team { - margin-bottom: 50px; -} -article.type-team .article-body-wrap { - width: 50%; - float: left; - margin-right: 30px; -} -article.type-team .article-body-wrap .body-text { - margin-top: 0; -} -article.type-team .member-position { - margin: 0 0 20px; -} -article.type-team .profile-image-wrap { - float: right; - width: 46%; -} -ul.member-contact { - margin-left: 0; - margin-bottom: 25px; - list-style: none; -} -ul.member-contact li span { - font-weight: bold; - margin-right: 7px; -} -ul.member-contact li a { - text-decoration: none; - margin-left: -2px; -} -.team-member-details-wrap ul.social-icons.small { - margin-bottom: 15px; -} - - -/* #Sidebar -================================================== */ - -.sidebar { - padding-bottom: 40px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.sidebar.left-sidebar { - padding-right: 20px; -} -.sidebar.right-sidebar { - padding-left: 20px; -} -.sidebar .widget_heading { - margin-top: -6px; -} -.sidebar .widget-heading h4 { - display: inline-block; - margin-top: 0; - margin-bottom: 20px; - font-weight: normal; - border-bottom: 2px solid transparent; - padding-bottom: 3px; -} -.sidebar object, .sidebar object > img .sidebar embed { - width: 100%; - max-width: 100%; -} -.sidebar object > img { - height: auto; -} -.sidebar a:hover { - text-decoration: none; -} -.sidebar .widget #lang_sel a { - padding: 2px 10px; -} - - -/* #Comments -================================================== */ - -#comment-area a { - text-decoration: none; -} -#comments-list > h4 { - border-bottom: 2px solid #000; - display: inline-block; - padding-bottom: 3px; - margin-bottom: 0; -} -#comments-list ol { - list-style: none; - margin: 0 0 -10px; -} -#comments-list ol li { - margin-bottom: 0; -} -.comment .comment-wrap { - position: relative; - height: auto; - border-bottom: 1px dotted #ccc; - padding: 20px 0; -} -.comment-wrap .comment-avatar { - float: left; - position: relative; -} -.comment-wrap .comment-avatar img { - height: 50px; - width: 50px; - display: block; -} -#comments-list li ul { - list-style: none; - margin: 0 0 0 30px; - font-size: 100%; -} -.comment-content { - margin-left: 70px; -} -.comment-content .comment-body p { - margin-bottom: 10px; -} -.comment-meta { - margin-bottom: 5px; -} -.comment-meta .comment-author { - font-weight: bold; -} -.comment-meta .comment-date { - margin-left: 2px; - font-size: 12px; -} -.comment-meta .edit-link { - margin-left: 5px; - font-weight: normal; - font-size: 12px; -} -.comment-meta .meta-sep { - margin: 0 0 0 1px; - color: #ccc; -} -.comment-meta .comment-reply { - font-size: 12px; -} -#comment-area .edit-link a:hover, #comment-area .comment-reply a:hover { - text-decoration: underline; -} -.comment-avatar .is-author { - text-align: center; - font-size: 10px; - text-transform: uppercase; - color: #ccc; -} -.comment-meta cite { - font-style: normal; +#masthead{ + display: none !important; } -.comment-meta a.comment-reply-link { - font-weight: normal; +div.post-title.box { + display: none !important; } - -/* Trackbacks */ -#trackbacks-list span { - font-size: 12px; -} -#trackbacks-list ol li { - margin-bottom: 10px; +div.entry-image { + display: none !important; } -#trackbacks-list .comment-author { - font-size: 12px; - margin-bottom: 5px; +div#main { + padding: 0px; } -#trackbacks-list .comment-content p { - font-size: 14px; +div.single-pagination, div.author-meta,div#disqus_thread, #related-posts { + display: none !important; } - -/* -------------------------------------------- - COMMENT FORM --------------------------------------------- */ - -#respond-wrap { - padding-bottom: 20px; - position: relative; - z-index: 1; - margin-bottom: 30px; -} -#respond { - margin: 30px 0 0; - padding: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - border: 1px solid transparent; -} -#respond h3 { - margin-top: 0; -} -#respond-wrap h3 { - margin-top: 0; - margin-bottom: 5px; - border-bottom: 2px solid #000; - display: inline-block; - padding-bottom: 2px; -} -.comment-form-author, .comment-form-email, .comment-form-url { - width: 235px; - margin-bottom: 0; -} -#commentform { - margin-top: 10px; - margin-bottom: 0; -} -#commentform p.comment-notes span.required { - float: none; -} -#commentform p span.required { - float: right; -} -#commentform label { - font-size: 12px; - font-weight: normal; - margin-bottom: 4px; -} -#commentform input { - margin-bottom: 12px; -} -#commentform textarea { - width: 100%; - max-width: 100%; - min-width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - height: 200px; -} -#commentform p.form-allowed-tags { - display: none; -} -#commentform p.form-allowed-tags code { - color: #444; -} -.comment #respond h3#reply-title { - display: block; - margin: 0px 0 10px; -} -#reply-title small { - margin-top: 5px; - font-size: 14px; - display: block; -} -#reply-title small a, #reply-title small a:hover { - text-decoration: none; -} -p.form-submit { - height: auto; - overflow: hidden; - margin-bottom: 0; -} -article.type-post #respond .form-submit input#submit { - margin: 0; - border: 0; - background: none; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; - padding: 8px 11px; -} -article.type-post #respond .form-submit input#submit:hover { - border: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; +aside#side-bar, footer#colophon { + display: none !important; } - -/* #Contact -================================================== */ - -.contact-map { - margin-bottom: 30px; -} -.contact-form h6 { - margin-bottom: 10px; -} -.contact-form p.thanks { - display: none; -} -.contact-form label { - font-weight: normal; - font-size: 12px; - margin-bottom: 6px; +/* +Theme Name: Bliss by Bluthemes +Author: Bluthemes +Author URI: http://bluthemes.com +Description: Simplicity is Bliss +Version: 3.1.1 +Tags: two-columns, theme-options, right-sidebar, custom-background, custom-menu, post-formats, threaded-comments +*/ +*{ + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-font-smoothing:antialiased; +} +iframe{ max-width: 100%; } +html,body{ + height: 100%; +} +body{ + font-family: "Lato",Helvetica,sans-serif; + font-weight: 300; + line-height: 1.75; + background: #E9F0F4; + overflow-x: hidden; + position: relative; + font-size: 14px; + left: 0; + width: 100%; } -.contact-form input, .contact-form textarea { - width: 96%; +body.nomargin #main{ + padding-top: 75px; + margin-bottom: 0; } -.contact-form textarea { - height: 189px; +body.nomargin #content{ + margin-bottom:0; } -.contact-form h5 { - margin-bottom: 10px; +body.nomargin .widget-area{ + padding-top: 25px; } -.button, button, input[type="submit"], input[type="reset"], input[type="button"] { - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; +h1,h2,h3,h4{ + font-family: 'Merriweather',serif; + font-weight: 400; } - - -/* #Shortcodes -================================================== */ - -/* -------------------------------------------- - TEXT BLOCK SHORTCODE --------------------------------------------- */ - -.wpb_text_column ul, .box-content-wrap ul { - list-style: disc inside none; -} -.wpb_text_column { - margin-bottom: 10px; -} -.wpb_text_column h3.wpb_heading { - display: block; - padding-bottom: 0; - border-bottom-width: 0; -} -.wpb_text_column h3.wpb_text_heading { - border-bottom-width: 2px; - display: inline-block; - padding-bottom: 4px; -} -.full-width-text { - padding-top: 50px; - padding-bottom: 50px; - position: relative; -} -.full-width-text:after { - content: ''; - width: 0; - height: 0; - border-top: 50px solid transparent; - border-right: 60px solid transparent; - border-left: 60px solid transparent; - position: absolute; - left: 50%; - margin-left: -60px; - bottom: -25px; -} -.full-width-text .heading-wrap { - text-align: center; -} -.full-width-text h3.wpb_heading { - display: inline-block; -} -.full-width-text p { - line-height: 28px; - margin-bottom: 30px; +a:focus{ + outline: none; } - -/* -------------------------------------------- - SHOWCASE SHORTCODE --------------------------------------------- */ - -.fullwidth-layout .wpb_showcase_widget.full-width { - margin: 0!important; - width: 100%!important; +a, a:hover, a:focus, a:active{ + text-decoration: none!important; + /*color: #F69087;*/ +} +.lightbox img{ + -webkit-transition: opacity .3s ease-in-out; + -moz-transition: opacity .3s ease-in-out; + -o-transition: opacity .3s ease-in-out; + -ms-transition: opacity .3s ease-in-out; + transition: opacity .3s ease-in-out; + opacity: 1; + border-radius:2px; +} +.lightbox img:hover{ + opacity: 0.8; +} + +/*.entry-content p a:before { + border-bottom: 2px solid rgba(0,0,0,0.5); + color: rgba(0,0,0,0.5); + content: attr(data-hover); + left: 0; + max-width: 0; + overflow: hidden; + padding: 0; + position: absolute; + top: -5px; + white-space: nowrap; + -webkit-transition: all .3s ease-in-out; + -moz-transition: all .3s ease-in-out; + -o-transition: all .3s ease-in-out; + -ms-transition: all .3s ease-in-out; + transition: all .3s ease-in-out; +} +.entry-content p a { + position:relative; + padding: 0; + text-shadow: none; +} +.entry-content p a:hover:before, .entry-content p a:focus:before { + max-width: 100%; +}*/ + +.above_content{ + margin-bottom: 30px; + text-align: center; +} +#main{ + margin-bottom: 50px; + padding-top: 25px; +} +header{ + display: block; +} + +#primary.both_side #content{ + float: none; + display: inline-block; +} +#primary.both_side .widget-area{ + float: left; +} +#primary.both_side .widget-area + .widget-area{ + float: right; +} + +#primary.left_side .widget-area{ + float: left; +} +#primary.left_side #content{ + float: right; +} +#primary.right_side .widget-area{ + float: right; +} +#primary.right_side #content{ + float: left; +} +aside.widget-area { + /*width: 300px;*/ + /*margin-left: 30px;*/ +} +.span9 { + width: 610px; +} +#page{ + position: relative; + overflow-x: hidden; +} +.top-line{ + height:3px; + position:absolute; + top:0; + width:100%; + left:0; + border-radius:2px 2px 0 0; + overflow:hidden; +} +.top-line div{ + display: inline-block; + float: left; + height: 100%; + position: relative; + top: 0; + width: 25%; +} +#masthead{ + background: #2E3641; + z-index: 999; + /*height: 75px;*/ + /*margin-bottom: 50px;*/ + position: relative; + top: 0; + width: 100%; +} +#masthead .top-banner{ + height:70px; + background-color: inherit; + position: relative; +} +#masthead .top-banner > .container{ + position: relative; + } + +#masthead .image-overflow{ + width: 100%; + height: 100%; + overflow: hidden; + position: absolute; +} + +#masthead .header-background-image{ + position: absolute; + overflow: hidden; + z-index: -1; + top: 0; + left: -50%; + width: 200%; + height: 100%; +} +#masthead .header-background-image img{ + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + min-width: 50%; + min-height: 50%; +} + +#masthead .top-banner .top-banner-social { + line-height: 70px; +} +#masthead .top-banner .top-banner-social a { + padding: 5px; + font-size: 18px; + opacity: 1; + + -webkit-transition: opacity 0.4s ease-in-out; + -moz-transition: opacity 0.4s ease-in-out; + -o-transition: opacity 0.4s ease-in-out; + -ms-transition: opacity 0.4s ease-in-out; + transition: opacity 0.4s ease-in-out; +} +#masthead .top-banner .top-banner-social a:hover { + opacity: 0.7; +} +/*#masthead .top-banner .banner-overlay{ + display: block; + position: absolute; + left: 0; + height: 100%; + width: 100%; + content: ''; + top: 0; + background-color:rgba(0,0,0,0.05); +}*/ + +#masthead .brand{ + float: left; + position: relative; + z-index: 1; } - - -/* -------------------------------------------- - CLIENTS SHORTCODE --------------------------------------------- */ - -ul.clients-items { - margin: 0 -25px 0 0; - list-style: none; -} -.client-item { - float: left; - width: 124px; - margin-right: 25px; - margin-bottom: 25px; -} -.client-item figure { - position: relative; - width: 100%; - height: 124px; - border: 1px solid transparent; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - opacity: 0.75; - -moz-opacity: 0.75; - filter:alpha(opacity= 75); - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} -.client-item figure:hover { - opacity: 1; - -moz-opacity: 1; - filter:alpha(opacity= 100); -} -.client-item figure img { - margin:auto; - position:absolute; - top:0; - bottom:0; - left:0; - right:0; - max-height:100%; - max-width:100%; - width: auto; - display: block; -} -.wpb_featured_clients_widget.alt-bg { - padding-top: 22px; - padding-bottom: 12px; -} -.wpb_featured_clients_widget li { - margin-bottom: 10px; -} -.wpb_featured_clients_widget h4 { - line-height: 60px; - margin-top: 0; - margin-bottom: 0; - font-weight: normal; -} -.featured-clients-items { - margin-bottom: 0; -} -.featured-clients-items li a { - text-align: center; -} -.featured-clients-items li img { - max-height: 60px; - width: auto; -} -.featured-clients-items:hover li a { - opacity: 0.5; - -moz-opacity: 0.5; - filter:alpha(opacity= 50); -} -.featured-clients-items li:hover a { - opacity: 1; - -moz-opacity: 1; - filter:alpha(opacity= 100); +#masthead .brand h1{ + margin-top:13px; + position: relative; + font-size: 28px; + float: left; +} +#masthead .brand.brand-image h1{ + float: left; +} +#masthead .brand.brand-image h1 small{ + margin: 0 10px; +} +#masthead .brand small{ + font-size: 15px; + font-weight: normal; + margin: 12px 15px; + opacity: 0.7; + color: #DFDFDF; +} + +#masthead .brand img{ + height: 50px; + margin: 10px 0; + float: left; +} +#mobile-menu { + position: absolute; + right: 5px; + top: 3px; +} +#mobile-menu select { + -moz-appearance: none; + -webkit-appearance: none; + background: none repeat scroll 0 0 rgba(0, 0, 0, 0); + border: none!important; + outline: none!important; + text-indent: 10000px; + position: relative; } - -/* -------------------------------------------- - BOXED CONTENT SHORTCODE --------------------------------------------- */ - -.wpb_box_text .box-content-wrap { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - padding: 16px 20px 10px; - -moz-box-shadow: 0 1px 0 rgba(0,0,0,.1); - -webkit-box-shadow: 0 1px 0 rgba(0,0,0,.1); - box-shadow: 0 1px 0 rgba(0,0,0,.1); -} -.wpb_box_text.whitestroke .box-content-wrap { - border: 1px solid transparent; +#mobile-menu:before { + content: '\f0c9'; + font-family: 'fontello'; + color: #333333; + position: absolute; + top: 7px; + right: 0; + font-size: 25px; + width: 40px; + height: 40px; + display: block; } - -/* -------------------------------------------- - CONTACT FORM SHORTCODE --------------------------------------------- */ - -.wpcf7 p { - clear: both; - height: auto; - overflow: hidden; - margin-bottom: 0; -} -span.wpcf7-form-control-wrap { - display: block; -} -.wpcf7 span.wpcf7-not-valid-tip { - top: 3px; - left: 5px; - background: transparent; - color: red; - border: 0; -} -.wpcf7 .wpcf7-captchar + span.wpcf7-not-valid-tip { - top: 10px; - left: 78px; -} -.wpcf7 input[type="text"], .wpcf7 input[type="email"], .wpcf7 textarea, .wpcf7 select, input[type="email"], input[type="tel"] { - width: 95%; - margin-top: 6px; - margin-bottom: 20px; -} -.sidebar .wpcf7 input[type="text"], .sidebar .wpcf7 input[type="email"], .sidebar .wpcf7 textarea, .sidebar .wpcf7 select { - width: 88%; -} -.wpcf7 textarea { - max-width: 95%; -} -.wpcf7 .wpcf7-captchac { - float: left; - border: 1px solid #CCC; - padding: 3px 0 4px; - margin: 6px 10px 0 0; -} -.wpcf7 input.wpcf7-captchar { - float: left; - width: 45%; -} -.wpcf7 input.wpcf7-submit[type="submit"] { - display: inline-block; - font-size: 14px; - line-height: 18px; - height: auto; - padding: 8px 28px 7px 14px; - background-image: url('images/button-arrow.png'); - background-position: 83% center; - background-repeat: no-repeat; - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; - border: 0; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; - -} -.wpcf7 input.wpcf7-submit[type="submit"]:hover { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; +#masthead .bluth-navigation .container{ position: relative; } +#masthead .bluth-navigation{ + opacity: 1; + background-color: inherit; + box-shadow: 0 1px 0 rgba(0,0,0,0.1) inset, 0 -1px 0 rgba(0,0,0,0.1) inset; + min-height: 46px; + -webkit-transition: top 0.3s ease-in-out; + -moz-transition: top 0.3s ease-in-out; + -o-transition: top 0.3s ease-in-out; + -ms-transition: top 0.3s ease-in-out; + transition: top 0.3s ease-in-out; +} +#masthead .bluth-navigation .navbar .nav > li > a { + line-height:25px; + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; + /*padding: 13px 20px;*/ + +} +#masthead .bluth-navigation.shrunk .navbar .nav > li > a { + line-height:25px; + + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +#masthead .bluth-navigation.fixed{ + opacity: 0.95; + margin-bottom: 0; + width: 100%; + top: 0; + left: 0; + position: fixed; +} +#masthead .bluth-navigation:hover{ + opacity: 1; +} +#masthead .bluth-navigation .mini-logo{ + display: inline-block; + top: 6px; + float: left; + text-align: right; + overflow: hidden; + + max-width:0; + opacity:0; + + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +#masthead .bluth-navigation.shrunk .mini-logo{ + max-width:200px; + opacity: 1; + + -webkit-transition: all 0.3s ease-in-out 0.3s; + -moz-transition: all 0.3s ease-in-out 0.3s; + -o-transition: all 0.3s ease-in-out 0.3s; + -ms-transition: all 0.3s ease-in-out 0.3s; + transition: all 0.3s ease-in-out 0.3s; +} +#masthead .bluth-navigation .mini-logo h1, #masthead .bluth-navigation .mini-logo img{ + font-size: 18px; + position: relative; + line-height: 23px; + max-height: 25px; + border-right: 2px solid rgba(0, 0, 0, 0.05); + padding-right: 5px; + /*min-width:100px;*/ + + top:0; + left:-100%; + + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +#masthead .bluth-navigation.shrunk .mini-logo h1, #masthead .bluth-navigation.shrunk .mini-logo img{ + left:0; + + -webkit-transition: all 0.3s ease-in-out 0.2s; + -moz-transition: all 0.3s ease-in-out 0.2s; + -o-transition: all 0.3s ease-in-out 0.2s; + -ms-transition: all 0.3s ease-in-out 0.2s; + transition: all 0.3s ease-in-out 0.2s; +} +#masthead .bluth-navigation .mini-logo img{ max-height:45px; position: static; } +#masthead .bluth-navigation .navbar-inner{ + /*margin-left: 0;*/ + padding: 0; + background: transparent; +} +#masthead .bluth-navigation.shrunk .navbar-inner{ +} +/* search form */ +#masthead .bluth-navigation .bl_search { + + margin: 10px 0; + position: static; + right: 0; + -webkit-transition: all 0.3s ease-in-out 0.3s; + -moz-transition: all 0.3s ease-in-out 0.3s; + -o-transition: all 0.3s ease-in-out 0.3s; + -ms-transition: all 0.3s ease-in-out 0.3s; + transition: all 0.3s ease-in-out 0.3s; +} +#masthead .bluth-navigation.shrunk .bl_search { + margin: 10px 0; + + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +#masthead .bluth-navigation .bl_search form{ + margin: 0; +} + +/* HEADER BIG LOGO */ +#masthead.header_big_logo .top-banner{ + height: auto; + text-align: center; +} + +#masthead.header_big_logo .brand{ + float: none; + display: inline-block; +} +#masthead.header_big_logo .brand img{ + float:none; + height: auto; + margin-bottom: 0; +} +#masthead.header_big_logo .brand h1{ + margin-top: 0; +} +#masthead.header_big_logo .brand.brand-image h1 { + float: none; + display: block; +} +#masthead.header_big_logo .brand.brand-text h1{ + font-size: 48px; + margin-top: 35px; +} +#masthead.header_big_logo .brand.brand-text h1 small{ + display: block; +} +#masthead.header_big_logo .top-banner .top-banner-social { + position: absolute; + right: 0; + top: 0; +} +.admin-bar{ + /*padding-top: 28px;*/ +} +.admin-bar .bluth-navigation.fixed{ + margin-top: 28px; +} +.cleanwidget{ + background: transparent!important; + border: none!important; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +.cleanwidget .widget-head{ + margin: 0; +} +.widget-area .cleanwidget .widget-head{ + margin: -15px -15px 0; +} +.nopadding, .nopadding .widget-body{ + padding: 0!important; +} +.nopadding > h3{ + margin: 0!important; +} +.box{ + background: none repeat scroll 0 0 #FFFFFF; + -moz-border-radius: 2px 2px 2px 2px; + -webkit-border-radius: 2px 2px 2px 2px; + border-radius: 2px 2px 2px 2px; +} +.relative{ + position:relative!important; +} +.between_posts{ + text-align: center; + /*margin-bottom: 30px;*/ +} +.between_posts.box{ + padding: 10px; + margin-bottom: 30px; +} +.bl_background{ + position: fixed; + z-index: -1; + top: -50%; + left: -50%; + width: 200%; + height: 200%; +} +.bl_background img{ + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + min-width: 50%; + min-height: 50%; +} +#stripe { + background: url("assets/img/stripe.png") repeat scroll 0 0 transparent; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +#background_pattern { + background-repeat: repeat; + height: 100%; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: -1; +} +.input-append .btn{ + box-shadow: none; +} +#content{ + margin-bottom: 30px; +} +.page #content{ +} +.page #content article.type-page{ + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + background: #fff; +} +.page #content article .the-content{ + opacity: 0; +} + +.twocolumn .columns{ margin-left: -5px; margin-right: -5px; } +.twocolumn article, .twocolumn article.type-post{ width: 49.9999%; padding:0 5px; margin-bottom: 10px; } +.twocolumn article.format-audio .entry-audio { margin-top: 0; } +.twocolumn article.format-gallery .swiper-gallery{ max-height: 150px; overflow:hidden; } +.twocolumn article .entry-content{ padding: 15px; position: relative; height: auto; } +.twocolumn article .post-title { position: static; padding: 15px 85px 15px 15px; } +.twocolumn article .post-title h1, .twocolumn article .entry-image a h1{ font-size: 20px; } +.twocolumn article .post-meta { position: relative; padding: 0; bottom: 0; font-size: 10px; width: 100%; margin: 0; text-align: left; left: 0; line-height: 1.7; } +.twocolumn article .post-meta ul li:first-child{ display: block; float: none; font-size: 12px; } +.twocolumn article .post-meta ul li:first-child + li{ display: none; } +.twocolumn article .post-meta ul li{ margin-right: 3px; } +/*.twocolumn article .entry-meta{ padding: 15px!important; }*/ +.twocolumn article.format-quote footer.entry-meta > *, .twocolumn article.format-status footer.entry-meta > *{ padding: 17px 15px;} + +.threecolumn .columns{ margin-left: -5px; margin-right: -5px; } +.threecolumn article, .threecolumn article.type-post{ width: 33.333%; padding:0 5px; margin-bottom: 10px; } +.threecolumn article.format-audio .entry-audio { margin-top: 0; } +.threecolumn article.format-gallery .swiper-gallery{ max-height: 150px; overflow:hidden; } +.threecolumn article .entry-content{ padding: 15px; position: relative; } +.threecolumn article .post-title { position: static; padding: 15px 85px 15px 15px;} +.threecolumn article .post-title .author-image img{ height: 25px; } +.threecolumn article .post-title h1, .threecolumn article .entry-image a h1{ font-size: 20px; } +.threecolumn article .post-meta { position: relative; padding: 0; bottom: 0; font-size: 10px; width: 100%; margin: 0; text-align: left; left: 0; line-height: 1.7; } +.threecolumn article .post-meta ul li:first-child{ display: block; float: none; font-size: 12px; } +.threecolumn article .post-meta ul li:first-child + li{ display: none; } +.threecolumn article .post-meta ul li{ margin-right: 3px; } +/*.threecolumn article .entry-meta{ padding: 15px!important; }*/ +.threecolumn article.format-quote footer.entry-meta > *, .threecolumn article.format-status footer.entry-meta > *{ padding: 17px 15px;} + +/***** + CONTENT LIST +******/ + #content.list .entry-image, #content.list .entry-image img{ + height: 150px; + left: 0; + position: absolute; + width: 150px; + z-index: 1; + } + #content.list .entry-container{ + max-height: 150px; + overflow: hidden; + padding: 50px; + } + #content.list .entry-image + .entry-container{ + padding: 20px 20px 20px 180px; + } + #content.list .entry-content{ + padding: 0; + } + +.bl_alert { + background: none repeat scroll 0 0 #fff; + height: 75px; + padding: 5px 0; + position: fixed; + bottom: 0; + width: 100%; + z-index: 1000; + border-top: 1px solid #ddd; + display: none; +} +.bl_alert > h4 { + margin: 22px 0; +} +.radiustop{ + -moz-border-radius: 2px 2px 0 0; + -webkit-border-radius: 2px 2px 0 0; + border-radius: 2px 2px 0 0; +} +.radiusbottom{ + -moz-border-radius: 0 0 2px 2px; + -webkit-border-radius: 0 0 2px 2px; + border-radius: 0 0 2px 2px; +} +/* page */ +article.type-page .the-content, article.type-page .title{ + padding: 45px; +} +article.type-page .title + .the-content{ + padding-top: 10px; +} +article.type-page .entry-image{ + overflow: hidden; + max-height: 400px; + position: relative; +} +.entry-content:after,.entry-content:before, article.type-page:before, article.type-page:after { + content: ""; + display: table; + line-height: 0; +} +.entry-content:after, article.type-page:after { + clear: both; +} +article.type-page .title { + /*margin: 0 0 20px;*/ + border-bottom: 1px solid #eaeaea; + margin:0; + padding-top: 30px; + padding-bottom: 30px; +} +article.type-page .title small{ + display: inline-block; + font-size: 16px; + margin-left: 15px; + position: relative; + top: -8px; +} +article.type-page .entry-image .title { + position: absolute; + color: #FFFFFF; + text-shadow: 1px 1px 2px rgba(0,0,0,0.4); + top: 0; + left: 0; + width: 100%; + text-align: center; + border-bottom: none; + padding-top: 125px; + font-weight: 600; + /*line-height: 200px;*/ +} +article.type-page .entry-image .title small{ + margin: 0; + display: block; + width: 100%; + text-align: center; + line-height: 40px; + color: #FFFFFF; + opacity: 0.8; +} +.the-content { + font-size: 16px; +} +.the-content p{ + font-size: 16px; +} +.the-content p.lead{ + font-size: 21px; +} +.site-footer{ + box-shadow: 0 1px 0 rgba(0,0,0,0.1) inset; + background: #2E3641; + position: relative; + color: #fff; +} +.site-footer .box{ + color: #333; +} +.site-footer .container{ + padding: 40px 0; +} +.site-footer #footer-bottom{ + background: rgba(0,0,0,0.1); + color: #B8B8B8; + font-size: 12px; + padding: 5px 0; + text-align: center; +} +.site-footer #footer-body{ + list-style: none; + padding: 0; + margin: 0; +} +.site-footer #footer-body ul{ + list-style: none; + padding: 0; + margin: 0; +} +#footer-body > div[class*="span"] ul li a{ + font-size: 16px; + text-decoration: none; + display: inline-block; + padding: 2px 4px; + border: none; + -webkit-transition: transform 0.2s ease-in-out; + -moz-transition: transform 0.2s ease-in-out; + -o-transition: transform 0.2s ease-in-out; + -ms-transition: transform 0.2s ease-in-out; + transition: transform 0.2s ease-in-out; +} +#footer-body .widget-head{ + background: transparent; + border: none; + margin: 0; + padding: 0; +} +#footer-body .box .widget-head{ + background: #272F3A; + border: none; + padding: 0 15px; +} +#footer-body .widget_nav_menu, +#footer-body .widget_archive, +#footer-body .widget_tag_cloud, +#footer-body .widget_recent_entries, +#footer-body .widget_meta, +#footer-body .widget_categories, +#footer-body .widget_pages, +#footer-body .widget_rss{ + background: transparent; + border: none; + padding: 0; +} +.site-footer .badge{ + display: none; +} +.site-footer #footer-body .widget_nav_menu a:hover, +.site-footer #footer-body .widget_archive a:hover, +.site-footer #footer-body .widget_tag_cloud a:hover, +.site-footer #footer-body .widget_recent_entries a:hover, +.site-footer #footer-body .widget_meta a:hover, +.site-footer #footer-body .widget_categories a:hover, +.site-footer #footer-body .widget_pages a:hover{ + background: #F69087; +/* transform: scale(1.04); + -ms-transform: scale(1.04); + -webkit-transform: scale(1.04); */ + color: #fff!important; +} +.site-title { + font-size: 22px; + line-height: 35px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); + margin: 0; } - -/* -------------------------------------------- - CODE SHORTCODE --------------------------------------------- */ - -code { - display: block; - padding: 5px 20px 20px; - border: 1px solid #e4e4e4; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - background: #f7f7f7; - font: 11px Consolas, "Andale Mono", Courier, "Courier New", monospace; - line-height: 16px; - overflow: auto; - overflow-y: hidden; - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} -code p { - font-size: 11px; - margin-bottom: 12px; +.pad15{ + padding: 15px; +} +.pad25{ + padding: 25px; +} +.nobg{ + background-color: transparent!important; +} +.full-width{ + width: 100%; + display: block; +} +select, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input { + height: 30px; + line-height: 30px; +} +.popover{ + min-width: 220px; +} +.entry-image{ + overflow: hidden; + background: #F4F4F4; + max-height: 400px; + position: relative; +} +/*.entry-image h2{ + color: #FFFFFF; + font-family: lato; + font-size: 90px; + font-weight: 900; + line-height: 100%; + margin-left: 15px; + opacity: 0.15; + position: absolute; + width: 50%; + word-wrap: break-word; + z-index: 1; +}*/ +.entry-image img { + width: 100%; +} +.entry-meta time{ + color: #666; + font-size: 20px; +} +.entry-audio { + margin-top: -120px; +} +.entry-audio.no-image { + margin-top: -50px; +} +.entry-video { + line-height: 0; +} +.entry-video iframe, .entry-video object{ + /*min-height: 433px;*/ + min-width: 100%; +} +.threecolumn .entry-video iframe, .threecolumn .entry-video object{ + /*min-height: 150px;*/ +} +.twocolumn .entry-video iframe, .twocolumn .entry-video object{ + /*min-height: 211px;*/ + +} +.pagination{ + text-align: center; +} +.pagination > * { + font-size:18px; + margin-right: 10px; + padding: 5px 13px; + display:inline-block; +} +.pagination > a { + background: none repeat scroll 0 0 #FFFFFF; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + text-decoration:none; + -webkit-transition: all .1s ease-in-out; + -moz-transition: all .1s ease-in-out; + -o-transition: all .1s ease-in-out; + transition: all .1s ease-in-out; +} +.pagination > a:hover { + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -ms-transform: scale(1.1); + -o-transform: scale(1.1); + transform: scale(1.1); +} +.single-pagination{ + margin-top:25px; + padding: 0 25px; + position: relative; + direction: ltr; +} +.single-pagination .box{ + width:100%; + height: 70px; + border-radius:2px; +} +.single-pagination a{ + position: relative; + top: 0; + height: 70px; + width: 50%; +} +.single-pagination a.nav-previous{ + border-right:1px solid rgba(0,0,0,0.15); +} +.single-pagination a.nav-previous, .single-pagination a.nav-previous > span, .single-pagination a.nav-previous > .bgimage, .single-pagination a.nav-previous > .tab_icon, .single-pagination a.nav-previous > .bgfallback{ + left: 0; + z-index: 1; } - -/* -------------------------------------------- - TABLE SHORTCODE --------------------------------------------- */ - -table.sf-table { - width: 100%; - display: table; +.single-pagination a.nav-next, .single-pagination a.nav-next > span, .single-pagination a.nav-next > .bgimage, .single-pagination a.nav-next > .tab_icon, .single-pagination a.nav-next > .bgfallback{ + right: 0; + z-index: 1; } -table.striped_minimal tr:nth-of-type(even), table.striped_bordered tr:nth-of-type(even) { - background-color: #f7f7f7; +.single-pagination a.nav-next > span, .single-pagination a.nav-next > .bgimage, .single-pagination a.nav-next > .tab_icon, .single-pagination a.nav-next > .bgfallback{ + left:100%; } -table.sf-table th { - padding: 10px 20px; - text-transform: uppercase; - letter-spacing: 1px; - font-weight: bold; - vertical-align: middle; - text-align: left; +.single-pagination a > .bgfallback{ + background-color:#ffffff; + position: absolute; + top: 50%; + width: 88px; + height: 88px; + margin: -44px 0 0 -44px; + border-radius: 500px; +} +.single-pagination a > span{ + width: 46px; + height: 46px; + display: block; + -moz-border-radius: 23px; + -webkit-border-radius: 23px; + border-radius: 23px; + cursor: pointer; + opacity: 0.9; + position: absolute; + top: 50%; + background-size: 17px 25px; + margin: -23px 0 0 -23px; + -webkit-transition: all 0.4s ease; + -moz-transition: all 0.4s ease; + -o-transition: all 0.4s ease; + -ms-transition: all 0.4s ease; + transition: all 0.4s ease; +} +.single-pagination a:hover > span{ + width: 100px; + height: 100px; + -moz-border-radius: 50px; + -webkit-border-radius: 50px; + border-radius: 50px; + /*opacity: 0;*/ + margin: -50px 0 0 -50px; + background-size: 22px 32px; + background-color:#a8872d; +} +.single-pagination a > .bgimage{ + width: 0px; + height: 0px; + position: absolute; + top: 50%; + overflow: hidden; + background-size: 100% 100%; + background-position: center center; + background-repeat: no-repeat; + margin: 0px; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + -o-transition: all 0.2s ease-out; + -ms-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +.single-pagination a:hover > .bgimage{ + width: 90px; + height: 90px; + background-size: 120% 120%; + margin: -45px 0 0 -45px; + -moz-border-radius: 500px; + -webkit-border-radius: 500px; + border-radius: 500px; +} +.single-pagination a > .tab_icon{ + width: 90px; + height: 90px; + position: absolute; + top: 50%; + overflow: hidden; + background-size: 100% 100%; + background-position: center center; + background-repeat: no-repeat; + margin: -45px 0 0 -45px; + border-radius: 500px; + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + -o-transition: all 0.2s ease-out; + -ms-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +.single-pagination a:hover > .tab_icon{ + width: 0px; + height: 0px; + margin: 0; } -table.sf-table td { - padding: 10px 20px; +.single-pagination a > .tab_icon i{ + width: 100%; + height: 100%; + padding-top:3px; + font-size:35px; } -table.standard_minimal th { - padding: 10px 30px 10px 0; - border-bottom: 2px solid #e4e4e4; +.single-pagination a:hover > .tab_icon i{ + padding-bottom:20px; } -table.striped_minimal th { - border-bottom: 2px solid #e4e4e4; +.single-pagination a.nav-previous h5{ + display: block; + height: 50px; + overflow: hidden; + padding: 15px 15px 15px 60px; + position: absolute; + white-space: nowrap; + width: 95%; } -table.standard_minimal td { - padding: 10px 30px 10px 0; - border-bottom: 1px solid #e4e4e4; +.single-pagination a.nav-next h5{ + display: block; + height: 50px; + overflow: hidden; + padding: 15px 60px 15px 15px; + position: absolute; + white-space: nowrap; + width: 100%; + text-align:right; +} +/*.single-pagination > span{ + width:50%; +} +.single-pagination > span a:hover{ + background-color:#FAFAFA; + outline:none; + text-decoration: none; + box-shadow:-2px 2px 0 0 rgba(0,0,0,0.05) inset; +} +.single-pagination > span a:hover span{ + color: #6D6D6D; +} +.single-pagination a{ + color: #999999; + font-style:italic; + font-weight: 200; +} +.single-pagination a span{ + color: #717171; + font-style:normal; + font-weight: bold; +}*/ +.nav-previous{ float:left; } +.nav-previous .tab_attachment{ float:left; } +.nav-previous a[rel="prev"]{ + display: block; + padding: 20px; + position: relative; + text-align: left; } -table.standard_bordered, table.striped_bordered { - border: 1px solid #e4e4e4; +.nav-next{ float:right; } +.nav-next .tab_attachment{ float:right; } +.nav-next a[rel="next"]{ + display: block; + padding: 20px; + position: relative; + text-align: right; +} +footer.entry-meta { + bottom: 20px; + margin-top: 25px; + position: relative; + border-radius:0 0 2px 2px; +} + +footer.entry-meta ul{ + color: rgba(0,0,0,0.3); + list-style: none; + margin:0; +} +footer.entry-meta ul a{ + color: rgba(0,0,0,0.3); +} +footer.entry-meta .up_arrow:after, footer.entry-meta .up_arrow:before { + border-color: transparent transparent #FCFCFC ; + border-style: solid; + border-width: 15px; + content: ""; + height: 0; + left: 40px; + position: absolute; + top: -30px; + width: 0; +} +footer.entry-meta .up_arrow:before { + top: -31px; + border-color: transparent transparent #DDDDDD; +} +footer.entry-meta .avatar { + -moz-border-radius: 150px; + -webkit-border-radius: 150px; + border-radius: 150px; + position: absolute; + left: 0; + top: 0; +} +footer.entry-meta h4 a{ + color: #878787; + font-weight: normal; + text-shadow: 0 1px 0 #FFFFFF; + text-decoration: none; +} +.author-meta{ + position: relative; + text-align: center; + margin-top: 30px; +} +.author-meta .author-header{ + margin-bottom: 40px; + background-color: #333333; +} +.author-meta .author-header .author-image{ + border: 5px solid #FFFFFF; + border-radius: 500px 500px 500px 500px; + bottom: -40px; + display: inline-block; + position: relative; + text-align: center; +} +.author-meta .author-header .author-image img{ + height: 90px; + width: 90px; + border-radius: 500px 500px 500px 500px; + +} +.author-meta .author-body{ + padding: 0px 75px 25px; +} +.author-meta .author-body p{ + font-size: 16px; + opacity: 0.6; +} +.widget-area > div{ + padding: 15px; + margin-bottom: 30px; + position:relative; +} +.widget-area > div > form{ + margin: 0; +} +.widget-area div.bl_tweets, +.widget-area div.bl_likebox, +.widget-area div.bl_instagram, +.widget-area div.bl_tabs, +.widget-area div.bl_socialbox, +.widget-area div.widget_calendar, +.widget-area div.widget_pages, +.widget-area div.widget_archive, +.widget-area div.widget_calendar, +.widget-area div.widget_nav_menu, +.widget-area div.widget_tag_cloud, +.widget-area div.widget_recent_entries, +.widget-area div.widget_meta, +.widget-area div.widget_categories, +.widget-area div.bl_flickr, +.widget-area div.widget_rss, +.widget-area div.bl_author, +.widget-area div.bl_imagebox, +.widget-area div.bl_newsletter, +.widget-area div.widget_search{ + padding: 0; +} +.widget-area div.bl_tweets .widget-head, +.widget-area div.bl_likebox .widget-head, +.bl_instagram .widget-head, +.widget-area div.bl_newsletter .widget-head, +.widget-area div.bl_tabs .widget-head, +.widget-area div.bl_socialbox .widget-head, +.widget-area div.widget_calendar .widget-head, +.widget-area div.widget_pages .widget-head, +.widget-area div.widget_archive .widget-head, +.widget-area div.widget_calendar .widget-head, +.widget-area div.widget_nav_menu .widget-head, +.widget-area div.widget_tag_cloud .widget-head, +.widget-area div.widget_recent_entries .widget-head, +.widget-area div.widget_meta .widget-head, +.widget-area div.widget_categories .widget-head, +.widget-area div.bl_flickr .widget-head, +.widget-area div.bl_author .widget-head, +.widget-area div.bl_imagebox .widget-head, +.widget-area div.widget_rss .widget-head, +.widget-area div.widget_search .widget-head{ + margin: 0; +} +.widget-area > div.box > select { + margin: 15px; + width: 270px; +} +.nav-tabs > .active > a, .nav-tabs > .active > a:hover, .nav-tabs > .active > a:focus{ + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + border: none; +} +.nav-tabs{ + border-bottom: none; +} +.nav-tabs > li{ + display: table-cell; + width: 1%; + float: none; +} +.nav-tabs > li a{ + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.nav-tabs > li:nth-child(2) a{ + /*background: #9EB2C0;*/ +} + +.bl_google_ads{ + padding: 0!important; +} +.bl_google_ads article{ + padding: 15px; +} +.bl_google_ads h3{ + margin: 0; +} + + /***************/ + /* TWEETS WIDGET + /***************/ + + .bl_tweets .box{ + padding: 0; + background-color: transparent; + } + .bl_tweets .widget-body{ + background: #FFFFFF; + border-radius: 3px; + } + .bl_tweets .twitter-user-info{ + background: none repeat scroll 0 0 #1BB2E9; + background-size: cover; + background-position: center center; + border-bottom: 1px solid #EEEEEE; + color: #FFFFFF; + min-height: 86px; + padding: 15px 15px 15px 80px; + position: relative; + text-shadow: 1px 1px 3px rgba(0,0,0,0.5); + border-radius: 2px 2px 0 0; + } + .bl_tweets .twitter-user-info .user-image{ + position: absolute; + left:15px; + border-radius: 5px; + border: 3px solid #FFFFFF; + } + .bl_tweets .twitter-user-info .user-image img{ + border-radius: 5px; + } + .bl_tweets .twitter-user-info .user-name .uname{ + margin-bottom: 0; + font-size: 19px; + } + .bl_tweets .twitter-user-info .user-description{ + opacity: 0.7; + font-size: 13px; + } + .bl_tweets .twitter-user-info .user-description p{ + margin-bottom: 0; + } + .bl_tweets .twitter-user-info .user-location{ + opacity: 0.7; + font-size: 11px; + } + .bl_tweets .twitter-user-info .user-location p{ + margin-bottom: 0; + } + .bl_tweets .twitter-status{ + background-color: #ffffff; + color: #222222; + padding: 15px; + border-bottom: 1px dashed #EEEEEE; + } + .bl_tweets .twitter-status:last-child{ + border-bottom: none; + } + .bl_tweets .twitter-status time{ + opacity: 0.5; + font-size: 12px; + } + .bl_tweets .twitter-status .reply-to{ + font-size: 13px; + color: #1BB2E9; + } + +.site-footer #footer-body .nav-tabs > li > a, .nav-tabs > li > a{ + background: rgba(255,255,255,0.5); + border: medium none!important; + color: rgba(0,0,0,0.5); + font-size: 15px; + font-weight: bold; + text-align: center; + border-radius: 0; + margin: 0; + padding: 8px 0; + display: block; +} +.nav-tabs > li > a:hover{ + background: rgba(255,255,255,1); + color: #333333; +} +.site-footer #footer-body #bl_side_tabs .active a, #bl_side_tabs .active a{ + color: #333333; + background: #fff!important; + display: block; +} +.widget-area h3, #footer-body h3{ + /*color: #333333;*/ + padding: 5px 15px; + font-size: 18px; + box-shadow: 0 -1px 0 rgba(0,0,0,0.06) inset; +} +.widget-area h3 * { + font-size: inherit; + font-weight: inherit; + line-height: inherit; + color: inherit; +} +.top-color { + width: 100%; + position: relative; + z-index: 999; +} +.top-color div { + float: left; + height: 5px; + width: 25%; +} +.above_header{ + padding: 5px 0; + text-align: center; + background: #2E3641; +} +.format-status .post-title{ + border-bottom: 1px solid #DDDDDD; +} +.format-status .entry-content{ + padding: 0; + border-bottom: 1px solid #DDDDDD; +} +.format-status .entry-container.bl_facebook .entry-content, .format-status .entry-container.bl_twitter .entry-content{ + padding: 0; + background-color: #F4F5F8; +} +.format-status iframe{ + /*border: none!important;*/ + box-shadow: none!important; + -moz-box-shadow: none!important; + -webkit-box-shadow: none!important; + max-width: none!important; + /*min-width: 100%!important;*/ +} +.format-status iframe.twitter-tweet{ + margin: 25px auto !important; + /*padding-left:25px!important;*/ +} +.format-status .fb-post{ + text-align: center; + width: 100%; +} +.format-status .fb-post span { + margin: 25px 0; + max-width: 100%; + overflow-y: hidden; +} +.format-status .entry-container.bl_google .entry-content{ + padding: 0; + padding-top: 15px; + padding-bottom: 15px; + background-color: #F4F5F8; + text-align: center; +} +.format-status .entry-container.bl_google .entry-content div{ + display: inline-block; +} +/*.format-status .post-meta{ + border-bottom: 1px solid #DDDDDD; + margin-bottom: 10px; + padding: 25px 35px; + padding-top: 25px; + padding-left: 45px; +}*/ +.format-status .facebook-fallback{ + display: block; + padding: 25px 0; + text-align: center; + background-color: #46629E; + color: #FFFFFF; + font-size: 20px; + margin: -5px 0; +} +.format-link .entry-image .post-format-badge{ + display:block; + position: relative; + width: 100%; + height: 150px; + padding: 30px; + background: #333333; + right: auto; + text-align: center; +} +.format-link .entry-image .post-format-badge > a{ + z-index: 1; } -table.standard_bordered tr, table.striped_bordered tr { - border-top: 1px dotted #e4e4e4; +.format-link .entry-image .post-format-badge > div i{ + opacity: 1; + font-size: 60px; + display: inline; +} +.format-link .entry-image .post-format-badge .background-link { + position: absolute; + left: 50%; + top: 5%; + opacity: 0.05; + color: #FFFFFF; + font-size:190px; + z-index: 0; +} +.format-link .entry-image .post-format-badge span{ + display:block; + font-size:11px; + opacity: 0.7; +} +.home .format-quote .entry-container{ + display: none; +} +.format-quote .quote-area{ + opacity: 0; + position: absolute; + width: 100%; + top: 50%; + left: 0; + text-align: center; + z-index: 10; + text-shadow: 1px 1px 2px rgba(0,0,0,0.25); + padding: 0 15px; + + -webkit-transition: opacity .80s ease-in-out; -moz-transition: opacity .80s ease-in-out; -o-transition: opacity .80s ease-in-out; transition: opacity .80s ease-in-out; + +} +.format-quote .no-image .quote-area{ + position: relative; + margin:0!important; + top: auto; + background-color: #FFFFFF; + text-shadow:none; +} +.format-quote .no-image .quote-area .quote-text{ + color: #333333; + padding: 30px 0; +} +.format-quote .no-image .quote-area .quote-author a{ + color: #333333; +} +.format-quote .quote-area .quote-text{ + margin:0; + line-height: 1.2; + font-size: 60px; + font-weight: bold; + font-style: italic; + color: #FFFFFF; +} +.format-quote .quote-area .quote-author a{ + color: #FFFFFF; +} +.format-quote .entry-image > a:after{ + opacity: 0.2; +} +.format-quote .entry-image:hover > a:after{ + opacity: 0.4; +} +.format-quote footer.entry-meta, .format-status footer.entry-meta { + bottom: auto; + top: 0; + margin: 0; + padding:0; +} +.format-quote footer.entry-meta > *, .format-status footer.entry-meta > *{ + padding: 17px 50px; +} +.format-quote footer.entry-meta .share-story-container, .format-status footer.entry-meta .share-story-container{ + margin: 0; +} +/*.format-quote footer.entry-meta .share-story-container h4{ + margin: 10px 0; +} +.format-quote footer.entry-meta ul{ + padding:10px 50px; +}*/ +.entry-container{ + background: none repeat scroll 0 0 #FFFFFF; + position: relative; +} +.entry-content { + padding: 35px 50px; +} +.entry-content iframe { + max-width: 100%; } -table.standard_bordered th, table.standard_bordered td, table.striped_bordered th, table.striped_bordered td { - border-left: 1px dotted #e4e4e4; +.post-title{ + border-radius: 2px 2px 0 0; + padding: 35px 105px 25px 45px; + margin:0; +} +.post-title h1{ + display: block; + text-align: left; + font-size:25px; +} +.post-title .author-image { + margin-right:15px; +} +.post-title .author-image img{ + border-radius:500px; + height:50px; +} +.entry-title{ + margin: 0; + text-align: center; + line-height:120%; +} +.entry-title a{ + color: #333; +} +.entry-container a:hover{ + text-decoration: none; +} +.entry-content > p a:hover{ + text-decoration: underline; +} +.entry-title a i{ + opacity:0.2; + font-size:30px; + margin-left:-30px; +} +/*.format-quote a.more-link:hover{ background-color:#85A9B3; } +.format-standard a.more-link:hover{ background-color:#F69087; } +.format-gallery a.more-link:hover{ background-color:#00ACED; } +.format-image a.more-link:hover{ background-color:#B0CB7A; } +.format-link a.more-link:hover{ background-color:#9664B5; } +.format-video a.more-link:hover{ background-color:#85CCB1; } +.format-audio a.more-link:hover{ background-color:#EF7336; }*/ +/*#content .entry-content a.more-link:hover { + color: #FFFFFF; + text-decoration: none; +}*/ +.entry-content p, .entry-content ul li, .entry-content ol li{ + font-size: 18px; + line-height: 2; + color: #525252; +} +.entry-content p *{ + max-width: 100%; +} +/* =Plug-in Fixes +-------------------------------------------------------------- */ +.mfp-bg{ z-index: 1000!important; } +.mfp-wrap{ z-index: 1005!important; } +.nivo-directionNav a{ top: 0!important; font-size: 20px!important; opacity: 1; display:block!important; } +/* =WordPress Core +-------------------------------------------------------------- */ +.entry-content p.wp-caption-text, .entry-content p.gallery-caption, article.type-page .the-content p.wp-caption-text, article.type-page .the-content p.gallery-caption { + color: #999999; + font-size: 12px; + text-align: center; +} +.gallery-item img{ + border: none!important; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; +} +.gallery-item +.alignnone { + margin: 5px 20px 20px 0; } -/* -------------------------------------------- - PRICING TABLE SHORTCODE --------------------------------------------- */ - -.pricing-table-wrap { - height: auto; - overflow: hidden; - clear: both; - padding-bottom: 20px; -} -.pricing-table-column { - float: left; - border: 1px solid #e4e4e4; - border-left-width: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.pricing-table-column:first-child { - border-left: 1px solid #e4e4e4; -} -.columns-5 .pricing-table-column { - width: 20%; -} -.columns-4 .pricing-table-column { - width: 25%; -} -.columns-3 .pricing-table-column { - width: 33.3%; -} -.columns-2 .pricing-table-column { - width: 50%; -} -.columns-1 .pricing-table-column { - width: 100%; -} -.pricing-table-column:first-child, .pricing-table-wrap.bordered .pricing-table-column, .pricing-table-wrap.bordered_alt .pricing-table-column { - border-left: 1px solid #e4e4e4; -} -.pricing-table-price { - padding: 18px 30px 10px; - font-size: 36px; - line-height: 36px; - font-weight: bold; - border-bottom: 2px solid #e4e4e4; -} -.pricing-table-price span { - font-size: 12px; - font-weight: normal; - margin-left: 4px; -} -.pricing-table-package { - padding: 20px 30px; - font-size: 18px; - border-bottom: 1px dotted #e4e4e4; -} -.column-highlight .pricing-table-package { - font-weight: bold; -} -.pricing-table-details { - padding: 20px 30px; -} -.pricing-table-column .button { - margin-top: 10px; - margin-bottom: 0; -} -.pricing-table-wrap.bordered, .pricing-table-wrap.bordered_alt { - margin: 0 -10px; -} -.pricing-table-wrap.bordered .pricing-table-column, .pricing-table-wrap.bordered_alt .pricing-table-column { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - margin: 0 10px; -} -.bordered.columns-4 .pricing-table-column, .bordered_alt.columns-4 .pricing-table-column { - width: 22.7%; -} -.bordered.columns-3 .pricing-table-column, .bordered_alt.columns-3 .pricing-table-column { - width: 31%; -} -.bordered.columns-2 .pricing-table-column, .bordered_alt.columns-2 .pricing-table-column { - width: 47.6%; -} -.bordered.columns-1 .pricing-table-column, .bordered_alt.columns-1 .pricing-table-column { - width: 97.2%; -} -.pricing-table-wrap.bordered .pricing-table-package { - padding: 20px; - font-size: 16px; - line-height: 18px; -} -.pricing-table-wrap.bordered .pricing-table-price { - padding: 0; - float: right; - font-size: 18px; - line-height: 18px; - border-bottom: 0; -} -.pricing-table-wrap.bordered_alt .pricing-table-price { - border-bottom: 1px dotted #e4e4e4; -} -.labelled-pricing-table .pricing-table-column { - margin-top: 15px; - border: 0; - padding-left: 1px; -} -.labelled-pricing-table .pricing-table-column.column-highlight { - margin-top: 0; - position: relative; - padding-left: 0; - -moz-box-shadow: 0 0 5px rgba(0,0,0,.1); - -webkit-box-shadow: 0 0 5px rgba(0,0,0,.1); - box-shadow: 0 0 5px rgba(0,0,0,.1); -} -.labelled-pricing-table .pricing-table-column.column-highlight + .pricing-table-column { - padding-left: 0; -} -.labelled-pricing-table .pricing-table-column.label-column { - margin-top: 104px; -} -.labelled-pricing-table .pricing-table-price { - font-size: 14px; - font-weight: bold; - line-height: 18px; - text-align: center; - padding: 12px; - border: 0; -} -.labelled-pricing-table .pricing-table-price span { - font-weight: normal; -} -.labelled-pricing-table .pricing-table-package { - font-size: 24px; - font-weight: normal; - line-height: 30px; - text-align: center; - padding: 9px 5px 8px; - border: 0; -} -.labelled-pricing-table .column-highlight .pricing-table-package { - padding-top: 16px; - padding-bottom: 16px; -} -.labelled-pricing-table.columns-5 .pricing-table-package { - font-size: 20px; -} -.labelled-pricing-table .pricing-table-label-row, .labelled-pricing-table .pricing-table-row { - text-align: center; - padding: 12px; -} -.labelled-pricing-table .alt-row { - background: #ccc; -} -.labelled-pricing-table .pricing-table-label-row { - display: none; - font-weight: bold; -} -.labelled-pricing-table .label-column .pricing-table-label-row { - display: block; - font-weight: normal; -} -.labelled-pricing-table .lpt-button-wrap { - padding: 20px 10px; - text-align: center; -} -.labelled-pricing-table .column-highlight .lpt-button-wrap { - padding: 30px 10px; -} -.labelled-pricing-table .lpt-button-wrap a { - display: inline-block; - margin: 0; +.aligncenter, +div.aligncenter { + display: block; + margin: 5px auto 5px auto; } -/* -------------------------------------------- - DIVIDER SHORTCODE --------------------------------------------- */ - -.wpb_divider { - display: block; - border-bottom-width: 1px; - margin-bottom: 30px; -} -.wpb_divider.alt-bg { - border-top: 0; - margin-top: 0; - padding-top: 0; - padding-bottom: 0; -} -.wpb_divider.standard { - border-bottom-style: solid; - border-bottom-width: 2px; -} -.wpb_divider.thin { - border-bottom-style: solid; -} -.wpb_divider.dotted { - border-bottom-style: dotted; -} -.wpb_divider.go_to_top a { - text-align: right; - display: block; - text-decoration: none; - border-bottom: 1px solid transparent; - margin-bottom: 30px; -} -.wpb_divider.go_to_top_icon1 { - position: relative; - height: 9px; - border-bottom: 1px solid transparent; -} -.wpb_divider.go_to_top_icon2 { - position: relative; - height: 10px; - border-bottom: 1px solid transparent; -} -.wpb_divider.go_to_top_icon1 a, .wpb_divider.go_to_top_icon2 a { - position: absolute; - right: 0; - display: block; - padding: 0 0 0 10px; - text-decoration: none; -} -.wpb_divider.go_to_top_icon2 a i { - padding-left: 6px; +.alignright { + float:right; + margin: 5px 0 20px 20px; } -/* -------------------------------------------- - BUTTON SHORTCODE --------------------------------------------- */ - -a.sf-button { - display: inline-block; - font-size: 12px; - line-height: 18px; - height: auto; - padding: 6px 12px; - margin: 0 20px 20px 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-transition: all .3s ease-out; - -moz-transition: all .3s ease-out; - transition: all .3s ease-out; - border: 0; - outline: none; - text-shadow: none; - text-decoration: none; - font-weight: normal; -} -a.sf-button:hover { - border: 0!important; - box-shadow:0 2px 3px 0 rgba(0,0,0,.2); - text-decoration: none!important; -} -a.sf-button.medium { - font-size: 14px; - line-height: 20px; - padding: 10px 16px; -} -a.sf-button.large { - font-size: 18px; - line-height: 26px; - padding: 10px 22px; -} -a.sf-button .arrow { - background-image: url('images/button-arrow.png'); - background-repeat: no-repeat; - display: inline-block; - width: 6px; - height: 9px; - margin-left: 7px; - transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -webkit-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; -} -a.sf-button.medium .arrow { - vertical-align: 0; -} -a.sf-button.large .arrow { - vertical-align: 1px; -} -a.sf-button.lightgrey .arrow, a.sf-button.green .arrow, a.sf-button.limegreen .arrow, a.sf-button.white .arrow { - background-image: url('images/button-arrow2.png'); -} -a.sf-button.slightlyrounded, a.sf-button.slightlyroundedarrow { - -webkit-border-radius: 8px; - -moz-border-radius: 8px; - border-radius: 8px; -} -a.sf-button.rounded, a.sf-button.roundedarrow { - -moz-border-radius: 20px; - -webkit-border-radius: 20px; - border-radius: 20px; -} -a.sf-button.slightlyrounded:hover, a.sf-button.slightlyroundedarrow:hover, a.sf-button.rounded:hover, a.sf-button.roundedarrow:hover { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - box-shadow: none; -} -a.sf-button.outerglow { - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - -moz-box-shadow: 0 0 4px rgba(0,0,0,.3); - -webkit-box-shadow: 0 0 4px rgba(0,0,0,.3); - box-shadow: 0 0 4px rgba(0,0,0,.3); -} -a.sf-button.dropshadow { - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - -moz-box-shadow: 1px 1px 0.6px 0 rgba(0,0,0,.75); - -webkit-box-shadow: 1px 1px 0.6px 0 rgba(0,0,0,.75); - box-shadow: 1px 1px 0.6px 0 rgba(0,0,0,.75); -} -a.sf-button.black { - background-color: #212121; - color: #fff; -} -a.sf-button.white { - background-color: #fff; - color: #212121; -} -a.sf-button.blue { - background-color: #0000cc; - color: #fff; -} -a.sf-button.grey { - background-color: #656565; - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iaGF0MCIgZ3JhZGllbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIHgxPSI1MCUiIHkxPSIxMDAlIiB4Mj0iNTAlIiB5Mj0iLTEuNDIxMDg1NDcxNTIwMmUtMTQlIj4KPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwLjE1Ii8+CjxzdG9wIG9mZnNldD0iNTAlIiBzdG9wLWNvbG9yPSIjZjdmN2Y3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSI1MCUiIHN0b3AtY29sb3I9IiNmN2Y3ZjciIHN0b3Atb3BhY2l0eT0iMCIvPgogICA8L2xpbmVhckdyYWRpZW50PgoKPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9InVybCgjaGF0MCkiIC8+Cjwvc3ZnPg==); - background-image: -moz-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -o-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -webkit-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - color: #fff; -} -a.sf-button.lightgrey { - background-color: #cbcbcb; - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iaGF0MCIgZ3JhZGllbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIHgxPSI1MCUiIHkxPSIxMDAlIiB4Mj0iNTAlIiB5Mj0iLTEuNDIxMDg1NDcxNTIwMmUtMTQlIj4KPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwLjE1Ii8+CjxzdG9wIG9mZnNldD0iNTAlIiBzdG9wLWNvbG9yPSIjZjdmN2Y3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSI1MCUiIHN0b3AtY29sb3I9IiNmN2Y3ZjciIHN0b3Atb3BhY2l0eT0iMCIvPgogICA8L2xpbmVhckdyYWRpZW50PgoKPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9InVybCgjaGF0MCkiIC8+Cjwvc3ZnPg==); - background-image: -moz-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -o-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -webkit-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); -} -a.sf-button.purple { - background-color: #5f5ba7; - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iaGF0MCIgZ3JhZGllbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIHgxPSI1MCUiIHkxPSIxMDAlIiB4Mj0iNTAlIiB5Mj0iLTEuNDIxMDg1NDcxNTIwMmUtMTQlIj4KPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwLjE1Ii8+CjxzdG9wIG9mZnNldD0iNTAlIiBzdG9wLWNvbG9yPSIjZjdmN2Y3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSI1MCUiIHN0b3AtY29sb3I9IiNmN2Y3ZjciIHN0b3Atb3BhY2l0eT0iMCIvPgogICA8L2xpbmVhckdyYWRpZW50PgoKPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9InVybCgjaGF0MCkiIC8+Cjwvc3ZnPg==); - background-image: -moz-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -o-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -webkit-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - color: #fff; -} -a.sf-button.lightblue { - background-color: #00adef; - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iaGF0MCIgZ3JhZGllbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIHgxPSI1MCUiIHkxPSIxMDAlIiB4Mj0iNTAlIiB5Mj0iLTEuNDIxMDg1NDcxNTIwMmUtMTQlIj4KPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwLjE1Ii8+CjxzdG9wIG9mZnNldD0iNTAlIiBzdG9wLWNvbG9yPSIjZjdmN2Y3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSI1MCUiIHN0b3AtY29sb3I9IiNmN2Y3ZjciIHN0b3Atb3BhY2l0eT0iMCIvPgogICA8L2xpbmVhckdyYWRpZW50PgoKPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9InVybCgjaGF0MCkiIC8+Cjwvc3ZnPg==); - background-image: -moz-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -o-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -webkit-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - color: #fff; -} -a.sf-button.turquoise { - background-color: #1bbbb3; - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iaGF0MCIgZ3JhZGllbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIHgxPSI1MCUiIHkxPSIxMDAlIiB4Mj0iNTAlIiB5Mj0iLTEuNDIxMDg1NDcxNTIwMmUtMTQlIj4KPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwLjE1Ii8+CjxzdG9wIG9mZnNldD0iNTAlIiBzdG9wLWNvbG9yPSIjZjdmN2Y3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSI1MCUiIHN0b3AtY29sb3I9IiNmN2Y3ZjciIHN0b3Atb3BhY2l0eT0iMCIvPgogICA8L2xpbmVhckdyYWRpZW50PgoKPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9InVybCgjaGF0MCkiIC8+Cjwvc3ZnPg==); - background-image: -moz-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -o-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -webkit-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - color: #fff; -} -a.sf-button.green { - background-color: #65cb00; - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iaGF0MCIgZ3JhZGllbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIHgxPSI1MCUiIHkxPSIxMDAlIiB4Mj0iNTAlIiB5Mj0iLTEuNDIxMDg1NDcxNTIwMmUtMTQlIj4KPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwLjE1Ii8+CjxzdG9wIG9mZnNldD0iNTAlIiBzdG9wLWNvbG9yPSIjZjdmN2Y3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSI1MCUiIHN0b3AtY29sb3I9IiNmN2Y3ZjciIHN0b3Atb3BhY2l0eT0iMCIvPgogICA8L2xpbmVhckdyYWRpZW50PgoKPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9InVybCgjaGF0MCkiIC8+Cjwvc3ZnPg==); - background-image: -moz-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -o-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -webkit-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); -} -a.sf-button.limegreen { - background-color: #cbff00; - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iaGF0MCIgZ3JhZGllbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIHgxPSI1MCUiIHkxPSIxMDAlIiB4Mj0iNTAlIiB5Mj0iLTEuNDIxMDg1NDcxNTIwMmUtMTQlIj4KPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwLjE1Ii8+CjxzdG9wIG9mZnNldD0iNTAlIiBzdG9wLWNvbG9yPSIjZjdmN2Y3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSI1MCUiIHN0b3AtY29sb3I9IiNmN2Y3ZjciIHN0b3Atb3BhY2l0eT0iMCIvPgogICA8L2xpbmVhckdyYWRpZW50PgoKPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9InVybCgjaGF0MCkiIC8+Cjwvc3ZnPg==); - background-image: -moz-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -o-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -webkit-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); -} -a.sf-button.orange { - background-color: #f90; - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iaGF0MCIgZ3JhZGllbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIHgxPSI1MCUiIHkxPSIxMDAlIiB4Mj0iNTAlIiB5Mj0iLTEuNDIxMDg1NDcxNTIwMmUtMTQlIj4KPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwLjE1Ii8+CjxzdG9wIG9mZnNldD0iNTAlIiBzdG9wLWNvbG9yPSIjZjdmN2Y3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSI1MCUiIHN0b3AtY29sb3I9IiNmN2Y3ZjciIHN0b3Atb3BhY2l0eT0iMCIvPgogICA8L2xpbmVhckdyYWRpZW50PgoKPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9InVybCgjaGF0MCkiIC8+Cjwvc3ZnPg==); - background-image: -moz-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -o-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -webkit-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - color: #fff; -} -a.sf-button.pink { - background-color: #ed135a; - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iaGF0MCIgZ3JhZGllbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIHgxPSI1MCUiIHkxPSIxMDAlIiB4Mj0iNTAlIiB5Mj0iLTEuNDIxMDg1NDcxNTIwMmUtMTQlIj4KPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwLjE1Ii8+CjxzdG9wIG9mZnNldD0iNTAlIiBzdG9wLWNvbG9yPSIjZjdmN2Y3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSI1MCUiIHN0b3AtY29sb3I9IiNmN2Y3ZjciIHN0b3Atb3BhY2l0eT0iMCIvPgogICA8L2xpbmVhckdyYWRpZW50PgoKPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9InVybCgjaGF0MCkiIC8+Cjwvc3ZnPg==); - background-image: -moz-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -o-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: -webkit-linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - background-image: linear-gradient(90deg, rgba(255,255,255,.15) 0%, rgba(247,247,247,0) 50%, rgba(247,247,247,0) 50.12%); - color: #fff; -} -.sf-button.lightblue:hover { - background: #0099ff; -} -.sf-button.pink:hover { - background: #ad2043; -} -.sf-button.purple:hover { - background: #7400e9; -} -.sf-button.grey:hover { - background: #444; -} -.sf-button.lightgrey:hover { - background: #aaa; -} -.sf-button.accent { - background: none; - background-image: none; +.alignleft { + float: left; + margin: 5px 20px 20px 0; } -/* -------------------------------------------- - ALERT SHORTCODE --------------------------------------------- */ - -.alert { - height: auto; - font-size: 12px; - line-height: 16px; - overflow: hidden; - padding: 12px 15px; - text-align: left; - margin-bottom: 20px; - font-weight: normal; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - clear: both; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -moz-box-shadow: 0 1px 0 rgba(0,0,0,.1); - -webkit-box-shadow: 0 1px 0 rgba(0,0,0,.1); - box-shadow: 0 1px 0 rgba(0,0,0,.1); - border: 0; - background-color: #fbf7e3; -} -.alert .messagebox_text { - background: none; - padding-left: 0; -} -.alert .messagebox_text p { - float: left; -} -.alert .messagebox_text:before { - content: "\f06a"; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: block; - text-decoration: inherit; - width: 10px; - height: auto; - float: left; - margin-right: 13px; - margin-top: 4px; - font-size: 16px; - text-indent: 0; -} -.alert.alert-info .messagebox_text:before { - content: "\f05a"; -} -.alert.alert-error .messagebox_text:before { - content: "\f071"; -} -.alert.alert-success .messagebox_text:before { - content: "\f00c"; -} -.alert.alert-info { - background-color: #d9edf7; -} -.alert.alert-error { - background-color: #f1dddd; -} -.alert.alert-success { - background-color: #dfefd7; +.aligncenter { + display: block; + margin: 5px auto 5px auto; } -/* -------------------------------------------- - IMAGE SHORTCODE --------------------------------------------- */ - -.glowframe img { - border: 6px solid transparent; - -moz-box-shadow: 0 0 4px rgba(0,0,0,.2); - -webkit-box-shadow: 0 0 4px rgba(0,0,0,.2); - box-shadow: 0 0 4px rgba(0,0,0,.2); - width: 96%; -} -.borderframe img { - border: 6px solid transparent; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.shadowframe img { - -moz-box-shadow: 0 2px 2px rgba(0,0,0,.15); - -webkit-box-shadow: 0 2px 2px rgba(0,0,0,.15); - box-shadow: 0 2px 2px rgba(0,0,0,.15); +a img.alignright { + float: right; + margin: 5px 0 20px 20px; } -/* -------------------------------------------- - TESTIMONIALS SHORTCODE --------------------------------------------- */ - -.testimonial-wrap { - margin-bottom: 20px; -} -.testimonial-wrap.large .testimonial-text { - font-size: 16px; -} -ul.testimonials { - margin-bottom: 0; - list-style: none; -} -.testimonials > li { - padding-top: 30px; - margin-bottom: 30px; - border-top: 1px solid transparent; - height: auto; -} -.testimonials > li:first-child { - padding-top: 0; - border-top: 0; -} -.testimonial-text { - margin-bottom: 5px; -} -.testimonial-wrap.large .testimonial-text { - margin-bottom: 10px; -} -.testimonial-text p { - margin-bottom: 10px; -} -.testimonial-wrap cite, .wpb_testimonial_carousel_widget cite, .testimonials-slider cite { - opacity: 0.6; - -moz-opacity: 0.6; - filter:alpha(opacity= 60); -} -.testimonial .pagination-wrap { - display: none; -} -.span12.testimonial .pagination-wrap { - display: block; -} -.testimonials.carousel-items li { - padding-top: 0; - border: 1px solid #e4e4e4; - margin-bottom: 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - padding: 15px; - position: relative; -} -.testimonials.carousel-items li:after { - content: ''; - width: 0; - height: 0; - border-top: 1px solid #fff; - border-bottom: 12px solid transparent; - border-left: 15px solid #fff; - position: absolute; - left: 30px; - bottom: -13px; - opacity: 0.6; - -moz-opacity: 0.6; - filter:alpha(opacity= 60); -} -.alt-bg.wpb_testimonial_slider_widget { - padding-top: 60px; - padding-bottom: 45px; -} -.slider-wrap { - margin-bottom: 10px; - position: relative; -} -.testimonials-slider { - padding-bottom: 15px; -} -.flexslider.content-slider ul.slides { - background: transparent; -} -.testimonials-slider .testimonial-text { - padding: 0 15%; - margin-bottom: 15px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.testimonials-slider .testimonial-text.text-large { - font-size: 24px; - line-height: 32px; -} -.testimonials-slider .flex-control-nav { - position: absolute; - bottom: 0; - left: 0; - margin: 0; - z-index: 4; - list-style: none!important; - width: 100%; - text-align: center; -} -.testimonials-slider .flex-control-nav li { - float: none; +a img.alignnone { + margin: 5px 20px 20px 0; } -/* -------------------------------------------- - JOBS SHORTCODE --------------------------------------------- */ - -ul.jobs { - list-style: none; -} -.jobs > li { - padding-top: 30px; - margin-bottom: 30px; - border-top: 1px solid transparent; -} -.jobs > li:first-child { - padding-top: 0; - border-top: 0; -} -.jobs .sf-list { - margin-top: 15px; - margin-bottom: 10px; -} -.jobs a.button { - margin-top: 10px; -} -.jobs-overview { - list-style: disc inside none; -} -.jobs-overview .job { - margin-bottom: 4px; -} -.jobs-overview .job a { - text-decoration: none; +a img.alignleft { + float: left; + margin: 5px 20px 20px 0; } -/* -------------------------------------------- - SEARCH SHORTCODE --------------------------------------------- */ - -.search-widget { - margin-bottom: 0; -} -.search-widget input { - margin: 25px 0; - width: 80%; - padding: 10px 5% 10px 30px; +a img.aligncenter { + display: block; + margin-left: auto; + margin-right: auto } -/* -------------------------------------------- - FAQS SHORTCODE --------------------------------------------- */ +.wp-caption { + background: none repeat scroll 0 0 #ECECEC; + max-width: 100%; + padding: 5px; + text-align: center; + border-radius: 2px 2px 2px 2px; + border: 1px solid #DDDDDD; +} -ul.faqs-nav { - padding-bottom: 30px; - border-bottom: 2px solid #f4f4f4; - margin-bottom: 40px; - list-style: none; -} -.faqs-nav li { - float: left; - width: 44%; - padding: 10px 10px 10px 10px; - border: 1px solid #F4F4F4; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - margin: 0 10px 10px 0; -} -.faqs-nav li a { - text-decoration: none; -} -.faqs-nav li i { - margin-right: 8px; -} -.faqs-nav li .count { - float: right; - opacity: 0.6; - -moz-opacity: 0.6; - filter:alpha(opacity= 60); -} -h3.faq-section-title { - border-bottom: 1px solid #ccc; - padding-bottom: 20px; - margin-bottom: 40px; -} -ul.faqs-section { - margin-bottom: 60px; - list-style: none; -} -.faq-item h6 { - margin-bottom: 15px; -} -.faq-item { - padding-top: 40px; - border-top: 1px solid #ccc; - margin-bottom: 40px; -} -.faq-item:first-child { - border-top: 0; - padding-top: 0; +.wp-caption.alignnone { + margin: 5px 20px 20px 0; } -/* -------------------------------------------- - COLUMN SHORTCODE --------------------------------------------- */ +.wp-caption.alignleft { + margin: 5px 20px 20px 0; +} -.one_half { - width: 48%; +.wp-caption.alignright { + margin: 5px 0 20px 20px; } -.one_third { - width: 30.66%; + +.wp-caption img { + border: 0 none; + height: auto; + margin: 0; + max-width: 100%; + padding: 0; + width: auto; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; } -.two_third { - width: 65.33%; + +.wp-caption p.wp-caption-text, article.type-page .the-content .wp-caption p.wp-caption-text { + font-size: 11px; + line-height: 17px; + margin: 0; + padding: 8px 0 0; +} + +article.type-post p a { + color: #FFFFFF; + max-width: 100%; + display: inline-block; + margin-left: 2px; + margin-right: 4px; + position: relative; + padding: 0 5px; + line-height: 26px; + -webkit-transition: all .10s ease-in-out; -moz-transition: all .10s ease-in-out; -o-transition: all .10s ease-in-out; transition: all .10s ease-in-out; +} +article.type-post p a:hover { + transform: scale(1.03); + -ms-transform: scale(1.03); + -webkit-transform: scale(1.03); +} +article.type-post p a.lightbox { + background: none; + padding: auto; + margin: auto; +} +article.type-post, article.type-post .entry-header { + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} + +article.type-post:first-child, article.type-post:first-child .entry-header { + -moz-border-radius: 2px 2px 0 0; + -webkit-border-radius: 2px 2px 0 0; + border-radius: 2px 2px 0 0; +} +article.type-post:last-child, article.type-post:last-child .entry-container, article.type-post:last-child .entry-container .entry-content { + -moz-border-radius: 0 0 2px 2px; + -webkit-border-radius: 0 0 2px 2px; + border-radius: 0 0 2px 2px; +} +article.type-post{ + /*overflow: hidden;*/ + position: relative; + margin-bottom: 30px; +} +.entry-header{ + background: #f0f0f0; + border-radius: 2px 2px 0 0; + height: 120px; + position: relative; +} +.post-format-badge { + position: absolute; + right: 0; + top: 0; +/* border-radius: 500px 500px 500px 500px; + bottom: -40px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + height: 80px; + left: 60px; + margin: 0 -50px; + overflow: hidden; + position: absolute; + text-align: center; + width: 80px; + z-index: 500;*/ +} +.post-format-badge .avatar-share { +/* border-radius: 500px; + display: block; + height: 80px; + overflow: hidden; + width: 80px; + z-index: 500;*/ +} +.post-format-badge .avatar-share:hover { + overflow: hidden; + border-radius: 500px; +} +.entry-header .post-format-badge { + bottom: -30px; + top: auto !important; +} +article.format-standard{ + overflow: visible; +} +article.format-standard .entry-content{ + /*padding: 40px 90px 50px;*/ +} +.format-standard .post-format-badge{ + /*bottom: -40px;*/ +} +.format-standard .entry-container.noimg .entry-content{ + padding-top: 15px; +} +.share-story-container { + margin-top: 25px; +} +.share-story-container h4{ + margin: 0; + font-size: 14px; + padding-right: 15px; + display: block; + width: 100%; + float: none; + line-height: 40px; + border-bottom: 1px solid rgba(0,0,0,0.1); +} +.share-story li{ + display: table-cell; + width: 1%; +} +.share-story li a { + height: 40px; + display: block; + text-align: center; +} +.share-story li i { + line-height: 50px; + font-size: 20px; + height: 50px; +} +.bl-author-footer{ + display: block; + border-top: 1px solid rgba(0,0,0,0.05); + height: 50px; + margin-top:25px; +} +.bl-author-footer .author-header img{ + border: 5px solid #FFFFFF; + border-radius: 500px 500px 500px 500px; + height: 80px; + position: relative; } -.one_fourth { - width: 22%; +.entry-container > .post-format-badge { + top: -40px; } -.three_fourth { - width: 74%; +.post-format-badge i { + display: block; + font-size: 27px; + height: 80px; + line-height: 117px; + opacity: 0.35; + text-align: center; + width: 110px; } -.one_half, .one_third, .two_third, .three_fourth, .one_fourth { - position: relative; - margin-right: 4%; - float: left; +.post-format-badge img{ + max-width:80px; + margin:auto; + display:inline-block; + position:relative; + left: 0; + top: 0; + border-radius: 500px; } -.last { - margin-right: 0 !important; - clear:right; +.format-link .post-format-badge i { + line-height: 70px; } -.clearboth { - clear: both; - display: block; - font-size: 0; - height: 0; - line-height: 0; - width: 100%; +.post-format-quote{ + color: #85A9B3; } - -/* -------------------------------------------- - SITEMAP SHORTCODE --------------------------------------------- */ - -.sitemap-wrap { - margin-bottom: 20px; +.post-format-image{ + color: #B0CB7A; } -.sitemap-col { - float: left; - width: 28%; - margin-left: 7%; +.post-format-gallery{ + color: #00ACED; } -.sitemap-col:first-child { - margin-left: 0; +.post-format-standard{ + color: #F69087; } -.sitemap-col h6 { - margin-bottom: 15px; +.post-format-video{ + color: #85CCB1; } -.sitemap-col ul { - margin-bottom: 40px; - list-style: none!important; +.post-format-audio{ + color: #EF7336; } -.sitemap-col ul li { - margin-bottom: 8px; +.post-format-link{ + color: #9664B5; } -.sitemap-col ul li a { - text-decoration: none; +.sticky .post-format-badge{ + color: #2999C4; } - -/* -------------------------------------------- - MAP SHORTCODE --------------------------------------------- */ - -.wpb_gmaps_widget { - margin-bottom: 20px; +.post-meta{ + color: #9a9a9a; + text-align: left; + padding: 0px 0; + margin-bottom: 0; + line-height: 14px; } -.wpb_gmaps_widget .wpb_map_wrapper { - padding: 0; +.post-meta time{ + display: inline-block; } -.wpb_wrapper.shadow .wpb_map_wrapper { - padding: 0 0 1.6%; - margin-bottom: 30px; - background: transparent url('images/box_shadow_effect.png') no-repeat center bottom; - background-size: 100% auto; +.post-meta ul{ + list-style: none; + margin: 0; + padding: 0; + display: inline-block; + z-index: 10; } -.map-canvas img { - max-width: none; +.post-meta ul li{ + float: left; + margin-right: 15px; } - - -/* -------------------------------------------- - PARALLAX SHORTCODE --------------------------------------------- */ - -.spb_parallax_asset { - padding-top: 80px; - padding-bottom: 80px; - overflow: hidden; - background-attachment: fixed; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; - background-repeat: no-repeat; - background-position: center center; - box-shadow: inset 0px 0px 20px rgba(0, 0, 0, 0.3); -} -.spb_parallax_asset.bg-type-pattern { - background-repeat: repeat; - background-size: auto; -} -.spb_parallax_asset .spb_content_wrapper { - position: relative; -} -.spb_parallax_asset .heading-wrap { - text-align: center; - margin-bottom: 10px; +.post-meta ul li:last-child { + margin: 0; } - -/* -------------------------------------------- - HR SHORTCODE --------------------------------------------- */ - -.horizontal-break { - height: 2px; - width: 50px; - margin: 20px auto 25px; +.post-meta ul li a{ + color: #9a9a9a; } - -/* -------------------------------------------- - CLIENT BOX SHORTCODE --------------------------------------------- */ - -.client-box { - width: 228px; - height: auto; - background-color: #fafafa; - background-position: center center; - background-repeat: no-repeat; - float: left; - margin: 0 2px 7px 5px; -} -.client-box img { - width: 100%; - height: auto; - display: block; +.post-meta:before, .post-meta:after { + content: ""; + display: table; + line-height: 0; } - -/* -------------------------------------------- - GOOGLE CHART SHORTCODE --------------------------------------------- */ - -.googlechart { - margin-bottom: 30px; - width: 100%; +.post-meta:after { + clear:both; } - -/* -------------------------------------------- - ICON SHORTCODE --------------------------------------------- */ - -.sf-icon { - font-size: 22px; - line-height: 26px; - padding: 0 5px 6px 0; - width: auto; - height: 24px; - background-image: none; -} -.sf-icon.icon-medium { - font-size: 38px; - line-height: 40px; - width: auto; - height: 38px; - padding: 0px 10px 2px 0; -} -.sf-icon-cont.cont-small .sf-icon { - line-height: 30px; -} -.sf-icon-cont.cont-medium .sf-icon { - line-height: 48px; -} -.sf-icon.icon-large { - font-size: 50px; - line-height: 69px; - width: auto; - height: 56px; - padding: 0px 12px 6px 0; -} -.sf-icon-cont.cont-large .sf-icon { - line-height: 80px; -} -.sf-icon-cont .sf-icon { - padding: 0; -} -.sf-icon-cont { - background-image: none; - padding: 18px; - border-radius: 50%; - text-align: center; - vertical-align: middle; - margin-bottom: 20px; - margin-right: 20px; - height: 28px; - width: 28px; - line-height: 12px; -} -.sf-icon-cont.cont-small { - padding: 8px; -} -.sf-icon-cont.cont-medium { - background-image: none; - padding: 25px; - border-radius: 50%; - text-align: center; - vertical-align: middle; - margin-bottom: 20px; - width: 48px; - height: 48px; - line-height: 12px; -} -.sf-icon-cont.cont-large { - background-image: none; - padding: 37px; - border-radius: 50%; - text-align: center; - vertical-align: middle; - width: 77px; - height: 77px; -} -.sf-icon.icon-large:before { - font-size: 72px; -} -.sf-icon-float-left { - float: left; - padding: 5px 10px 0 0; -} -.sf-icon-float-right { - float: right; - padding: 5px 0 0 10px; -} -.sf-icon-float-none { - display: inline-block; +/* input focus */ +textarea:focus, input[type="text"]:focus, input[type="password"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, input[type="number"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus, .uneditable-input:focus { + border: 1px solid rgba(126, 201, 172,0.8); + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; + outline: 0 none; } -/* -------------------------------------------- - TYPOGRAPHY SHORTCODE --------------------------------------------- */ -span.highlighted { - padding: 1px 3px; - border-radius: 1px; - margin-right: 2px; - color: #fff; -} -span.dropcap1, span.dropcap2 { - float: left; - padding: 11px 0px 9px; - margin-right: 8px; - font-size: 46px; - font-family: serif; - font-style: normal; -} -span.dropcap3, span.dropcap4 { - float: left; - font-family: serif; - font-style: normal; - font-size: 18px; - padding: 4px 10px 4px 11px; - margin: 4px 10px 2px 0; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} -span.dropcap4 { - -webkit-border-radius: 30px; - -moz-border-radius: 30px; - border-radius: 30px; -} -blockquote { - border-left: 0; - padding: 10px 0; -} -blockquote, blockquote p { - font-size: 18px; - line-height: 28px; - font-style: italic; -} -blockquote.blockquote1, blockquote.blockquote1 p, blockquote.pullquote, blockquote.pullquote p { - font-size: 14px; - line-height: 20px; -} -blockquote.blockquote2, blockquote.blockquote1 p { - font-size: 14px; - line-height: 22px; -} -blockquote.pullquote { - border-left: 1px dotted transparent; - padding: 0 0 0 20px; -} -.decorative-ampersand { - font-family: 'Vidaloka', serif; - font-size: 24px; -} -/* -------------------------------------------- - LIST SHORTCODE --------------------------------------------- */ +/* entry */ -.sf-list { - margin-left: 0; - list-style: none!important; -} -.sf-list li { - padding: 0 0 0 20px; -} -.list-add_bw li { - background: transparent url('images/list-icons/add_b&w.png') no-repeat 2px 3px; -} -.list-add li { - background: transparent url('images/list-icons/add_colour.png') no-repeat 2px 3px; -} -.list-arrow_bw li { - background: transparent url('images/list-icons/arrow_b&w.png') no-repeat left 3px; -} -.list-arrow li { - background: transparent url('images/list-icons/arrow_colour.png') no-repeat left 3px; +/* comments */ +.commentlist{ + list-style: none; + margin: 0; } -.list-article li { - background: transparent url('images/list-icons/article_b&w.png') no-repeat left 3px; +.commentlist ul{ + list-style: none; + margin: 0; } -.list-bar li { - background: transparent url('images/list-icons/bar_b&w.png') no-repeat left 6px; +.commentlist .pingback { + padding: 4px 20px; } -.list-bolt_bw li { - background: transparent url('images/list-icons/bolt_b&w.png') no-repeat 2px 3px; +.comments-title, #reply-title{ + text-shadow: 0 1px 0 #fff; + color: #585858; } -.list-bolt li { - background: transparent url('images/list-icons/bolt_colour.png') no-repeat 2px 3px; +.comments-title{ + padding: 0 25px 10px; + text-align: center; } -.list-date li { - background: transparent url('images/list-icons/date_b&w.png') no-repeat left 3px; -} -.list-delete_bw li { - background: transparent url('images/list-icons/delete_b&w.png') no-repeat 1px 4px; -} -.list-delete li { - background: transparent url('images/list-icons/delete_colour.png') no-repeat 1px 4px; -} -.list-dot li { - background: transparent url('images/list-icons/dot_b&w.png') no-repeat 2px 5px; -} -.list-like_bw li { - background: transparent url('images/list-icons/like_b&w.png') no-repeat left 3px; +.commentlist article.comment{ + background: #FFFFFF; + border-bottom: 1px solid #F4F4F4; + padding: 20px 10px 20px 80px; + position: relative; } -.list-like li { - background: transparent url('images/list-icons/like_colour.png') no-repeat left 3px; +.commentlist .children article.comment{ + padding-left: 110px; } -.list-pen li { - background: transparent url('images/list-icons/pen_b&w.png') no-repeat left 3px; +.commentlist .children .children > li > article{ + padding-left: 140px; } -.list-question_bw li { - background: transparent url('images/list-icons/questionMark_b&w.png') no-repeat left 3px; +.commentlist .children .children .children > li > article{ + padding-left: 170px; } -.list-question li { - background: transparent url('images/list-icons/questionMark_colour.png') no-repeat left 3px; +.commentlist .children .children .children .children > li > article{ + padding-left: 200px; } -.list-settings_bw li { - background: transparent url('images/list-icons/settings_b&w.png') no-repeat left 3px; +.comment-author{ + margin-bottom: 10px; + position: relative; } -.list-settings li { - background: transparent url('images/list-icons/settings_colour.png') no-repeat left 3px; +article.comment .avatar{ + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; + position: absolute; + left: -60px; + top: 0; } -.list-star_bw li { - background: transparent url('images/list-icons/star_b&w.png') no-repeat left 3px; +.bypostauthor > article.comment .commenter a{ + color: #1ABC9C; +} +article.comment cite.commenter{ + color: #717171; + font-size: 15px; + font-weight: bold; +} +article.comment .reply a{ + color: #999; + font-size:12px; +} +.form-submit #submit{ + background-color: #eeeeee; + border: 1px solid #ddd; + padding: 10px 20px; +} +.form-allowed-tags{ + display: none; +} +.comments-area{ + background: #fff; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + padding: 10px 0; margin-top: 30px; +} +.comments-area-facebook{ + padding: 20px; +} +.fb-comments, .fb-comments span, .fb-comments.fb_iframe_widget span iframe { + width: 100% !important; +} +.comment-notes{ + display: none; +} +#commentform input[type="text"], #commentform textarea{ + background: #EFEFEF; + border-radius: 2px 2px 2px 2px; + border:none; + box-shadow: none; + font-size: 16px; + height: 35px; + width: 100%; } -.list-star li { - background: transparent url('images/list-icons/star_colour.png') no-repeat left 3px; +#respond{ + padding: 20px 20px 0; } -.list-tick_bw li { - background: transparent url('images/list-icons/tick_b&w.png') no-repeat left 3px; +#commentform textarea{ + height: 200px; } -.list-tick li { - background: transparent url('images/list-icons/tick_colour.png') no-repeat left 3px; +#commentform > p { + width: 50%; } -.list-user li { - background: transparent url('images/list-icons/user_b&w.png') no-repeat left 3px; +.comment-form-author{ + float: left; } -.list-warning_bw li { - background: transparent url('images/list-icons/warning_b&w.png') no-repeat left 3px; +.comment-form-email{ + float: left; + padding-left: 25px; } -.list-warning li { - background: transparent url('images/list-icons/warning_colour.png') no-repeat left 3px; +#commentform .comment-form-comment{ + width: 100%; } -/* -------------------------------------------- - SOCIAL SHORTCODE --------------------------------------------- */ -ul.social-icons { - height: auto; - overflow: hidden; - margin-right: -12px; - list-style: none!important;; -} -ul.social-icons li { - float: left; - display: inline-block; - width: 32px; - height: 32px; - margin-right: 12px; - background: none; - padding: 0!important; - line-height: 32px!important; - border: 0!important; - -webkit-transition: opacity 0.3s ease; - -moz-transition: opacity 0.3s ease; - -o-transition: opacity 0.3s ease; - transition: opacity 0.3s ease; - -webkit-transition-delay: 0.1s; - -moz-transition-delay: 0.1s; - -o-transition-delay: 0.1s; - transition-delay: 0.1s; -} -ul.social-icons li a { - background: transparent url(images/social-icons.png) no-repeat 0 0; - display: block; - width: 32px; - height: 32px; - text-indent: 100%; - white-space: nowrap; - overflow: hidden; - padding: 0; -} -ul.social-icons.dark li a { - background-image: url(images/social-icons-mono.png); -} -ul.social-icons.dark.small li a { - background-image: url(images/social-icons-mono-small.png); -} -ul.social-icons.light li a { - background-image: url(images/social-icons-mono-light.png); -} -ul.social-icons.light.small li a { - background-image: url(images/social-icons-mono-light-small.png); -} -ul.social-icons:hover li, ul.social-icons.small:hover li { - opacity: 0.5; - -moz-opacity: 0.5; - filter:alpha(opacity= 50); -} -ul.social-icons li:hover, ul.social-icons.small li:hover { - opacity: 1; - -moz-opacity: 1; - filter:alpha(opacity= 100); -} -ul.social-icons li a:hover { - color: transparent; -} -ul.social-icons li.twitter a { - background-position: 0 0; -} -ul.social-icons li.facebook a { - background-position: -32px 0; -} -ul.social-icons li.dribbble a { - background-position: -64px 0; -} -ul.social-icons li.vimeo a { - background-position: -96px 0; -} -ul.social-icons li.tumblr a { - background-position: -128px 0; -} -ul.social-icons li.spotify a { - background-position: -160px 0; -} -ul.social-icons li.linkedin a { - background-position: -192px 0; -} -ul.social-icons li.lastfm a { - background-position: -224px 0; -} -ul.social-icons li.googleplus a { - background-position: -256px 0; -} -ul.social-icons li.flickr a { - background-position: -288px 0; -} -ul.social-icons li.youtube a { - background-position: -320px 0; -} -ul.social-icons li.behance a { - background-position: -352px 0; -} -ul.social-icons li.pinterest a { - background-position: -384px 0; -} -ul.social-icons li.instagram a { - background-position: -416px 0; -} -ul.social-icons li.yelp a { - background-position: -448px 0; -} -ul.social-icons li.skype a { - background-position: -480px 0; -} -ul.social-icons.small { - height: auto; - overflow: hidden; - margin-right: -5px; - list-style: none!important; -} -ul.social-icons.small li { - width: 24px; - height: 24px; - margin: 0 5px 0 0; - float: left; - display: inline-block; - background: none; - padding: 0!important; - line-height: 24px!important; - border: 0!important; - -webkit-transition: opacity 0.3s ease; - -moz-transition: opacity 0.3s ease; - -o-transition: opacity 0.3s ease; - transition: opacity 0.3s ease; - -webkit-transition-delay: 0.1s; - -moz-transition-delay: 0.1s; - -o-transition-delay: 0.1s; - transition-delay: 0.1s; -} -ul.social-icons.small li a { - background: transparent url(images/social-icons-small.png) no-repeat 0 0; - display: block; - width: 24px; - height: 24px; - text-indent: 100%; - white-space: nowrap; - overflow: hidden; - padding: 0; -} -ul.social-icons.small li.twitter a { - background-position: 0 0; -} -ul.social-icons.small li.facebook a { - background-position: -24px 0; +/* Buttons */ + +.page-links > a, button:hover, html input[type="button"]:hover, input[type="reset"]:hover, input[type="submit"]:hover, .btn:hover{ + background-position:0; } -ul.social-icons.small li.dribbble a { - background-position: -48px 0; +.page-links > a:active, button:active, html input[type="button"]:active, input[type="reset"]:active, input[type="submit"]:active,button:focus, html input[type="button"]:focus, input[type="reset"]:focus, input[type="submit"]:focus, .btn:active, .btn:focus{ + /*box-shadow:0 2px 0 0 rgba(0, 0, 0, 0.1) inset;*/ + /*padding: 10px 20px 8px;*/ } -ul.social-icons.small li.vimeo a { - background-position: -72px 0; +.page-links > span,.btn.disabled{ + /*box-shadow:0 -2px 0 0 rgba(0, 0, 0, 0.1) inset;*/ + color:#cacaca; + /*padding:4px 12px 4px;*/ } -ul.social-icons.small li.tumblr a { - background-position: -96px 0; +/*.btn:focus{ + outline:none!important; } -ul.social-icons.small li.spotify a { - background-position: -120px 0; +.btn.btn-large { + padding: 13px 20px 15px; + font-size: 18px; } -ul.social-icons.small li.linkedin a { - background-position: -144px 0; +.btn.btn-large:active, .btn.btn-large:focus { + padding: 15px 20px 13px; } -ul.social-icons.small li.lastfm a { - background-position: -168px 0; +.btn.btn-small { + min-height: 20px; + padding: 2px 8px 4px; } -ul.social-icons.small li.googleplus a { - background-position: -192px 0; +.btn.btn-small:active, .btn.btn-small:focus { + padding: 4px 8px 2px; } -ul.social-icons.small li.flickr a { - background-position: -216px 0; +.btn.btn-mini { + min-height: 10px; + padding: 2px 8px 4px; } -ul.social-icons.small li.youtube a { - background-position: -240px 0; +.btn.btn-mini:active, .btn.btn-mini:focus { + padding: 4px 8px 2px; } -ul.social-icons.small li.behance a { - background-position: -264px 0; +.btn:hover, article.post .entry-content a.btn:hover{ + background-color: #E6E6E6; } -ul.social-icons.small li.pinterest a { - background-position: -288px 0; +.btn:active, .btn:focus, article.post .entry-content a.btn:active,article.post .entry-content a.btn:focus{ + background-color: #E6E6E6; } -ul.social-icons.small li.instagram a { - background-position: -312px 0; +.btn.dropdown-toggle:after { + content: "\e83f "; + display: inline-block; + font-family: fontello; + font-size: 12px; + margin-right: 10px; + padding-right: 0; + position: relative; + width: 1px; } -ul.social-icons.small li.yelp a { - background-position: -336px 0; +.btn-primary, .label-primary, #commentform #submit, .widget_search input[type="submit"], article.post .entry-content a.btn-primary{ + background-color: #1ABC9C; + color: #fff; } -ul.social-icons.small li.skype a { - background-position: -360px 0; +.btn-primary:hover, #commentform #submit:hover, article.post .entry-content a.btn-primary:hover{ + background-color: #48C9B0; } - -/* -------------------------------------------- - PROGRESS SHORTCODE --------------------------------------------- */ - -.progress { - height: 42px; - margin-bottom: 10px; -} -.progress .bar { - position: relative; -} -.progress .bar-text { - position: absolute; - top: 0; - left: 0; - line-height: 42px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - padding: 0 20px; - color: #fff; - font-weight: bold; - width: 100%; - text-align: left; - display: none; -} -.progress .bar-text > span { - float: right; - display: block; -} -.progress .bar { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; +.btn-primary:active, .btn-primary:focus, #commentform #submit:active, #commentform #submit:focus, article.post .entry-content a.btn-primary:active,article.post .entry-content a.btn-primary:focus{ + background-color: #16A085; } -/* -------------------------------------------- - CHART SHORTCODE --------------------------------------------- */ - -.chart-shortcode { - position: relative; - text-align: center; -} -.chart-shortcode.chart-center { - margin: 0 auto; -} -.chart-shortcode canvas { - position: absolute; - top: 0; - left: 0; -} -.chart-shortcode span { - font-size: 14px; - vertical-align: -1px; +.btn-info, .label-info, article.post .entry-content a.btn-info{ + background-color: #3498DB; + color: #ffffff; } -.chart-shortcode.chart-170 span { - font-size: 36px; - vertical-align: 0px; +.btn-info:hover, article.post .entry-content a.btn-info:hover{ + background-color: #5DADE2; } -.chart-shortcode.chart-170 span i { - vertical-align: -4px; +.btn-info:active, .btn-info:focus, article.post .entry-content a.btn-info:focus, article.post .entry-content a.btn-info:active{ + background-color: #2C81BA; } - -/* -------------------------------------------- - LATEST TWEET SHORTCODE --------------------------------------------- */ - -.latest-tweet ul { - margin-bottom: 10px; - list-style: none!important; -} -.latest-tweet ul li { - margin-left: 0; -} -.latest-tweet p { - margin-bottom: 0; +.btn-danger, .label-danger, article.post .entry-content a.btn-danger{ + background-color: #E74C3C; + color: #ffffff; } -.latest-tweet .tweet-author { - margin-right: 4px; - font-weight: bold; +.btn-danger:hover, article.post .entry-content a.btn-danger:hover{ + background-color: #EC7063; } -.latest-tweet .tweet-date { - text-decoration: none; - color: #999; - margin-left: 5px; - display: inline-block; +.btn-danger:active, .btn-danger:focus, article.post .entry-content a.btn-danger:active, article.post .entry-content a.btn-danger:focus{ + background-color: #C54133; } -/* -------------------------------------------- - TWEET SLIDER SHORTCODE --------------------------------------------- */ - -.alt-bg.wpb_tweets_slider_widget { - padding-top: 60px; - padding-bottom: 60px; -} -.wpb_tweets_slider_widget .tweet-text { - padding: 0 15%; - text-align: center; +.btn-success, .label-success, article.post .entry-content a.btn-success{ + background-color: #2ECC71; + color: #ffffff; } -.wpb_tweets_slider_widget .text-normal .tweet-text { - font-size: 18px; - line-height: 26px; +.btn-success:hover, article.post .entry-content a.btn-success:hover{ + background-color: #58D68D; } -.wpb_tweets_slider_widget .text-large .tweet-text { - font-size: 24px; - line-height: 36px; +.btn-success:active, .btn-success:focus, article.post .entry-content a.btn-success:active, article.post .entry-content a.btn-success:focus{ + background-color: #27AE60; } -.wpb_tweets_slider_widget .twitter_intents { - margin-top: 20px; - display: block; - padding: 0 15%; + +.page-links > a, .btn-inverse, .label-inverse, article.post .entry-content a.btn-inverse{ + background-color: #34495E; + color: #ffffff; } -.wpb_tweets_slider_widget .twitter_intents a { - margin: 0 4px; - position: relative; +.page-links > a:hover, .btn-inverse:hover, article.post .entry-content a.btn-inverse:hover{ + background-color: #415B76; } -.wpb_tweets_slider_widget a:hover { - text-decoration: none; +.page-links > a:active, .btn-inverse:active, .btn-inverse:focus, article.post .entry-content a.btn-inverse:active, article.post .entry-content a.btn-inverse:focus{ + background-color: #2C3E50; } -/* -------------------------------------------- - GALLERY SHORTCODE --------------------------------------------- */ - -.gallery { - padding-top: 10px; -} -.gallery .gallery-item { - width: auto; - float: left; - display: inline; - margin: 0 14px 14px; - width: 17%; -} -.gallery-item .gallery-icon { - background: #222 url(images/view-image.png) no-repeat center center; - width: 100%; - height: auto; -} -.gallery-item .gallery-icon a { - display: block; - opacity: 1; - -moz-opacity: 1; - filter:alpha(opacity= 100); -} -.gallery-icon a img { - display: block; - width: 100%; - height: auto; -} -.gallery-item .gallery-icon a:hover { - opacity: 0.1; - -moz-opacity: 0.1; - filter:alpha(opacity= 10); +.btn-warning, .label-warning, article.post .entry-content a.btn-warning{ + background-color: #F39C12; + color: #ffffff; } - -/* -------------------------------------------- - ACCORDION SHORTCODE --------------------------------------------- */ - -.wpb_accordion .wpb_accordion_wrapper { - margin-bottom: 30px; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.wpb_accordion .wpb_accordion_section { - margin-bottom: 6px; - border: 1px solid transparent; -} -.wpb_accordion_section > h3 { - font-size: 14px; - font-weight: normal; - outline: 0!important; -} -.wpb_accordion .wpb_accordion_section > h3 a { - display: block; - text-decoration: none; - padding: 12px 15px; - -webkit-transition: all 0.3s ease; - -moz-transition: all 0.3s ease; - -o-transition: all 0.3s ease; - transition: all 0.3s ease; - -webkit-transition-delay: 0.1s; - -moz-transition-delay: 0.1s; - -o-transition-delay: 0.1s; - transition-delay: 0.1s; -} -.ui-accordion .ui-accordion-header .ui-icon { - position: absolute!important; - right: 15px; - top: 14px!important; - margin-top: 0!important; - background-image: none!important; - left: auto!important; - width: 12px; - -webkit-transition: all 0.3s ease; - -moz-transition: all 0.3s ease; - -o-transition: all 0.3s ease; - transition: all 0.3s ease; - -webkit-transition-delay: 0.1s; - -moz-transition-delay: 0.1s; - -o-transition-delay: 0.1s; - transition-delay: 0.1s; -} -.wpb_accordion_section > h3 .ui-icon:before { - content: "\f067"; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: inline-block; - text-decoration: inherit; - width: 10px; - height: 10px; - float: left; - margin-right: 10px; - margin-top: -1px; - font-size: 14px; - text-indent: 0; -} -.wpb_accordion_section h3.ui-state-active .ui-icon:before { - content: "\f068"; -} -.wpb_accordion .ui-state-active, .wpb_accordion .ui-state-default { - border: 0!important; - background: none!important; - margin-top: 0; -} -.wpb_accordion .ui-accordion .ui-accordion-content { - border: 0; - padding: 3px 15px 15px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.wpb_accordion .ui-accordion .ui-accordion-content .row { - margin-left: 0!important; -} -.wpb_accordion .ui-accordion .ui-accordion-content.row-fluid [class*="span"] { - width: 100%!important; -} -.wpb_accordion .ui-accordion .ui-accordion-header { - position: relative; - margin-top: 0; -} -.ui-accordion-content .wpb_wrapper p:last-child { - margin-bottom: 0; -} -.ui-accordion-content .wpb_wrapper .box-content-wrap p:last-child { - margin-bottom:20px; +.btn-warning:hover, article.post .entry-content a.btn-warning:hover{ + background-color: #F6B517; } +.btn-warning:active, .btn-warning:focus, article.post .entry-content a.btn-warning:active, article.post .entry-content a.btn-warning:focus{ + background-color: #CF850F; +}*/ -/* -------------------------------------------- - TABS SHORTCODE --------------------------------------------- */ - -.wpb_tabs .wpb_tour_tabs_wrapper { - margin-bottom: 30px; -} -.tabbed-asset { - overflow: hidden; - margin-bottom: 20px; -} -.tab-content { - padding: 10px; - background-color: #f7f7f7; - color: #222; -} -.tab-content.ui-tabs-hide { - display: none; -} -.ui-widget :active { - outline: none; -} -.ui-tabs .ui-tabs-nav li { - font-weight: normal; - border-left-width: 0; - margin: 0!important; -} -.ui-tabs .ui-tabs-nav li:first-child { - border-left-width: 1px; -} -.wpb_accordion_section .ui-accordion-content { - height: auto; - overflow: hidden; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.wpb_tabs .ui-tabs .ui-tabs-panel { - height: auto; - overflow: hidden; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -.wpb_tabs .ui-tabs .ui-tabs-panel .row, .wpb_tabs .ui-tabs .ui-tabs-panel .row [class*="span"] { - width: 100%!important; - margin-left: 0!important; -} -.wpb_tabs .ui-tabs .ui-tabs-panel .row [class*="span"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - padding: 15px; -} -.wpb_tabs .ui-tabs .ui-tabs-nav li a { - padding: 12px 15px; -} -.wpb_content_element .ui-widget-header .ui-state-default { - background: transparent; +/* search form */ +#searchform label, #searchform input[type="submit"]{ + display: none; } - -/* -------------------------------------------- - TOUR SHORTCODE --------------------------------------------- */ - -.wpb_tour .wpb_tour_tabs_wrapper { - margin-bottom: 30px; -} -.wpb_tour .ui-tabs .ui-tabs-nav { - width: 20%; - z-index: 2; -} -.wpb_tour .ui-tabs .ui-tabs-nav li { - border-bottom: 1px solid #e4e4e4!important; - border-width: 1px; - border-color: transparent!important; - top: 0!important; - float: none; - width: 100%; -} -.wpb_tour .ui-tabs .ui-tabs-nav li.ui-state-active { - border-right: 0; -} -.wpb_tour .ui-tabs .ui-tabs-panel { - border: 1px solid #e4e4e4; - padding: 12px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - min-height: 100px; - margin-left: 0!important; - z-index: 1; - width: 78%; -} -.wpb_tour_next_prev_nav { - margin-left: 0; -} -.wpb_tour .ui-tabs .ui-tabs-panel .row { - margin-left: 0!important; -} -.wpb_tour .ui-tabs .ui-tabs-panel.row-fluid [class*="span"] { - width: 100%!important; - margin-left: 0!important; -} -.wpb_tour.span3 .ui-tabs .ui-tabs-nav { - width: auto; - float: none; -} -.wpb_tour.span3 .ui-tabs .ui-tabs-nav li { - margin-bottom: 4px!important; - border-width: 1px!important; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.wpb_tour.span3 .ui-tabs .ui-tabs-panel { - width: 100%; +.widget-area #searchform input[type="submit"]{ + display: inline-block; + width: 28%; } - -/* -------------------------------------------- - CALENDAR WIDGET --------------------------------------------- */ - -.widget_calendar #calendar_wrap { - border: 1px solid #e4e4e4; /* stroke */ - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; /* border radius */ - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; /* prevents bg color from leaking outside the border */ - background-color: #fff; /* layer fill content */ - overflow: hidden; -} -#calendar_wrap caption { - border-bottom: 2px solid #222; - padding: 7px 0; -} -.widget_calendar table { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: collapse; - position: relative; - margin-bottom: -2px; -} -.widget_calendar th { - text-align: center; - width: 26px; - height: 35px; - border: 1px solid #e4e4e4; - border-bottom: 0; - vertical-align: middle; -} -.widget_calendar th:first-child { - border-left: 0; -} -.widget_calendar th:last-child { - border-right: 0; -} -.widget_calendar tbody tr { - height: 35px; -} -.widget_calendar tbody tr > td { - color: #444; - text-align: center; - border: 1px solid #e4e4e4; - vertical-align: middle; - padding: 0; -} -.widget_calendar tbody tr > td:first-child { - border-left: 0; -} -.widget_calendar tbody tr > td:last-child { - border-right: 0; -} -.widget_calendar tbody tr > td a { - padding: 6px 0; - display: block; -} -.sidebar .widget_calendar tbody tr > td a:hover { - text-decoration: none; -} -.widget_calendar tbody tr > td.pad { - border: 0; - border-top: 1px solid #e4e4e4; - background: transparent url('images/scanlines_dark.png') repeat 0 0; -} -.widget_calendar tfoot { - position: absolute; - top: 2px; - width: 100%; - display: block; -} -.widget_calendar tfoot tr { - width: 100%; - display: block -} -.widget_calendar tfoot td { - padding: 5px 0; - border-color: transparent; - float: left; -} -.widget_calendar tfoot td#prev { - padding-left: 10px; - width: 40px; - text-align: left; -} -.widget_calendar tfoot td#next { - padding-right: 10px; - width: 40px; - text-align: right; - float: right; -} -.widget_calendar tfoot td a:hover { - text-decoration: none; +#masthead #searchform input[type="text"]{ + border: none; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + width: 100%; + margin: 0; + background: rgba(0,0,0,0.05); + color: #A0A0A0; + -webkit-transition: background 0.2s ease-in-out; + -moz-transition: background 0.2s ease-in-out; + -o-transition: background 0.2s ease-in-out; + -ms-transition: background 0.2s ease-in-out; + transition: background 0.2s ease-in-out; +} +#searchform input[type="text"]:focus{ + background: #fafafa; + color: #444; + box-shadow: none; } +/* -/* #WooCommerce -================================================== */ + Widgets -.woocommerce .woocommerce-result-count, .woocommerce-page .woocommerce-result-count { - margin-top: 4px!important; -} -.woocommerce .products ul, .woocommerce ul.products, .woocommerce-page .products ul, .woocommerce-page ul.products { - padding-top: 25px!important; - border-top: 1px solid #e4e4e4; -} -.woocommerce-account .page-content h2 { - border-bottom: 1px solid #ccc; - padding-bottom: 10px; - margin-top: 40px; -} -.woocommerce-account p.myaccount_address { - border-bottom: 1px solid #ccc; - padding-bottom: 60px; -} -.woocommerce-account div.col2-set.addresses { - margin-bottom: 50px; -} -.addresses .title .edit { - margin: 10px 0 0 0; - border: 1px solid #e4e4e4; - padding: 2px 10px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - font-size: 12px; - line-height: 18px; -} -.woocommerce-account input[name="change_password"] { - margin: 10px 0 0 4px; -} -.woocommerce-page form .form-row label { - padding-bottom: 5px; -} -.woocommerce-page .cart-collaterals { - margin-bottom: 50px; - border-top: 1px solid #e4e4e4; - padding: 20px 0; -} -.woocommerce-cart .cart-collaterals .cart_totals table { - float: right; -} -.woocommerce-cart .shipping-calculator-button { - text-decoration: none; -} -.cart-collaterals .shipping_calculator .button[name="calc_shipping"] { - width: 28%; - float: right; - padding: 10px 12px; - margin-right: 3px; - margin-top: 10px; -} -div.product .woocommerce_tabs ul.tabs li.active a { - background: transparent; -} -div.product .woocommerce_tabs ul.tabs li a { - background: transparent; -} -#payment ul.payment_methods li { - margin-bottom: 10px; -} -#payment ul.payment_methods li input { - margin: 5px 6px 0 0; - float: left; -} -.woocommerce-checkout h3#order_review_heading { - margin-top: 50px; -} -.woocommerce-checkout form.checkout { - margin-bottom: 50px; -} -.quantity input.qty { - height: 26px; -} -div.product .thumbnails { - margin-left: 0!important; -} -div.product .woocommerce_tabs ul.tabs { - margin-bottom: 0; - padding-left: 15px; +*/ +#above-blog{ width: 100%; } +#above-blog > div{ display:block; width: 100%; } +.bl_category ul{ + list-style: none; +} +.bl_category > ul{ + margin: 0; +} +.bl_category ul li{ + /*min-height: 25px;*/ +} +.bl_category ul li a{ + position: relative; + display: block; + padding: 8px 0; + border-bottom:1px solid rgba(0,0,0,0.03); +} +.bl_category ul li:last-child a{ + border-bottom: none; +} +.bl_category ul li .children:before{ + content: "\e83f "; + font-family: 'fontello'; + position:absolute; + top:10px; + right: 35px; + display:block; + color: rgba(0,0,0,0.2); +} +.bl_category ul li a + span{ + background-color: rgba(0,0,0,0.2); + text-shadow: none; + font-weight: normal; + position: absolute; + right: 0; + top: 10px; + border-radius: 2px; +} +.bl_category ul li .children li{ + + position: relative; + max-height: 0; + min-height: 0; + overflow: hidden; + + -webkit-transition: max-height .80s ease-in-out; -moz-transition: max-height .80s ease-in-out; -o-transition: max-height .80s ease-in-out; transition: max-height .80s ease-in-out; +} +.bl_category ul li:hover > .children > li{ + max-height: 500px; +} +.bl_category ul li .children li a{ + +} + +.bl_category > ul > li > a{ + display: block; + overflow: visible; + max-height: none; +} +.widget-area > .widget_categories > select{ + border: 0 none; + margin: 0!important; + min-height: 40px; + padding: 10px; + width: 100%!important; +} + +.scale img{ + -webkit-transition: all .10s ease-in-out; -moz-transition: all .10s ease-in-out; -o-transition: all .10s ease-in-out; transition: all .10s ease-in-out; +} +.scale:hover img{ + transform: scale(1.03); + -ms-transform: scale(1.03); + -webkit-transform: scale(1.03); +} +.bl-social-icon{ + background: none repeat scroll 0 0 #F0F0F0; + border-radius: 500px; + color: #777777; + display: inline-block; + font-size: 11px; + padding: 4px 6px; +} +/* general css for all widgets */ +.widget-head{ +/* background: #2E3641; + padding: 0 15px; + -moz-border-radius: 2px 2px 0 0; + -webkit-border-radius: 2px 2px 0 0; + border-radius: 2px 2px 0 0; + color: #fff; + margin: -15px -15px 15px;*/ +} +.widget-head a{ + color: #fff; +} +.bl_tabs, .bl_author, .bl_imagebox,.bl_instagram, .bl_likebox, .bl_tweets, .widget_categories, .widget_recent_comments, .widget_search{ + padding: 0!important; +} +/*.bl_tabs .widget-head,*/ +.bl_author .widget-head, +.bl_imagebox .widget-head, +.bl_instagram .widget-head, +.bl_likebox .widget-head, +.bl_tweets .widget-head, +.widget_recent_comments .widget-head, +.widget_categories .widget-head{ + margin: 0!important; +} +#footer-body .bl_html .widget-body{ + padding: 15px; +} +/* Author Widget */ +.bl_author > img{ + width: 100%; + -moz-border-radius: 2px 2px 0 0; + -webkit-border-radius: 2px 2px 0 0; + border-radius: 2px 2px 0 0; +} +.bl_author > h3 + img{ + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +#footer-body .bl_author .widget-body{ + background: #ffffff; + -moz-border-radius: 0 0 2px 2px; + -webkit-border-radius: 0 0 2px 2px; + border-radius: 0 0 2px 2px; + padding: 0 15px 15px; +} +.bl_author .widget-body{ + position: relative; + text-align: center; +} +.bl_author > img + .widget-body .bl_author_img + .bl_author_bio{ + padding-top: 50px; +} +.bl_author .bl_author_bio{ + padding-left: 25px; + padding-right: 25px; + padding-bottom: 15px; + color: #333; +} +.bl_author .bl_author_bio > h3{ + margin-top: 0; +} +#footer-body .bl_author .bl_author_bio{ + padding-left: 0; + padding-right: 0; + padding-bottom: 0; +} +.bl_author .bl_author_bio p{ + margin: 0; +} +.bl_author_img { + -moz-border-radius: 500px; + -webkit-border-radius: 500px; + border-radius: 500px; + height: 100px; + width: 100px; + background: #fff; + padding: 5px; +} +.bl_author > img + .widget-body .bl_author_img { + left: 50%; + margin: 0 -50px; + position: absolute; + top: -45px; + overflow: hidden; +} +.bl_author > img + .widget-body .bl_author_img img{ + -moz-border-radius: 500px; + -webkit-border-radius: 500px; + border-radius: 500px; + height: 90px; + max-width: none; + width: 90px; +} +/* Image Box Widget */ +.bl_imagebox .top-line{ + display: none; +} +.bl_imagebox > img{ + width: 100%; + -moz-border-radius: 2px 2px 0 0; + -webkit-border-radius: 2px 2px 0 0; + border-radius: 2px 2px 0 0; +} +.bl_imagebox > h3 + img{ + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +#footer-body .bl_imagebox .widget-body{ + background: #ffffff; + -moz-border-radius: 0 0 2px 2px; + -webkit-border-radius: 0 0 2px 2px; + border-radius: 0 0 2px 2px; + padding: 0 15px 15px; +} +.bl_imagebox .widget-body{ + position: relative; + text-align: center; +} +.bl_imagebox .widget-footer{ + color: #C9C9C9; + padding: 5px 15px; + font-size: 12px; +} +.bl_imagebox > img + .widget-body .bl_imagebox_img + .bl_imagebox_bio{ + padding-top: 60px; +} +.bl_imagebox .bl_imagebox_bio{ + padding: 5px 15px 15px; + color: #333; +} +.bl_imagebox .bl_imagebox_bio > h3{ + color: #333; + font-size: 25px!important; + font-weight: bold; + margin: 0; +} +#footer-body .bl_imagebox .bl_imagebox_bio{ + padding-left: 0; + padding-right: 0; + padding-bottom: 0; +} +.bl_imagebox .bl_imagebox_bio p{ + margin: 10px 0 0; +} +.bl_imagebox_img { + -moz-border-radius: 500px; + -webkit-border-radius: 500px; + border-radius: 500px; + height: 100px; + width: 100px; + background: #fff; + padding: 5px; +} +.bl_imagebox > img + .widget-body .bl_imagebox_img { + left: 50%; + margin: 0 -50px; + position: absolute; + top: -45px; +} + +/* featured posts widget */ +.bl_featured_post{ + padding: 0!important; + position: relative; + overflow: hidden; +} +.bl_featured_post iframe { + max-width: 100%; + height: 235px; + margin-bottom: -7px; } -div.product .woocommerce_tabs ul.tabs li { - margin: 0 -2px; +.widget-area .bl_featured_post h3 a { + display: inline-block; + font-size: 12px; + position: absolute; + right: 20px; +} +.bl_featured_post .widget-body > iframe + h4, .bl_featured_post .widget-body > iframe ~ p{ + display: none; +} +.bl_featured_post h3{ + margin: 0; + position: relative; + box-shadow: none!important; + /*min-height: 47px;*/ +} +.bl_featured_post .widget-body{ + border-radius: 2px; + position: relative; + overflow: hidden; +} +.bl_featured_post h3 + .widget-body{ + border-radius: 0 0 2px 2px; +} +.bl_featured_post .widget-body > img{ + height: 250px; + max-width: none; + min-width: 100%; + width: auto; +} +.bl_featured_post .widget-body > .featured_post_overlay{ + width: 100%; + height: 100%; + top: 0; + position: absolute; + background: rgba(0,0,0,0.3); +} +.bl_featured_post .widget-body > h4{ + line-height: 30px; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.6); + position: absolute; + top: 80px; + color: #FFFFFF; + font-weight: bolder; + font-size: 30px; + padding: 0 25px; + width: 100%; + text-align: center; +} +.bl_featured_post .widget-body > h4 a{ + color: #FFFFFF; + opacity: 0.9; +} +.bl_featured_post .widget-body > h4 a:hover{ + opacity: 1; +} +.bl_featured_post .widget-body > p{ + line-height: 18px; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.6); + position: absolute; + top: 120px; + color: #FFFFFF; + font-weight: bolder; + font-size: 16px; + padding: 0 25px; + width: 100%; + text-align: center; +} + +.bl_featured_post .featured_gallery{ + list-style: none; + width: 1000%; + margin: 0; + position: relative; +} +.bl_featured_post .featured_gallery li{ + width: 10%; + float:left; +} +#footer-body .bl_featured_post .featured_box_arrow, .widget-area .bl_featured_post .featured_box_arrow{ + position: absolute; + top: 50%; + height: 50px; + margin: 0; + font-size: 34px; + color: #fff; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#footer-body .bl_featured_post .featured_box_arrow:hover, .widget-area .bl_featured_post .featured_box_arrow:hover{ + cursor: pointer; + opacity: 0.8; +} +#footer-body .bl_featured_post .left_arrow, .widget-area .bl_featured_post .left_arrow{ + left: -40px; +} +#footer-body .bl_featured_post .right_arrow, .widget-area .bl_featured_post .right_arrow{ + right: -40px; +} +#footer-body .bl_featured_post:hover > .left_arrow, .widget-area .bl_featured_post:hover > .left_arrow{ + left: 1px; +} +#footer-body .bl_featured_post:hover > .right_arrow, .widget-area .bl_featured_post:hover > .right_arrow{ + right: 1px; } -div.product .woocommerce_tabs .panel { - margin-bottom: 0px; - margin-top: -1px; - border: 1px solid rgb(221, 221, 221); - padding: 10px 20px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - background-color: rgb(255, 255, 255); +/* + Featured Posts Widget +*/ +.swiper-container.swiper-container-featured .swiper-wrapper{ + position: relative; +} +.swiper-container.swiper-container-featured .swiper-slide{ + height: 250px; +} +#above-blog .swiper-container.swiper-container-featured .swiper-slide, #above-blog .swiper-container.swiper-container-featured .swiper-slide a{ + height: 350px; +} +.swiper-container.swiper-container-featured .swiper-slide a{ + height: 250px; + display: block; + padding-right: 4px; + background-size: cover; + background-position: center center; + background-repeat: no-repeat; +} +.swiper-container-featured .swiper-slide a:after { + background: none repeat scroll 0 0 #000000; + content: ""; + height: 100%; + left: 0; + opacity: 0.3; + position: absolute; + top: 0; + -webkit-transition: opacity .15s ease-out; + -moz-transition: opacity .15s ease-out; + -ms-transition: opacity .15s ease-out; + -o-transition: opacity .15s ease-out; + transition: opacity .15s ease-out; + width: 100%; +} +.ie8 .swiper-container-featured .swiper-slide a:after{ + display: none!important; +} +.swiper-container-featured .swiper-slide a:hover:after { + opacity: 0.2; +} +.swiper-container.swiper-container-featured .swiper-slide:last-child a{ + padding-right: 0 +} +.widget-area .bl_featured_post{ + position: relative; +} +.widget-area .bl_featured_post .widget-head a{ + color: #FFFFFF; + font-size: 12px; + position: relative; + right: 0; + bottom: 15px; + z-index: 100; + width: 100%; + text-align: center; +} +.swiper-container.swiper-container-featured .post-title{ + color: #FFFFFF; + position: absolute; + top:50%; + width: 100%; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.15); + text-transform: none!important; + padding: 0 15px!important; + z-index: 10; +} +.swiper-container.swiper-container-featured .post-title p{ + line-height: 1.5!important; +} +#above-blog .swiper-container.swiper-container-featured .post-title{ + padding: 0 45px!important; +} +#above-blog .swiper-container.swiper-container-featured .post-title p{ + margin: 5px 0; +} + + + +.bl_featured_post .widget-body{ + padding: 0; + position: relative; +} +.bl_featured_post .featured-images-container{ + overflow: hidden; +} +.bl_featured_post .widget-body .featured-header{ + z-index: 2; + position: relative; + padding: 7px 0; + border-top: 1px solid #EEEEEE; +} +.bl_featured_post ul{ + list-style: none; + margin: 0; + padding: 0; +} +.bl_featured_post .blu-heading{ + margin: 0; +} +.bl_featured_post .featured-images{ + width: 6000px; + position: relative; +} +.bl_featured_post .featured-header li{ + display: table-cell; + width: 1%; + text-align: center; + line-height: 17px; +} +.bl_featured_post .featured-header li p{ + color: #444444; + font-weight: bold; + margin: 0; + font-size: 16px; +} +.bl_featured_post .featured-interactions{ + bottom: 0; + position: absolute; + text-align: left; + color: #F9F9F9; + font-size: 14px; + padding: 5px; + width: 100%; + z-index: 10; + background: -moz-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,0.6) 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(0,0,0,0)), color-stop(100%,rgba(0,0,0,0.6))); + background: -webkit-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,0.6) 100%); + background: -o-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,0.6) 100%); + background: -ms-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,0.6) 100%); + background: linear-gradient(to bottom, rgba(0,0,0,0) 0%,rgba(0,0,0,0.6) 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00000000', endColorstr='#cc000000',GradientType=0 ); +} +.bl_featured_post .swiper-container .arrow-left, +.bl_featured_post .swiper-container .arrow-right { + height: 40%; + margin-top: 0; + position: absolute; + top: 30%; + width: 35px; + z-index: 10000; +} +.bl_featured_post .swiper-container .arrow-right { + right:0; +} +.bl_featured_post .swiper-container .arrow-left { + left: 0; +} +/* social box */ +.widget-area .bl_socialbox .widget-body{ + padding: 10px 14px; +} +.cleanwidget.bl_socialbox, .cleanwidget.bl_socialbox .widget-head{ + padding: 0; + background: transparent; + +} +.bl_socialbox ul{ + list-style: none; + margin: 0; +} +.bl_socialbox li{ + float: left; + margin: 4px; +} +.site-footer #footer-body .bl_socialbox a, .bl_socialbox a{ + color: #666; + padding: 6px; + font-size: 18px; + background: #F7F7F7; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + -webkit-transition: transform 0.2s ease-in-out; + -moz-transition: transform 0.2s ease-in-out; + -o-transition: transform 0.2s ease-in-out; + -ms-transition: transform 0.2s ease-in-out; + transition: transform 0.2s ease-in-out; + display: block; } -.widget_product_search form { - margin-bottom: 0; +.site-footer #footer-body .bl_socialbox a:hover, .bl_socialbox a:hover{ + color: #fff!important; +/* transform: scale(1.08); + -ms-transform: scale(1.08); + -webkit-transform: scale(1.08);*/ + text-decoration: none; +} +.bl_socialbox a.bl_icon_facebook{ color: #4861A3!important; } +.bl_socialbox a.bl_icon_facebook:hover{ color:#fff!important; background: #4861A3!important; border-color: #4861A3!important; } +.bl_socialbox a.bl_icon_twitter{ color: #1BB2E9!important; } +.bl_socialbox a.bl_icon_twitter:hover{ color:#fff!important; background: #1BB2E9!important; border-color: #1BB2E9!important; } +.bl_socialbox a.bl_icon_googleplus{ color: #CE4231!important; } +.bl_socialbox a.bl_icon_googleplus:hover{ color:#fff!important; background: #CE4231!important; border-color: #CE4231!important; } +.bl_socialbox a.bl_icon_linkedin{ color: #007BB6!important; } +.bl_socialbox a.bl_icon_linkedin:hover{ color:#fff!important; background: #007BB6!important; border-color: #007BB6!important; } +.bl_socialbox a.bl_icon_youtube{ color: #BC1E2C!important; } +.bl_socialbox a.bl_icon_youtube:hover{ color:#fff!important; background: #BC1E2C!important; border-color: #BC1E2C!important; } +.bl_socialbox a.bl_icon_rss{ color: #F99C00!important; } +.bl_socialbox a.bl_icon_rss:hover{ color:#fff!important; background: #F99C00!important; border-color: #F99C00!important; } +.bl_socialbox a.bl_icon_flickr{ color: #FE0083!important; } +.bl_socialbox a.bl_icon_flickr:hover{ color:#fff!important; background: #FE0083!important; border-color: #FE0083!important; } +.bl_socialbox a.bl_icon_vimeo{ color: #1BB6EC!important; } +.bl_socialbox a.bl_icon_vimeo:hover{ color:#fff!important; background: #1BB6EC!important; border-color: #1BB6EC!important; } +.bl_socialbox a.bl_icon_pinterest{ color: #CD2026!important; } +.bl_socialbox a.bl_icon_pinterest:hover{ color:#fff!important; background: #CD2026!important; border-color: #CD2026!important; } +.bl_socialbox a.bl_icon_dribbble{ color: #E14A85!important; } +.bl_socialbox a.bl_icon_dribbble:hover{ color:#fff!important; background: #E14A85!important; border-color: #E14A85!important; } +.bl_socialbox a.bl_icon_tumblr{ color: #49637C!important; } +.bl_socialbox a.bl_icon_tumblr:hover{ color:#fff!important; background: #49637C!important; border-color: #49637C!important; } +.bl_socialbox a.bl_icon_instagram{ color: #AC8568!important; } +.bl_socialbox a.bl_icon_instagram:hover{ color:#fff!important; background: #AC8568!important; border-color: #AC8568!important; } +.bl_socialbox a.bl_icon_viadeo{ color: #F97618!important; } +.bl_socialbox a.bl_icon_viadeo:hover{ color:#fff!important; background: #F97618!important; border-color: #F97618!important; } +.bl_socialbox a.bl_icon_github{ color: #4190DE!important; } +.bl_socialbox a.bl_icon_github:hover{ color:#fff!important; background: #4190DE!important; border-color: #4190DE!important; } + +/* Tabs widget */ +.bl_tabs h3 + #bl_side_tabs{ + top:0; +} +.bl_tabs h3 + #bl_side_tabs + .tab-content{ + margin-top: 0; +} +.bl_tabs #bl_side_tabs{ + margin: 0; + position:relative; + top: -36px; +} +#bl_side_posts > ul, #bl_side_comments > ul{ + list-style: none; + margin: 0; + padding: 0; + overflow: hidden; +} +#bl_side_posts > ul li, #bl_side_comments > ul li{ + padding: 15px 15px 25px 110px; + position: relative; + min-height: 55px; + right: -110%; + border-left: 3px solid transparent; +} +#bl_side_posts > ul li:hover, #bl_side_comments > ul li:hover { + background: none repeat scroll 0 0 #F8F8F8; + /*border-left: 3px solid #F69087;*/ + cursor: pointer; +} +#bl_side_posts > ul li:hover .tab_icon, #bl_side_comments > ul li:hover .tab_attachment, #bl_side_posts > ul li:hover .tab_attachment { + -webkit-transition: all .15s ease-in-out; + -moz-transition: all .15s ease-in-out; + -o-transition: all .15s ease-in-out; + transition: all .15s ease-in-out; +/* -webkit-transform: scale(1.05); + -moz-transform: scale(1.05); + -ms-transform: scale(1.05); + -o-transform: scale(1.05); + transform: scale(1.05);*/ +} +.bl_tabs{ + margin-top: 66px; +} +.bl_tabs .top-line{ + display:none; +} +.bl_tabs:first-child{ + margin-top: 36px; +} +.bl_tabs > h3 { + margin-top: -36px !important; +} +.bl_tabs ul li a{ + font-weight: bold; +} +.bl_tabs ul li .tab_attachment{ + position: absolute; + left: 15px; + top: 8px; + background: transparent!important; + display: block; +} +.bl_tabs ul li .tab_text{ + display: table; + height: 55px; +} +.site-footer #footer-body .bl_tabs ul li .tab_text h5, .bl_tabs ul li .tab_text h5{ + color: #717171; + display: table-cell; + text-decoration: none !important; + vertical-align: middle; + background: transparent; + -webkit-transform: none; + -moz-transform: none; + -ms-transform: none; + -o-transform: none; + transform: none; +} +.widget-area .bl_tabs ul li .tab_text h5{ + background: transparent; +} +.site-footer #footer-body .bl_tabs ul li .tab_text h5 a, .bl_tabs ul li .tab_text h5 a{ + color: #717171; + text-decoration: none !important; +} +.site-footer #footer-body .bl_tabs ul li .tab_text h5, .bl_tabs ul li .tab_text h5 small{ + display:block; +} +.bl_tabs ul li .tab_text a span{ + /*color: #F69087;*/ +} +.bl_tabs .tab-content{ + background: none repeat scroll 0 0 #FFFFFF; + margin-top: -36px; + min-height: 100px; + padding: 15px 0; +} +.tab_icon{ + display: block; + height: 80px; + width: 80px; + -moz-border-radius: 500px; + -webkit-border-radius: 500px; + border-radius: 500px; +} +.tab_icon i { + color: #FFFFFF; + display: block; + font-size: 26px; + height: 80px; + line-height: 80px; + text-align: center; + width: 80px; +} +.bl_tabs .tab-content img{ + -moz-border-radius: 500px; + -webkit-border-radius: 500px; + border-radius: 500px; + width: 80px; + height: 80px; + display: block; + position: relative; + max-width: none\9; +} +.tab_quote{ + background-color: #85A9B3; + background-position: 2px -220px; +} +.tab_audio{ + background-color: #EF7336; + background-position: 2px -330px; +} +.tab_link{ + background-color: #9664B5; + background-position: 2px -50px; +} +.tab_gallery, .tab_image{ + background-position: 1px -274px; + background-color: #B0CB7A; +} +.tab_standard{ + background-position: 1px -107px; + background-color: #F69087; +} +.tab_video{ + background-position: 1px -442px; + background-color: #85CCB1; +} +#bl_side_tags{ + padding: 0 15px; +} +#bl_side_tags .bl_tab_tag{ + font-weight: bold; + padding: 4px 6px; + margin: 0 5px 5px 0; + background: #F8F8F8; + text-decoration: none; + color: #666; + display: block; + float: left; + text-align: center; +} +#bl_side_tags .bl_tab_tag:hover{ + /*background: #F69087;*/ + color: #fff; + -webkit-transition: all .15s ease-in-out; + -moz-transition: all .15s ease-in-out; + -o-transition: all .15s ease-in-out; + transition: all .15s ease-in-out; + -webkit-transform: scale(1.05); + -moz-transform: scale(1.05); + -ms-transform: scale(1.05); + -o-transform: scale(1.05); + transform: scale(1.05); +} + +/* Facebook like box */ +.bl_likebox .widget-head{ + background-image: url("assets/img/noise_transparent.png"); + background-color: #4861A3; + color: #FFF; + text-shadow: 0 1px 0 rgba(52,76,137,0.5); + margin: 0; +} +#bl_likebox > iframe { + min-width: 180px; +} +#footer-body #bl_likebox { + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; +} +.bl_likebox .widget-body{ + padding: 0; +} +#bl_likebox { + background: none repeat scroll 0 0 #FFFFFF; +} +/* Google+ widget */ +.widget-area > .bl_googlebadge > h3, #footer-body .bl_googlebadge > h3{ + margin: 0; +} +.widget-area > .bl_googlebadge, #footer-body .bl_googlebadge{ + background: none repeat scroll 0 0 transparent; + overflow: hidden; + padding: 0; +} +.widget-area > .bl_googlebadge .widget-body, #footer-body .bl_googlebadge .widget-body{ + left: -50%; + position: relative; + text-align: center; + width: 200%; +} +.widget-area > .bl_googlebadge .widget-body > div iframe, #footer-body .bl_googlebadge .widget-body > div iframe{ +} + +/* Twitter widget */ +.bl_tweets .widget-head{ + background-image: url("assets/img/noise_transparent.png"); + background-color: #3BAAE1; + color: #FFF; + text-shadow: 0 1px 0 rgba(52,133,170,0.5); + margin: 0; +} +#footer-body .bl_tweets{ + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + overflow: hidden; +} +.bl_tweets .widget-body{ + padding: 0; + background: #E2E2E2; +} +.bl_tweets #tweets{ + overflow: hidden; +} +.bl_tweets #tweets iframe{ + margin-top: -3px; +} +#footer-body #tweets iframe{ + min-width: 100%!important; +} +/* Newsletter Widget */ +.bl_newsletter p{ + color: #B0B0B0; + margin: 0 0 15px; +} +.bl_newsletter .widget-body { + padding: 15px; +} +.bl_newsletter .input-append{ + margin-bottom: 0; + position: relative; + width: 100%; +} +#footer-body .bl_newsletter .widget-head, #footer-body .bl_newsletter{ + padding: 0; + background: transparent; + border: none; +} +#footer-body .bl_newsletter .widget-head{ + margin: 0; +} +.widget-area .bl_newsletter p{ + color: #717171; + text-shadow: none; + margin: 0 0 15px; +} +.bl_newsletter .bl_newsletter_email{ + height: 40px; + width: 70%; +} +.widget-area .bl_newsletter .bl_newsletter_email{ + border: 1px solid #CCCCCC; +} +.bl_newsletter button{ + height: 40px; + box-shadow: none; + width: 30%; +} +/* Flickr widget */ +.flickr-slider { + height: auto!important; +} +.bl_flickr .widget-body{ + overflow: hidden; +} +.bl_flickr .flickr-images{ + margin: 0; + list-style: none; + height: auto!important; +} +.bl_flickr .nivo-directionNav a{ + /*margin-top: -21px;*/ + position: absolute; + top: 50%; +} +.bl_flickr .nivo-directionNav a:before { + content: ""; + cursor: pointer; + display: block; + height: 600px; + margin-top: -150px; + position: absolute; + top: -100%; + width: 100%; } -.widget_product_search input[type="submit"] { - visibility: hidden; - height: 0; - padding: 0; - margin: 0; +.widget-area .bl_flickr h3 { + position: relative; } -ul.cart_list li, ul.product_list_widget li { - padding: 0; +.widget-area .bl_flickr h3 a { + display: inline-block; + font-size: 12px; + position: absolute; + right: 20px; +} +/* instagram widget */ +.bl_instagram{ + /*width: 300px!important;*/ + overflow: hidden; + border: none; +} +#footer-body .bl_instagram .widget-head, .widget-area .bl_instagram .widget-head{ + background-color: #5F8CB0; + background-image: url("assets/img/noise_transparent.png"), -moz-linear-gradient(left center , #5F8CB0, #4A7496); + background-position: 50% 50%; + min-width: 300px; + padding: 0 15px; + color: #FFFFFF; } -.woocommerce ul.cart_list li, .woocommerce ul.product_list_widget li, .woocommerce-page ul.cart_list li, .woocommerce-page ul.product_list_widget li { - padding: 10px 0; +#footer-body .bl_instagram .widget-body, .widget-area .bl_instagram .widget-body{ + padding: 0; + overflow: hidden; + position: relative; } -ul.products li.product { - text-align: center; +#footer-body .bl_instagram .widget-body, .widget-area .bl_instagram .widget-body{ + /*width: 300px;*/ } -ul.products li.product a { - display: block; +#footer-body .bl_instagram .instagram-images > li, .widget-area .bl_instagram .instagram-images > li{ + /*width: 300px;*/ } -ul.products li.product a.button { - display: inline-block; +#footer-body .bl_instagram .widget-body .instagram-header, .widget-area .bl_instagram .widget-body .instagram-header{ + z-index: 2; + position: relative; } -ul.products li.product a img { - display: block; +#footer-body .bl_instagram .widget-body:hover > .left_arrow, .widget-area .bl_instagram .widget-body:hover > .left_arrow{ + left: 1px; } -ul.product_list_widget li a:hover { - text-decoration: none; +#footer-body .bl_instagram .widget-body:hover > .right_arrow, .widget-area .bl_instagram .widget-body:hover > .right_arrow{ + right: 1px; } -.woocommerce .widget_shopping_cart .total, .woocommerce-page .widget_shopping_cart .total { - padding: 10px 0!important; +#footer-body .bl_instagram .widget-body:hover > .instagram_link, .widget-area .bl_instagram .widget-body:hover > .instagram_link{ + top: 50%; } -.widget_shopping_cart_content .buttons > a { - margin-right: 5px!important; +#footer-body .bl_instagram .instagram_link a, .widget-area .bl_instagram .instagram_link a{ + color: #ffffff; + display: block; + text-align: center; + text-decoration: none; + line-height: 50px; } -.page-content .related.products { - margin-top: 50px; +#footer-body .bl_instagram .instagram_link, .widget-area .bl_instagram .instagram_link{ + z-index: 1; + position: absolute; + display: block; + top: -50px; + font-size: 32px; + left: 50%; + height: 60px; + width: 60px; + margin: -30px; + -moz-border-radius: 500px; + -webkit-border-radius: 500px; + border-radius: 500px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + background: #F97F77; + padding: 5px; +} +#footer-body .bl_instagram .instagram_link:hover, .widget-area .bl_instagram .instagram_link:hover{ + background: #F99690; +} +#footer-body .bl_instagram .instagram_arrow, .widget-area .bl_instagram .instagram_arrow{ + position: absolute; + top: 50%; + height: 50px; + margin: -25px 0; + font-size: 34px; + color: #fff; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#footer-body .bl_instagram .instagram_arrow:hover, .widget-area .bl_instagram .instagram_arrow:hover{ + cursor: pointer; + opacity: 0.8; +} +#footer-body .bl_instagram .left_arrow, .widget-area .bl_instagram .left_arrow{ + left: -40px; +} +#footer-body .bl_instagram .right_arrow, .widget-area .bl_instagram .right_arrow{ + right: -40px; +} +#footer-body .bl_instagram ul, .widget-area .bl_instagram ul{ + list-style: none; + margin: 0; + padding: 0; +} +#footer-body .bl_instagram .instagram-images, .widget-area .bl_instagram .instagram-images{ + width: 15000px; + position: relative; +} +#footer-body .bl_instagram .instagram-images > li, .widget-area .bl_instagram .instagram-images > li{ + float: left; +} +#footer-body .bl_instagram .instagram-header li, .widget-area .bl_instagram .instagram-header li{ + display: table-cell; + width: 1%; + text-align: center; + background: #FDFDFD; + padding: 5px 0 10px; +} +#footer-body .bl_instagram .instagram-header li p, .widget-area .bl_instagram .instagram-header li p{ + color: #727272; + font-weight: bold; + margin: 0; + font-size: 20px; +} +#footer-body .bl_instagram .instagram-interactions, .widget-area .bl_instagram .instagram-interactions{ + background-color: #5F8CB0; + background-image: url("assets/img/noise_transparent.png"), -moz-linear-gradient(left center , #5F8CB0, #4A7496); + background-position: 50% 50%; + height: 51px; + position: relative; } -.widget_shopping_cart .total { - border-top: 3px double #ccc; - padding: 8px 0 0; - margin-top: 20px; +#footer-body .bl_instagram .instagram-interactions li, .widget-area .bl_instagram .instagram-interactions li{ + display: table-cell; + width: 1%; + text-align: center; + color: #F9F9F9; + font-size: 20px; + padding: 15px; } -ul.products li.product h3 { - line-height: 100%; + +/* + Default Wordpress Widgets +*/ + +/* search */ +.searchform input{ + margin:0!important; +} +#masthead .searchform fieldset{ + width:100%; + position:absolute; +} +#masthead .searchform input{ + background: transparent; + -webkit-transition: all .4s ease-in-out; + -moz-transition: all .4s ease-in-out; + -o-transition: all .4s ease-in-out; + transition: all .4s ease-in-out; + display: none; + /*opacity: 0;*/ + padding: 0; + /*z-index:-1;*/ + width: 100%; + min-height: 40px; + border: none; + /*border-bottom: 1px solid rgba(0,0,0,0.1);*/ + /*height: 0;*/ + position: absolute; + box-shadow: none; + font-size: 30px; + color: rgba(0,0,0,0.2); + top: -7px; + border-radius: 0; +} +.searchform input{ + width: 100%; +} +.searchform a{ + display: none; +} +#masthead .searchform a{ + display: inline-block; + position: absolute; + right: 0; + top: -10px; + font-size:25px; +} +#masthead .searchform a:focus + input{ + opacity: 1; + z-index: 1; + width: 100%; + height: auto; + min-height: 40px; +} +.bl_search_overlay{ + display: none; + width: 100%; + height: 100%; + position: fixed; + background: transparent; + z-index: 50; +} +.widget-area div.widget_search input[type="text"], #footer-body div.widget_search input[type="text"]{ + /*width: 70%;*/ + height: 34px; + margin: 0; + background: none repeat scroll 0 0 #EFEFEF; + -moz-border-radius: 2px 2px 2px 2px; + -webkit-border-radius: 2px 2px 2px 2px; + border-radius: 2px 2px 2px 2px; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + font-size: 16px; + /*max-width: 190px;*/ +} +.widget-area div.widget_search form{ + margin: 0; + padding: 15px; +} +#footer-body #searchform{ + display: inline-block; +} +#footer-body .widget_search{ + background: transparent; + border: none; +} +#footer-body .widget_search .widget-head{ + background: transparent; + margin: 0; + padding: 0; +} +/* rss */ +.widget_rss ul{ + margin: 0; + list-style: none; +} +.widget_rss ul li{ + padding: 10px 15px; + border-top: 1px solid #eee; +} +#footer-body .widget_rss ul li{ + border-top: none; +} +.widget_rss ul li:first-child{ + border-top: none; +} +.widget_rss ul li a{ + color: #333; + font-size: 16px; + font-weight: bold; +} +.widget_rss ul li .rss-date{ + color: #999; + font-size: 12px; + display: block; +} +#footer-body .rssSummary{ + color: #fff; +} +#footer-body .rssSummary{ + color: #fff; +} +/* Recent Comments */ +.widget_recent_comments .recentcomments{ + list-style: none; +} +/* Calendar */ +.widget_calendar table{ + width: 100%; +} +#footer-body .widget_calendar{ + padding: 0; +} +#footer-body .widget_calendar table{ + width: 100%; + background: #ffffff; + color: #717171; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; +} +.widget_calendar table > caption { + -moz-border-radius: 2px 2px 0 0; + -webkit-border-radius: 2px 2px 0 0; + border-radius: 2px 2px 0 0; +} +#footer-body .widget_calendar .widget-head { + margin: 0; +} +.widget_calendar table > caption { + background: none repeat scroll 0 0 #272F3A; + color: #FFFFFF; + font-size: 20px; + font-weight: 400; + line-height: 40px; + padding: 0 15px; + text-align: left; +} +.widget_calendar .widget-head + #calendar_wrap table > caption { + background: none repeat scroll 0 0 #9EB2C0; + color: #FFFFFF; + font-family: inherit; + font-size: 15px; + font-weight: bold; + line-height: inherit; + padding: 5px 0; + text-align: center; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +#footer-body .widget_calendar .widget-head + #calendar_wrap table > caption { + -moz-border-radius: 2px 2px 0 0; + -webkit-border-radius: 2px 2px 0 0; + border-radius: 2px 2px 0 0; +} +.widget_calendar tr th { + background: none repeat scroll 0 0 #C1CFD9; + color: #FFFFFF; + padding: 3px 0; +} +.widget_calendar tr td { + text-align: center; + font-size: 16px; +} +.widget_calendar tr td a { + font-weight: bold; +} + +/* Categories, Pages, Archives, Recent Comments and Reecent Posts bundled */ +.widget_recent_entries > ul, .widget-area .widget_nav_menu > div > ul, .widget_categories > ul, .widget_recent_comments > ul, .widget_pages > ul, .widget_meta > ul, .widget_archive > ul{ + list-style: none; + margin: 0; +} +.widget-area .widget_recent_entries li , +.widget-area .widget_nav_menu ul li , +.widget-area .widget_categories li , +.widget-area .widget_recent_comments li, +.widget-area .widget_pages li , +.widget-area .widget_meta li , +.widget-area .widget_archive li { + display: block; + line-height: 40px; + padding: 0; + border-bottom: 1px solid #eee; + border-left: 3px solid transparent; +} +.widget-area .widget_recent_comments li{ + padding: 0 15px; +} +.widget-area .widget_recent_entries li a , +.widget-area .widget_nav_menu ul li a , +.widget-area .widget_categories li a , +.widget-area .widget_recent_comments li a, +.widget-area .widget_pages li a , +.widget-area .widget_meta li a , +.widget-area .widget_archive li a { + padding: 0 15px; +} + +.widget-area .widget_recent_entries li a , +.widget-area .widget_nav_menu ul li a , +.widget-area .widget_categories li a , +.widget-area .widget_recent_comments li a, +.widget-area .widget_pages li a , +.widget-area .widget_meta li a , +.widget-area .widget_archive li a { + padding-left: 15px; +} + +.widget-area .widget_nav_menu > div > ul ul{ + background: #FAFAFA; +} +.widget-area .widget_nav_menu > div > ul ul li { + /*background: #FFFFFF;*/ + /*margin-top: 10px;*/ +} +.widget-area .widget_nav_menu > div > ul ul li:last-child { + border-bottom:none; +} +.widget-area .widget_nav_menu > div > ul ul a { + border-left: medium none; +} +.widget_recent_entries li a, +.widget-area .widget_nav_menu ul li a, +.widget_categories li a, +.widget_recent_comments li a, +.widget_pages li a, +.widget_meta li a, +.widget_archive li a{ + display: block; + text-decoration: none; + font-weight: 400; + color: #717171; + font-size: 16px; +} +.widget_recent_entries li span.badge, +.widget-area .widget_nav_menu ul li span.badge, +.widget_categories li span.badge, +.widget_recent_comments li span.badge, +.widget_pages li span.badge, +.widget_meta li span.badge, +.widget_archive li span.badge{ + background: none repeat scroll 0 0 #C1CFD9; + -moz-border-radius: 16px 16px 16px 16px; + -webkit-border-radius: 16px 16px 16px 16px; + border-radius: 16px 16px 16px 16px; + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) inset, 0 1px 1px #FFFFFF; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) inset, 0 1px 1px #FFFFFF; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) inset, 0 1px 1px #FFFFFF; + color: #FFFFFF; + font-size: 12px; + height: 20px; + line-height: 18px; + margin: 0; + min-width: 20px; + padding: 1px 6px 0; + position: absolute; + right: 15px; + text-align: center; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + top: 11px; +} +.widget-area ul li{ + position: relative; +} +.widget-area .widget_nav_menu > div > ul ul{ + margin: 0; + list-style: none; + background: #f4f4f4; +} +.widget-area .widget_nav_menu > div > ul ul a{ + border-left: 3px solid transparent; +} +.widget-area .widget_recent_entries li:hover, +.widget-area .widget_nav_menu div > ul > li:hover, +.widget-area .widget_categories li:hover, +.widget-area .widget_recent_comments li:hover, +.widget-area .widget_meta li:hover, +.widget-area .widget_pages li:hover, +.widget-area .widget_archive li:hover{ + border-left: 3px solid #F69087; + background: #F8F8F8; +} +.widget-area .widget_nav_menu div > ul > li ul li{ + padding-left: 25px; +} +.widget-area .widget_nav_menu div > ul > li ul li:hover{ + background: #FFFFFF; +} +/* tag cloud */ +.widget_tag_cloud .tagcloud{ + padding: 15px; +} +#footer-body .widget_tag_cloud .tagcloud{ + padding: 0; +} +.widget_tag_cloud .tagcloud:before, .widget_tag_cloud .tagcloud:after { + content: ""; + display: table; + line-height: 0; +} +.widget_tag_cloud .tagcloud:after { + clear: both; +} +.widget_tag_cloud .tagcloud a{ + font-weight: bold; + padding: 4px 6px; + margin: 0 5px 5px 0; + background: #F8F8F8; + text-decoration: none; + display: block; + float: left; + font-size: 14px !important; + text-align: center; +} +#footer-body .widget_tag_cloud .tagcloud a{ + background: transparent; +} +.widget_tag_cloud .tagcloud a:hover{ + /*background: #F69087;*/ + color: #fff; + -webkit-transition: all .15s ease-in-out; + -moz-transition: all .15s ease-in-out; + -o-transition: all .15s ease-in-out; + transition: all .15s ease-in-out; + -webkit-transform: scale(1.05); + -moz-transform: scale(1.05); + -ms-transform: scale(1.05); + -o-transform: scale(1.05); + transform: scale(1.05); +} +/* header menu */ +.navbar-inverse .navbar-inner{ + background: transparent; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; + border: none; + padding: 0 15px; + filter: none; +} +.navbar{ + margin-bottom: 0; + float: left; + position: relative; +} +.navbar .brand { + display: block; + text-align: center; + width: 100%; + color: #555555; + height: 70px; + margin: 0 30px 0 0; + padding: 13px 0 12px; +} +.navbar .brand-text { + line-height: 42px; +} +.navbar .nav > li > a { + color: #EFEFEF; + display: block; + font-size: 15px; + font-weight: 300; + line-height: 25px; + text-decoration: none; +} +.navbar .nav > li:focus > .dropdown-menu, .navbar .nav > li a:focus + .dropdown-menu, .navbar .nav > li .dropdown-menu li a:focus, .navbar .nav > li:active > .dropdown-menu, .navbar .nav > li a:active + .dropdown-menu, .navbar .nav > li .dropdown-menu li a:active { + /*display: block;*/ + /*opacity: 1;*/ +} +.navbar-inverse .brand, .navbar-inverse .nav > li > a{ + text-shadow: none; +} +.navbar-inverse .brand:hover, .navbar-inverse .nav > li > a:hover, .navbar-inverse .brand:focus, .navbar-inverse .nav > li > a:focus{ + color:inherit; + opacity:0.7; +} +.nav-line{ + position: absolute; + height: 3px; + width: 100px; + top: 0; + left: 0; +} +.navbar-inverse .nav-collapse .nav > li > a, .navbar-inverse .nav-collapse .dropdown-menu a{ + color: #EFEFEF; +} +.navbar .nav > li.active, .navbar .nav > li:hover{ + background: none repeat scroll 0 0 rgba(255, 255, 255, 0.02); + color: #fff; +} +.dropdown-menu{ + /*background: none repeat scroll 0 0 #212833;*/ + border-top: 2px solid #F69087; + border-left: 0; + border-right: 0; + border-radius: 0; + padding: 0; + margin: 0; +} +.dropdown-menu > li > a{ + color: #FFFFFF; + font-size: 16px; + padding: 15px 20px; +} +.navbar .nav > li > .dropdown-menu:after, .navbar .nav > li > .dropdown-menu:before{ + display: none; +} +/*.navbar .nav > li:hover > ul { + display: block; +}*/ +.dropdown-menu > li > a:hover{ + background: rgba(0,0,0,0.05); +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, .navbar-inverse .nav li.dropdown.active > .dropdown-toggle, .navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle{ + background: transparent; +} +.dropdown-toggle i{ + font-size: 12px; + margin: 0 0 0 4px; +} +.btn.btn-navbar { + background: none repeat scroll 0 0 #85CCB1; + margin: 18px 0; + padding: 7px 10px; +} +.btn.btn-navbar:hover, .btn.btn-navbar:active, .btn.btn-navbar:focus{ + background: none repeat scroll 0 0 #67B295; +} +.nav-collapse .nav > li > a, .nav-collapse .dropdown-menu a{ + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +.dropdown-menu{ + /*top: -1000px;*/ + /*display: block;*/ + /*opacity: 0;*/ + + -webkit-transition: opacity 0.4s ease 0.1s; + -moz-transition: opacity 0.4s ease 0.1s; + -o-transition: opacity 0.4s ease 0.1s; + -ms-transition: opacity 0.4s ease 0.1s; + transition: opacity 0.4s ease 0.1s; +} +.dropdown-submenu > .dropdown-menu { + border: 1px solid rgba(0,0,0,0.1); + border-radius: 0 2px 2px 0; + box-shadow: none; + margin-left: 0; + margin-top: -1px; +} +.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus, .dropdown-submenu:hover > a, .dropdown-submenu:focus > a { + background-color: rgba(0, 0, 0, 0.03); + background-image: none; +} +.navbar .nav > li:hover > ul{ + top: auto; + opacity: 1; } -.sidebar .widget_shopping_cart .buttons a:hover, .product-name a { - text-decoration: none; +/* + Shortcode components +*/ + +/* some silly fix to remove a smiley face image created by a stats plugin */ +img#wpstats{display:none} +.popover-content{ + font-size: 14px; + line-height: 20px; +} +/* related posts */ +#related-posts{ + padding: 25px; + margin-top:25px; + position: relative; +} +#related-posts > h3{ + text-align:center; + margin-top:0; +} +#related-posts .box{ + width:100%; + height: 70px; + border-radius:2px; +} +#related-posts a{ + position: relative; + top: 0; + height: 100px; + width: 100% +} +#related-posts a, #related-posts a > span, #related-posts a > .bgimage, #related-posts a > .tab_icon, #related-posts a > .bgfallback{ + left: 25px; + z-index: 1; } -.woocommerce .quantity, .woocommerce-page .quantity { - height: 30px; +#related-posts a > .bgfallback{ + background-color:#ffffff; + position: absolute; + top: 50%; + width: 88px; + height: 88px; + margin: -44px 0 0 -44px; + border-radius: 500px; +} +#related-posts a > span{ + width: 46px; + height: 46px; + display: block; + -moz-border-radius: 23px; + -webkit-border-radius: 23px; + border-radius: 23px; + cursor: pointer; + opacity: 0.9; + position: absolute; + top: 50%; + background-size: 17px 25px; + margin: -23px 0 0 -23px; + -webkit-transition: all 0.4s ease; + -moz-transition: all 0.4s ease; + -o-transition: all 0.4s ease; + -ms-transition: all 0.4s ease; + transition: all 0.4s ease; +} +#related-posts a:hover > span{ + width: 100px; + height: 100px; + -moz-border-radius: 50px; + -webkit-border-radius: 50px; + border-radius: 50px; + /*opacity: 0;*/ + margin: -50px 0 0 -50px; + background-size: 22px 32px; + background-color:#a8872d; +} +#related-posts a > .bgimage{ + width: 0px; + height: 0px; + position: absolute; + top: 50%; + overflow: hidden; + background-size: 100% 100%; + background-position: center center; + background-repeat: no-repeat; + margin: 0px; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + -o-transition: all 0.2s ease-out; + -ms-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +#related-posts a:hover > .bgimage{ + width: 90px; + height: 90px; + background-size: 120% 120%; + margin: -45px 0 0 -45px; + -moz-border-radius: 500px; + -webkit-border-radius: 500px; + border-radius: 500px; +} +#related-posts a > .tab_icon{ + width: 90px; + height: 90px; + position: absolute; + top: 50%; + overflow: hidden; + background-size: 100% 100%; + background-position: center center; + background-repeat: no-repeat; + margin: -45px 0 0 -45px; + border-radius: 500px; + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + -o-transition: all 0.2s ease-out; + -ms-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +#related-posts a:hover > .tab_icon{ + width: 0px; + height: 0px; + margin: 0; } -.type-woocommerce .summary .single_add_to_cart_button { - padding-top: 7px; - padding-bottom: 7px; +#related-posts a > .tab_icon i{ + width: 100%; + height: 100%; + padding-top:3px; + font-size:35px; } -div.product .woocommerce_tabs ul.tabs, .woocommerce div.product .woocommerce-tabs ul.tabs { - margin-bottom: 0!important; - padding-left: 15px!important; +#related-posts a:hover > .tab_icon i{ + padding-bottom:20px; } -div.product .woocommerce_tabs .panel, div.product .woocommerce-tabs .panel { - margin-bottom: 0px; - margin-top: -1px; - border: 1px solid rgb(221, 221, 221); - border-top: 0; - padding: 14px 23px!important; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - background-color: rgb(255, 255, 255); +#related-posts a h5{ + display: block; + height: auto; + overflow: hidden; + padding: 15px 15px 0 85px; + margin-bottom:0; + position: relative; + white-space: nowrap; + width: 95%; } -div.product .woocommerce_tabs .panel h2, div.product .woocommerce-tabs .panel h2 { - margin-top: 0; +#related-posts a p{ + color:#CCCCCC; + display: block; + height: auto; + overflow: hidden; + padding: 0 0 0 85px; + margin-bottom: 5px; + position: relative; + white-space: nowrap; + width: 90%; } -table.shop_table td.product-quantity { - text-align: left; +#related-posts > p{ + display: none; } -table.shop_table td { - padding: 12px; + +/*#related-posts .box{ + margin-top: 30px; } -.cart .button, .cart input.button { - padding: 7px 12px; +#related-posts .box.related-video iframe, #related-posts .box.related-video iframe{ + width: 100%; } -td.product-quantity .quantity { - margin: 0; +#related-posts .box.related-quote{ + border-top: 3px solid #85A9B3; } -table.shop_table td.product-remove { - max-width: 0px; +#related-posts .box.related-image{ + border-top: 3px solid #B0CB7A; +} +#related-posts .box.related-gallery{ + border-top: 3px solid #00ACED; +} +#related-posts .box.related-standard{ + border-top: 3px solid #F69087; +} +#related-posts .box.related-video{ + border-top: 3px solid #85CCB1; +} +#related-posts .box.related-audio{ + border-top: 3px solid #EF7336; } -.woocommerce table.cart a.remove, .woocommerce-page table.cart a.remove, .woocommerce #content table.cart a.remove, .woocommerce-page #content table.cart a.remove -table.cart .product-thumbnail, #content table.cart .product-thumbnail { - line-height: 18px; +#related-posts .box.related-link{ + border-top: 3px solid #9664B5; } -table.cart img, #content table.cart img { - width: 100%; +.related-content a { + color: #717171; + font-weight: normal; + display: block; + word-wrap: break-word; } -table.cart td.actions .coupon .input-text, #content table.cart td.actions .coupon .input-text { - width: 160px; - margin-right: 10px; +#related-posts .related-image img{ + height: 150px; + width: 194px; } -.woocommerce-page form .form-row input.input-text, .woocommerce-page form .form-row textarea { - padding: 14px 6px; +#related-posts .related-content{ + padding: 10px; + position: relative; } -#payment ul.payment_methods { - padding-left: 0; - padding-right: 0; +#related-posts .related-content h4{ + margin: 0 0 5px; } -#payment div.form-row { - padding: 1em 0; +.related-content > p { + font-size: 12px; + line-height: 18px; + margin: 0; } -.checkout #shiptobilling { - margin: 10px 0; +#related-posts .related-header{ + height: 150px; } -form .form-row .input-checkbox { - display: inline-block; - margin: -1px 0 0 0; +#related-posts .related-footer{ + background: #FCFCFC; + border-top: 1px solid #ddd; + font-size: 11px; + color: #777; + padding: 5px 10px; +}*/ + +/* Recent Posts */ +#recent-posts{ + list-style: none; + margin: 0; } -#shiptobilling .checkbox { - padding-left: 0; +#recent-posts li{ + padding: 15px 0; + min-height: 85px; + border-bottom: 1px solid #f4f4f4; } -#shipping_method input { - float: right; +.recent-content{ + min-height: 70px; } -#shipping_method label { - white-space: nowrap; - margin-right: 20px; - padding-top: 2px; +.recent-icon{ + float: left; + margin-right: 15px; } -.woocommerce-page form .form-row input.input-text{ - padding: 2px 6px; - height: 30px; +.recent-content h4,.recent-content p{ + margin: 5px 0; } -.woocommerce-page form .form-row textarea{ - padding:2px 6px; +/* Pagelinks */ +.page-links{ + margin-top: 20px; } -#product-display-area { - clear: both; - margin-bottom: 30px; +.page-links > a, .page-links > span{ + padding: 8px 20px 10px; + margin-right: 2px; } -.woocommerce div.product form.cart .variations td.label { - padding: 5px 10px 0!important; - margin: 1px 10px 0 0; - width: 90%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - text-align: center; +.page-links > a{ + color: #fff!important; } -.woocommerce .related ul.products li.product, .woocommerce .related ul li.product, .woocommerce .upsells.products ul.products li.product, .woocommerce .upsells.products ul li.product, .woocommerce-page .related ul.products li.product, .woocommerce-page .related ul li.product, .woocommerce-page .upsells.products ul.products li.product, .woocommerce-page .upsells.products ul li.product { - width: 22%!important; +.page-links > span{ + background: #F6968E; + color: #fff!important; } - -/* #Style Switcher -================================================== */ - -.style-switcher { - position: fixed; - top: 80px; - left: -240px; - -webkit-border-radius: 0 0 3px 0; - -moz-border-radius: 0 0 3px 0; - border-radius: 0 0 3px 0; - z-index: 9997; - width: 290px; -} -.style-switcher h4 { - background: #fff; - font-size: 14px; - font-weight: bold; - text-transform: uppercase; - padding: 7px 15px; - margin-bottom: 0; - line-height: 28px; - height: 28px; - width: 254px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); -} -.switch-button { - width: 19px; - float: right; - font-size: 26px; - line-height: 28px; - text-align: center; - text-decoration: none; - display: block; -} -.switch-button:hover { - cursor: pointer; - text-decoration: none; -} -.switch-cont { - width: 240px; - background: #222222; - height: auto; - padding: 10px 0; -} -.switch-cont h5 { - color: #fff; - font-size: 12px; - font-weight: normal; - margin-left: 20px; - margin-bottom: 15px; -} -.switch-cont .ad-select h5 { - margin-left: 0; - margin-bottom: 10px; - text-align: left; -} -.options { - margin-bottom: 15px; - height: auto; - overflow: hidden; - padding: 0 15px 20px; - border-bottom: 1px solid #444; -} -.options li { - float: left; - display: inline; - width: 50%; - margin-bottom: 0; - text-align: center; -} -.options.bg-select { - margin-bottom: 10px; -} -.options.bg-select li { - width: 37px; - margin-right: 5px; - margin-bottom: 5px; -} -.bg-select li img { - display: block; - width: 27px; - height: 27px; - border: 1px solid #333 -} -.options li a { - text-decoration: none; - color: #fff; - padding: 4px; - display: block; -} -.options li a:hover { - background-color: #333; -} -.options li.selected a { - background-color: #8dc63f; -} -.options select { - width: 100%; - font-size: 12px; - height: 26px; - margin-bottom: 0; -} -.options select:focus { - outline: none; -} -.layout-select li { - width: auto; -} -.layout-select li:first-child { - margin-right: 10px; -} -.layout-select li img { - width: 92px; - display: block; -} -.switch-cont a.many-more { - color: #fff; - font-weight: bold; - font-size: 12px; - text-decoration: none; - padding: 8px 0; - margin: 0 20px; - display: block; - text-align: center; -} -.many-more:hover { - background-color: #333; +/* disquss css fix */ +#disqus_thread { + background: #fff; + border-radius: 2px; + margin-top: 30px; + padding: 25px; + border-top: 3px solid #F69087; } -@media only screen and (max-width: 1024px) { - .style-switcher { - display: none; - } +/* Notification */ +.bl_alert { + background: #FFFFE1; + padding: 20px 0; + position: fixed; + bottom: 0; + width: 100%; + z-index: 1000; + border-top: 1px solid #ddd; + display: none; + top: 0; +} +.admin-bar .bl_alert { + top: 28px; +} +.bl_alert > h4 { + margin: 0; } - -/* #Retina Styles -================================================== */ - /* -* Swift Framework Retina Stylesheet v1.0 -* Retina Stylesheet for Retina Dislay Devices -* Copyright 2013, Swift Ideas -*/ -@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { + Swiper Slider - #logo img.standard, #mini-logo img.standard { - display: none; - } - #logo img.retina, #mini-logo img.retina { - display: block; - } - .mobile-nav > div { - background-image: url('images/select@2x.png'); - background-size: 28px 26px; - } - ul.social-icons li a { - background-image: url('images/social-icons@2x.png'); - background-size: 512px 32px; - } - ul.social-icons.small li a { - background-image: url('images/social-icons-small@2x.png'); - background-size: 384px 24px; - } - ul.social-icons.dark li a { - background-image: url('images/social-icons-mono@2x.png'); - } - ul.social-icons.dark.small li a { - background-image: url('images/social-icons-mono-small@2x.png'); - } - ul.social-icons.light li a { - background-image: url('images/social-icons-mono-light@2x.png'); - } - ul.social-icons.light.small li a { - background-image: url('images/social-icons-mono-light-small@2x.png'); - } - #respond .form-submit input, .wpcf7 input.wpcf7-submit[type="submit"], a.sf-button .arrow { - background-image: url('images/button-arrow@2x.png'); - background-repeat: no-repeat; - background-size: 6px 9px; - } - a.sf-button.lightgrey .arrow, a.sf-button.green .arrow, a.sf-button.limegreen .arrow, a.sf-button.white .arrow { - background-image: url('images/button-arrow2@2x.png'); - background-repeat: no-repeat; - background-size: 6px 9px; - } - .widget.flickr-widget li, .portfolio-grid li { - background-image: url('images/plus-icon@2x.png'); - background-size: 13px 13px; - } - .flex-direction-nav a, .wooslider-direction-nav a, .tp-leftarrow, .tp-leftarrow.large, .tp-leftarrow.square, .tp-leftarrow.round, .tp-rightarrow, .tp-rightarrow.large, .tp-rightarrow.square, .tp-rightarrow.round, .thumb-slider .flex-direction-nav a, .rev_slider_wrapper > .tp-leftarrow, .rev_slider_wrapper > .tp-leftarrow.large, .rev_slider_wrapper > .tp-leftarrow.square, .rev_slider_wrapper > .tp-leftarrow.round, .rev_slider_wrapper > .tp-leftarrow.default, .rev_slider_wrapper > .tp-rightarrow, .rev_slider_wrapper > .tp-rightarrow.large, .rev_slider_wrapper > .tp-rightarrow.square, .rev_slider_wrapper > .tp-rightarrow.round, .rev_slider_wrapper > .tp-rightarrow.default { - background-image: url('images/showcase-nav@2x.png'); - background-size: 72px 36px; - } - .list-add_bw li { - background-image: url('images/list-icons/add_b&w@2x.png'); - background-size: 10px 11px; - } - .list-add li { - background-image: url('images/list-icons/add_colour@2x.png'); - background-size: 10px 11px; - } - .list-arrow_bw li { - background-image: url('images/list-icons/arrow_b&w@2x.png'); - background-size: 13px 11px; - } - .list-arrow li { - background-image: url('images/list-icons/arrow_colour@2x.png'); - background-size: 13px 11px; - } - .list-article li { - background-image: url('images/list-icons/article_b&w@2x.png'); - background-size: 13px 11px; - } - .list-bar li { - background-image: url('images/list-icons/bar_b&w@2x.png'); - background-size: 11px 4px; - } - .list-bolt_bw li { - background-image: url('images/list-icons/bolt_b&w@2x.png'); - background-size: 9px 12px; - } - .list-bolt li { - background-image: url('images/list-icons/bolt_colour@2x.png'); - background-size: 9px 12px; - } - .list-date li { - background-image: url('images/list-icons/date_b&w@2x.png'); - background-size: 11px 13px; - } - .list-delete_bw li { - background-image: url('images/list-icons/delete_b&w@2x.png'); - background-size: 10px 10px; - } - .list-delete li { - background-image: url('images/list-icons/delete_colour@2x.png'); - background-size: 10px 10px; - } - .list-dot li { - background-image: url('images/list-icons/dot_b&w@2x.png'); - background-size: 7px 7px; - } - .list-like_bw li { - background-image: url('images/list-icons/like_b&w@2x.png'); - background-size: 12px 11px; - } - .list-like li { - background-image: url('images/list-icons/like_colour@2x.png'); - background-size: 12px 11px; - } - .list-pen li { - background-image: url('images/list-icons/pen_b&w@2x.png'); - background-size: 12px 12px; - } - .list-question_bw li { - background-image: url('images/list-icons/questionMark_b&w@2x.png'); - background-size: 12px 12px; - } - .list-question li { - background-image: url('images/list-icons/questionMark_colour@2x.png'); - background-size: 12px 12px; - } - .list-settings_bw li { - background-image: url('images/list-icons/settings_b&w@2x.png'); - background-size: 12px 12px; - } - .list-settings li { - background-image: url('images/list-icons/settings_colour@2x.png'); - background-size: 12px 12px; - } - .list-star_bw li { - background-image: url('images/list-icons/star_b&w@2x.png'); - background-size: 12px 12px; - } - .list-star li { - background-image: url('images/list-icons/star_colour@2x.png'); - background-size: 12px 12px; - } - .list-tick_bw li { - background-image: url('images/list-icons/tick_b&w@2x.png'); - background-size: 12px 9px; - } - .list-tick li { - background-image: url('images/list-icons/tick_colour@2x.png'); - background-size: 12px 9px; - } - .list-user li { - background-image: url('images/list-icons/user_b&w@2x.png'); - background-size: 12px 11px; - } - .list-warning_bw li { - background-image: url('images/list-icons/warning_b&w@2x.png'); - background-size: 12px 11px; - } - .list-warning li { - background-image: url('images/list-icons/warning_colour@2x.png'); - background-size: 12px 11px; - } - .widget_calendar tbody tr > td.pad { - background-image: url('images/scanlines_dark@2x.png'); - background-size: 4px 4px; - } -} - -/* #Mobile Styles -================================================== */ - -.mobile-browser figure:hover .overlay .thumb-info, .wpb_single_image.span12 figure:hover .overlay .thumb-info { - opacity: 0!important; - -moz-opacity: 0!important; - filter:alpha(opacity=0)!important; -} -.mobile-browser figure:hover > a > .overlay, .wpb_single_image.span12 figure:hover > a > .overlay { - opacity: 0!important; - -moz-opacity: 0!important; - filter:alpha(opacity=0)!important; -} -.mobile-browser figure:hover .overlay, .wpb_single_image.span12 figure:hover .overlay { - box-shadow: none!important; -} -.mobile-browser .recent-post figure:hover img, .mobile-browser .portfolio-items > li figure:hover img { - -moz-transform: scale(1); - -webkit-transform: scale(1); - -o-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); -} \ No newline at end of file +*/ +.swiper-container{margin:0 auto;position:relative;overflow:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-wrapper{width:100%;-webkit-transition-property:-webkit-transform,left,top;-webkit-transition-duration:0s;-webkit-transform:translate3d(0px,0,0);-webkit-transition-timing-function:ease;-moz-transition-property:-moz-transform,left,top;-moz-transition-duration:0s;-moz-transform:translate3d(0px,0,0);-moz-transition-timing-function:ease;-o-transition-property:-o-transform,left,top;-o-transition-duration:0s;-o-transition-timing-function:ease;-o-transform:translate(0px,0);-ms-transition-property:-ms-transform,left,top;-ms-transition-duration:0s;-ms-transform:translate3d(0px,0,0);-ms-transition-timing-function:ease;transition-property:transform,left,top;transition-duration:0s;transform:translate3d(0px,0,0);transition-timing-function:ease}.swiper-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{float:left}.swiper-wp8-horizontal{-ms-touch-action:pan-y}.swiper-wp8-vertical{-ms-touch-action:pan-x}.swiper-container{width:100%;color:#fff;text-align:center}.swiper-gallery{opacity:0;-webkit-transition:opacity .35s ease-out;-moz-transition:opacity .35s ease-out;-ms-transition:opacity .35s ease-out;-o-transition:opacity .35s ease-out;transition:opacity .35s ease-out}.swiper-gallery.swiper-container{margin-bottom:0}.swiper-gallery .swiper-wrapper{position:relative}.swiper-gallery .swiper-wrapper img{width:100%}.swiper-container .arrow-left{position:absolute;left:10px;top:50%;margin-top:-150px;width:35px;height:300px;z-index:10000}.swiper-container .arrow-left:before{content:'\e845';font-family:fontello;font-size:40px;color:#FFF;position:absolute;top:50%;left:-40px;margin-top:-20px;-webkit-transition:left .15s ease-out;-moz-transition:left .15s ease-out;-ms-transition:left .15s ease-out;-o-transition:left .15s ease-out;transition:left .15s ease-out}.swiper-container:hover .arrow-left:before{left:10px}.swiper-container .arrow-right{position:absolute;right:10px;top:50%;margin-top:-150px;width:35px;height:300px;z-index:10000}.swiper-container .arrow-right:before{content:'\e846';font-family:fontello;font-size:40px;color:#FFF;position:absolute;top:50%;right:-40px;margin-top:-20px;-webkit-transition:right .15s ease-out;-moz-transition:right .15s ease-out;-ms-transition:right .15s ease-out;-o-transition:right .15s ease-out;transition:right .15s ease-out}.swiper-container:hover .arrow-right:before{right:10px}.entry-content .swiper-gallery .arrow-left{left:30px}.entry-content .swiper-gallery .arrow-right{right:30px}.entry-content .swiper-pagination{left:30px}.swiper-slide{height:100%;position:relative}.swiper-slide .swipe-small>div{border-color:#FFF;border-style:solid}.swiper-wrapper{position:absolute;top:0}.swiper-slide>div{height:100%}.swiper-slide .swiper-content{height:100%;background-repeat:no-repeat;background-size:cover;background-position:center center}.swiper-content.no-image{background:none repeat scroll 0 0 #777}.swiper-text{position:relative;z-index:2;text-align:center;width:100%;display:table;padding:0 30px;height:100%}.swiper-text>div{display:table-cell;text-align:center;vertical-align:middle;position:relative;z-index:2}.swiper-text:after{background:none repeat scroll 0 0 #000;content:"";height:100%;left:0;opacity:.15;position:absolute;top:0;width:100%;-webkit-transition:opacity .15s ease-out;-moz-transition:opacity .15s ease-out;-ms-transition:opacity .15s ease-out;-o-transition:opacity .15s ease-out;transition:opacity .15s ease-out}.ie8 .swiper-text:after{display:none!important}.swiper-text:hover:after{opacity:.3}.swiper-pagination{position:absolute;z-index:20;left:10px;bottom:10px}.swiper-pagination-switch{display:inline-block;width:8px;height:8px;-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;background:#222;margin-right:5px;-ms-filter:"alpha(Opacity=80)";opacity:.8;border:1px solid #fff;cursor:pointer}.swiper-visible-switch{background:#aaa}.swiper-active-switch{background:#fff}.swiper-container:hover{cursor:url(https://mail.google.com/mail/images/2/openhand.cur),default!important}.swiper-container.active,.swiper-container.active .swiper-wrapper .swiper-slide a{cursor:url(https://mail.google.com/mail/images/2/closedhand.cur),default!important}.swiper-content .entry-title,.swiper-content .title-category{color:#FFF;margin-bottom:0;margin-top:0;text-shadow:1px 1px 1px rgba(0,0,0,.2)}.swiper-content.swiper-small .entry-title{font-size:25px}.swiper-content .title-category{font-size:20px;text-transform:uppercase}.swiper-content .entry-title a{color:#FFF} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/AppModule.java b/app/src/main/java/it/cosenonjaviste/AppModule.java deleted file mode 100644 index 04409bd..0000000 --- a/app/src/main/java/it/cosenonjaviste/AppModule.java +++ /dev/null @@ -1,47 +0,0 @@ -package it.cosenonjaviste; - -import android.app.Application; - -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; -import it.cosenonjaviste.author.AuthorListFragment; -import it.cosenonjaviste.category.CategoryListFragment; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import it.cosenonjaviste.model.TwitterService; -import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.model.WordPressServiceFactory; -import it.cosenonjaviste.page.PageFragment; -import it.cosenonjaviste.post.PostListFragment; -import it.cosenonjaviste.twitter.TweetListFragment; -import it.cosenonjaviste.twitter.Twitter4JService; - -@Module(injects = { - MainActivity.class, - PostListFragment.class, - PageFragment.class, - AuthorListFragment.class, - CategoryListFragment.class, - TweetListFragment.class -}, library = true) -public class AppModule { - - private Application application; - - public AppModule(Application application) { - this.application = application; - } - - @Provides @Singleton WordPressService provideGitHubService() { - return WordPressServiceFactory.create("http://www.cosenonjaviste.it/", BuildConfig.DEBUG); - } - - @Provides TwitterService provideTwitterService() { - return new Twitter4JService(); - } - - @Provides @Singleton SchedulerManager provideSchedulerManager() { - return new SchedulerManager(); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/CnjFragment.java b/app/src/main/java/it/cosenonjaviste/CnjFragment.java deleted file mode 100644 index 5560755..0000000 --- a/app/src/main/java/it/cosenonjaviste/CnjFragment.java +++ /dev/null @@ -1,55 +0,0 @@ -package it.cosenonjaviste; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import org.parceler.Parcels; - -import butterknife.ButterKnife; -import it.cosenonjaviste.lib.mvp.MvpFragment; -import it.cosenonjaviste.lib.mvp.MvpPresenter; -import it.cosenonjaviste.lib.mvp.MvpView; -import it.cosenonjaviste.lib.mvp.dagger.DaggerApplication; -import it.cosenonjaviste.lib.mvp.dagger.ObjectGraphHolder; -import it.cosenonjaviste.utils.SingleFragmentActivity; - -public abstract class CnjFragment

, M> extends MvpFragment { - - @Override public void onCreate(Bundle savedInstanceState) { - ObjectGraphHolder.inject((DaggerApplication) getActivity().getApplication(), this); - super.onCreate(savedInstanceState); - } - - @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(getLayoutId(), container, false); - initView(view); - return view; - } - - protected void initView(View view) { - ButterKnife.inject(this, view); - } - - protected abstract int getLayoutId(); - - @Override public void open(Class> viewClass, MM model) { - Intent intent = SingleFragmentActivity.createIntent(getActivity(), viewClass); - intent.putExtra(MODEL, Parcels.wrap(model)); - getActivity().startActivity(intent); - } - - public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { - Fragment fragment = Fragment.instantiate(context, viewClass.getName()); - Bundle bundle = new Bundle(); - bundle.putParcelable(MODEL, Parcels.wrap(model)); - fragment.setArguments(bundle); - return (T) fragment; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java deleted file mode 100644 index 9f1a43f..0000000 --- a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java +++ /dev/null @@ -1,11 +0,0 @@ -package it.cosenonjaviste; - -import it.cosenonjaviste.lib.mvp.dagger.DaggerApplication; - -public class CoseNonJavisteApp extends DaggerApplication { - - @Override public Object[] getModules() { - return new Object[]{new AppModule(this)}; - } - -} diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java deleted file mode 100755 index 5c8d8b2..0000000 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ /dev/null @@ -1,112 +0,0 @@ -package it.cosenonjaviste; - -import android.content.res.Configuration; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.view.GravityCompat; -import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.ActionBarActivity; -import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.widget.Toolbar; -import android.view.View; -import android.widget.ArrayAdapter; -import android.widget.ListView; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import it.cosenonjaviste.author.AuthorListFragment; -import it.cosenonjaviste.author.AuthorListModel; -import it.cosenonjaviste.category.CategoryListFragment; -import it.cosenonjaviste.category.CategoryListModel; -import it.cosenonjaviste.lib.mvp.dagger.DaggerApplication; -import it.cosenonjaviste.lib.mvp.dagger.ObjectGraphHolder; -import it.cosenonjaviste.page.PageFragment; -import it.cosenonjaviste.page.PageModel; -import it.cosenonjaviste.post.PostListFragment; -import it.cosenonjaviste.post.PostListModel; -import it.cosenonjaviste.twitter.TweetListFragment; -import it.cosenonjaviste.twitter.TweetListModel; - -public class MainActivity extends ActionBarActivity { - @InjectView(R.id.drawer_layout) DrawerLayout mDrawerLayout; - @InjectView(R.id.left_drawer_menu) View mDrawerMenu; - @InjectView(R.id.left_drawer) ListView mDrawerList; - private ActionBarDrawerToggle mDrawerToggle; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - ObjectGraphHolder.inject((DaggerApplication) getApplication(), this); - - setContentView(R.layout.activity_main); - - ButterKnife.inject(this); - - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - String[] menuItems = getResources().getStringArray(R.array.menu_items); - - mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); - mDrawerList.setAdapter(new ArrayAdapter<>(this, R.layout.drawer_list_item, menuItems)); - mDrawerList.setOnItemClickListener((parent, view, position, id) -> selectItem(position)); - - mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) { - public void onDrawerClosed(View view) { - invalidateOptionsMenu(); - } - - public void onDrawerOpened(View drawerView) { - invalidateOptionsMenu(); - } - }; - mDrawerLayout.setDrawerListener(mDrawerToggle); - - if (savedInstanceState == null) { - selectItem(0); - } - } - - private void selectItem(int position) { - String tag = "fragment_" + position; - Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag); - - if (fragment == null) { - fragment = createFragment(position); - } - - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment, tag).commit(); - - // update selected item and title, then close the drawer - mDrawerList.setItemChecked(position, true); - mDrawerLayout.closeDrawer(mDrawerMenu); - } - - private Fragment createFragment(int position) { - //TODO activity title - switch (position) { - case 1: - return CnjFragment.createView(this, CategoryListFragment.class, new CategoryListModel()); - case 2: - return CnjFragment.createView(this, AuthorListFragment.class, new AuthorListModel()); - case 3: - return CnjFragment.createView(this, TweetListFragment.class, new TweetListModel()); - case 4: - return CnjFragment.createView(this, PageFragment.class, new PageModel("http://www.cosenonjaviste.it/contatti/")); - default: - return CnjFragment.createView(this, PostListFragment.class, new PostListModel()); - } - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - mDrawerToggle.syncState(); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - mDrawerToggle.onConfigurationChanged(newConfig); - } -} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorAdapter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorAdapter.java deleted file mode 100644 index 335a505..0000000 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorAdapter.java +++ /dev/null @@ -1,79 +0,0 @@ -package it.cosenonjaviste.author; - -import android.content.Context; -import android.text.Html; -import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.squareup.picasso.Picasso; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import it.cosenonjaviste.R; -import it.cosenonjaviste.model.Author; -import it.cosenonjaviste.utils.CircleTransform; - -public class AuthorAdapter extends BaseAdapter { - - private List authors = new ArrayList<>(); - - private Context context; - private CircleTransform transformation; - - public AuthorAdapter(Context context) { - this.context = context; - transformation = CircleTransform.createWithBorder(context, R.dimen.author_image_size_big, R.color.colorPrimary, R.dimen.author_image_border); - } - - @Override public int getCount() { - return authors.size(); - } - - @Override public Author getItem(int position) { - return authors.get(position); - } - - @Override public long getItemId(int position) { - return getItem(position).getId(); - } - - @Override public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = LayoutInflater.from(context).inflate(R.layout.author_cell, parent, false); - RowWrapper rowWrapper = new RowWrapper(); - ButterKnife.inject(rowWrapper, convertView); - convertView.setTag(rowWrapper); - } - RowWrapper rowWrapper = (RowWrapper) convertView.getTag(); - Author author = getItem(position); - String description = author.getDescription(); - rowWrapper.title.setText(Html.fromHtml(description.replaceAll("^

", "").replaceAll("$

", ""))); - rowWrapper.firstName.setText(author.getFirstName()); - rowWrapper.lastName.setText(author.getLastName()); - String imageUrl = author.getImageUrl(); - if (!TextUtils.isEmpty(imageUrl)) { - Picasso.with(context).load(imageUrl).transform(transformation).into(rowWrapper.image); - } - return convertView; - } - - public void reloadData(List posts) { - this.authors = posts; - notifyDataSetChanged(); - } - - static class RowWrapper { - @InjectView(R.id.first_name) TextView firstName; - @InjectView(R.id.last_name) TextView lastName; - @InjectView(R.id.title) TextView title; - @InjectView(R.id.author_image) ImageView image; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java deleted file mode 100644 index fa61689..0000000 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ /dev/null @@ -1,56 +0,0 @@ -package it.cosenonjaviste.author; - -import android.annotation.SuppressLint; -import android.view.View; - -import com.quentindommerc.superlistview.SuperGridview; - -import javax.inject.Inject; -import javax.inject.Provider; - -import butterknife.InjectView; -import butterknife.OnClick; -import it.cosenonjaviste.CnjFragment; -import it.cosenonjaviste.R; -import rx.functions.Actions; - -public class AuthorListFragment extends CnjFragment { - - @InjectView(R.id.grid) SuperGridview grid; - - @Inject Provider presenterProvider; - - private AuthorAdapter adapter; - - @Override protected AuthorListPresenter createPresenter() { - return presenterProvider.get(); - } - - @Override protected int getLayoutId() { - return R.layout.super_grid; - } - - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { - super.initView(view); - adapter = new AuthorAdapter(getActivity()); - grid.getList().setNumColumns(2); - grid.setAdapter(adapter); - grid.setOnItemClickListener((parent, v, position, id) -> presenter.goToAuthorDetail(position)); - } - - @OnClick(R.id.error_retry) void retry() { - presenter.loadAuthors(); - } - - @Override public void update(AuthorListModel model) { - presenter.testFromFragment(); - model.call(authors -> { - grid.showList(); - adapter.reloadData(authors); - }).whenError(t -> grid.showError()).whenEmpty(Actions.empty()); - } - - public void startLoading() { - grid.showProgress(); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListModel.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListModel.java deleted file mode 100644 index 660542a..0000000 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListModel.java +++ /dev/null @@ -1,39 +0,0 @@ -package it.cosenonjaviste.author; - -import org.parceler.Parcel; - -import java.util.List; - -import it.cosenonjaviste.lib.mvp.utils.OptionalItem; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; -import it.cosenonjaviste.model.Author; -import rx.functions.Action1; - -@Parcel -public class AuthorListModel { - OptionalList items = new OptionalList<>(); - - public boolean isEmpty() { - return items.isEmpty(); - } - - public int size() { - return items.size(); - } - - public Author get(int index) { - return items.get(index); - } - - public void done(List object) { - items.done(object); - } - - public void error(Throwable throwable) { - items.error(throwable); - } - - public OptionalItem> call(Action1> action) { - return items.call(action); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java deleted file mode 100644 index 28bb477..0000000 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ /dev/null @@ -1,71 +0,0 @@ -package it.cosenonjaviste.author; - -import java.util.Collections; -import java.util.List; - -import javax.inject.Inject; - -import it.cosenonjaviste.lib.mvp.MvpView; -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import it.cosenonjaviste.model.Author; -import it.cosenonjaviste.model.AuthorResponse; -import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.post.PostListFragment; -import it.cosenonjaviste.post.PostListModel; -import rx.Observable; - -public class AuthorListPresenter extends RxMvpPresenter { - - @Inject WordPressService wordPressService; - - private boolean loadStarted; - - @Inject public AuthorListPresenter(SchedulerManager schedulerManager) { - super(schedulerManager); - } - - public void loadAuthors() { - Observable> observable = wordPressService - .listAuthors() - .map(AuthorResponse::getAuthors) - .doOnNext(Collections::sort); - - subscribe(observable, - () -> { - loadStarted = true; - getView().startLoading(); - }, - posts -> { - model.done(posts); - view.update(model); - }, throwable -> { - model.error(throwable); - view.update(model); - }); - } - - @Override public void subscribe(MvpView view) { - super.subscribe(view); - if (model.isEmpty() && !loadStarted) { - loadAuthors(); - } - } - - public void goToAuthorDetail(int position) { - Author author = model.get(position); - getView().open(PostListFragment.class, new PostListModel(author)); - } - - public void testFromJUnit() { - System.out.println(123); - } - - public void testFromFragment() { - System.out.println(123); - } - - @Override public AuthorListFragment getView() { - return (AuthorListFragment) super.getView(); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryAdapter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryAdapter.java deleted file mode 100644 index 941f29e..0000000 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryAdapter.java +++ /dev/null @@ -1,63 +0,0 @@ -package it.cosenonjaviste.category; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.TextView; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import it.cosenonjaviste.R; -import it.cosenonjaviste.model.Category; - -public class CategoryAdapter extends BaseAdapter { - - private List authors = new ArrayList<>(); - - private Context context; - - public CategoryAdapter(Context context) { - this.context = context; - } - - @Override public int getCount() { - return authors.size(); - } - - @Override public Category getItem(int position) { - return authors.get(position); - } - - @Override public long getItemId(int position) { - return getItem(position).getId(); - } - - @Override public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = LayoutInflater.from(context).inflate(R.layout.category_row, parent, false); - RowWrapper rowWrapper = new RowWrapper(); - ButterKnife.inject(rowWrapper, convertView); - convertView.setTag(rowWrapper); - } - RowWrapper rowWrapper = (RowWrapper) convertView.getTag(); - Category category = getItem(position); - rowWrapper.title.setText(category.getTitle()); - rowWrapper.subtitle.setText(context.getString(R.string.post_count, category.getPostCount())); - return convertView; - } - - public void reloadData(List posts) { - this.authors = posts; - notifyDataSetChanged(); - } - - static class RowWrapper { - @InjectView(R.id.category_name) TextView title; - @InjectView(R.id.category_posts) TextView subtitle; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java deleted file mode 100644 index bd0fb2e..0000000 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ /dev/null @@ -1,63 +0,0 @@ -package it.cosenonjaviste.category; - -import android.annotation.SuppressLint; -import android.view.View; - -import com.quentindommerc.superlistview.SuperGridview; - -import javax.inject.Inject; -import javax.inject.Provider; - -import butterknife.InjectView; -import butterknife.OnClick; -import it.cosenonjaviste.CnjFragment; -import it.cosenonjaviste.R; -import rx.functions.Actions; - -public class CategoryListFragment extends CnjFragment { - - @InjectView(R.id.grid) SuperGridview grid; - - @Inject Provider presenterProvider; - - private CategoryAdapter adapter; - - @Override protected CategoryListPresenter createPresenter() { - return presenterProvider.get(); - } - - @Override protected int getLayoutId() { - return R.layout.super_grid; - } - - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { - super.initView(view); - adapter = new CategoryAdapter(getActivity()); - grid.setAdapter(adapter); - grid.getList().setNumColumns(2); - grid.setRefreshingColor(android.R.color.holo_orange_light, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_red_light); - grid.setOnItemClickListener((parent, v, position, id) -> presenter.goToPosts(position)); - } - - @OnClick(R.id.error_retry) void retry() { - presenter.loadData(); - } - - - @Override public void update(CategoryListModel model) { - model.call( - categories -> { - grid.showList(); - adapter.reloadData(categories); - } - ).whenError( - t -> grid.showError() - ).whenEmpty( - Actions.empty() - ); - } - - public void startLoading() { - grid.showProgress(); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListModel.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListModel.java deleted file mode 100644 index 5d2c5ce..0000000 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListModel.java +++ /dev/null @@ -1,39 +0,0 @@ -package it.cosenonjaviste.category; - -import org.parceler.Parcel; - -import java.util.List; - -import it.cosenonjaviste.lib.mvp.utils.OptionalItem; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; -import it.cosenonjaviste.model.Category; -import rx.functions.Action1; - -@Parcel -public class CategoryListModel { - OptionalList items = new OptionalList<>(); - - public boolean isEmpty() { - return items.isEmpty(); - } - - public int size() { - return items.size(); - } - - public Category get(int index) { - return items.get(index); - } - - public void done(List object) { - items.done(object); - } - - public void error(Throwable throwable) { - items.error(throwable); - } - - public OptionalItem> call(Action1> action) { - return items.call(action); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java deleted file mode 100644 index f1e57d7..0000000 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ /dev/null @@ -1,61 +0,0 @@ -package it.cosenonjaviste.category; - -import java.util.List; - -import javax.inject.Inject; - -import it.cosenonjaviste.lib.mvp.MvpView; -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import it.cosenonjaviste.model.Category; -import it.cosenonjaviste.model.CategoryResponse; -import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.post.PostListFragment; -import it.cosenonjaviste.post.PostListModel; -import rx.Observable; - -public class CategoryListPresenter extends RxMvpPresenter { - - @Inject WordPressService wordPressService; - - private boolean loadStarted; - - @Inject public CategoryListPresenter(SchedulerManager schedulerManager) { - super(schedulerManager); - } - - @Override public void subscribe(MvpView view) { - super.subscribe(view); - if (model.isEmpty() && !loadStarted) { - loadData(); - } - } - - public void loadData() { - Observable> observable = wordPressService - .listCategories() - .map(CategoryResponse::getCategories); - - subscribe(observable, - () -> { - loadStarted = true; - getView().startLoading(); - }, - posts -> { - model.done(posts); - view.update(model); - }, throwable -> { - model.error(throwable); - view.update(model); - }); - } - - public void goToPosts(int position) { - Category category = model.get(position); - getView().open(PostListFragment.class, new PostListModel(category)); - } - - @Override public CategoryListFragment getView() { - return (CategoryListFragment) super.getView(); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/core/Navigator.java b/app/src/main/java/it/cosenonjaviste/core/Navigator.java new file mode 100644 index 0000000..efa33d3 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/Navigator.java @@ -0,0 +1,15 @@ +package it.cosenonjaviste.core; + +import it.codingjam.lifecyclebinder.DefaultLifeCycleAware; +import it.cosenonjaviste.core.post.PostListArgument; +import it.cosenonjaviste.model.Post; + +public abstract class Navigator extends DefaultLifeCycleAware { + public abstract void openPostList(PostListArgument argument); + + public abstract void openDetail(Post post); + + public abstract void share(String subject, String text); + + public abstract void showMessage(int message); +} diff --git a/app/src/main/java/it/cosenonjaviste/core/author/AuthorListModel.java b/app/src/main/java/it/cosenonjaviste/core/author/AuthorListModel.java new file mode 100644 index 0000000..a73f379 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/author/AuthorListModel.java @@ -0,0 +1,41 @@ +package it.cosenonjaviste.core.author; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; + +import it.cosenonjaviste.core.list.ListModel; +import it.cosenonjaviste.model.Author; + +@ParcelablePlease +public class AuthorListModel extends ListModel implements Parcelable { + + public int size() { + return items.size(); + } + + public Author get(int index) { + return items.get(index); + } + + @Override public int describeContents() { + return 0; + } + + @Override public void writeToParcel(Parcel dest, int flags) { + AuthorListModelParcelablePlease.writeToParcel(this, dest, flags); + } + + public static final Creator CREATOR = new Creator() { + public AuthorListModel createFromParcel(Parcel source) { + AuthorListModel target = new AuthorListModel(); + AuthorListModelParcelablePlease.readFromParcel(target, source); + return target; + } + + public AuthorListModel[] newArray(int size) { + return new AuthorListModel[size]; + } + }; +} diff --git a/app/src/main/java/it/cosenonjaviste/core/author/AuthorListViewModel.java b/app/src/main/java/it/cosenonjaviste/core/author/AuthorListViewModel.java new file mode 100644 index 0000000..a04d5e8 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/author/AuthorListViewModel.java @@ -0,0 +1,50 @@ +package it.cosenonjaviste.core.author; + +import android.databinding.ObservableBoolean; +import android.support.annotation.NonNull; + +import com.nytimes.android.external.store2.base.impl.Store; + +import java.util.Collections; +import java.util.List; + +import javax.inject.Inject; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import it.codingjam.lifecyclebinder.BindLifeCycle; +import it.cosenonjaviste.core.Navigator; +import it.cosenonjaviste.core.list.RxListViewModel; +import it.cosenonjaviste.core.post.PostListArgument; +import it.cosenonjaviste.model.Author; + +public class AuthorListViewModel extends RxListViewModel { + + @Inject Store, Integer> authorsStore; + + @Inject @BindLifeCycle Navigator navigator; + + @Inject public AuthorListViewModel() { + } + + @NonNull @Override protected AuthorListModel createModel() { + return new AuthorListModel(); + } + + @Override protected Disposable reloadData(ObservableBoolean loadingAction, boolean forceFetch) { + loadingAction.set(true); + return (forceFetch ? authorsStore.fetch(0) : authorsStore.get(0)) + .singleOrError() + .doOnSuccess(Collections::sort) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doAfterTerminate(() -> loadingAction.set(false)) + .subscribe(model::done, throwable -> model.error()); + } + + public void goToAuthorDetail(int position) { + Author author = model.get(position); + navigator.openPostList(PostListArgument.create(author)); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/core/base/ArgumentManager.java b/app/src/main/java/it/cosenonjaviste/core/base/ArgumentManager.java new file mode 100755 index 0000000..0a3e91f --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/base/ArgumentManager.java @@ -0,0 +1,35 @@ +/* + * Copyright 2015 Fabio Collini. + * + * 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 it.cosenonjaviste.core.base; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Parcelable; + +public class ArgumentManager { + public static final String ARGUMENT = "argument"; + + public static

P readArgument(Bundle arguments) { + return arguments != null ? arguments.getParcelable(ARGUMENT) : null; + } + + public static Intent writeArgument(Intent intent, Parcelable argument) { + if (argument != null) { + intent.putExtra(ARGUMENT, argument); + } + return intent; + } +} diff --git a/app/src/main/java/it/cosenonjaviste/core/base/RxViewModel.java b/app/src/main/java/it/cosenonjaviste/core/base/RxViewModel.java new file mode 100755 index 0000000..9b0d597 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/base/RxViewModel.java @@ -0,0 +1,33 @@ +/* + * Copyright 2015 Fabio Collini. + * + * 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 it.cosenonjaviste.core.base; + + +import android.os.Parcelable; +import android.support.v4.app.Fragment; + +import io.reactivex.disposables.CompositeDisposable; + +public abstract class RxViewModel extends ViewModel { + + protected final CompositeDisposable disposable = new CompositeDisposable(); + + @Override public void onDestroy(Fragment view, boolean changingConfigurations) { + if (!changingConfigurations) { + disposable.clear(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/core/base/ViewModel.java b/app/src/main/java/it/cosenonjaviste/core/base/ViewModel.java new file mode 100755 index 0000000..dc34280 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/base/ViewModel.java @@ -0,0 +1,85 @@ +/* + * Copyright 2015 Fabio Collini. + * + * 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 it.cosenonjaviste.core.base; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Parcelable; +import android.support.annotation.NonNull; +import android.support.v4.app.Fragment; + +import it.codingjam.lifecyclebinder.DefaultLifeCycleAware; + +public abstract class ViewModel extends DefaultLifeCycleAware { + + public static final String MODEL = "model"; + + protected M model; + + protected A argument; + + @Override public void onCreate(Fragment view, Bundle state, Intent intent, Bundle a) { + M model = null; + if (state != null) { + model = state.getParcelable(ViewModel.MODEL); + } + + initArgumentAndModel(ArgumentManager.readArgument(a), model); + } + + @Override public void onPause(Fragment view) { + pause(); + } + + public void pause() { + } + + @Override public void onResume(Fragment view) { + resume(); + } + + public void resume() { + } + + @NonNull protected abstract M createModel(); + + public void initArgumentAndModel(A arguments, M model) { + this.argument = arguments; + this.model = model != null ? model : createModel(); + } + + public M initAndResume() { + return initAndResume(null); + } + + public M initAndResume(A arguments) { + initArgumentAndModel(arguments, null); + resume(); + return model; + } + + public M getModel() { + return model; + } + + public A getArgument() { + return argument; + } + + @Override public void onSaveInstanceState(Fragment view, Bundle bundle) { + bundle.putParcelable(ViewModel.MODEL, getModel()); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/core/category/CategoryListModel.java b/app/src/main/java/it/cosenonjaviste/core/category/CategoryListModel.java new file mode 100644 index 0000000..62972db --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/category/CategoryListModel.java @@ -0,0 +1,37 @@ +package it.cosenonjaviste.core.category; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; + +import it.cosenonjaviste.core.list.ListModel; +import it.cosenonjaviste.model.Category; + +@ParcelablePlease +public class CategoryListModel extends ListModel implements Parcelable { + + public Category get(int index) { + return items.get(index); + } + + @Override public int describeContents() { + return 0; + } + + @Override public void writeToParcel(Parcel dest, int flags) { + CategoryListModelParcelablePlease.writeToParcel(this, dest, flags); + } + + public static final Creator CREATOR = new Creator() { + public CategoryListModel createFromParcel(Parcel source) { + CategoryListModel target = new CategoryListModel(); + CategoryListModelParcelablePlease.readFromParcel(target, source); + return target; + } + + public CategoryListModel[] newArray(int size) { + return new CategoryListModel[size]; + } + }; +} diff --git a/app/src/main/java/it/cosenonjaviste/core/category/CategoryListViewModel.java b/app/src/main/java/it/cosenonjaviste/core/category/CategoryListViewModel.java new file mode 100644 index 0000000..d9192e7 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/category/CategoryListViewModel.java @@ -0,0 +1,45 @@ +package it.cosenonjaviste.core.category; + +import android.databinding.ObservableBoolean; +import android.support.annotation.NonNull; + +import javax.inject.Inject; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import it.codingjam.lifecyclebinder.BindLifeCycle; +import it.cosenonjaviste.core.Navigator; +import it.cosenonjaviste.core.list.RxListViewModel; +import it.cosenonjaviste.core.post.PostListArgument; +import it.cosenonjaviste.model.Category; +import it.cosenonjaviste.model.WordPressService; + +public class CategoryListViewModel extends RxListViewModel { + + @Inject WordPressService wordPressService; + + @Inject @BindLifeCycle Navigator navigator; + + @Inject public CategoryListViewModel() { + } + + @NonNull @Override protected CategoryListModel createModel() { + return new CategoryListModel(); + } + + @Override protected Disposable reloadData(ObservableBoolean loadingSetter, boolean forceFetch) { + loadingSetter.set(true); + return wordPressService + .listCategories() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doAfterTerminate(() -> loadingSetter.set(false)) + .subscribe(model::done, throwable -> model.error()); + } + + public void goToPosts(int position) { + Category category = model.get(position); + navigator.openPostList(PostListArgument.create(category)); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/core/contact/ContactModel.java b/app/src/main/java/it/cosenonjaviste/core/contact/ContactModel.java new file mode 100644 index 0000000..571e15e --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/contact/ContactModel.java @@ -0,0 +1,42 @@ +package it.cosenonjaviste.core.contact; + +import android.databinding.ObservableField; +import android.databinding.ObservableInt; +import android.os.Parcel; +import android.os.Parcelable; + +import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; + +@ParcelablePlease +public class ContactModel implements Parcelable { + + public boolean sendPressed; + + public ObservableField name = new ObservableField<>(); + public ObservableField email = new ObservableField<>(); + public ObservableField message = new ObservableField<>(); + + public ObservableInt nameError = new ObservableInt(); + public ObservableInt emailError = new ObservableInt(); + public ObservableInt messageError = new ObservableInt(); + + @Override public int describeContents() { + return 0; + } + + @Override public void writeToParcel(Parcel dest, int flags) { + ContactModelParcelablePlease.writeToParcel(this, dest, flags); + } + + public static final Creator CREATOR = new Creator() { + public ContactModel createFromParcel(Parcel source) { + ContactModel target = new ContactModel(); + ContactModelParcelablePlease.readFromParcel(target, source); + return target; + } + + public ContactModel[] newArray(int size) { + return new ContactModel[size]; + } + }; +} diff --git a/app/src/main/java/it/cosenonjaviste/core/contact/ContactViewModel.java b/app/src/main/java/it/cosenonjaviste/core/contact/ContactViewModel.java new file mode 100644 index 0000000..fe02140 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/contact/ContactViewModel.java @@ -0,0 +1,104 @@ +package it.cosenonjaviste.core.contact; + +import android.databinding.Observable.OnPropertyChangedCallback; +import android.databinding.ObservableBoolean; +import android.databinding.ObservableInt; +import android.support.annotation.NonNull; + +import javax.inject.Inject; + +import io.reactivex.Completable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import it.codingjam.lifecyclebinder.BindLifeCycle; +import it.cosenonjaviste.R; +import it.cosenonjaviste.core.Navigator; +import it.cosenonjaviste.core.base.RxViewModel; +import it.cosenonjaviste.core.utils.EmailVerifier; +import it.cosenonjaviste.model.MailJetService; + +public class ContactViewModel extends RxViewModel { + + @Inject MailJetService mailJetService; + + @Inject @BindLifeCycle Navigator navigator; + + public final ObservableBoolean sending = new ObservableBoolean(); + + private OnPropertyChangedCallback listener = new OnPropertyChangedCallback() { + @Override + public void onPropertyChanged(android.databinding.Observable sender, int propertyId) { + validate(); + } + }; + + @Inject public ContactViewModel() { + } + + @NonNull @Override protected ContactModel createModel() { + return new ContactModel(); + } + + @Override public void resume() { + super.resume(); + + model.name.addOnPropertyChangedCallback(listener); + model.message.addOnPropertyChangedCallback(listener); + model.email.addOnPropertyChangedCallback(listener); + } + + @Override public void pause() { + super.pause(); + model.name.removeOnPropertyChangedCallback(listener); + model.message.removeOnPropertyChangedCallback(listener); + model.email.removeOnPropertyChangedCallback(listener); + } + + private boolean validate() { + if (model.sendPressed) { + boolean isValid = checkMandatory(model.nameError, model.name.get() == null || model.name.get().isEmpty()); + if (model.email.get() != null && !model.email.get().isEmpty()) { + if (!EmailVerifier.checkEmail(model.email.get())) { + model.emailError.set(R.string.invalid_email); + isValid = false; + } else { + model.emailError.set(0); + } + } else { + model.emailError.set(R.string.mandatory_field); + isValid = false; + } + isValid = checkMandatory(model.messageError, model.message.get() == null || model.message.get().isEmpty()) && isValid; + return isValid; + } else { + return true; + } + } + + private boolean checkMandatory(ObservableInt error, boolean empty) { + error.set(empty ? R.string.mandatory_field : 0); + return !empty; + } + + public void send() { + model.sendPressed = true; + if (validate()) { + Completable observable = mailJetService.sendEmail( + model.name + " ", + "info@cosenonjaviste.it", + "Email from " + model.name, + "Reply to: " + model.email + "\n" + model.message + ); + + sending.set(true); + disposable.add(observable + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doAfterTerminate(() -> sending.set(false)) + .subscribe( + () -> navigator.showMessage(R.string.message_sent), + t -> navigator.showMessage(R.string.error_sending_message)) + ); + } + } +} diff --git a/app/src/main/java/it/cosenonjaviste/core/list/GenericRxListViewModel.java b/app/src/main/java/it/cosenonjaviste/core/list/GenericRxListViewModel.java new file mode 100644 index 0000000..7f57ec6 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/list/GenericRxListViewModel.java @@ -0,0 +1,17 @@ +package it.cosenonjaviste.core.list; + +import android.databinding.ObservableBoolean; + +public interface GenericRxListViewModel { + ObservableBoolean isLoading(); + + ObservableBoolean isLoadingPullToRefresh(); + + ObservableBoolean isLoadingNextPage(); + + ObservableBoolean isError(); + + void reloadData(); + + void loadDataPullToRefresh(); +} diff --git a/app/src/main/java/it/cosenonjaviste/core/list/ListModel.java b/app/src/main/java/it/cosenonjaviste/core/list/ListModel.java new file mode 100644 index 0000000..476ac88 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/list/ListModel.java @@ -0,0 +1,51 @@ +package it.cosenonjaviste.core.list; + +import android.databinding.ObservableArrayList; +import android.databinding.ObservableBoolean; +import android.os.Parcelable; + +import com.hannesdorfmann.parcelableplease.annotation.Bagger; + +import java.util.List; + +import it.cosenonjaviste.core.utils.ObservableArrayListBagger; + +public abstract class ListModel implements Parcelable { + + public ObservableBoolean error = new ObservableBoolean(); + + public boolean loaded; + + @Bagger(ObservableArrayListBagger.class) + public ObservableArrayList items = new ObservableArrayList<>(); + + public final ObservableArrayList getItems() { + return items; + } + + public boolean isLoaded() { + return loaded || error.get(); + } + + public void clear() { + getItems().clear(); + } + + public void done(List items) { + loaded = true; + getItems().clear(); + getItems().addAll(items); + error.set(false); + } + + public void append(List items) { + loaded = true; + getItems().addAll(items); + error.set(false); + } + + public void error() { + clear(); + error.set(true); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/core/list/RxListViewModel.java b/app/src/main/java/it/cosenonjaviste/core/list/RxListViewModel.java new file mode 100644 index 0000000..38082ef --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/list/RxListViewModel.java @@ -0,0 +1,45 @@ +package it.cosenonjaviste.core.list; + +import android.databinding.ObservableBoolean; + +import io.reactivex.disposables.Disposable; +import it.cosenonjaviste.core.base.RxViewModel; + +public abstract class RxListViewModel> extends RxViewModel implements GenericRxListViewModel { + protected ObservableBoolean loading = new ObservableBoolean(); + + protected ObservableBoolean loadingNextPage = new ObservableBoolean(); + + protected ObservableBoolean loadingPullToRefresh = new ObservableBoolean(); + + @Override public ObservableBoolean isLoading() { + return loading; + } + + @Override public ObservableBoolean isLoadingPullToRefresh() { + return loadingPullToRefresh; + } + + @Override public ObservableBoolean isLoadingNextPage() { + return loadingNextPage; + } + + @Override public ObservableBoolean isError() { + return model.error; + } + + @Override public void resume() { + super.resume(); + reloadData(); + } + + public void reloadData() { + reloadData(loading, false); + } + + public final void loadDataPullToRefresh() { + reloadData(loadingPullToRefresh, true); + } + + protected abstract Disposable reloadData(ObservableBoolean loadingAction, boolean forceFetch); +} diff --git a/app/src/main/java/it/cosenonjaviste/core/page/PageModel.java b/app/src/main/java/it/cosenonjaviste/core/page/PageModel.java new file mode 100644 index 0000000..d6ccfc3 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/page/PageModel.java @@ -0,0 +1,45 @@ +package it.cosenonjaviste.core.page; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; + +import it.cosenonjaviste.model.Post; + +@ParcelablePlease +public class PageModel implements Parcelable { + + Post post; + + public PageModel() { + } + + public Post getPost() { + return post; + } + + public void setPost(Post post) { + this.post = post; + } + + @Override public int describeContents() { + return 0; + } + + @Override public void writeToParcel(Parcel dest, int flags) { + PageModelParcelablePlease.writeToParcel(this, dest, flags); + } + + public static final Creator CREATOR = new Creator() { + public PageModel createFromParcel(Parcel source) { + PageModel target = new PageModel(); + PageModelParcelablePlease.readFromParcel(target, source); + return target; + } + + public PageModel[] newArray(int size) { + return new PageModel[size]; + } + }; +} diff --git a/app/src/main/java/it/cosenonjaviste/core/page/PageViewModel.java b/app/src/main/java/it/cosenonjaviste/core/page/PageViewModel.java new file mode 100644 index 0000000..8db8faa --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/page/PageViewModel.java @@ -0,0 +1,46 @@ +package it.cosenonjaviste.core.page; + +import android.databinding.ObservableBoolean; +import android.support.annotation.NonNull; + +import javax.inject.Inject; + +import it.codingjam.lifecyclebinder.BindLifeCycle; +import it.cosenonjaviste.core.Navigator; +import it.cosenonjaviste.core.base.ViewModel; +import it.cosenonjaviste.model.Post; + +public class PageViewModel extends ViewModel { + + public ObservableBoolean loading = new ObservableBoolean(); + + @Inject @BindLifeCycle Navigator navigator; + + @Inject public PageViewModel() { + } + + @NonNull @Override protected PageModel createModel() { + return new PageModel(); + } + + public Post getPost() { + return model.getPost(); + } + + @Override public void resume() { + super.resume(); + if (model.getPost() == null) { + model.setPost(getArgument()); + loading.set(true); + } + } + + public void htmlLoaded() { + loading.set(false); + } + + public void share() { + Post post = model.getPost(); + navigator.share(post.title(), post.title() + " - " + post.url()); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/core/post/PostListArgument.java b/app/src/main/java/it/cosenonjaviste/core/post/PostListArgument.java new file mode 100644 index 0000000..de8a960 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/post/PostListArgument.java @@ -0,0 +1,25 @@ +package it.cosenonjaviste.core.post; + +import android.os.Parcelable; +import android.support.annotation.Nullable; + +import com.google.auto.value.AutoValue; + +import it.cosenonjaviste.model.Author; +import it.cosenonjaviste.model.Category; + +@AutoValue +public abstract class PostListArgument implements Parcelable { + + public static PostListArgument create(Category category) { + return new AutoValue_PostListArgument(category, null); + } + + public static PostListArgument create(Author author) { + return new AutoValue_PostListArgument(null, author); + } + + @Nullable public abstract Category category(); + + @Nullable public abstract Author author(); +} diff --git a/app/src/main/java/it/cosenonjaviste/core/post/PostListModel.java b/app/src/main/java/it/cosenonjaviste/core/post/PostListModel.java new file mode 100644 index 0000000..2781760 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/post/PostListModel.java @@ -0,0 +1,50 @@ +package it.cosenonjaviste.core.post; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; + +import it.cosenonjaviste.core.list.ListModel; +import it.cosenonjaviste.model.Post; + +@ParcelablePlease +public class PostListModel extends ListModel implements Parcelable { + + boolean moreDataAvailable; + + public PostListModel() { + } + + public boolean isMoreDataAvailable() { + return moreDataAvailable; + } + + public void setMoreDataAvailable(boolean moreDataAvailable) { + this.moreDataAvailable = moreDataAvailable; + } + + public int size() { + return items.size(); + } + + @Override public int describeContents() { + return 0; + } + + @Override public void writeToParcel(Parcel dest, int flags) { + PostListModelParcelablePlease.writeToParcel(this, dest, flags); + } + + public static final Creator CREATOR = new Creator() { + public PostListModel createFromParcel(Parcel source) { + PostListModel target = new PostListModel(); + PostListModelParcelablePlease.readFromParcel(target, source); + return target; + } + + public PostListModel[] newArray(int size) { + return new PostListModel[size]; + } + }; +} diff --git a/app/src/main/java/it/cosenonjaviste/core/post/PostListViewModel.java b/app/src/main/java/it/cosenonjaviste/core/post/PostListViewModel.java new file mode 100644 index 0000000..9d2a0c6 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/post/PostListViewModel.java @@ -0,0 +1,110 @@ +package it.cosenonjaviste.core.post; + +import android.databinding.ObservableBoolean; +import android.support.annotation.NonNull; + +import java.util.List; + +import javax.inject.Inject; + +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import it.codingjam.lifecyclebinder.BindLifeCycle; +import it.cosenonjaviste.core.Navigator; +import it.cosenonjaviste.core.list.RxListViewModel; +import it.cosenonjaviste.model.Author; +import it.cosenonjaviste.model.Category; +import it.cosenonjaviste.model.Post; +import it.cosenonjaviste.model.WordPressService; + +public class PostListViewModel extends RxListViewModel { + + @Inject WordPressService wordPressService; + + @Inject @BindLifeCycle Navigator navigator; + + @Inject public PostListViewModel() { + } + + @NonNull @Override protected PostListModel createModel() { + return new PostListModel(); + } + + @Override protected Disposable reloadData(ObservableBoolean loadingAction, boolean forceFetch) { + loadingAction.set(true); + return getObservable(1) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doAfterTerminate(() -> loadingAction.set(false)) + .subscribe(posts -> { + model.done(posts); + model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); + }, throwable -> model.error()); + } + + public void goToDetail(int position) { + Post item = model.getItems().get(position); + navigator.openDetail(item); + } + + public void loadNextPage() { + if (!loadingNextPage.get() && model.isMoreDataAvailable()) { + int page = calcNextPage(model.getItems().size(), WordPressService.POST_PAGE_SIZE); + + loadingNextPage.set(true); + disposable.add(getObservable(page) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doAfterTerminate(() -> loadingNextPage.set(false)) + .subscribe(posts -> { + model.append(posts); + model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); + }, throwable -> model.error()) + ); + } + } + + private Single> getObservable(int page) { + if (getArgument() == null) { + return wordPressService.listPosts(page); + } else { + Category category = getArgument().category(); + if (category != null) { + return wordPressService.listCategoryPosts(category.id(), page); + } else { + Author author = getArgument().author(); + return wordPressService.listAuthorPosts(author.id(), page); + } + } + } + + private static int calcNextPage(int size, int pageSize) { + return size / pageSize + 1; + } + + public boolean isToolbarVisible() { + PostListArgument arg = getArgument(); + return arg != null && (arg.author() != null || arg.category() != null); + } + + public String getToolbarTitle() { + PostListArgument arg = getArgument(); + if (arg == null) { + return null; + } else { + Author author = arg.author(); + if (author != null) { + return author.name(); + } else { + Category category = arg.category(); + if (category != null) { + return category.title(); + } else { + return null; + } + } + } + } +} diff --git a/app/src/main/java/it/cosenonjaviste/core/twitter/TweetListModel.java b/app/src/main/java/it/cosenonjaviste/core/twitter/TweetListModel.java new file mode 100644 index 0000000..3bcd911 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/twitter/TweetListModel.java @@ -0,0 +1,43 @@ +package it.cosenonjaviste.core.twitter; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; + +import it.cosenonjaviste.core.list.ListModel; +import it.cosenonjaviste.model.Tweet; + +@ParcelablePlease +public class TweetListModel extends ListModel implements Parcelable { + + boolean moreDataAvailable; + + public void setMoreDataAvailable(boolean moreDataAvailable) { + this.moreDataAvailable = moreDataAvailable; + } + + public boolean isMoreDataAvailable() { + return moreDataAvailable; + } + + @Override public int describeContents() { + return 0; + } + + @Override public void writeToParcel(Parcel dest, int flags) { + TweetListModelParcelablePlease.writeToParcel(this, dest, flags); + } + + public static final Creator CREATOR = new Creator() { + public TweetListModel createFromParcel(Parcel source) { + TweetListModel target = new TweetListModel(); + TweetListModelParcelablePlease.readFromParcel(target, source); + return target; + } + + public TweetListModel[] newArray(int size) { + return new TweetListModel[size]; + } + }; +} diff --git a/app/src/main/java/it/cosenonjaviste/core/twitter/TweetListViewModel.java b/app/src/main/java/it/cosenonjaviste/core/twitter/TweetListViewModel.java new file mode 100644 index 0000000..64c7ab9 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/twitter/TweetListViewModel.java @@ -0,0 +1,57 @@ +package it.cosenonjaviste.core.twitter; + +import android.databinding.ObservableBoolean; +import android.support.annotation.NonNull; + +import javax.inject.Inject; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import it.cosenonjaviste.core.list.RxListViewModel; +import it.cosenonjaviste.model.TwitterService; + +public class TweetListViewModel extends RxListViewModel { + + @Inject TwitterService twitterService; + + @Inject public TweetListViewModel() { + } + + @NonNull @Override protected TweetListModel createModel() { + return new TweetListModel(); + } + + @Override protected Disposable reloadData(ObservableBoolean loadingAction, boolean forceFetch) { + loadingAction.set(true); + return twitterService.loadTweets(1) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doAfterTerminate(() -> loadingAction.set(false)) + .subscribe(posts -> { + model.done(posts); + model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); + }, throwable -> model.error()); + } + + public void loadNextPage() { + if (!isLoadingNextPage().get() && model.isMoreDataAvailable()) { + int page = calcNextPage(model.getItems().size(), TwitterService.PAGE_SIZE); + + loadingNextPage.set(true); + disposable.add(twitterService.loadTweets(page) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doAfterTerminate(() -> loadingNextPage.set(false)) + .subscribe(posts -> { + model.append(posts); + model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); + }, throwable -> model.error()) + ); + } + } + + private static int calcNextPage(int size, int pageSize) { + return size / pageSize + 1; + } +} diff --git a/app/src/main/java/it/cosenonjaviste/core/utils/DenvelopingConverter.java b/app/src/main/java/it/cosenonjaviste/core/utils/DenvelopingConverter.java new file mode 100644 index 0000000..76d623e --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/utils/DenvelopingConverter.java @@ -0,0 +1,73 @@ +package it.cosenonjaviste.core.utils; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; + +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; + +import okhttp3.ResponseBody; +import retrofit2.Converter; +import retrofit2.Retrofit; + +/** + * A {@link retrofit2.Converter.Factory} which removes unwanted wrapping envelopes from API + * responses. + */ +public class DenvelopingConverter extends Converter.Factory { + + final Gson gson; + + public DenvelopingConverter(@NonNull Gson gson) { + this.gson = gson; + } + + @Override + public Converter responseBodyConverter( + Type type, Annotation[] annotations, Retrofit retrofit) { + + // This converter requires an annotation providing the name of the payload in the envelope; + // if one is not supplied then return null to continue down the converter chain. + final String payloadName = getPayloadName(annotations); + if (payloadName == null) return null; + + final TypeAdapter adapter = gson.getAdapter(TypeToken.get(type)); + return new Converter() { + @Override + public Object convert(ResponseBody body) throws IOException { + try { + JsonReader jsonReader = gson.newJsonReader(body.charStream()); + jsonReader.beginObject(); + while (jsonReader.hasNext()) { + if (payloadName.equals(jsonReader.nextName())) { + return adapter.read(jsonReader); + } else { + jsonReader.skipValue(); + } + } + return null; + } finally { + body.close(); + } + } + }; + } + + private @Nullable String getPayloadName(Annotation[] annotations) { + if (annotations == null) { + return null; + } + for (Annotation annotation : annotations) { + if (annotation instanceof EnvelopePayload) { + return ((EnvelopePayload) annotation).value(); + } + } + return null; + } +} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/core/utils/EmailVerifier.java b/app/src/main/java/it/cosenonjaviste/core/utils/EmailVerifier.java new file mode 100644 index 0000000..62a02da --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/utils/EmailVerifier.java @@ -0,0 +1,20 @@ +package it.cosenonjaviste.core.utils; + +import java.util.regex.Pattern; + +public class EmailVerifier { + private static final Pattern EMAIL_ADDRESS + = Pattern.compile( + "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" + + "\\@" + + "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" + + "(" + + "\\." + + "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" + + ")+" + ); + + public static boolean checkEmail(String email) { + return EMAIL_ADDRESS.matcher(email).matches(); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/core/utils/EnvelopePayload.java b/app/src/main/java/it/cosenonjaviste/core/utils/EnvelopePayload.java new file mode 100644 index 0000000..09b3f9a --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/utils/EnvelopePayload.java @@ -0,0 +1,17 @@ +package it.cosenonjaviste.core.utils; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * An annotation for identifying the payload that we want to extract from an API response wrapped in + * an envelope object. + */ +@Target(METHOD) +@Retention(RUNTIME) +public @interface EnvelopePayload { + String value() default ""; +} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/utils/Md5Utils.java b/app/src/main/java/it/cosenonjaviste/core/utils/Md5Utils.java similarity index 93% rename from app/src/main/java/it/cosenonjaviste/utils/Md5Utils.java rename to app/src/main/java/it/cosenonjaviste/core/utils/Md5Utils.java index 614480a..d9a52fe 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/Md5Utils.java +++ b/app/src/main/java/it/cosenonjaviste/core/utils/Md5Utils.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste.utils; +package it.cosenonjaviste.core.utils; import java.security.MessageDigest; diff --git a/app/src/main/java/it/cosenonjaviste/core/utils/ObservableArrayListBagger.java b/app/src/main/java/it/cosenonjaviste/core/utils/ObservableArrayListBagger.java new file mode 100644 index 0000000..165b997 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/core/utils/ObservableArrayListBagger.java @@ -0,0 +1,18 @@ +package it.cosenonjaviste.core.utils; + +import android.databinding.ObservableArrayList; +import android.os.Parcel; + +import com.hannesdorfmann.parcelableplease.ParcelBagger; + +public class ObservableArrayListBagger implements ParcelBagger { + @Override public void write(ObservableArrayList value, Parcel out, int flags) { + out.writeList(value); + } + + @Override public ObservableArrayList read(Parcel in) { + ObservableArrayList observableArrayList = new ObservableArrayList(); + in.readList(observableArrayList, observableArrayList.getClass().getClassLoader()); + return observableArrayList; + } +} diff --git a/app/src/main/java/it/cosenonjaviste/model/Attachment.java b/app/src/main/java/it/cosenonjaviste/model/Attachment.java new file mode 100644 index 0000000..365bbb7 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/model/Attachment.java @@ -0,0 +1,20 @@ +package it.cosenonjaviste.model; + +import android.os.Parcelable; + +import com.google.auto.value.AutoValue; +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; + +@AutoValue +public abstract class Attachment implements Parcelable { + public static Attachment create(String url) { + return new AutoValue_Attachment(url); + } + + public abstract String url(); + + public static TypeAdapter typeAdapter(Gson gson) { + return new AutoValue_Attachment.GsonTypeAdapter(gson); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/model/Author.java b/app/src/main/java/it/cosenonjaviste/model/Author.java index 71b3939..bfd4b36 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Author.java +++ b/app/src/main/java/it/cosenonjaviste/model/Author.java @@ -1,64 +1,58 @@ package it.cosenonjaviste.model; -import com.google.gson.annotations.SerializedName; - -import org.parceler.Parcel; - -import it.cosenonjaviste.utils.Md5Utils; +import android.os.Parcelable; -@Parcel -public class Author implements Comparable { - long id; - - @SerializedName("first_name") - String firstName; - - @SerializedName("last_name") - String lastName; - - String email; +import com.google.auto.value.AutoValue; +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.SerializedName; - String imageUrl; +import it.cosenonjaviste.core.utils.Md5Utils; - String description; +@AutoValue +public abstract class Author implements Comparable, Parcelable { - public Author() { + public static Author create(long id, String firstName, String lastName, String email) { + return new AutoValue_Author(id, firstName, lastName, email); } - public Author(long id, String firstName, String lastName) { - this.id = id; - this.firstName = firstName; - this.lastName = lastName; + public static TypeAdapter typeAdapter(Gson gson) { + return new AutoValue_Author.GsonTypeAdapter(gson); } - public long getId() { - return id; - } + public abstract long id(); - public String getName() { - return firstName + " " + lastName; - } + @SerializedName("first_name") + public abstract String firstName(); - public String getFirstName() { - return firstName; - } + @SerializedName("last_name") + public abstract String lastName(); - public String getLastName() { - return lastName; + public abstract String email(); + + public String name() { + return firstName() + " " + lastName(); } - public String getImageUrl() { - if (imageUrl == null && email != null && email.length() > 0) { - imageUrl = "http://www.gravatar.com/avatar/" + Md5Utils.md5Hex(email); + public String imageUrl() { + if (email() != null && email().length() > 0) { + return "http://www.gravatar.com/avatar/" + Md5Utils.md5Hex(email()); } - return imageUrl; + return null; } - public String getDescription() { - return description; + @Override public int compareTo(Author o) { + long lhs = sortId(); + long rhs = o.sortId(); + return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1); } - @Override public int compareTo(Author o) { - return Long.compare(id, o.id); + private long sortId() { + long id = id(); + if (id < 5 || id == 8 || id == 32) { + return id; + } else { + return id + 100; + } } } diff --git a/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java b/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java deleted file mode 100644 index c1e1d63..0000000 --- a/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java +++ /dev/null @@ -1,11 +0,0 @@ -package it.cosenonjaviste.model; - -import java.util.List; - -public class AuthorResponse { - private List authors; - - public List getAuthors() { - return authors; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/model/Category.java b/app/src/main/java/it/cosenonjaviste/model/Category.java index c64b992..49c50fb 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Category.java +++ b/app/src/main/java/it/cosenonjaviste/model/Category.java @@ -1,53 +1,27 @@ package it.cosenonjaviste.model; -import com.google.gson.annotations.SerializedName; - -import org.parceler.Parcel; - -@Parcel -public class Category { - long id; - - String title; - - @SerializedName("post_count") - int postCount; - - public Category() { - } +import android.os.Parcelable; - public Category(long id, String title, int postCount) { - this.id = id; - this.title = title; - this.postCount = postCount; - } - - public long getId() { - return id; - } +import com.google.auto.value.AutoValue; +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.SerializedName; - public String getTitle() { - return title; - } +@AutoValue +public abstract class Category implements Parcelable { - public int getPostCount() { - return postCount; + public static Category create(long id, String title, int postCount) { + return new AutoValue_Category(id, title, postCount); } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Category category = (Category) o; + public abstract long id(); - if (id != category.id) return false; + public abstract String title(); - return true; - } + @SerializedName("post_count") + public abstract int postCount(); - @Override - public int hashCode() { - return (int) (id ^ (id >>> 32)); + public static TypeAdapter typeAdapter(Gson gson) { + return new AutoValue_Category.GsonTypeAdapter(gson); } } diff --git a/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java b/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java deleted file mode 100644 index 8ce2493..0000000 --- a/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java +++ /dev/null @@ -1,11 +0,0 @@ -package it.cosenonjaviste.model; - -import java.util.List; - -public class CategoryResponse { - private List categories; - - public List getCategories() { - return categories; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/model/MailJetService.java b/app/src/main/java/it/cosenonjaviste/model/MailJetService.java new file mode 100644 index 0000000..c8e9975 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/model/MailJetService.java @@ -0,0 +1,17 @@ +package it.cosenonjaviste.model; + + +import io.reactivex.Completable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface MailJetService { + + @POST("/send/message") @FormUrlEncoded Completable sendEmail( + @Field("from") String from, + @Field("to") String to, + @Field("subject") String subject, + @Field("text") String text + ); +} diff --git a/app/src/main/java/it/cosenonjaviste/model/MyAdapterFactory.java b/app/src/main/java/it/cosenonjaviste/model/MyAdapterFactory.java new file mode 100644 index 0000000..a5768d3 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/model/MyAdapterFactory.java @@ -0,0 +1,12 @@ +package it.cosenonjaviste.model; + +import com.google.gson.TypeAdapterFactory; +import com.ryanharter.auto.value.gson.GsonTypeAdapterFactory; + +@GsonTypeAdapterFactory +public abstract class MyAdapterFactory implements TypeAdapterFactory { + + public static TypeAdapterFactory create() { + return new AutoValueGson_MyAdapterFactory(); + } +} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/model/Post.java b/app/src/main/java/it/cosenonjaviste/model/Post.java index 9510797..094cc71 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Post.java +++ b/app/src/main/java/it/cosenonjaviste/model/Post.java @@ -1,39 +1,61 @@ package it.cosenonjaviste.model; -import org.parceler.Parcel; +import android.os.Parcelable; +import android.support.annotation.Nullable; +import com.google.auto.value.AutoValue; +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; + +import java.util.Arrays; import java.util.Date; +import java.util.List; -@Parcel -public class Post { - long id; - Author author; - String title; - Date date; - String url; - String excerpt; - - public long getId() { - return id; - } +import it.cosenonjaviste.ui.utils.DateFormatter; - public Author getAuthor() { - return author; +@AutoValue +public abstract class Post implements Parcelable { + public static Post create(long id, Author author, String title, Date date, String url, String excerpt, Attachment... attachments) { + return new AutoValue_Post(id, author, title, date, url, excerpt, Arrays.asList(attachments)); } - public String getTitle() { - return title; + public abstract long id(); + + public abstract Author author(); + + public abstract String title(); + + @Nullable + public abstract Date date(); + + public abstract String url(); + + @Nullable + public abstract String excerpt(); + + public abstract List attachments(); + + public String excerptHtml() { + String excerpt = excerpt(); + if (excerpt == null) { + return ""; + } + return excerpt.replaceAll("
Continue reading...<\\/a>", "").replaceAll("^

", "").replaceAll("$

", ""); } - public Date getDate() { - return date; + public String subtitle() { + return author().name() + ", " + DateFormatter.formatDate(date()); } - public String getUrl() { - return url; + public String imageUrl() { + if (attachments() != null && !attachments().isEmpty()) { + return attachments().get(0).url(); + } else { + return null; + } } - public String getExcerpt() { - return excerpt; + public static TypeAdapter typeAdapter(Gson gson) { + return new AutoValue_Post.GsonTypeAdapter(gson); } } diff --git a/app/src/main/java/it/cosenonjaviste/model/PostResponse.java b/app/src/main/java/it/cosenonjaviste/model/PostResponse.java deleted file mode 100644 index 4d523a8..0000000 --- a/app/src/main/java/it/cosenonjaviste/model/PostResponse.java +++ /dev/null @@ -1,11 +0,0 @@ -package it.cosenonjaviste.model; - -import java.util.List; - -public class PostResponse { - private List posts; - - public List getPosts() { - return posts; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/model/Tweet.java b/app/src/main/java/it/cosenonjaviste/model/Tweet.java index 100d834..55441a2 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Tweet.java +++ b/app/src/main/java/it/cosenonjaviste/model/Tweet.java @@ -1,54 +1,30 @@ package it.cosenonjaviste.model; -import org.parceler.Parcel; +import android.os.Parcelable; -import java.util.Date; - -@Parcel -public class Tweet { - long id; - String text; - Date createdAt; - String userImage; - String author; - - public void setId(long id) { - this.id = id; - } +import com.google.auto.value.AutoValue; +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; - public long getId() { - return id; - } - - public void setText(String text) { - this.text = text; - } +import java.util.Date; - public String getText() { - return text; +@AutoValue +public abstract class Tweet implements Parcelable { + public static Tweet create(long id, String text, Date createdAt, String userImage, String author) { + return new AutoValue_Tweet(id, text, createdAt, userImage, author); } - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } + public abstract long id(); - public Date getCreatedAt() { - return createdAt; - } + public abstract String text(); - public void setUserImage(String userImage) { - this.userImage = userImage; - } + public abstract Date createdAt(); - public String getUserImage() { - return userImage; - } + public abstract String userImage(); - public void setAuthor(String author) { - this.author = author; - } + public abstract String author(); - public String getAuthor() { - return author; + public static TypeAdapter typeAdapter(Gson gson) { + return new AutoValue_Tweet.GsonTypeAdapter(gson); } } diff --git a/app/src/main/java/it/cosenonjaviste/model/TwitterService.java b/app/src/main/java/it/cosenonjaviste/model/TwitterService.java index 9c23007..b06ab5c 100644 --- a/app/src/main/java/it/cosenonjaviste/model/TwitterService.java +++ b/app/src/main/java/it/cosenonjaviste/model/TwitterService.java @@ -2,11 +2,40 @@ import java.util.List; -import rx.Observable; +import io.reactivex.Observable; +import io.reactivex.Single; +import twitter4j.Paging; +import twitter4j.Status; +import twitter4j.Twitter; +import twitter4j.TwitterFactory; +import twitter4j.User; +import twitter4j.conf.ConfigurationBuilder; -public interface TwitterService { +public class TwitterService { - int PAGE_SIZE = 20; + public static final int PAGE_SIZE = 20; - Observable> loadTweets(int page); + private final Twitter twitter; + + public TwitterService(String consumerKey, String consumerSecret, String accessToken, String accessTokenSecret) { + ConfigurationBuilder cb = new ConfigurationBuilder(); + cb.setDebugEnabled(true) + .setOAuthConsumerKey(consumerKey) + .setOAuthConsumerSecret(consumerSecret) + .setOAuthAccessToken(accessToken) + .setOAuthAccessTokenSecret(accessTokenSecret); + TwitterFactory tf = new TwitterFactory(cb.build()); + twitter = tf.getInstance(); + } + + public Single> loadTweets(int page) { + return Observable.fromCallable(() -> twitter.getUserTimeline(251259751, new Paging(page, PAGE_SIZE))) + .flatMapIterable(l -> l) + .map(this::createTweet).toList(); + } + + private Tweet createTweet(Status s) { + User user = s.getUser(); + return Tweet.create(s.getId(), s.getText(), s.getCreatedAt(), user.getProfileImageURL(), user.getName()); + } } diff --git a/app/src/main/java/it/cosenonjaviste/model/WordPressService.java b/app/src/main/java/it/cosenonjaviste/model/WordPressService.java index 165c819..b186b4d 100644 --- a/app/src/main/java/it/cosenonjaviste/model/WordPressService.java +++ b/app/src/main/java/it/cosenonjaviste/model/WordPressService.java @@ -1,24 +1,32 @@ package it.cosenonjaviste.model; -import retrofit.http.GET; -import retrofit.http.Query; -import rx.Observable; +import java.util.List; + +import io.reactivex.Single; +import it.cosenonjaviste.core.utils.EnvelopePayload; +import retrofit2.http.GET; +import retrofit2.http.Query; public interface WordPressService { int POST_PAGE_SIZE = 10; - String POSTS_EXTRA = "&exclude=content,title_plain,tags,custom_fields&author_meta=email"; + String POSTS_EXTRA = "&exclude=content,title_plain,tags,custom_fields,categories,comments&author_meta=email"; String CATEGORY_POSTS_URL = "/?json=get_category_posts"; String AUTHOR_POSTS_URL = "/?json=get_author_posts"; - @GET("/?json=get_recent_posts&count=" + POST_PAGE_SIZE + POSTS_EXTRA) Observable listPosts(@Query("page") int page); + @EnvelopePayload("posts") + @GET("/?json=get_recent_posts&count=" + POST_PAGE_SIZE + POSTS_EXTRA) Single> listPosts(@Query("page") int page); - @GET(CATEGORY_POSTS_URL + "&count=" + POST_PAGE_SIZE + POSTS_EXTRA) Observable listCategoryPosts(@Query("id") long categoryId, @Query("page") int page); + @EnvelopePayload("posts") + @GET(CATEGORY_POSTS_URL + "&count=" + POST_PAGE_SIZE + POSTS_EXTRA) Single> listCategoryPosts(@Query("id") long categoryId, @Query("page") int page); - @GET(AUTHOR_POSTS_URL + "&count=" + POST_PAGE_SIZE + POSTS_EXTRA) Observable listAuthorPosts(@Query("id") long authorId, @Query("page") int page); + @EnvelopePayload("posts") + @GET(AUTHOR_POSTS_URL + "&count=" + POST_PAGE_SIZE + POSTS_EXTRA) Single> listAuthorPosts(@Query("id") long authorId, @Query("page") int page); - @GET("/?json=get_author_index&author_meta=email") Observable listAuthors(); + @EnvelopePayload("authors") + @GET("/?json=get_author_index&author_meta=email") Single> listAuthors(); - @GET("/?json=get_category_index") Observable listCategories(); + @EnvelopePayload("categories") + @GET("/?json=get_category_index") Single> listCategories(); } \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/model/WordPressServiceFactory.java b/app/src/main/java/it/cosenonjaviste/model/WordPressServiceFactory.java deleted file mode 100644 index ed3e299..0000000 --- a/app/src/main/java/it/cosenonjaviste/model/WordPressServiceFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -package it.cosenonjaviste.model; - -import com.google.gson.GsonBuilder; - -import retrofit.RestAdapter; -import retrofit.converter.GsonConverter; - -public class WordPressServiceFactory { - public static WordPressService create(String endpoint, boolean debug) { - RestAdapter restAdapter = new RestAdapter.Builder() - .setEndpoint(endpoint) - //http calls are executed in background thread using SchedulerManager - .setExecutors(Runnable::run, null) - .setConverter(new GsonConverter(new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create())) - .build(); - if (debug) { - restAdapter.setLogLevel(RestAdapter.LogLevel.FULL); - } - return restAdapter.create(WordPressService.class); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java deleted file mode 100644 index 8d400ba..0000000 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ /dev/null @@ -1,95 +0,0 @@ -package it.cosenonjaviste.page; - -import android.annotation.SuppressLint; -import android.view.View; -import android.webkit.WebResourceResponse; -import android.webkit.WebSettings; -import android.webkit.WebView; -import android.webkit.WebViewClient; - -import java.io.File; -import java.io.IOException; - -import javax.inject.Inject; -import javax.inject.Provider; - -import butterknife.InjectView; -import it.cosenonjaviste.CnjFragment; -import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; - -public class PageFragment extends CnjFragment implements MvpView { - - @InjectView(R.id.web_view) WebView webView; - - @InjectView(R.id.progress_detail) View progressBar; - - @Inject Provider presenterProvider; - - @Override protected PagePresenter createPresenter() { - return presenterProvider.get(); - } - - @SuppressLint("SetJavaScriptEnabled") @Override protected void initView(View view) { - super.initView(view); - - WebSettings settings = webView.getSettings(); - settings.setJavaScriptEnabled(true); - File externalFilesDir = getActivity().getExternalFilesDir(null); - if (externalFilesDir != null) { - settings.setAppCachePath(externalFilesDir.getAbsolutePath()); - settings.setAppCacheMaxSize(20 * 1024 * 1024); - settings.setAppCacheEnabled(true); - settings.setCacheMode(WebSettings.LOAD_DEFAULT); - } - - webView.setWebViewClient(new WebViewClient() { - @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { - view.loadUrl(url); - return true; - } - - @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { - if (url.equalsIgnoreCase("http://www.cosenonjaviste.it/wp-content/themes/flexform/style.css")) { - return getCssWebResourceResponseFromAsset(); - } - if (url.startsWith("https://pbs.twimg.com/") - || url.startsWith("https://cdn.syndication.twimg.com/") - || url.startsWith("https://syndication.twitter.com") - || url.contains("platform.twitter.com/") - || url.startsWith("http://www.facebook.com/plugins/like_box.php") - || url.startsWith("https://fbcdn-profile-") - || url.contains("sharethis.com/") - || url.equals("http://www.cosenonjaviste.it/wp-content/uploads/2013/06/favicon.ico") - ) { - return null; - } - return super.shouldInterceptRequest(view, url); - } - - private WebResourceResponse getCssWebResourceResponseFromAsset() { - try { - return new WebResourceResponse("text/css", "UTF-8", getActivity().getAssets().open("style.css")); - } catch (IOException e) { - return null; - } - } - - @Override - public void onPageFinished(WebView view, String url) { - super.onPageFinished(view, url); - webView.setVisibility(View.VISIBLE); - progressBar.setVisibility(View.INVISIBLE); - } - }); - } - - @Override protected int getLayoutId() { - return R.layout.post_detail; - } - - @Override public void update(PageModel model) { - webView.loadUrl(presenter.getPostUrl()); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/page/PageModel.java b/app/src/main/java/it/cosenonjaviste/page/PageModel.java deleted file mode 100644 index 3609121..0000000 --- a/app/src/main/java/it/cosenonjaviste/page/PageModel.java +++ /dev/null @@ -1,20 +0,0 @@ -package it.cosenonjaviste.page; - -import org.parceler.Parcel; - -@Parcel -public class PageModel { - - String url; - - PageModel() { - } - - public PageModel(String url) { - this.url = url; - } - - public String getUrl() { - return url; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java deleted file mode 100644 index c7d2818..0000000 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ /dev/null @@ -1,14 +0,0 @@ -package it.cosenonjaviste.page; - -import javax.inject.Inject; - -import it.cosenonjaviste.lib.mvp.MvpPresenter; - -public class PagePresenter extends MvpPresenter { - - @Inject PageUrlManager pageUrlManager; - - public String getPostUrl() { - return pageUrlManager.getUrl(model.getUrl()); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/page/PageUrlManager.java b/app/src/main/java/it/cosenonjaviste/page/PageUrlManager.java deleted file mode 100644 index 6ddd777..0000000 --- a/app/src/main/java/it/cosenonjaviste/page/PageUrlManager.java +++ /dev/null @@ -1,15 +0,0 @@ -package it.cosenonjaviste.page; - -import javax.inject.Inject; -import javax.inject.Singleton; - -@Singleton -public class PageUrlManager { - - @Inject public PageUrlManager() { - } - - public String getUrl(String url) { - return url; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/post/PostAdapter.java b/app/src/main/java/it/cosenonjaviste/post/PostAdapter.java deleted file mode 100644 index b77e934..0000000 --- a/app/src/main/java/it/cosenonjaviste/post/PostAdapter.java +++ /dev/null @@ -1,82 +0,0 @@ -package it.cosenonjaviste.post; - -import android.content.Context; -import android.text.Html; -import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.squareup.picasso.Picasso; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import it.cosenonjaviste.R; -import it.cosenonjaviste.model.Post; -import it.cosenonjaviste.utils.CircleTransform; -import it.cosenonjaviste.utils.DateFormatter; - -public class PostAdapter extends BaseAdapter { - - private List posts = new ArrayList<>(); - - private Context context; - private CircleTransform transformation; - - public PostAdapter(Context context) { - this.context = context; - transformation = CircleTransform.createWithBorder(context, R.dimen.author_image_size, R.color.colorPrimary, R.dimen.author_image_border); - } - - @Override public int getCount() { - return posts.size(); - } - - @Override public Post getItem(int position) { - return posts.get(position); - } - - @Override public long getItemId(int position) { - return getItem(position).getId(); - } - - @Override public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = LayoutInflater.from(context).inflate(R.layout.post_row, parent, false); - RowWrapper rowWrapper = new RowWrapper(); - ButterKnife.inject(rowWrapper, convertView); - convertView.setTag(rowWrapper); - } - RowWrapper rowWrapper = (RowWrapper) convertView.getTag(); - Post post = getItem(position); - rowWrapper.title.setText(Html.fromHtml(post.getTitle())); - String excerpt = post.getExcerpt() != null ? post.getExcerpt() : ""; - rowWrapper.text.setText(Html.fromHtml(excerpt.replaceAll("^

", "").replaceAll("$

", ""))); - rowWrapper.author.setText(post.getAuthor().getName()); - rowWrapper.date.setText(DateFormatter.formatDate(post.getDate())); - String imageUrl = post.getAuthor().getImageUrl(); - if (!TextUtils.isEmpty(imageUrl)) { - Picasso.with(context).load(imageUrl).transform(transformation).into(rowWrapper.image); - } - return convertView; - } - - public void reloadData(List posts) { - this.posts = posts; - notifyDataSetChanged(); - } - - static class RowWrapper { - @InjectView(R.id.date) TextView date; - @InjectView(R.id.author) TextView author; - @InjectView(R.id.title) TextView title; - @InjectView(R.id.text) TextView text; - @InjectView(R.id.author_image) ImageView image; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java deleted file mode 100644 index 21cfa7f..0000000 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ /dev/null @@ -1,73 +0,0 @@ -package it.cosenonjaviste.post; - -import android.annotation.SuppressLint; -import android.view.View; - -import com.quentindommerc.superlistview.SuperListview; - -import javax.inject.Inject; -import javax.inject.Provider; - -import butterknife.InjectView; -import butterknife.OnClick; -import it.cosenonjaviste.CnjFragment; -import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; -import rx.functions.Actions; - -public class PostListFragment extends CnjFragment implements MvpView { - - @InjectView(R.id.list) SuperListview list; - - @Inject Provider presenterProvider; - - private PostAdapter adapter; - - @Override protected PostListPresenter createPresenter() { - return presenterProvider.get(); - } - - @Override protected int getLayoutId() { - return R.layout.super_list; - } - - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { - super.initView(view); - adapter = new PostAdapter(getActivity()); - list.setAdapter(adapter); - list.setRefreshingColor(android.R.color.holo_orange_light, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_red_light); - list.setRefreshListener(presenter::reloadData); - list.setOnItemClickListener((parent, v, position, id) -> presenter.goToDetail(adapter.getItem(position))); - list.setupMoreListener((numberOfItems, numberBeforeMore, currentItemPos) -> presenter.loadNextPage(), 1); - } - - @OnClick(R.id.error_retry) void retry() { - presenter.reloadData(); - } - - @Override public void update(PostListModel model) { - model.getItems().call( - posts -> { - list.showList(); - list.hideMoreProgress(model.isMoreDataAvailable()); - adapter.reloadData(posts); - } - ).whenError( - t -> list.showError() - ).whenEmpty( - Actions.empty() - ); - } - - public void startLoading(boolean showMainLoading) { - if (showMainLoading) { - list.showProgress(); - } else { - list.setRefreshing(true); - } - } - - public void startMoreItemsLoading() { - list.showMoreProgress(); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListModel.java b/app/src/main/java/it/cosenonjaviste/post/PostListModel.java deleted file mode 100644 index c07a82a..0000000 --- a/app/src/main/java/it/cosenonjaviste/post/PostListModel.java +++ /dev/null @@ -1,51 +0,0 @@ -package it.cosenonjaviste.post; - -import org.parceler.Parcel; - -import it.cosenonjaviste.lib.mvp.utils.OptionalList; -import it.cosenonjaviste.model.Author; -import it.cosenonjaviste.model.Category; -import it.cosenonjaviste.model.Post; - -@Parcel -public class PostListModel { - - OptionalList items = new OptionalList<>(); - - Category category; - - boolean moreDataAvailable; - - Author author; - - public PostListModel() { - } - - public PostListModel(Category category) { - this.category = category; - } - - public PostListModel(Author author) { - this.author = author; - } - - public Category getCategory() { - return category; - } - - public boolean isMoreDataAvailable() { - return moreDataAvailable; - } - - public void setMoreDataAvailable(boolean moreDataAvailable) { - this.moreDataAvailable = moreDataAvailable; - } - - public Author getAuthor() { - return author; - } - - public OptionalList getItems() { - return items; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java deleted file mode 100644 index 77afe44..0000000 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ /dev/null @@ -1,97 +0,0 @@ -package it.cosenonjaviste.post; - -import java.util.List; - -import javax.inject.Inject; - -import it.cosenonjaviste.lib.mvp.MvpView; -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import it.cosenonjaviste.model.Author; -import it.cosenonjaviste.model.Category; -import it.cosenonjaviste.model.Post; -import it.cosenonjaviste.model.PostResponse; -import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.page.PageFragment; -import it.cosenonjaviste.page.PageModel; -import rx.Observable; - -public class PostListPresenter extends RxMvpPresenter { - - @Inject WordPressService wordPressService; - - private boolean loadStarted; - - @Inject public PostListPresenter(SchedulerManager schedulerManager) { - super(schedulerManager); - } - - @Override public void subscribe(MvpView view) { - super.subscribe(view); - if (model.getItems().isEmpty() && !loadStarted) { - reloadData(); - } - } - - public void reloadData() { - Observable> observable = getObservable(0); - - subscribe(observable, - () -> { - loadStarted = true; - getView().startLoading(model.getItems().isEmpty()); - }, - posts -> { - model.getItems().done(posts); - model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); - view.update(model); - }, throwable -> { - model.getItems().error(throwable); - view.update(model); - }); - } - - public void goToDetail(Post item) { - getView().open(PageFragment.class, new PageModel(item.getUrl())); - } - - public void loadNextPage() { - int page = calcNextPage(model.getItems().size(), WordPressService.POST_PAGE_SIZE); - Observable> observable = getObservable(page); - - subscribe(observable, - () -> getView().startMoreItemsLoading(), - posts -> { - model.getItems().append(posts); - model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); - view.update(model); - }, throwable -> { - model.getItems().error(throwable); - view.update(model); - }); - } - - private Observable> getObservable(int page) { - Observable observable; - Category category = model.getCategory(); - if (category != null) { - observable = wordPressService.listCategoryPosts(category.getId(), page); - } else { - Author author = model.getAuthor(); - if (author != null) { - observable = wordPressService.listAuthorPosts(author.getId(), page); - } else { - observable = wordPressService.listPosts(page); - } - } - return observable.map(PostResponse::getPosts); - } - - private static int calcNextPage(int size, int pageSize) { - return size / pageSize + 1; - } - - @Override public PostListFragment getView() { - return (PostListFragment) super.getView(); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetAdapter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetAdapter.java deleted file mode 100644 index ca8a17a..0000000 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetAdapter.java +++ /dev/null @@ -1,79 +0,0 @@ -package it.cosenonjaviste.twitter; - -import android.content.Context; -import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.squareup.picasso.Picasso; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import it.cosenonjaviste.R; -import it.cosenonjaviste.model.Tweet; -import it.cosenonjaviste.utils.CircleTransform; -import it.cosenonjaviste.utils.DateFormatter; - -public class TweetAdapter extends BaseAdapter { - - private List items = new ArrayList<>(); - - private Context context; - - private CircleTransform transformation; - - public TweetAdapter(Context context) { - this.context = context; - transformation = CircleTransform.createWithBorder(context, R.dimen.author_image_size, R.color.colorPrimary, R.dimen.author_image_border); - } - - @Override public int getCount() { - return items.size(); - } - - @Override public Tweet getItem(int position) { - return items.get(position); - } - - @Override public long getItemId(int position) { - return getItem(position).getId(); - } - - @Override public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = LayoutInflater.from(context).inflate(R.layout.tweet_row, parent, false); - RowWrapper rowWrapper = new RowWrapper(); - ButterKnife.inject(rowWrapper, convertView); - convertView.setTag(rowWrapper); - } - RowWrapper rowWrapper = (RowWrapper) convertView.getTag(); - Tweet item = getItem(position); - rowWrapper.title.setText(item.getText()); - rowWrapper.author.setText(item.getAuthor()); - rowWrapper.date.setText(DateFormatter.formatDate(item.getCreatedAt())); - String imageUrl = item.getUserImage(); - if (!TextUtils.isEmpty(imageUrl)) { - Picasso.with(context).load(imageUrl).transform(transformation).into(rowWrapper.image); - } - return convertView; - } - - public void reloadData(List items) { - this.items = items; - notifyDataSetChanged(); - } - - static class RowWrapper { - @InjectView(R.id.date) TextView date; - @InjectView(R.id.author) TextView author; - @InjectView(R.id.title) TextView title; - @InjectView(R.id.author_image) ImageView image; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java deleted file mode 100644 index 28ea204..0000000 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ /dev/null @@ -1,72 +0,0 @@ -package it.cosenonjaviste.twitter; - -import android.annotation.SuppressLint; -import android.view.View; - -import com.quentindommerc.superlistview.SuperListview; - -import javax.inject.Inject; -import javax.inject.Provider; - -import butterknife.InjectView; -import butterknife.OnClick; -import it.cosenonjaviste.CnjFragment; -import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; -import rx.functions.Actions; - -public class TweetListFragment extends CnjFragment implements MvpView { - - @InjectView(R.id.list) SuperListview list; - - @Inject Provider presenterProvider; - - private TweetAdapter adapter; - - @Override protected TweetListPresenter createPresenter() { - return presenterProvider.get(); - } - - @Override protected int getLayoutId() { - return R.layout.super_list; - } - - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { - super.initView(view); - adapter = new TweetAdapter(getActivity()); - list.setAdapter(adapter); - list.setRefreshingColor(android.R.color.holo_orange_light, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_red_light); - list.setRefreshListener(presenter::reloadData); - list.setupMoreListener((numberOfItems, numberBeforeMore, currentItemPos) -> presenter.loadNextPage(), 1); - } - - @OnClick(R.id.error_retry) void retry() { - presenter.reloadData(); - } - - @Override public void update(TweetListModel model) { - model.call( - items -> { - list.showList(); - list.hideMoreProgress(model.isMoreDataAvailable()); - adapter.reloadData(items); - } - ).whenError( - t -> list.showError() - ).whenEmpty( - Actions.empty() - ); - } - - public void startLoading(boolean showMainLoading) { - if (showMainLoading) { - list.showProgress(); - } else { - list.setRefreshing(true); - } - } - - public void startMoreItemsLoading() { - list.showMoreProgress(); - } -} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java deleted file mode 100644 index d1b4d0a..0000000 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java +++ /dev/null @@ -1,49 +0,0 @@ -package it.cosenonjaviste.twitter; - -import org.parceler.Parcel; - -import java.util.List; - -import it.cosenonjaviste.lib.mvp.utils.OptionalItem; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; -import it.cosenonjaviste.model.Tweet; -import rx.functions.Action1; - -@Parcel -public class TweetListModel { - OptionalList list = new OptionalList<>(); - - boolean moreDataAvailable; - - public void setMoreDataAvailable(boolean moreDataAvailable) { - this.moreDataAvailable = moreDataAvailable; - } - - public boolean isMoreDataAvailable() { - return moreDataAvailable; - } - - public OptionalItem> call(Action1> action) { - return list.call(action); - } - - public boolean isEmpty() { - return list.isEmpty(); - } - - public void done(List object) { - list.done(object); - } - - public void error(Throwable throwable) { - list.error(throwable); - } - - public int size() { - return list.size(); - } - - public void append(List object) { - list.append(object); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java deleted file mode 100644 index af0fe38..0000000 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ /dev/null @@ -1,73 +0,0 @@ -package it.cosenonjaviste.twitter; - -import java.util.List; - -import javax.inject.Inject; - -import it.cosenonjaviste.lib.mvp.MvpView; -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import it.cosenonjaviste.model.Tweet; -import it.cosenonjaviste.model.TwitterService; -import rx.Observable; - -public class TweetListPresenter extends RxMvpPresenter { - - @Inject TwitterService twitterService; - - private boolean loadStarted; - - @Inject public TweetListPresenter(SchedulerManager schedulerManager) { - super(schedulerManager); - } - - public void reloadData() { - Observable> observable = twitterService.loadTweets(1); - - subscribe(observable, - () -> { - loadStarted = true; - getView().startLoading(model.isEmpty()); - }, - posts -> { - model.done(posts); - model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); - view.update(model); - }, throwable -> { - model.error(throwable); - view.update(model); - }); - } - - @Override public void subscribe(MvpView view) { - super.subscribe(view); - if (model.isEmpty() && !loadStarted) { - reloadData(); - } - } - - public void loadNextPage() { - int page = calcNextPage(model.size(), TwitterService.PAGE_SIZE); - Observable> observable = twitterService.loadTweets(page); - - subscribe(observable, - () -> getView().startMoreItemsLoading(), - posts -> { - model.append(posts); - model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); - view.update(model); - }, throwable -> { - model.error(throwable); - view.update(model); - }); - - } - - private static int calcNextPage(int size, int pageSize) { - return size / pageSize + 1; - } - - @Override public TweetListFragment getView() { - return (TweetListFragment) super.getView(); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/twitter/Twitter4JService.java b/app/src/main/java/it/cosenonjaviste/twitter/Twitter4JService.java deleted file mode 100644 index fda60a0..0000000 --- a/app/src/main/java/it/cosenonjaviste/twitter/Twitter4JService.java +++ /dev/null @@ -1,57 +0,0 @@ -package it.cosenonjaviste.twitter; - -import java.util.List; - -import it.cosenonjaviste.BuildConfig; -import it.cosenonjaviste.model.Tweet; -import it.cosenonjaviste.model.TwitterService; -import rx.Observable; -import rx.Subscriber; -import twitter4j.Paging; -import twitter4j.Status; -import twitter4j.Twitter; -import twitter4j.TwitterException; -import twitter4j.TwitterFactory; -import twitter4j.User; -import twitter4j.conf.ConfigurationBuilder; - -public class Twitter4JService implements TwitterService { - - private final Twitter twitter; - - public Twitter4JService() { - ConfigurationBuilder cb = new ConfigurationBuilder(); - cb.setDebugEnabled(true) - .setOAuthConsumerKey(BuildConfig.CONSUMER_KEY) - .setOAuthConsumerSecret(BuildConfig.CONSUMER_SECRET) - .setOAuthAccessToken(BuildConfig.ACCESS_TOKEN) - .setOAuthAccessTokenSecret(BuildConfig.ACCESS_TOKEN_SECRET); - TwitterFactory tf = new TwitterFactory(cb.build()); - twitter = tf.getInstance(); - } - - @Override public Observable> loadTweets(int page) { - return Observable.create((Subscriber> subscriber) -> { - try { - List statuses = twitter.getUserTimeline(251259751, new Paging(page, PAGE_SIZE)); - subscriber.onNext(statuses); - subscriber.onCompleted(); - } catch (TwitterException e) { - subscriber.onError(e); - } - }).flatMap(Observable::from).map(this::createTweet).toList(); - } - - private Tweet createTweet(Status s) { - Tweet tweet = new Tweet(); - tweet.setId(s.getId()); - tweet.setText(s.getText()); - tweet.setCreatedAt(s.getCreatedAt()); - - User user = s.getUser(); - tweet.setAuthor(user.getName()); - tweet.setUserImage(user.getProfileImageURL()); - - return tweet; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/ui/AndroidNavigator.java b/app/src/main/java/it/cosenonjaviste/ui/AndroidNavigator.java new file mode 100644 index 0000000..1c28d81 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/AndroidNavigator.java @@ -0,0 +1,58 @@ +package it.cosenonjaviste.ui; + +import android.content.Intent; +import android.os.Bundle; +import android.support.design.widget.Snackbar; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; + +import it.cosenonjaviste.R; +import it.cosenonjaviste.core.Navigator; +import it.cosenonjaviste.core.post.PostListArgument; +import it.cosenonjaviste.model.Post; +import it.cosenonjaviste.ui.page.PageFragment; +import it.cosenonjaviste.ui.post.PostListFragment; +import it.cosenonjaviste.ui.utils.SingleFragmentActivity; + +public class AndroidNavigator extends Navigator { + + private FragmentActivity activity; + + @Override + public void onCreate(Object view, Bundle savedInstanceState, Intent intent, Bundle arguments) { + if (view instanceof Fragment) { + activity = ((Fragment) view).getActivity(); + } else { + activity = (FragmentActivity) view; + } + } + + @Override + public void onDestroy(Object view, boolean changingConfigurations) { + activity = null; + } + + @Override + public void openPostList(PostListArgument argument) { + SingleFragmentActivity.open(activity, PostListFragment.class, argument); + } + + @Override + public void openDetail(Post post) { + SingleFragmentActivity.open(activity, PageFragment.class, post); + } + + @Override + public void share(String subject, String text) { + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject); + sendIntent.putExtra(Intent.EXTRA_TEXT, text); + sendIntent.setType("text/plain"); + activity.startActivity(Intent.createChooser(sendIntent, activity.getResources().getText(R.string.share_post))); + } + + @Override public void showMessage(int message) { + Snackbar.make(activity.findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG).show(); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/AppModule.java b/app/src/main/java/it/cosenonjaviste/ui/AppModule.java new file mode 100644 index 0000000..1cd198c --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/AppModule.java @@ -0,0 +1,107 @@ +package it.cosenonjaviste.ui; + +import android.app.Application; +import android.util.Base64; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.nytimes.android.external.store2.base.impl.Store; +import com.nytimes.android.external.store2.base.impl.StoreBuilder; + +import java.util.List; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import it.cosenonjaviste.BuildConfig; +import it.cosenonjaviste.core.Navigator; +import it.cosenonjaviste.core.utils.DenvelopingConverter; +import it.cosenonjaviste.model.Author; +import it.cosenonjaviste.model.MailJetService; +import it.cosenonjaviste.model.MyAdapterFactory; +import it.cosenonjaviste.model.Post; +import it.cosenonjaviste.model.TwitterService; +import it.cosenonjaviste.model.WordPressService; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; + +@Module +public class AppModule { + + private Application application; + + public AppModule(Application application) { + this.application = application; + } + + @Provides @Singleton public Gson provideGson() { + return new GsonBuilder() + .setDateFormat("yyyy-MM-dd HH:mm:ss") + .registerTypeAdapterFactory(MyAdapterFactory.create()) + .create(); + } + + @Provides @Singleton public WordPressService provideWordPressService(Gson gson) { + Retrofit retrofit = new Retrofit.Builder() + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .addConverterFactory(new DenvelopingConverter(gson)) + .addConverterFactory(GsonConverterFactory.create(gson)) + .baseUrl("http://www.codingjam.it/") + .build(); + + return retrofit.create(WordPressService.class); + } + + @Provides @Singleton public MailJetService provideMailJetService(Gson gson) { + OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); + + httpClient.addNetworkInterceptor(chain -> { + String userName = BuildConfig.MAILJET_USERNAME; + String password = BuildConfig.MAILJET_PASSWORD; + String string = "Basic " + Base64.encodeToString((userName + ":" + password).getBytes(), Base64.NO_WRAP); + + Request original = chain.request(); + Request.Builder builder = original.newBuilder(); + builder.header("Authorization", string); + Request request = builder.build(); + + return chain.proceed(request); + }); + + Retrofit retrofit = new Retrofit.Builder() + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .addConverterFactory(GsonConverterFactory.create(gson)) + .baseUrl("https://api.mailjet.com/v3") + .build(); + + return retrofit.create(MailJetService.class); + } + + @Provides @Singleton public TwitterService provideTwitterService() { + return new TwitterService(BuildConfig.CONSUMER_KEY, BuildConfig.CONSUMER_SECRET, BuildConfig.ACCESS_TOKEN, BuildConfig.ACCESS_TOKEN_SECRET); + } + + @Provides public Navigator provideNavigator() { + return new AndroidNavigator(); + } + + @Provides @Singleton + public Store, Integer> postListStore(WordPressService wordPressService) { + return StoreBuilder.>key() + .fetcher(integer -> wordPressService.listPosts(integer).toObservable()) +// .persister(persister) + .open(); + } + + @Provides @Singleton + public Store, Integer> authorListStore(WordPressService wordPressService) { + return StoreBuilder.>key() + .fetcher(integer -> wordPressService.listAuthors().toObservable()) +// .persister(persister) + .open(); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/ApplicationComponent.java b/app/src/main/java/it/cosenonjaviste/ui/ApplicationComponent.java new file mode 100644 index 0000000..f2eefc4 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/ApplicationComponent.java @@ -0,0 +1,34 @@ +package it.cosenonjaviste.ui; + +import android.support.annotation.VisibleForTesting; + +import com.google.gson.Gson; + +import javax.inject.Singleton; + +import dagger.Component; +import it.cosenonjaviste.ui.author.AuthorListFragment; +import it.cosenonjaviste.ui.category.CategoryListFragment; +import it.cosenonjaviste.ui.contact.ContactFragment; +import it.cosenonjaviste.ui.page.PageFragment; +import it.cosenonjaviste.ui.post.PostListFragment; +import it.cosenonjaviste.ui.twitter.TweetListFragment; + +@Singleton +@Component(modules = {AppModule.class}) +public interface ApplicationComponent { + + @VisibleForTesting Gson gson(); + + void inject(PostListFragment postListFragment); + + void inject(AuthorListFragment authorListFragment); + + void inject(PageFragment pageFragment); + + void inject(TweetListFragment tweetListFragment); + + void inject(ContactFragment contactFragment); + + void inject(CategoryListFragment categoryListFragment); +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/CoseNonJavisteApp.java b/app/src/main/java/it/cosenonjaviste/ui/CoseNonJavisteApp.java new file mode 100644 index 0000000..11c411b --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/CoseNonJavisteApp.java @@ -0,0 +1,43 @@ +package it.cosenonjaviste.ui; + +import android.app.Application; +import android.content.Context; +import android.support.v4.app.Fragment; + +import com.crashlytics.android.Crashlytics; +import com.squareup.leakcanary.LeakCanary; + +import io.fabric.sdk.android.Fabric; +import it.cosenonjaviste.BuildConfig; + +public class CoseNonJavisteApp extends Application { + + private ApplicationComponent component; + + @Override public void onCreate() { + super.onCreate(); + if (!BuildConfig.DEBUG) { + Fabric.with(this, new Crashlytics()); + } + LeakCanary.install(this); + component = DaggerApplicationComponent.builder() + .appModule(new AppModule(this)) + .build(); + } + + public ApplicationComponent getComponent() { + return component; + } + + public static ApplicationComponent getComponent(Fragment fragment) { + return getComponent(fragment.getActivity()); + } + + public static ApplicationComponent getComponent(Context context) { + return ((CoseNonJavisteApp) context.getApplicationContext()).getComponent(); + } + + public void setComponent(ApplicationComponent component) { + this.component = component; + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/MainActivity.java b/app/src/main/java/it/cosenonjaviste/ui/MainActivity.java new file mode 100755 index 0000000..1896ceb --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/MainActivity.java @@ -0,0 +1,87 @@ +package it.cosenonjaviste.ui; + +import android.databinding.DataBindingUtil; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.view.GravityCompat; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.view.MenuItem; + +import it.cosenonjaviste.R; +import it.cosenonjaviste.databinding.ActivityMainBinding; +import it.cosenonjaviste.ui.author.AuthorListFragment; +import it.cosenonjaviste.ui.category.CategoryListFragment; +import it.cosenonjaviste.ui.contact.ContactFragment; +import it.cosenonjaviste.ui.post.PostListFragment; +import it.cosenonjaviste.ui.twitter.TweetListFragment; + +public class MainActivity extends AppCompatActivity { + private ActivityMainBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = DataBindingUtil.setContentView(this, R.layout.activity_main); + + setSupportActionBar(binding.toolbar); + + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeAsUpIndicator(R.drawable.ic_menu); + } + + binding.drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); + binding.leftDrawerMenu.setNavigationItemSelectedListener(menuItem -> { + selectItem(menuItem.getItemId()); + menuItem.setChecked(true); + return true; + }); + + if (savedInstanceState == null) { + selectItem(R.id.drawer_post); + binding.leftDrawerMenu.getMenu().findItem(R.id.drawer_post).setChecked(true); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + binding.drawerLayout.openDrawer(GravityCompat.START); + return true; + } + + return super.onOptionsItemSelected(item); + } + + private void selectItem(int menuItemId) { + String tag = "fragment_" + menuItemId; + Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag); + + if (fragment == null) { + fragment = createFragment(menuItemId); + } + + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment, tag).commit(); + + binding.drawerLayout.closeDrawer(binding.leftDrawerMenu); + } + + private Fragment createFragment(int menuItemId) { + switch (menuItemId) { + case R.id.drawer_categories: + return Fragment.instantiate(this, CategoryListFragment.class.getName()); + case R.id.drawer_authors: + return Fragment.instantiate(this, AuthorListFragment.class.getName()); + case R.id.drawer_twitter: + return Fragment.instantiate(this, TweetListFragment.class.getName()); + case R.id.drawer_contacts: + return Fragment.instantiate(this, ContactFragment.class.getName()); + default: + return Fragment.instantiate(this, PostListFragment.class.getName()); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/ui/MessageManager.java b/app/src/main/java/it/cosenonjaviste/ui/MessageManager.java new file mode 100644 index 0000000..f355b46 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/MessageManager.java @@ -0,0 +1,12 @@ +package it.cosenonjaviste.ui; + +import android.app.Activity; +import android.support.design.widget.Snackbar; + +public class MessageManager { + public void showMessage(Activity activity, int message) { + if (activity != null) { + Snackbar.make(activity.findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG).show(); + } + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/ui/author/AuthorListFragment.java new file mode 100644 index 0000000..6110801 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/author/AuthorListFragment.java @@ -0,0 +1,41 @@ +package it.cosenonjaviste.ui.author; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import javax.inject.Inject; +import javax.inject.Provider; + +import it.codingjam.lifecyclebinder.LifeCycleBinder; +import it.codingjam.lifecyclebinder.RetainedObjectProvider; +import it.cosenonjaviste.core.author.AuthorListViewModel; +import it.cosenonjaviste.databinding.AuthorCellBinding; +import it.cosenonjaviste.databinding.RecyclerBinding; +import it.cosenonjaviste.ui.CoseNonJavisteApp; +import it.cosenonjaviste.ui.utils.RecyclerBindingBuilder; + +public class AuthorListFragment extends Fragment { + + @RetainedObjectProvider("viewModel") @Inject Provider provider; + + AuthorListViewModel viewModel; + +// @BindLifeCycle @Inject AuthorListViewModel viewModel; + + @Override public void onCreate(Bundle state) { + super.onCreate(state); + CoseNonJavisteApp.getComponent(this).inject(this); + LifeCycleBinder.bind(this); + } + + @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return new RecyclerBindingBuilder<>(viewModel, RecyclerBinding.inflate(inflater, container, false)) + .gridLayoutManager(2) + .viewHolder(viewGroup -> new AuthorViewHolder(AuthorCellBinding.inflate(inflater, viewGroup, false), viewModel)) + .getRoot(); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/author/AuthorViewHolder.java b/app/src/main/java/it/cosenonjaviste/ui/author/AuthorViewHolder.java new file mode 100644 index 0000000..1ab37de --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/author/AuthorViewHolder.java @@ -0,0 +1,33 @@ +package it.cosenonjaviste.ui.author; + +import android.databinding.ObservableField; + +import it.cosenonjaviste.core.author.AuthorListViewModel; +import it.cosenonjaviste.databinding.AuthorCellBinding; +import it.cosenonjaviste.model.Author; +import it.cosenonjaviste.ui.recycler.BindableViewHolder; + + +public class AuthorViewHolder extends BindableViewHolder { + public final ObservableField item = new ObservableField<>(); + + private AuthorCellBinding binding; + + private AuthorListViewModel viewModel; + + public AuthorViewHolder(AuthorCellBinding binding, AuthorListViewModel viewModel) { + super(binding.getRoot()); + this.binding = binding; + this.viewModel = viewModel; + binding.setViewHolder(this); + } + + @Override public void bind(Author item) { + this.item.set(item); + binding.executePendingBindings(); + } + + public void onItemClicked() { + viewModel.goToAuthorDetail(getAdapterPosition()); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/bind/DataBindingConverters.java b/app/src/main/java/it/cosenonjaviste/ui/bind/DataBindingConverters.java new file mode 100644 index 0000000..84be910 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/bind/DataBindingConverters.java @@ -0,0 +1,88 @@ +package it.cosenonjaviste.ui.bind; + +import android.databinding.BindingAdapter; +import android.databinding.BindingConversion; +import android.support.design.widget.TextInputLayout; +import android.text.Html; +import android.text.TextUtils; +import android.view.View; +import android.webkit.WebView; +import android.widget.ImageView; +import android.widget.TextView; + +import com.squareup.picasso.Picasso; + +import java.util.Date; + +import it.cosenonjaviste.R; +import it.cosenonjaviste.ui.utils.CircleTransform; +import it.cosenonjaviste.ui.utils.DateFormatter; + +public class DataBindingConverters { + + private static CircleTransform circleTransformation; + + @BindingConversion + public static CharSequence convertDateToCharSequence(Date date) { + return DateFormatter.formatDate(date); + } + + @BindingAdapter("error") + public static void bindValidationError(TextInputLayout textInputLayout, int errorRes) { + if (errorRes != 0) { + textInputLayout.setError(textInputLayout.getResources().getString(errorRes)); + } else { + textInputLayout.setError(null); + } + } + + @BindingAdapter("visibleOrGone") + public static void bindVisibleOrGone(View view, boolean b) { + view.setVisibility(b ? View.VISIBLE : View.GONE); + } + + @BindingAdapter("visible") + public static void bindVisible(View view, boolean b) { + view.setVisibility(b ? View.VISIBLE : View.INVISIBLE); + } + + @BindingAdapter("userImageUrl") + public static void loadUserImage(ImageView view, String url) { + if (!TextUtils.isEmpty(url)) { + if (circleTransformation == null) { + circleTransformation = CircleTransform.createWithBorder(view.getResources(), R.dimen.author_image_size_big, R.color.colorPrimary, R.dimen.author_image_border); + } + Picasso.with(view.getContext()).load(url).transform(circleTransformation).into(view); + } else { + view.setImageDrawable(null); + } + } + + @BindingAdapter("imageUrl") + public static void loadImage(ImageView view, String url) { + if (!TextUtils.isEmpty(url)) { + Picasso.with(view.getContext()).load(url).into(view); + } else { + view.setImageDrawable(null); + } + } + + @BindingAdapter("textHtml") + public static void bindHtmlText(TextView view, String text) { + if (text != null) { + view.setText(Html.fromHtml(text)); + } else { + view.setText(""); + } + } + + @BindingAdapter("android:onClick") + public static void bindOnClick(View view, Runnable listener) { + view.setOnClickListener(v -> listener.run()); + } + + @BindingAdapter("url") + public static void bindOnClick(WebView view, String url) { + view.loadUrl(url); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/ui/category/CategoryListFragment.java new file mode 100644 index 0000000..ea9a25f --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/category/CategoryListFragment.java @@ -0,0 +1,39 @@ +package it.cosenonjaviste.ui.category; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import javax.inject.Inject; +import javax.inject.Provider; + +import it.codingjam.lifecyclebinder.LifeCycleBinder; +import it.codingjam.lifecyclebinder.RetainedObjectProvider; +import it.cosenonjaviste.core.category.CategoryListViewModel; +import it.cosenonjaviste.databinding.CategoryRowBinding; +import it.cosenonjaviste.databinding.RecyclerBinding; +import it.cosenonjaviste.ui.CoseNonJavisteApp; +import it.cosenonjaviste.ui.utils.RecyclerBindingBuilder; + +public class CategoryListFragment extends Fragment { + + @RetainedObjectProvider("viewModel") @Inject Provider provider; + + CategoryListViewModel viewModel; + + @Override public void onCreate(Bundle state) { + super.onCreate(state); + CoseNonJavisteApp.getComponent(this).inject(this); + LifeCycleBinder.bind(this); + } + + @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return new RecyclerBindingBuilder<>(viewModel, RecyclerBinding.inflate(inflater, container, false)) + .gridLayoutManager(2) + .viewHolder(viewGroup -> new CategoryViewHolder(CategoryRowBinding.inflate(inflater, viewGroup, false), viewModel)) + .getRoot(); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/category/CategoryViewHolder.java b/app/src/main/java/it/cosenonjaviste/ui/category/CategoryViewHolder.java new file mode 100644 index 0000000..4b44546 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/category/CategoryViewHolder.java @@ -0,0 +1,33 @@ +package it.cosenonjaviste.ui.category; + +import android.databinding.ObservableField; + +import it.cosenonjaviste.core.category.CategoryListViewModel; +import it.cosenonjaviste.databinding.CategoryRowBinding; +import it.cosenonjaviste.model.Category; +import it.cosenonjaviste.ui.recycler.BindableViewHolder; + + +public class CategoryViewHolder extends BindableViewHolder { + public final ObservableField item = new ObservableField<>(); + + private CategoryRowBinding binding; + + private CategoryListViewModel viewModel; + + public CategoryViewHolder(CategoryRowBinding binding, CategoryListViewModel viewModel) { + super(binding.getRoot()); + this.binding = binding; + this.viewModel = viewModel; + binding.setViewHolder(this); + } + + @Override public void bind(Category item) { + this.item.set(item); + binding.executePendingBindings(); + } + + public void onItemClicked() { + viewModel.goToPosts(getAdapterPosition()); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/contact/ContactFragment.java b/app/src/main/java/it/cosenonjaviste/ui/contact/ContactFragment.java new file mode 100644 index 0000000..2f84eef --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/contact/ContactFragment.java @@ -0,0 +1,37 @@ +package it.cosenonjaviste.ui.contact; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import javax.inject.Inject; +import javax.inject.Provider; + +import it.codingjam.lifecyclebinder.LifeCycleBinder; +import it.codingjam.lifecyclebinder.RetainedObjectProvider; +import it.cosenonjaviste.R; +import it.cosenonjaviste.core.contact.ContactViewModel; +import it.cosenonjaviste.databinding.ContactBinding; +import it.cosenonjaviste.ui.CoseNonJavisteApp; + +public class ContactFragment extends Fragment { + + @RetainedObjectProvider("viewModel") @Inject Provider provider; + + ContactViewModel viewModel; + + @Override public void onCreate(Bundle state) { + super.onCreate(state); + CoseNonJavisteApp.getComponent(this).inject(this); + LifeCycleBinder.bind(this); + } + + @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + ContactBinding binding = ContactBinding.bind(inflater.inflate(R.layout.contact, container, false)); + binding.setViewModel(viewModel); + return binding.getRoot(); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/ui/page/PageFragment.java new file mode 100644 index 0000000..794b0d6 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/page/PageFragment.java @@ -0,0 +1,122 @@ +package it.cosenonjaviste.ui.page; + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.WebResourceResponse; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; + +import javax.inject.Inject; +import javax.inject.Provider; + +import it.codingjam.lifecyclebinder.LifeCycleBinder; +import it.codingjam.lifecyclebinder.RetainedObjectProvider; +import it.cosenonjaviste.R; +import it.cosenonjaviste.core.page.PageViewModel; +import it.cosenonjaviste.databinding.PostDetailBinding; +import it.cosenonjaviste.ui.CoseNonJavisteApp; + +public class PageFragment extends Fragment { + + @RetainedObjectProvider("viewModel") @Inject Provider provider; + + PageViewModel viewModel; + + @Override public void onCreate(Bundle state) { + super.onCreate(state); + CoseNonJavisteApp.getComponent(this).inject(this); + LifeCycleBinder.bind(this); + } + + @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + PostDetailBinding binding = PostDetailBinding.bind(inflater.inflate(R.layout.post_detail, container, false)); + binding.setViewModel(viewModel); + + AppCompatActivity activity = (AppCompatActivity) getActivity(); + activity.setSupportActionBar(binding.toolbar); + activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + WebSettings settings = binding.webView.getSettings(); + settings.setJavaScriptEnabled(true); + File externalFilesDir = getActivity().getExternalFilesDir(null); + if (externalFilesDir != null) { + settings.setAppCachePath(externalFilesDir.getAbsolutePath()); + settings.setAppCacheMaxSize(20 * 1024 * 1024); + settings.setAppCacheEnabled(true); + settings.setCacheMode(WebSettings.LOAD_DEFAULT); + } + + binding.collapsingToolbar.setTitle(""); + + binding.webView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView webView, String url) { + webView.loadUrl(url); + return true; + } + + @Override public WebResourceResponse shouldInterceptRequest(WebView view11, String url) { + if (url.contains("codingjam.it/wp-content/themes/bliss/style.css?ver=4.4.2")) { + return getCssWebResourceResponseFromAsset(); + } + if (url.startsWith("https://pbs.twimg.com/") + || url.startsWith("https://cdn.syndication.twimg.com/") + || url.startsWith("https://syndication.twitter.com") + || url.contains("platform.twitter.com/") + || url.startsWith("http://www.facebook.com/plugins/like_box.php") + || url.startsWith("https://fbcdn-profile-") + || url.contains("sharethis.com/") + || url.contains("disquscdn.com/") + || url.contains("sharethis-gtm-pixel") + || url.contains("facebook.com/") + || url.contains("fbcdn.net/") + || url.contains("/contact-form-7/") + || url.contains("/catablog/") + || url.contains("/advanced-random-posts-widget/") + || url.contains("/yet-another-related-posts-plugin/") + || url.contains("/wp-social-seo-booster/") + || url.contains("/extended-categories-widget/") + || url.contains("google-analytics.com/") + || url.contains("cf_action=sync_comments") + || url.startsWith("http://www.cosenonjaviste.it/wp-includes/js/comment-reply.min.js") + || url.startsWith("https://fbstatic-a.akamaihd.net") + || url.startsWith("https://glitter.services.disqus.com") + || url.startsWith("http://connect.facebook.net") + || url.startsWith("http://disqus.com/") + || url.startsWith("https://referrer.disqus.com") + || url.startsWith("http://cosenonjaviste.disqus.com/") + || url.equals("http://www.cosenonjaviste.it/wp-content/uploads/2013/06/favicon.ico") + ) { + return new WebResourceResponse("", "", new ByteArrayInputStream(new byte[0])); + } + return super.shouldInterceptRequest(view11, url); + } + + private WebResourceResponse getCssWebResourceResponseFromAsset() { + try { + return new WebResourceResponse("text/css", "UTF-8", getActivity().getAssets().open("style.css")); + } catch (IOException e) { + return null; + } + } + + @Override + public void onPageFinished(WebView webView, String url) { + super.onPageFinished(webView, url); + viewModel.htmlLoaded(); + } + }); + return binding.getRoot(); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/ui/post/PostListFragment.java new file mode 100644 index 0000000..b956979 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/post/PostListFragment.java @@ -0,0 +1,52 @@ +package it.cosenonjaviste.ui.post; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import javax.inject.Inject; +import javax.inject.Provider; + +import it.codingjam.lifecyclebinder.LifeCycleBinder; +import it.codingjam.lifecyclebinder.RetainedObjectProvider; +import it.cosenonjaviste.core.post.PostListViewModel; +import it.cosenonjaviste.databinding.PostRowBinding; +import it.cosenonjaviste.databinding.RecyclerBinding; +import it.cosenonjaviste.ui.CoseNonJavisteApp; +import it.cosenonjaviste.ui.utils.RecyclerBindingBuilder; + +public class PostListFragment extends Fragment { + + @RetainedObjectProvider("viewModel") @Inject Provider provider; + + PostListViewModel viewModel; + + @Override public void onCreate(Bundle state) { + super.onCreate(state); + CoseNonJavisteApp.getComponent(this).inject(this); + LifeCycleBinder.bind(this); + } + + @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + RecyclerBinding binding = RecyclerBinding.inflate(inflater, container, false); + AppCompatActivity activity = (AppCompatActivity) getActivity(); + + if (viewModel.isToolbarVisible()) { + binding.toolbar.setVisibility(View.VISIBLE); + activity.setSupportActionBar(binding.toolbar); + if (activity.getSupportActionBar() != null) { + activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); + activity.getSupportActionBar().setTitle(viewModel.getToolbarTitle()); + } + } + + return new RecyclerBindingBuilder<>(viewModel, binding) + .viewHolder(viewGroup -> new PostViewHolder(PostRowBinding.inflate(inflater, viewGroup, false), viewModel)) + .loadMoreListener(viewModel::loadNextPage) + .getRoot(); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/post/PostViewHolder.java b/app/src/main/java/it/cosenonjaviste/ui/post/PostViewHolder.java new file mode 100644 index 0000000..69cef10 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/post/PostViewHolder.java @@ -0,0 +1,33 @@ +package it.cosenonjaviste.ui.post; + +import android.databinding.ObservableField; + +import it.cosenonjaviste.core.post.PostListViewModel; +import it.cosenonjaviste.databinding.PostRowBinding; +import it.cosenonjaviste.model.Post; +import it.cosenonjaviste.ui.recycler.BindableViewHolder; + + +public class PostViewHolder extends BindableViewHolder { + public final ObservableField item = new ObservableField<>(); + + private PostRowBinding binding; + + private PostListViewModel viewModel; + + public PostViewHolder(PostRowBinding binding, PostListViewModel viewModel) { + super(binding.getRoot()); + this.binding = binding; + this.viewModel = viewModel; + binding.setViewHolder(this); + } + + @Override public void bind(Post item) { + this.item.set(item); + binding.executePendingBindings(); + } + + public void onItemClicked() { + viewModel.goToDetail(getAdapterPosition()); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/ui/recycler/AdapterOnListChangedCallback.java b/app/src/main/java/it/cosenonjaviste/ui/recycler/AdapterOnListChangedCallback.java new file mode 100755 index 0000000..1f7e64e --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/recycler/AdapterOnListChangedCallback.java @@ -0,0 +1,48 @@ +/* + * Copyright 2015 Fabio Collini. + * + * 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 it.cosenonjaviste.ui.recycler; + +import android.databinding.ObservableList; +import android.support.v7.widget.RecyclerView; + +public class AdapterOnListChangedCallback extends ObservableList.OnListChangedCallback> { + + private RecyclerView.Adapter adapter; + + public AdapterOnListChangedCallback(RecyclerView.Adapter adapter) { + this.adapter = adapter; + } + + @Override public void onChanged(ObservableList sender) { + adapter.notifyDataSetChanged(); + } + + @Override public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) { + adapter.notifyItemRangeChanged(positionStart, itemCount); + } + + @Override public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) { + adapter.notifyItemRangeInserted(positionStart, itemCount); + } + + @Override public void onItemRangeMoved(ObservableList sender, int fromPosition, int toPosition, int itemCount) { + adapter.notifyDataSetChanged(); + } + + @Override public void onItemRangeRemoved(ObservableList sender, int positionStart, int itemCount) { + adapter.notifyItemRangeRemoved(positionStart, itemCount); + } +} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/ui/recycler/BindableAdapter.java b/app/src/main/java/it/cosenonjaviste/ui/recycler/BindableAdapter.java new file mode 100755 index 0000000..65716d1 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/recycler/BindableAdapter.java @@ -0,0 +1,127 @@ +/* + * Copyright 2015 Fabio Collini. + * + * 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 it.cosenonjaviste.ui.recycler; + +import android.databinding.ObservableList; +import android.support.v7.widget.RecyclerView; +import android.view.ViewGroup; + +import java.util.ArrayList; +import java.util.List; + +public class BindableAdapter extends RecyclerView.Adapter> { + + private final ObservableList.OnListChangedCallback> onListChangedCallback; + + private ObservableList items; + + private List> viewHolderFactories = new ArrayList<>(); + + private ViewHolderFactory defaultViewHolderFactory; + + private List viewTypeSelectors = new ArrayList<>(); + + private BindListener onBindListener; + + public BindableAdapter(ObservableList items) { + this(items, null); + } + + public BindableAdapter(ObservableList items, ViewHolderFactory defaultViewHolderFactory) { + this.items = items; + this.defaultViewHolderFactory = defaultViewHolderFactory; + //saved in a field to maintain a reference and avoid garbage collection + onListChangedCallback = new AdapterOnListChangedCallback<>(this); + items.addOnListChangedCallback((ObservableList.OnListChangedCallback) new WeakOnListChangedCallback<>(onListChangedCallback)); + if (!items.isEmpty()) { + notifyDataSetChanged(); + } + } + + public void addViewType(ViewHolderFactory viewHolderFactory, ViewTypeSelector selector) { + viewHolderFactories.add(viewHolderFactory); + viewTypeSelectors.add(selector); + } + + public void addViewType(ViewHolderFactory viewHolderFactory, final Class itemClass) { + viewHolderFactories.add(viewHolderFactory); + viewTypeSelectors.add(new ClassViewTypeSelector<>(itemClass)); + } + + @Override public int getItemViewType(int position) { + int i = 0; + for (ViewTypeSelector selector : viewTypeSelectors) { + if (selector.isOfViewType(position)) { + return i; + } + i++; + } + if (defaultViewHolderFactory == null) { + throw new RuntimeException("No factory found and no default factory available for item in position " + position); + } + return -1; + } + + @Override public BindableViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { + ViewHolderFactory factory; + if (viewType != -1) { + factory = viewHolderFactories.get(viewType); + } else { + factory = defaultViewHolderFactory; + } + return (BindableViewHolder) factory.create(viewGroup); + } + + @Override public void onBindViewHolder(BindableViewHolder viewHolder, int position) { + viewHolder.bind(items.get(position)); + if (onBindListener != null) { + onBindListener.call(viewHolder, position); + } + } + + @Override public int getItemCount() { + return items.size(); + } + + public void setOnBindListener(BindListener onBindListener) { + this.onBindListener = onBindListener; + } + + public interface ViewHolderFactory { + BindableViewHolder create(ViewGroup viewGroup); + } + + public interface ViewTypeSelector { + boolean isOfViewType(int position); + } + + public interface BindListener { + void call(BindableViewHolder viewHolder, Integer position); + } + + private class ClassViewTypeSelector implements ViewTypeSelector { + private final Class itemClass; + + public ClassViewTypeSelector(Class itemClass) { + this.itemClass = itemClass; + } + + @Override public boolean isOfViewType(int position) { + T item = items.get(position); + return item != null && item.getClass().isAssignableFrom(itemClass); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/ui/recycler/BindableViewHolder.java b/app/src/main/java/it/cosenonjaviste/ui/recycler/BindableViewHolder.java new file mode 100755 index 0000000..f7cc885 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/recycler/BindableViewHolder.java @@ -0,0 +1,28 @@ +/* + * Copyright 2015 Fabio Collini. + * + * 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 it.cosenonjaviste.ui.recycler; + +import android.support.v7.widget.RecyclerView; +import android.view.View; + +public abstract class BindableViewHolder extends RecyclerView.ViewHolder { + + public BindableViewHolder(View itemView) { + super(itemView); + } + + public abstract void bind(T item); +} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/ui/recycler/WeakOnListChangedCallback.java b/app/src/main/java/it/cosenonjaviste/ui/recycler/WeakOnListChangedCallback.java new file mode 100755 index 0000000..1b4ed82 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/recycler/WeakOnListChangedCallback.java @@ -0,0 +1,60 @@ +/* + * Copyright 2015 Fabio Collini. + * + * 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 it.cosenonjaviste.ui.recycler; + +import android.databinding.ObservableList; +import android.databinding.ObservableList.OnListChangedCallback; + +import java.lang.ref.WeakReference; + +public class WeakOnListChangedCallback extends OnListChangedCallback { + + private WeakReference> ref; + + public WeakOnListChangedCallback(OnListChangedCallback delegate) { + this.ref = new WeakReference<>(delegate); + } + + @Override public void onChanged(T sender) { + if (ref.get() != null) { + ref.get().onChanged(sender); + } + } + + @Override public void onItemRangeChanged(T sender, int positionStart, int itemCount) { + if (ref.get() != null) { + ref.get().onItemRangeChanged(sender, positionStart, itemCount); + } + } + + @Override public void onItemRangeInserted(T sender, int positionStart, int itemCount) { + if (ref.get() != null) { + ref.get().onItemRangeInserted(sender, positionStart, itemCount); + } + } + + @Override public void onItemRangeMoved(T sender, int fromPosition, int toPosition, int itemCount) { + if (ref.get() != null) { + ref.get().onItemRangeMoved(sender, fromPosition, toPosition, itemCount); + } + } + + @Override public void onItemRangeRemoved(T sender, int positionStart, int itemCount) { + if (ref.get() != null) { + ref.get().onItemRangeRemoved(sender, positionStart, itemCount); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/ui/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/ui/twitter/TweetListFragment.java new file mode 100644 index 0000000..0ef762d --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/twitter/TweetListFragment.java @@ -0,0 +1,39 @@ +package it.cosenonjaviste.ui.twitter; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import javax.inject.Inject; +import javax.inject.Provider; + +import it.codingjam.lifecyclebinder.LifeCycleBinder; +import it.codingjam.lifecyclebinder.RetainedObjectProvider; +import it.cosenonjaviste.core.twitter.TweetListViewModel; +import it.cosenonjaviste.databinding.RecyclerBinding; +import it.cosenonjaviste.databinding.TweetRowBinding; +import it.cosenonjaviste.ui.CoseNonJavisteApp; +import it.cosenonjaviste.ui.utils.RecyclerBindingBuilder; + +public class TweetListFragment extends Fragment { + + @RetainedObjectProvider("viewModel") @Inject Provider provider; + + TweetListViewModel viewModel; + + @Override public void onCreate(Bundle state) { + super.onCreate(state); + CoseNonJavisteApp.getComponent(this).inject(this); + LifeCycleBinder.bind(this); + } + + @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return new RecyclerBindingBuilder<>(viewModel, RecyclerBinding.inflate(inflater, container, false)) + .viewHolder(viewGroup -> new TweetViewHolder(TweetRowBinding.inflate(inflater, viewGroup, false))) + .loadMoreListener(viewModel::loadNextPage) + .getRoot(); + } +} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/ui/twitter/TweetViewHolder.java b/app/src/main/java/it/cosenonjaviste/ui/twitter/TweetViewHolder.java new file mode 100644 index 0000000..ef75f33 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/twitter/TweetViewHolder.java @@ -0,0 +1,25 @@ +package it.cosenonjaviste.ui.twitter; + +import android.databinding.ObservableField; + +import it.cosenonjaviste.databinding.TweetRowBinding; +import it.cosenonjaviste.model.Tweet; +import it.cosenonjaviste.ui.recycler.BindableViewHolder; + + +public class TweetViewHolder extends BindableViewHolder { + public final ObservableField item = new ObservableField<>(); + + private TweetRowBinding binding; + + public TweetViewHolder(TweetRowBinding binding) { + super(binding.getRoot()); + this.binding = binding; + binding.setViewHolder(this); + } + + @Override public void bind(Tweet item) { + this.item.set(item); + binding.executePendingBindings(); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/utils/CircleTransform.java b/app/src/main/java/it/cosenonjaviste/ui/utils/CircleTransform.java similarity index 78% rename from app/src/main/java/it/cosenonjaviste/utils/CircleTransform.java rename to app/src/main/java/it/cosenonjaviste/ui/utils/CircleTransform.java index 7cbe9a5..a7062e9 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/CircleTransform.java +++ b/app/src/main/java/it/cosenonjaviste/ui/utils/CircleTransform.java @@ -1,6 +1,6 @@ -package it.cosenonjaviste.utils; +package it.cosenonjaviste.ui.utils; -import android.content.Context; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapShader; @@ -16,22 +16,18 @@ public class CircleTransform implements Transformation { private int borderColor; private int imageSize; - public static CircleTransform create(Context context, int dimensionResource) { - return new CircleTransform(context, dimensionResource, false, 0, 0); + public static CircleTransform createWithBorder(Resources resources, int dimensionResource, int colorRes, int borderSizeResource) { + return new CircleTransform(resources, dimensionResource, true, colorRes, borderSizeResource); } - public static CircleTransform createWithBorder(Context context, int dimensionResource, int colorRes, int borderSizeResource) { - return new CircleTransform(context, dimensionResource, true, colorRes, borderSizeResource); - } - - private CircleTransform(Context context, int dimensionResource, boolean showBorder, int colorRes, int borderSizeResource) { + private CircleTransform(Resources resources, int dimensionResource, boolean showBorder, int colorRes, int borderSizeResource) { this.showBorder = showBorder; if (borderSizeResource != 0) { - borderSize = context.getResources().getDimensionPixelSize(borderSizeResource); + borderSize = resources.getDimensionPixelSize(borderSizeResource); } - imageSize = context.getResources().getDimensionPixelSize(dimensionResource); + imageSize = resources.getDimensionPixelSize(dimensionResource); if (colorRes != 0) { - borderColor = context.getResources().getColor(colorRes); + borderColor = resources.getColor(colorRes); } } diff --git a/app/src/main/java/it/cosenonjaviste/utils/DateFormatter.java b/app/src/main/java/it/cosenonjaviste/ui/utils/DateFormatter.java similarity index 89% rename from app/src/main/java/it/cosenonjaviste/utils/DateFormatter.java rename to app/src/main/java/it/cosenonjaviste/ui/utils/DateFormatter.java index 9c47052..25f5308 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/DateFormatter.java +++ b/app/src/main/java/it/cosenonjaviste/ui/utils/DateFormatter.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste.utils; +package it.cosenonjaviste.ui.utils; import android.text.format.DateUtils; diff --git a/app/src/main/java/it/cosenonjaviste/ui/utils/EndlessRecyclerOnScrollListener.java b/app/src/main/java/it/cosenonjaviste/ui/utils/EndlessRecyclerOnScrollListener.java new file mode 100644 index 0000000..c3ecf69 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/utils/EndlessRecyclerOnScrollListener.java @@ -0,0 +1,48 @@ +package it.cosenonjaviste.ui.utils; + +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; + +public class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener { + + private int previousTotal = 0; // The total number of items in the dataset after the last load + private boolean loading = true; // True if we are still waiting for the last set of data to load. + private int visibleThreshold = 2; // The minimum amount of items to have below your current scroll position before loading more. + private int firstVisibleItem, visibleItemCount, totalItemCount; + + private Runnable listener; + + public EndlessRecyclerOnScrollListener(Runnable listener) { + this.listener = listener; + } + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); + + visibleItemCount = recyclerView.getChildCount(); + totalItemCount = layoutManager.getItemCount(); + firstVisibleItem = layoutManager.findFirstVisibleItemPosition(); + + if (loading) { + if (totalItemCount > previousTotal) { + loading = false; + previousTotal = totalItemCount; + } + } + if (!loading && (totalItemCount - visibleItemCount) + <= (firstVisibleItem + visibleThreshold)) { + // End has been reached + + // Do something + onLoadMore(); + + loading = true; + } + } + + public void onLoadMore() { + listener.run(); + } +} \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/ui/utils/RecyclerBindingBuilder.java b/app/src/main/java/it/cosenonjaviste/ui/utils/RecyclerBindingBuilder.java new file mode 100644 index 0000000..9590b32 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/utils/RecyclerBindingBuilder.java @@ -0,0 +1,58 @@ +package it.cosenonjaviste.ui.utils; + +import android.support.annotation.NonNull; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; +import android.view.View; + +import it.cosenonjaviste.R; +import it.cosenonjaviste.core.list.ListModel; +import it.cosenonjaviste.core.list.RxListViewModel; +import it.cosenonjaviste.databinding.RecyclerBinding; +import it.cosenonjaviste.ui.recycler.BindableAdapter; + +public class RecyclerBindingBuilder { + + private final RxListViewModel> viewModel; + + private RecyclerBinding binding; + + public RecyclerBindingBuilder(RxListViewModel> viewModel, RecyclerBinding binding) { + this.viewModel = viewModel; + this.binding = binding; + this.binding.swipeRefresh.setColorSchemeResources(R.color.colorPrimary, R.color.cnj_border, R.color.cnj_selection); + this.binding.setViewModel(viewModel); + } + + public RecyclerBinding getBinding() { + if (binding.list.getLayoutManager() == null) { + linearLayoutManager(); + } + return binding; + } + + public View getRoot() { + return getBinding().getRoot(); + } + + public RecyclerBindingBuilder linearLayoutManager() { + binding.list.setLayoutManager(new LinearLayoutManager(binding.list.getContext())); + return this; + } + + public RecyclerBindingBuilder gridLayoutManager(int spanCount) { + binding.list.setLayoutManager(new GridLayoutManager(binding.list.getContext(), spanCount)); + return this; + } + + public RecyclerBindingBuilder loadMoreListener(Runnable listener) { + binding.list.addOnScrollListener(new EndlessRecyclerOnScrollListener(listener)); + return this; + } + + @NonNull + public RecyclerBindingBuilder viewHolder(BindableAdapter.ViewHolderFactory factory) { + binding.list.setAdapter(new BindableAdapter<>(viewModel.getModel().getItems(), factory)); + return this; + } +} diff --git a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java b/app/src/main/java/it/cosenonjaviste/ui/utils/SingleFragmentActivity.java similarity index 60% rename from app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java rename to app/src/main/java/it/cosenonjaviste/ui/utils/SingleFragmentActivity.java index 9e2e474..5e43481 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java +++ b/app/src/main/java/it/cosenonjaviste/ui/utils/SingleFragmentActivity.java @@ -1,41 +1,49 @@ -package it.cosenonjaviste.utils; +package it.cosenonjaviste.ui.utils; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.os.Parcelable; import android.support.v4.app.Fragment; -import android.support.v7.app.ActionBarActivity; -import android.support.v7.widget.Toolbar; +import android.support.v4.app.FragmentActivity; +import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.core.base.ArgumentManager; -public class SingleFragmentActivity extends ActionBarActivity { +public class SingleFragmentActivity extends AppCompatActivity { private static final String VIEW_CLASS = "viewClass"; - public static Intent createIntent(Context context, Class> viewClass) { - Intent intent = new Intent(context, SingleFragmentActivity.class); + public static Intent populateIntent(Intent intent, Class viewClass) { intent.putExtra(VIEW_CLASS, viewClass.getName()); return intent; } - public static Intent createIntent(Class> viewClass) { + public static Intent createIntent(Context context, Class viewClass) { + Intent intent = new Intent(context, SingleFragmentActivity.class); + populateIntent(intent, viewClass); + return intent; + } + + public static Intent createIntent(Class viewClass) { Intent intent = new Intent(); - intent.putExtra(VIEW_CLASS, viewClass.getName()); + populateIntent(intent, viewClass); return intent; } + public static void open(FragmentActivity activity, Class viewClass, ARG arg) { + Intent intent = createIntent(activity, viewClass); + ArgumentManager.writeArgument(intent, arg); + activity.startActivity(intent); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.single_fragment); - setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); - - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - if (savedInstanceState == null) { String viewClassName = getIntent().getStringExtra(VIEW_CLASS); Fragment fragment = Fragment.instantiate(this, viewClassName); diff --git a/app/src/main/java/it/cosenonjaviste/ui/utils/TextWatcherAdapter.java b/app/src/main/java/it/cosenonjaviste/ui/utils/TextWatcherAdapter.java new file mode 100644 index 0000000..a0a7d20 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ui/utils/TextWatcherAdapter.java @@ -0,0 +1,15 @@ +package it.cosenonjaviste.ui.utils; + +import android.text.Editable; +import android.text.TextWatcher; + +public class TextWatcherAdapter implements TextWatcher { + @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override public void afterTextChanged(Editable s) { + } +} diff --git a/app/src/main/project.properties b/app/src/main/project.properties new file mode 100644 index 0000000..b853455 --- /dev/null +++ b/app/src/main/project.properties @@ -0,0 +1,2 @@ +android.library.reference.1=../../build/intermediates/exploded-aar/com.android.support/appcompat-v7/21.0.0 +android.library.reference.2=../../build/intermediates/exploded-aar/com.android.support/support-v4/21.0.0 diff --git a/app/src/main/res/color/drawer_text.xml b/app/src/main/res/color/drawer_text.xml deleted file mode 100644 index 7a3b9bc..0000000 --- a/app/src/main/res/color/drawer_text.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_email_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_email_black_24dp.png new file mode 100644 index 0000000..36c6311 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_email_black_24dp.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_home_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_home_black_24dp.png new file mode 100644 index 0000000..9f61d7b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_home_black_24dp.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_label_outline_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_label_outline_black_24dp.png new file mode 100644 index 0000000..49b2151 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_label_outline_black_24dp.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_launcher.png b/app/src/main/res/drawable-hdpi/ic_launcher.png deleted file mode 100755 index 7ff053f..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_menu.png b/app/src/main/res/drawable-hdpi/ic_menu.png new file mode 100755 index 0000000..e7641b6 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_menu.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_person_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_person_black_24dp.png new file mode 100644 index 0000000..6fbcc6d Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_person_black_24dp.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_public_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_public_black_24dp.png new file mode 100644 index 0000000..ba5a426 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_public_black_24dp.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_share_white_24dp.png new file mode 100644 index 0000000..b09a692 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_share_white_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_email_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_email_black_24dp.png new file mode 100644 index 0000000..4325faf Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_email_black_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_home_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_home_black_24dp.png new file mode 100644 index 0000000..9f2c3d2 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_home_black_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_label_outline_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_label_outline_black_24dp.png new file mode 100644 index 0000000..1d600c2 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_label_outline_black_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_launcher.png b/app/src/main/res/drawable-mdpi/ic_launcher.png deleted file mode 100755 index 3f1b83c..0000000 Binary files a/app/src/main/res/drawable-mdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_menu.png b/app/src/main/res/drawable-mdpi/ic_menu.png new file mode 100755 index 0000000..44f1645 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_menu.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_person_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_person_black_24dp.png new file mode 100644 index 0000000..57da32a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_person_black_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_public_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_public_black_24dp.png new file mode 100644 index 0000000..6c186d1 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_public_black_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_share_white_24dp.png new file mode 100644 index 0000000..e944fd7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_share_white_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_email_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_email_black_24dp.png new file mode 100644 index 0000000..70620e4 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_email_black_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_home_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_home_black_24dp.png new file mode 100644 index 0000000..dcdcfc0 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_home_black_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_label_outline_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_label_outline_black_24dp.png new file mode 100644 index 0000000..7c470b6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_label_outline_black_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_launcher.png b/app/src/main/res/drawable-xhdpi/ic_launcher.png deleted file mode 100755 index 60b9943..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_menu.png b/app/src/main/res/drawable-xhdpi/ic_menu.png new file mode 100755 index 0000000..63ef7a6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_menu.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_person_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_person_black_24dp.png new file mode 100644 index 0000000..360a32f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_person_black_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_public_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_public_black_24dp.png new file mode 100644 index 0000000..87b0492 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_public_black_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png new file mode 100644 index 0000000..22a8783 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_email_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_email_black_24dp.png new file mode 100644 index 0000000..3d13627 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_email_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_home_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_home_black_24dp.png new file mode 100644 index 0000000..2e86cc2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_home_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_label_outline_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_label_outline_black_24dp.png new file mode 100644 index 0000000..9a16a70 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_label_outline_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/app/src/main/res/drawable-xxhdpi/ic_launcher.png deleted file mode 100755 index 524fed7..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_menu.png b/app/src/main/res/drawable-xxhdpi/ic_menu.png new file mode 100755 index 0000000..5fb1f06 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_menu.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_person_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_person_black_24dp.png new file mode 100644 index 0000000..f1e1484 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_person_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_public_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_public_black_24dp.png new file mode 100644 index 0000000..757729c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_public_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png new file mode 100644 index 0000000..a35b3cd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_email_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_email_black_24dp.png new file mode 100644 index 0000000..e81645b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_email_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_home_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_home_black_24dp.png new file mode 100644 index 0000000..04e2b26 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_home_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_label_outline_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_label_outline_black_24dp.png new file mode 100644 index 0000000..888bfd3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_label_outline_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_launcher.png b/app/src/main/res/drawable-xxxhdpi/ic_launcher.png deleted file mode 100755 index df36d4f..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_menu.png b/app/src/main/res/drawable-xxxhdpi/ic_menu.png new file mode 100755 index 0000000..cf80518 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_menu.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_person_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_person_black_24dp.png new file mode 100644 index 0000000..1ebc37b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_person_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_public_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_public_black_24dp.png new file mode 100644 index 0000000..fccc1a0 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_public_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png new file mode 100644 index 0000000..e351c7b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png differ diff --git a/app/src/main/res/drawable/detail_shadow.xml b/app/src/main/res/drawable/detail_shadow.xml new file mode 100644 index 0000000..aa2ca23 --- /dev/null +++ b/app/src/main/res/drawable/detail_shadow.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/logocnj.png b/app/src/main/res/drawable/logocnj.png index 773b2a0..6383e5f 100644 Binary files a/app/src/main/res/drawable/logocnj.png and b/app/src/main/res/drawable/logocnj.png differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 633cbbc..a38c52d 100755 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,53 +1,39 @@ - + - + android:layout_height="match_parent"> - - - - - - - - - - - + + + + + + + + - + app:headerLayout="@layout/drawer_header" + app:menu="@menu/drawer"/> - + + \ No newline at end of file diff --git a/app/src/main/res/layout/author_cell.xml b/app/src/main/res/layout/author_cell.xml index 35036b1..4cff40e 100644 --- a/app/src/main/res/layout/author_cell.xml +++ b/app/src/main/res/layout/author_cell.xml @@ -1,54 +1,55 @@ - + - + + + + + - - - - - - - - - - - \ No newline at end of file + android:layout_height="wrap_content" + android:foreground="?android:attr/selectableItemBackground" + card_view:cardUseCompatPadding="true" + android:onClick="@{() -> viewHolder.onItemClicked()}"> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/category_row.xml b/app/src/main/res/layout/category_row.xml index 46f8885..6207ad8 100644 --- a/app/src/main/res/layout/category_row.xml +++ b/app/src/main/res/layout/category_row.xml @@ -1,35 +1,45 @@ - + - + + + + + + android:layout_height="wrap_content" + android:foreground="?android:attr/selectableItemBackground" + card_view:cardUseCompatPadding="true" + android:onClick="@{() -> viewHolder.onItemClicked()}"> + + - + - + - - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout/contact.xml b/app/src/main/res/layout/contact.xml new file mode 100644 index 0000000..a7c8b37 --- /dev/null +++ b/app/src/main/res/layout/contact.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +