vueless
Version:
Vue Styleless UI Component Library, powered by Tailwind CSS.
179 lines (158 loc) • 4.66 kB
text/typescript
import { ref } from "vue";
import {
getArgs,
getArgTypes,
getSlotNames,
getSlotsFragment,
getDocsDescription,
} from "../../utils/storybook.ts";
import UToggle from "../../ui.button-toggle/UToggle.vue";
import UIcon from "../../ui.image-icon/UIcon.vue";
import URow from "../../ui.container-row/URow.vue";
import UBadge from "../../ui.text-badge/UBadge.vue";
import UDot from "../../ui.other-dot/UDot.vue";
import ULabel from "../../ui.form-label/ULabel.vue";
import type { Meta, StoryFn } from "@storybook/vue3-vite";
import type { Props } from "../types.ts";
interface UToggleArgs extends Props {
slotTemplate?: string;
enum: "size";
}
export default {
components: { UIcon },
title: "Buttons & Links / Toggle",
component: UToggle,
args: {
modelValue: "11",
options: [
{ value: "11", label: "Admin" },
{ value: "12", label: "Manager" },
{ value: "13", label: "Employee" },
{ value: "14", label: "Guest" },
],
},
argTypes: {
...getArgTypes(UToggle.__name),
},
parameters: {
docs: {
...getDocsDescription(UToggle.__name),
},
},
} as Meta;
const DefaultTemplate: StoryFn<UToggleArgs> = (args: UToggleArgs) => ({
components: { UToggle, UIcon, UBadge, UDot, ULabel },
setup: () => ({ args, slots: getSlotNames(UToggle.__name) }),
template: `
<UToggle v-bind="args" v-model="args.modelValue">
${args.slotTemplate || getSlotsFragment("")}
</UToggle>
`,
});
const EnumTemplate: StoryFn<UToggleArgs> = (args: UToggleArgs, { argTypes }) => ({
components: { UToggle, URow },
setup: () => ({ args, argTypes, getArgs }),
template: `
<URow>
<UToggle
v-for="option in argTypes?.[args.enum]?.options"
v-bind="getArgs(args, option)"
:key="option"
v-model="args.modelValue"
class="w-auto"
/>
</URow>
`,
});
export const Default = DefaultTemplate.bind({});
Default.args = { name: "Default" };
export const Sizes = EnumTemplate.bind({});
Sizes.args = {
name: "sizeTemplate",
enum: "size",
modelValue: 1,
options: [
{ value: 1, label: "{enumValue}" },
{ value: 2, label: "{enumValue}" },
],
};
export const Multiple = DefaultTemplate.bind({});
Multiple.args = { name: "multiple", multiple: true, modelValue: ["11", "12"] };
export const Block = DefaultTemplate.bind({});
Block.args = { name: "block", block: true };
export const Split = DefaultTemplate.bind({});
Split.args = { name: "split", split: true };
export const Round = DefaultTemplate.bind({});
Round.args = { name: "round", round: true, split: true };
export const Square = DefaultTemplate.bind({});
Square.args = {
name: "square",
square: true,
options: [
{ value: "11", icon: "star" },
{ value: "12", icon: "add" },
{ value: "13", icon: "timer" },
],
};
export const Disabled = DefaultTemplate.bind({});
Disabled.args = {
name: "DisabledItems",
disabled: true,
};
export const DisabledItems = DefaultTemplate.bind({});
DisabledItems.args = {
name: "DisabledItems",
options: [
{ value: "11", label: "Admin" },
{ value: "12", label: "Editor", disabled: true },
{ value: "13", label: "Viewer" },
{ value: "14", label: "Guest", disabled: true },
],
};
export const OptionSlot: StoryFn<UToggleArgs> = (args) => ({
components: { UToggle, UDot, ULabel },
setup() {
const modelValue = ref("1");
return { args, modelValue };
},
template: `
<ULabel label="Select transaction status:">
<UToggle
name="optionSlot"
v-model="modelValue"
:options="[
{ value: '1', label: 'Success', color: 'success' },
{ value: '2', label: 'Warning', color: 'warning' },
{ value: '3', label: 'Error', color: 'error' },
]"
>
<template #option="{ option }">
<UDot :color="option.color" />
{{ option.label }}
</template>
</UToggle>
</ULabel>
`,
});
export const Slots: StoryFn<UToggleArgs> = (args) => ({
components: { UToggle, URow, UIcon },
setup() {
const leftModel = ref("11");
const rightModel = ref("13");
return { args, leftModel, rightModel };
},
template: `
<URow>
<UToggle v-bind="args" v-model="leftModel" name="leftSlot">
<template #left="{ index }">
<UIcon size="sm" color="inherit" v-if="index === 0" name="settings" />
</template>
</UToggle>
<UToggle v-bind="args" v-model="rightModel" name="rightSlot">
<template #right="{ index }">
<div class="font-medium" v-if="index === 2">(24)</div>
</template>
</UToggle>
</URow>
`,
});