xiaomai c6f2feed14 feat(ui): integrate Shadcn UI
This commit integrates the Shadcn UI component library to provide a foundational set of components for the application's
user interface.

Key changes include:
- Added necessary dependencies like `class-variance-authority`, `clsx`, and `tailwind-merge`.
- Initialized Shadcn via its CLI, creating the `components.json` configuration file.
- Configured TypeScript path aliases in `tsconfig.json` and `tsconfig.app.json` to support `@/*` imports.
- Implemented CSS variables for theming, supporting both light and dark modes, in `main.css`.
- Added the standard `cn` utility function for merging Tailwind CSS classes.
- Updated `README.md` with detailed setup instructions for Shadcn UI.
2025-09-17 23:32:29 +08:00
2025-09-17 20:29:40 +08:00
2025-09-17 20:29:40 +08:00
2025-09-17 23:32:29 +08:00
2025-09-17 20:29:40 +08:00
2025-09-17 20:29:40 +08:00
2025-09-17 20:29:40 +08:00
2025-09-17 20:29:40 +08:00
2025-09-17 23:32:29 +08:00
2025-09-17 20:29:40 +08:00
2025-09-17 20:29:40 +08:00
2025-09-17 20:29:40 +08:00
2025-09-17 23:32:29 +08:00
2025-09-17 23:32:29 +08:00
2025-09-17 23:32:29 +08:00
2025-09-17 23:32:29 +08:00
2025-09-17 20:29:40 +08:00

Framework Combination

This is a learning project that combines multiple frameworks to create a demo application.

  • Base framework: Vue 3 + Vite 7
  • CSS framework: Tailwind CSS 4
  • UI framework: Shadcn UI
  • Package manager: pnpm

Development Setup

To set up this project from scratch:

pnpm create vue@latest
# Enter your project name
# Select: TypeScript, Router, Pinia, ESLint (Optional), Prettier
# Choose "Empty Project"
pnpm install
pnpm dev

Tailwind CSS Integration

Tailwind CSS v3

For reference, Tailwind CSS v3 setup (as learned from ChatGPT) involves:

pnpm add -D tailwindcss@3.4.1 postcss autoprefixer
pnpm exec tailwindcss init -p     # Generates tailwind.config.js and postcss.config.js

Tailwind CSS v4

Tailwind CSS 4 simplifies the setup significantly:

pnpm add tailwindcss @tailwindcss/vite

Register the Tailwind CSS plugin in vite.config.ts:

import tailwindcss from '@tailwindcss/vite'

export default defineConfig({
  plugins: [
    // ...
    tailwindcss(),
  ],
  // ...
})

Create src/styles/main.css with the following content:

@import 'tailwindcss';

/* Define theme (Tailwind CSS 4 no longer uses tailwind.config.js) */
@theme {
  /* Primary color palette */
  --color-primary-50: #f0f9ff;
  --color-primary-100: #e0f2fe;
  --color-primary-200: #bae6fd;
  --color-primary-300: #7dd3fc;
  --color-primary-400: #38bdf8;
  --color-primary-500: #0ea5e9;
  --color-primary-600: #0284c7;
  --color-primary-700: #0369a1;
  --color-primary-800: #075985;
  --color-primary-900: #0c4a6e;

  /* Animation variable */
  --animate-float: float 6s ease-in-out infinite;

  /* Keyframes */
  @keyframes float {
    0%,
    100% {
      transform: translateY(0);
    }
    50% {
      transform: translateY(-10px);
    }
  }
}

/* Custom utility/class for gradient text (optional) */
@layer utilities {
  .text-gradient {
    @apply bg-gradient-to-r from-primary-600 to-primary-400 bg-clip-text text-transparent;
  }
}

/* Alternative syntax: 
@utility text-gradient {
  @apply bg-gradient-to-r from-primary-600 to-primary-400 bg-clip-text text-transparent;
}
*/

Import the stylesheet in main.ts:

import '@/styles/main.css'

Now you can use Tailwind CSS atomic classes in your project.


Example Usage for Tailwind CSS v4

<script setup lang="ts"></script>

<template>
  <div class="bg-white dark:bg-gray-800 rounded-lg px-6 py-8 ring shadow-xl ring-gray-900/5">
    <div>
      <span class="inline-flex items-center justify-center rounded-md bg-indigo-500 p-2 shadow-lg">
        <svg
          class="h-6 w-6 text-white"
          fill="none"
          viewBox="0 0 24 24"
          stroke="currentColor"
          aria-hidden="true"
        >
          <!-- Icon SVG content -->
        </svg>
      </span>
    </div>
    <h3 class="text-gray-900 dark:text-white mt-5 text-base font-medium tracking-tight">
      Writes Upside-Down
    </h3>
    <p class="text-gray-500 dark:text-gray-400 mt-2 text-sm">
      The Zero Gravity Pen can be used to write in any orientation, including upside-down. It even
      works in outer space.
    </p>
  </div>
</template>

Shadcn UI

Installation guide adapted from the official Shadcn UI Vite documentation.

1. Configure TypeScript Paths

Add the baseUrl and paths properties to the compilerOptions section in both tsconfig.json and tsconfig.app.json to enable absolute imports:

tsconfig.json

{
  "files": [],
  "references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.app.json" }],
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}

tsconfig.app.json

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}

This allows you to import files from src using @/ instead of relative paths like ../../.


2. Install Node Type Definitions

Shadcn UI requires Node type definitions for TypeScript. Install them as a development dependency:

pnpm add -D @types/node

3. Initialize Shadcn CLI

Run the Shadcn CLI to set up the UI components and folder structure:

pnpm dlx shadcn@latest init

Follow the prompts to choose which components to include. After initialization, you can start using Shadcn UI components in your Vue project.

Description
No description provided
Readme 173 KiB
Languages
Vue 71.3%
TypeScript 18.1%
CSS 8%
HTML 2.6%