This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [lucide-vue-next](https://lucide.dev) ([source](https://redirect.github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-vue-next)) | [`^0.509.0` -> `^0.510.0`](https://renovatebot.com/diffs/npm/lucide-vue-next/0.509.0/0.510.0) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | | [pnpm](https://pnpm.io) ([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) | [`10.10.0` -> `10.11.0`](https://renovatebot.com/diffs/npm/pnpm/10.10.0/10.11.0) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>lucide-icons/lucide (lucide-vue-next)</summary> ### [`v0.510.0`](https://redirect.github.com/lucide-icons/lucide/releases/tag/0.510.0): Version 0.510.0 [Compare Source](https://redirect.github.com/lucide-icons/lucide/compare/0.509.0...0.510.0) #### What's Changed - fix(icons): changed `brackets` icon by [@​jguddas](https://redirect.github.com/jguddas) in [https://github.com/lucide-icons/lucide/pull/3172](https://redirect.github.com/lucide-icons/lucide/pull/3172) - feat(icons): added `check-line` icon by [@​oosawy](https://redirect.github.com/oosawy) in [https://github.com/lucide-icons/lucide/pull/2890](https://redirect.github.com/lucide-icons/lucide/pull/2890) #### New Contributors - [@​oosawy](https://redirect.github.com/oosawy) made their first contribution in [https://github.com/lucide-icons/lucide/pull/2890](https://redirect.github.com/lucide-icons/lucide/pull/2890) **Full Changelog**: https://github.com/lucide-icons/lucide/compare/0.509.0...0.510.0 </details> <details> <summary>pnpm/pnpm (pnpm)</summary> ### [`v10.11.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm/CHANGELOG.md#10110) [Compare Source](https://redirect.github.com/pnpm/pnpm/compare/v10.10.0...v10.11.0) ##### Minor Changes - A new setting added for `pnpm init` to create a `package.json` with `type=module`, when `init-type` is `module`. Works as a flag for the init command too [#​9463](https://redirect.github.com/pnpm/pnpm/pull/9463). - Added support for Nushell to `pnpm setup` [#​6476](https://redirect.github.com/pnpm/pnpm/issues/6476). - Added two new flags to the `pnpm audit` command, `--ignore` and `--ignore-unfixable` [#​8474](https://redirect.github.com/pnpm/pnpm/pull/8474). Ignore all vulnerabilities that have no solution: ```shell > pnpm audit --ignore-unfixable ``` Provide a list of CVE's to ignore those specifically, even if they have a resolution. ```shell > pnpm audit --ignore=CVE-2021-1234 --ignore=CVE-2021-5678 ``` - Added support for recursively running pack in every project of a workspace [#​4351](https://redirect.github.com/pnpm/pnpm/issues/4351). Now you can run `pnpm -r pack` to pack all packages in the workspace. ##### Patch Changes - pnpm version management should work, when `dangerouslyAllowAllBuilds` is set to `true` [#​9472](https://redirect.github.com/pnpm/pnpm/issues/9472). - `pnpm link` should work from inside a workspace [#​9506](https://redirect.github.com/pnpm/pnpm/issues/9506). - Set the default `workspaceConcurrency` to `Math.min(os.availableParallelism(), 4)` [#​9493](https://redirect.github.com/pnpm/pnpm/pull/9493). - Installation should not exit with an error if `strictPeerDependencies` is `true` but all issues are ignored by `peerDependencyRules` [#​9505](https://redirect.github.com/pnpm/pnpm/pull/9505). - Read `updateConfig` from `pnpm-workspace.yaml` [#​9500](https://redirect.github.com/pnpm/pnpm/issues/9500). - Add support for `recursive pack` - Remove `url.parse` usage to fix warning on Node.js 24 [#​9492](https://redirect.github.com/pnpm/pnpm/issues/9492). - `pnpm run` should be able to run commands from the workspace root, if `ignoreScripts` is set tot `true` [#​4858](https://redirect.github.com/pnpm/pnpm/issues/4858). </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. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- 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:eyJjcmVhdGVkSW5WZXIiOiI0MC43LjEiLCJ1cGRhdGVkSW5WZXIiOiI0MC4xMS45IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.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';
2. Configure TailwindCSS
Create a tailwind.config.ts file with the following configuration:
import tailwindConfig from '@unraid/ui/tailwind.config.ts';
import type { Config } from 'tailwindcss';
export default {
presets: [tailwindConfig],
content: [
// ... your content paths
'./components/**/*.{js,vue,ts}',
'./layouts/**/*.vue',
'./pages/**/*.vue',
],
theme: {
extend: {
// your theme extensions
},
},
} satisfies Partial<Config>;
This configuration:
- Uses the Unraid UI library's Tailwind config as a preset
- Properly types your configuration with TypeScript
- Allows you to extend the base theme while maintaining all Unraid UI defaults
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'],
},
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',
},
};