vueless
Version:
Vue Styleless UI Component Library, powered by Tailwind CSS.
128 lines (108 loc) • 3.07 kB
text/typescript
import { ref, computed } from "vue";
import {
getArgTypes,
getSlotNames,
getSlotsFragment,
getDocsDescription,
} from "../../utils/storybook";
import ULoaderOverlay from "../ULoaderOverlay.vue";
import UButton from "../../ui.button/UButton.vue";
import USelect from "../../ui.form-select/USelect.vue";
import type { Meta, StoryFn } from "@storybook/vue3-vite";
import type { Props } from "../types";
interface ULoaderOverlayArgs extends Props {
slotTemplate?: string;
enum: "color";
}
export default {
id: "9030",
title: "Loaders and Skeletons / Loader Overlay",
component: ULoaderOverlay,
argTypes: {
...getArgTypes(ULoaderOverlay.__name),
},
parameters: {
docs: {
...getDocsDescription(ULoaderOverlay.__name),
story: {
height: "420px",
},
},
},
} as Meta;
const DefaultTemplate: StoryFn<ULoaderOverlayArgs> = (args: ULoaderOverlayArgs) => ({
components: { ULoaderOverlay },
setup: () => ({ args, slots: getSlotNames(ULoaderOverlay.__name) }),
template: `
<ULoaderOverlay v-bind="args">
${args.slotTemplate || getSlotsFragment("")}
</ULoaderOverlay>
`,
});
const EnumTemplate: StoryFn<ULoaderOverlayArgs> = (args: ULoaderOverlayArgs, { argTypes }) => ({
components: { ULoaderOverlay, USelect },
setup() {
const selectModel = ref(null);
const options = computed(() => {
return argTypes?.[args.enum]?.options?.map((label, value) => ({ label, value }));
});
const selectedValue = computed(() => {
return options.value?.find((option) => option.value === selectModel.value)?.label;
});
return {
args,
selectModel,
selectedValue,
options,
};
},
template: `
<USelect
v-model="selectModel"
:options="options"
placeholder="Select loader color..."
open-direction="bottom"
class="max-w-60 absolute z-[99999]"
/>
<ULoaderOverlay :color="selectedValue" />
`,
});
const LoadingTemplate: StoryFn<ULoaderOverlayArgs> = (args: ULoaderOverlayArgs) => ({
components: { ULoaderOverlay, UButton },
setup() {
const isLoading = ref(true);
function loaderOverlayOn() {
isLoading.value = true;
}
function loaderOverlayOff() {
isLoading.value = false;
}
return { args, isLoading, loaderOverlayOn, loaderOverlayOff };
},
template: `
<UButton
size="sm"
label="Toggle loading"
class="absolute z-[99999]"
@click="isLoading ? loaderOverlayOff() : loaderOverlayOn()"
/>
<ULoaderOverlay
v-bind="args"
:loading="isLoading"
/>
`,
});
export const Default = DefaultTemplate.bind({});
Default.args = {};
export const Loading = LoadingTemplate.bind({});
Loading.args = {};
export const Colors = EnumTemplate.bind({});
Colors.args = { enum: "color" };
export const DefaultSlot = DefaultTemplate.bind({});
DefaultSlot.args = {
slotTemplate: `
<template #default>
<img src="https://media.tenor.com/9zmtHZ0tIjkAAAAi/nyancat-rainbow-cat.gif" alt="Cat" />
</template>
`,
};