Skip to content

Commit 219ebc5

Browse files
committed
feat: ULoader: add variant prop for supporting dots and spinner options
1 parent cac970d commit 219ebc5

File tree

4 files changed

+33
-4
lines changed

4 files changed

+33
-4
lines changed

src/ui.loader/ULoader.vue

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { useTemplateRef } from "vue";
44
import { useUI } from "../composables/useUI";
55
import { getDefaults } from "../utils/ui";
66
7+
import UIcon from "../ui.image-icon/UIcon.vue";
8+
79
import { COMPONENT_NAME, ELLIPSES_AMOUNT } from "./constants";
810
import defaultConfig from "./config";
911
@@ -29,15 +31,21 @@ defineExpose({
2931
* Get element / nested component attributes for each config token ✨
3032
* Applies: `class`, `config`, redefined default `props` and dev `vl-...` attributes.
3133
*/
32-
const { getDataTest, config, loaderAttrs, ellipseAttrs } = useUI<Config>(defaultConfig);
34+
const { getDataTest, config, loaderAttrs, ellipseAttrs, spinnerIconAttrs } =
35+
useUI<Config>(defaultConfig);
3336
</script>
3437

3538
<template>
3639
<Transition v-bind="config.loaderTransition">
3740
<div v-if="loading" ref="loader" v-bind="loaderAttrs" :data-test="getDataTest()">
3841
<!-- @slot Use it to add something instead of the default loader. -->
3942
<slot>
40-
<div v-for="ellipse in ELLIPSES_AMOUNT" :key="ellipse" v-bind="ellipseAttrs" />
43+
<template v-if="variant === 'spinner'">
44+
<UIcon :name="config.defaults.spinnerIcon" :color="color" v-bind="spinnerIconAttrs" />
45+
</template>
46+
<template v-else>
47+
<div v-for="ellipse in ELLIPSES_AMOUNT" :key="ellipse" v-bind="ellipseAttrs" />
48+
</template>
4149
</slot>
4250
</div>
4351
</Transition>

src/ui.loader/config.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export default /*tw*/ {
22
loader: {
3-
base: "relative flex items-center",
3+
base: "relative flex items-center justify-center",
44
variants: {
55
size: {
66
sm: "h-1.5 w-9",
@@ -49,9 +49,22 @@ export default /*tw*/ {
4949
},
5050
},
5151
},
52+
spinnerIcon: {
53+
base: "{UIcon} animate-spin",
54+
defaults: {
55+
size: {
56+
sm: "sm",
57+
md: "md",
58+
lg: "lg",
59+
},
60+
},
61+
},
5262
defaults: {
5363
color: "primary",
64+
variant: "dots",
5465
size: "md",
5566
loading: false,
67+
/* icons */
68+
spinnerIcon: "progress_activity",
5669
},
5770
};

src/ui.loader/storybook/stories.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import type { Props } from "../types";
1616

1717
interface ULoaderArgs extends Props {
1818
slotTemplate?: string;
19-
enum: "size" | "color";
19+
enum: "size" | "color" | "variant";
2020
}
2121

2222
export default {
@@ -82,6 +82,9 @@ const LoadingTemplate: StoryFn<ULoaderArgs> = (args: ULoaderArgs) => ({
8282
export const Default = DefaultTemplate.bind({});
8383
Default.args = {};
8484

85+
export const Variants = EnumTemplate.bind({});
86+
Variants.args = { enum: "variant" };
87+
8588
export const Sizes = EnumTemplate.bind({});
8689
Sizes.args = { enum: "size" };
8790

src/ui.loader/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ export interface Props {
3030
*/
3131
size?: "sm" | "md" | "lg";
3232

33+
/**
34+
* Loader variant.
35+
*/
36+
variant?: "dots" | "spinner";
37+
3338
/**
3439
* Component config object.
3540
*/

0 commit comments

Comments
 (0)