diff --git a/README.md b/README.md
index 679de04..a7e0341 100644
--- a/README.md
+++ b/README.md
@@ -74,7 +74,8 @@ After you have initialized the component, use it everywhere you want in your app
dash="60 0.9"
animation="reverse 700 400"
:noData="false"
- :loading="false"
+ :loading="false"
+ :loader="{ color: 'green' }"
fontColor="white"
:half="false"
:gap="10"
@@ -115,6 +116,7 @@ This table below provides a quick overview over all available options. To gain m
| **[`legendFormatter`](#legendformatter)** [](#legendformatter) | Function | Function that returns formatted value | |
| **[`animation`](#animation)** | String | "default \| rs \| loop \| reverse \| bounce [duration delay]" | "default 1000 400"|
| **[`loading`](#loading)** | Boolean | |false|
+| **[`loader`](#loading)** | Object | { [thickness, color, lineMode, line, opacity ]} | |
| **[`determinate`](#determinate)** | Boolean | |false|
| **[`noData`](#nodata)** | Boolean | |false|
| **[`angle`](#angle)** | Number | any Number |-90|
@@ -406,6 +408,21 @@ Forces loading state. The component provides an indeterminate loading state for
+- ### `loader`
+
+With this option defined as Object you can customize the loading circle that is shown in the states
+[loading](#loading) and [determinate](#determinate). Accepted properties are [`color`](#color), [`thickness`](#thickness), [`line`](#line),
+[`lineMode`](#linemode) and `opactity`. `opacity` is specific for loading circle and can be any valid CSS opacity value. If the option is not specified, the loading circle replicates the progress circle with a 0.55 default value for `opacity`.
+
+###### Example: :scroll:
+
+```vue
+
+
+```
+
+
+
- ### `determinate`
Provides a determinate loading state that indicates that your data loading is still in progress but allows to show the **[`progress`](#progress)**.
diff --git a/package.json b/package.json
index 711431c..c46967d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "vue-ellipse-progress",
- "version": "2.0.0-alpha.2",
+ "version": "2.0.0-alpha.3",
"private": false,
"description": "A Vue.js component to create beautiful animated circular progress bars",
"main": "./dist/vue-ellipse-progress.umd.min.js",
diff --git a/src/App.vue b/src/App.vue
index cb627ce..055cae6 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -48,6 +48,7 @@
:thickness="20"
:empty-thickness="10"
dot="10 red"
+ :loader="{ thickness: 40, color: 'red' }"
line-mode="bottom"
:no-data="noData"
:determinate="determinate"
@@ -73,6 +74,7 @@
line-mode="out 20"
:no-data="noData"
:determinate="determinate"
+ :loader="{ thickness: 40, color: 'red' }"
>
TASKS DONE
diff --git a/src/components/Circle/Circle.vue b/src/components/Circle/Circle.vue
index 5511380..cdbbde7 100644
--- a/src/components/Circle/Circle.vue
+++ b/src/components/Circle/Circle.vue
@@ -25,26 +25,7 @@
-
-
-
-
+
import CircleMixin from "./circleMixin";
import FadeInTransition from "../FadeInTransition.vue";
+import CircleLoader from "./CircleLoader.vue";
export default {
name: "CircleProgress",
- components: { FadeInTransition },
+ components: { CircleLoader, FadeInTransition },
mixins: [CircleMixin],
computed: {
position() {
diff --git a/src/components/Circle/CircleContainer.vue b/src/components/Circle/CircleContainer.vue
index 57d1869..e5d48af 100644
--- a/src/components/Circle/CircleContainer.vue
+++ b/src/components/Circle/CircleContainer.vue
@@ -27,7 +27,7 @@ import CircleProgress from "./Circle.vue";
import CircleDot from "./CircleDot.vue";
export default {
- name: "EpCircleContainer",
+ name: "CircleContainer",
components: { CircleDot, CircleProgress, HalfCircleProgress, Gradient },
props: {
options: {
diff --git a/src/components/Circle/CircleLoader.vue b/src/components/Circle/CircleLoader.vue
new file mode 100644
index 0000000..1e71e12
--- /dev/null
+++ b/src/components/Circle/CircleLoader.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Circle/HalfCircle.vue b/src/components/Circle/HalfCircle.vue
index 8b4a8b3..3a4ef72 100644
--- a/src/components/Circle/HalfCircle.vue
+++ b/src/components/Circle/HalfCircle.vue
@@ -24,25 +24,7 @@
-
-
-
-
+
@@ -63,10 +45,11 @@
+
+
diff --git a/src/components/VueEllipseProgress.vue b/src/components/VueEllipseProgress.vue
index 56b555f..cbf86e2 100644
--- a/src/components/VueEllipseProgress.vue
+++ b/src/components/VueEllipseProgress.vue
@@ -39,7 +39,7 @@ import { getNumberIfValid, isValidNumber } from "../utils";
import props from "./interface";
import CircleContainer from "./Circle/CircleContainer.vue";
import Counter from "./Counter.vue";
-import parseOptions from "./optionsParser";
+import { parseOptions, calcThickness, lineModeParser } from "./optionsParser";
export default {
name: "VueEllipseProgress",
@@ -84,17 +84,19 @@ export default {
const previousCircles = [];
for (let i = 0; i < this.circlesData.length; i++) {
const options = this.circlesData[i];
- normalizedCircles.push({
- ...parseOptions({
- index: i,
- id: i,
- ...options,
- globalDot: this.dot,
- globalGap: this.gap,
- globalThickness: this.thickness,
- previousCircles: [...previousCircles],
- }),
+ const parsedOptions = parseOptions({
+ index: i,
+ id: i,
+ ...options,
+ globalDot: this.dot,
+ globalGap: this.gap,
+ globalThickness: this.thickness,
+ previousCircles: [...previousCircles],
});
+ const loaderOptions = { ...parsedOptions, ...parsedOptions.loader };
+ loaderOptions.thickness = calcThickness(loaderOptions.thickness, parsedOptions.size);
+ loaderOptions.lineMode = parsedOptions.loader.lineMode ? lineModeParser(loaderOptions) : parsedOptions.lineMode;
+ normalizedCircles.push({ ...parsedOptions, loader: loaderOptions });
const { gap, thickness, dot } = normalizedCircles[i];
previousCircles.push({ gap, thickness, dot });
}
diff --git a/src/components/interface.js b/src/components/interface.js
index 8dd0349..089b1ad 100644
--- a/src/components/interface.js
+++ b/src/components/interface.js
@@ -13,7 +13,10 @@ const colorConfig = (defaultColor = "transparent") => ({
},
});
-export default {
+const validateLoaderProps = (loaderOptions) =>
+ Object.keys(loaderOptions).every((p) => options[p].validator(loaderOptions[p]));
+
+const options = {
data: {
type: Array,
required: false,
@@ -164,4 +167,20 @@ export default {
type: Function,
required: false,
},
+ loader: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ validator: (value) => {
+ const propsAllowed = Object.keys(value).every((prop) =>
+ ["thickness", "color", "lineMode", "line", "opacity"].includes(prop)
+ );
+ if (propsAllowed) {
+ return validateLoaderProps(value);
+ }
+ return false;
+ },
+ },
};
+
+export default options;
diff --git a/src/components/optionsParser.js b/src/components/optionsParser.js
index b142266..fa286f3 100644
--- a/src/components/optionsParser.js
+++ b/src/components/optionsParser.js
@@ -1,6 +1,6 @@
import { getNumberIfValid, isValidNumber } from "@/utils";
-const lineModeParser = (options) => {
+export const lineModeParser = (options) => {
const lineModeConfig = options.lineMode.trim().split(" ");
const mode = options.multiple ? "multiple" : lineModeConfig[0];
return {
@@ -49,12 +49,12 @@ const dotParser = (dot) => {
};
};
-const calcThickness = (thickness, size) => {
+export const calcThickness = (thickness, size) => {
const value = parseFloat(thickness);
return thickness.toString().includes("%") ? (value * size) / 100 : value;
};
-export default (options) => {
+export const parseOptions = (options) => {
const dot = dotParser(options.dot);
const globalDot = dotParser(options.globalDot);
return {
diff --git a/src/styles/animationsUsage.scss b/src/styles/animationsUsage.scss
index f1e8704..df20db7 100644
--- a/src/styles/animationsUsage.scss
+++ b/src/styles/animationsUsage.scss
@@ -17,7 +17,7 @@
}
}
-.ep-circle--loading {
+.ep-circle--loader {
&.animation__loading {
animation-name: ep-progress--loading, ep-progress--loading__rotation;
animation-iteration-count: infinite !important;
@@ -26,7 +26,7 @@
}
}
-.ep-half-circle--loading {
+.ep-half-circle--loader {
&.animation__loading {
animation-name: ep-half-progress--loading;
animation-iteration-count: infinite !important;