This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [vue-sonner](https://redirect.github.com/xiaoluoboding/vue-sonner) | [`1.3.2` -> `2.0.8`](https://renovatebot.com/diffs/npm/vue-sonner/1.3.2/2.0.8) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>xiaoluoboding/vue-sonner (vue-sonner)</summary> ### [`v2.0.8`](https://redirect.github.com/xiaoluoboding/vue-sonner/blob/HEAD/CHANGELOG.md#208-2025-08-18) [Compare Source](https://redirect.github.com/xiaoluoboding/vue-sonner/compare/v2.0.7...v2.0.8) ##### Bug Fixes - fixed the type for nuxt 4 ([e60b0bd](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/e60b0bd56f85493b0a3f4256ce7934a7cd12684f)) ### [`v2.0.7`](https://redirect.github.com/xiaoluoboding/vue-sonner/blob/HEAD/CHANGELOG.md#207-2025-08-17) [Compare Source](https://redirect.github.com/xiaoluoboding/vue-sonner/compare/v2.0.2...v2.0.7) ##### Bug Fixes - custom component not trigger on dismiss function ([d5a69c6](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/d5a69c6ae113fec77f992b17dd7167c616277a71)) - fixed the build error ([5ec4bca](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/5ec4bca24fc9e619012e71a4a771ddf58846bc93)) - improve expanded state management in Toaster component ([5acca24](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/5acca24250712e3842ababf5233ecb7902ae54be)) - postcss-calc will change the style ([f0d6add](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/f0d6add116b3b86c1e55320d158203f675901882)) ##### Features - add a new example ([cb08aef](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/cb08aef616b20535153ad942a693f72952e65791)) - add example for close all ([70ef6e2](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/70ef6e2b7fde2533324d426a4ef1528f6ab5d422)) ### [`v2.0.2`](https://redirect.github.com/xiaoluoboding/vue-sonner/blob/HEAD/CHANGELOG.md#202-2025-07-17) [Compare Source](https://redirect.github.com/xiaoluoboding/vue-sonner/compare/v2.0.1...v2.0.2) ### [`v2.0.1`](https://redirect.github.com/xiaoluoboding/vue-sonner/blob/HEAD/CHANGELOG.md#201-2025-06-23) [Compare Source](https://redirect.github.com/xiaoluoboding/vue-sonner/compare/v2.0.0...v2.0.1) ##### Bug Fixes - fixed multiple position bug ([9b07801](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/9b07801f5ffc835b89c0bbeb9ca42444764379e7)) - **theme:** make theme='system' reactive with watchEffect ([3b57e90](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/3b57e904989e4a9789743cd219c1a31bf0cf8290)) - **tsconfig:** add tsconfig.includes files ([e0d469b](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/e0d469b84e6e6724e8e66f4a3c1c309f73418184)) ##### Features - add do not generate css logic ([61458fb](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/61458fb7aa010d126b65e57fd819e50a94e8c307)) ### [`v2.0.0`](https://redirect.github.com/xiaoluoboding/vue-sonner/blob/HEAD/CHANGELOG.md#200-2025-05-21) [Compare Source](https://redirect.github.com/xiaoluoboding/vue-sonner/compare/v1.3.2...v2.0.0) ##### Bug Fixes - add packages path ([35490b3](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/35490b3fb5a8e5294265582a2eff6ca5583ff308)) - add packages path ([c7424e9](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/c7424e9070a7c660c7dbc2e9add38291569f61e3)) - fixed for nuxt module ([261eaf0](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/261eaf0be2b424144b47ac7faf45659e44c19372)) - fixed for nuxt module ([29751cf](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/29751cfd5b58e6c7b9f536e853b6a24f3737b8e4)) - format ([9033f2b](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/9033f2b9355bb73aafdf1c9a941ef30ab8df12b4)) #### [1.3.2](https://redirect.github.com/xiaoluoboding/vue-sonner/compare/v1.3.0...v1.3.2) (2025-04-12) ##### Bug Fixes - improve CSS insertion logic to handle document loading state ([6b22d24](https://redirect.github.com/xiaoluoboding/vue-sonner/commit/6b22d2458b615db9261ad855684a73b0d0182b13)) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/unraid/api). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNy4yIiwidXBkYXRlZEluVmVyIjoiNDEuNzEuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Eli Bosley <ekbosley@gmail.com>
Unraid UI
A Vue 3 component library providing a set of reusable, accessible UI components for Unraid development.
Features
- ⚡️ Built with Vue 3 and TypeScript
- 🎭 Storybook documentation
- ✅ Tested components
- 🎪 Built on top of TailwindCSS and Shadcn/UI
Installation
Make sure you have the peer dependencies installed:
npm install vue@^3.3.0 tailwindcss@^3.0.0
Setup
1. Add CSS
Import the component library styles in your main entry file:
import '@unraid/ui/style.css';
Usage
<script setup lang="ts">
import { Button } from '@unraid/ui';
</script>
<template>
<Button variant="primary"> Click me </Button>
</template>
Development
Local Development
Install dependencies:
npm install
Start Storybook development server:
npm run storybook
This will start Storybook at http://localhost:6006
Building
npm run build
Testing
Run tests:
npm run test
Run tests with UI:
npm run test:ui
Generate coverage report:
npm run coverage
Type Checking
npm run typecheck
Scripts
dev: Start development serverbuild: Build for productionpreview: Preview production buildtest: Run teststest:ui: Run tests with UIcoverage: Generate test coverageclean: Remove build artifactstypecheck: Run type checkingstorybook: Start Storybook development serverbuild-storybook: Build Storybook for production
License
Component Development
Installing Shadcn Components
- Install a new component using the Shadcn CLI:
npx shadcn-vue@latest add [component-name]
-
The component will be installed in the root components folder. Move it to the appropriate subfolder based on its type:
- Form components →
src/components/form/ - Layout components →
src/components/layout/ - Common components →
src/components/common/ - Brand components →
src/components/brand/
- Form components →
-
Update any imports in your codebase to reflect the new component location.
Component Variants Pattern
We use the class-variance-authority (CVA) package to manage component variants. Each component that supports variants should follow this pattern:
- Create a variants file (e.g.,
button.variants.ts):
import { cva } from 'class-variance-authority';
export const buttonVariants = cva('base-classes-here', {
variants: {
variant: {
primary: 'variant-specific-classes',
secondary: 'variant-specific-classes',
// ... other variants
},
size: {
sm: 'size-specific-classes',
md: 'size-specific-classes',
lg: 'size-specific-classes',
},
},
defaultVariants: {
variant: 'primary',
size: 'md',
},
});
- Use the variants in your component (e.g.,
Button.vue):
<script setup lang="ts">
import { computed } from "vue";
import { buttonVariants } from "./button.variants";
import { cn } from "@/lib/utils";
export interface ButtonProps {
variant?: "primary" | "secondary" | /* other variants */;
size?: "sm" | "md" | "lg";
class?: string;
}
const props = withDefaults(defineProps<ButtonProps>(), {
variant: "primary",
size: "md",
});
const buttonClass = computed(() => {
return cn(
buttonVariants({ variant: props.variant, size: props.size }),
props.class
);
});
</script>
<template>
<button :class="buttonClass">
<slot />
</button>
</template>
Storybook Development
We use Storybook for component development and documentation. To start the Storybook development server:
npm run storybook
This will start Storybook at http://localhost:6006
When creating stories for your components:
- Place story files in the
storiesdirectory - Name your story files as
ComponentName.stories.ts - Include examples of all variants and states
- Add documentation using JSDoc comments
Example story file:
import type { Meta, StoryObj } from '@storybook/vue3';
import { Button } from '../src/components/common/button';
const meta = {
title: 'Components/Button',
component: Button,
tags: ['autodocs'],
argTypes: {
variant: {
control: 'select',
options: ['primary', 'secondary', 'outline-solid'],
},
size: {
control: 'select',
options: ['sm', 'md', 'lg'],
},
},
} satisfies Meta<typeof Button>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Primary: Story = {
args: {
variant: 'primary',
size: 'md',
},
};
export const Secondary: Story = {
args: {
variant: 'secondary',
size: 'md',
},
};