资料

ai工具Vo

Installation - Tailwind CSS

以vue3 + sass为例,配置如下

安装tailwindcss

npm install -D tailwindcss
npx tailwindcss init

安装依赖(可选)

npm install lucide-vue-next

更新 tailwind.config.js

/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./index.html",
"./src/**/*.{vue,js,ts,jsx,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}

主CSS文件(通常是 src/assets/main.css,没有就创建一个)中添加Tailwind的指令:

@tailwind base;
@tailwind components;
@tailwind utilities;

确保main.css生效

main.ts 或者 main.js引入main.css

import './assets/main.css'

配置vite.config.ts 或者js

import tailwindcss from 'tailwindcss'

示例代码

<template>
<div
class="min-h-screen bg-gradient-to-br from-purple-400 via-pink-500 to-red-500 flex items-center justify-center p-4">
<div class="bg-white w-full max-w-md rounded-2xl shadow-2xl overflow-hidden">
<div class="p-8">
<div class="text-center mb-8">
<div
class="inline-block p-4 rounded-full bg-gradient-to-r from-purple-500 to-pink-500 text-white mb-4">
<UserIcon class="h-8 w-8" />
</div>
<h2 class="text-3xl font-extrabold text-gray-900">{{ isLogin ? 'Welcome Back' : 'Create Account' }}
</h2>
<p class="mt-2 text-sm text-gray-600">
{{ isLogin ? 'Sign in to your account' : 'Sign up for a new account' }}
</p>
</div> <form @submit.prevent="handleSubmit" class="space-y-6">
<div>
<label for="email" class="block text-sm font-medium text-gray-700">Email</label>
<input type="email" id="email" v-model="email" required class="mt-1 block w-full px-3 py-2 bg-gray-100 border border-gray-300 rounded-md text-sm shadow-sm placeholder-gray-400
focus:outline-none focus:border-purple-500 focus:ring-1 focus:ring-purple-500
transition duration-150 ease-in-out" placeholder="you@example.com">
</div> <div>
<label for="password" class="block text-sm font-medium text-gray-700">Password</label>
<input type="password" id="password" v-model="password" required class="mt-1 block w-full px-3 py-2 bg-gray-100 border border-gray-300 rounded-md text-sm shadow-sm placeholder-gray-400
focus:outline-none focus:border-purple-500 focus:ring-1 focus:ring-purple-500
transition duration-150 ease-in-out" placeholder="••••••••">
</div> <div v-if="!isLogin">
<label for="confirmPassword" class="block text-sm font-medium text-gray-700">Confirm
Password</label>
<input type="password" id="confirmPassword" v-model="confirmPassword" required class="mt-1 block w-full px-3 py-2 bg-gray-100 border border-gray-300 rounded-md text-sm shadow-sm placeholder-gray-400
focus:outline-none focus:border-purple-500 focus:ring-1 focus:ring-purple-500
transition duration-150 ease-in-out" placeholder="••••••••">
</div> <div>
<button type="submit"
class="w-full flex justify-center py-3 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-gradient-to-r from-purple-600 to-pink-600 hover:from-purple-700 hover:to-pink-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500 transition duration-150 ease-in-out"
:disabled="isLoading">
<Loader2Icon v-if="isLoading" class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" />
{{ isLoading ? 'Processing...' : (isLogin ? 'Sign In' : 'Sign Up') }}
</button>
</div>
</form> <div class="mt-6">
<div class="relative">
<div class="absolute inset-0 flex items-center">
<div class="w-full border-t border-gray-300"></div>
</div>
<div class="relative flex justify-center text-sm">
<span class="px-2 bg-white text-gray-500">
Or continue with
</span>
</div>
</div> <div class="mt-6 grid grid-cols-3 gap-3">
<div>
<a href="#"
class="w-full inline-flex justify-center py-2 px-4 border border-gray-300 rounded-md shadow-sm bg-white text-sm font-medium text-gray-500 hover:bg-gray-50">
<GithubIcon class="h-5 w-5" />
</a>
</div>
<div>
<a href="#"
class="w-full inline-flex justify-center py-2 px-4 border border-gray-300 rounded-md shadow-sm bg-white text-sm font-medium text-gray-500 hover:bg-gray-50">
<TwitterIcon class="h-5 w-5 text-[#1DA1F2]" />
</a>
</div>
<div>
<a href="#"
class="w-full inline-flex justify-center py-2 px-4 border border-gray-300 rounded-md shadow-sm bg-white text-sm font-medium text-gray-500 hover:bg-gray-50">
<FacebookIcon class="h-5 w-5 text-[#4267B2]" />
</a>
</div>
</div>
</div>
</div> <div
class="px-8 py-4 bg-gray-50 border-t border-gray-200 flex flex-col sm:flex-row justify-between items-center">
<div class="text-sm text-gray-600">
{{ isLogin ? "Don't have an account?" : "Already have an account?" }}
</div>
<button @click="toggleForm"
class="mt-3 sm:mt-0 w-full sm:w-auto flex justify-center items-center px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium text-purple-600 bg-white hover:bg-purple-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500 transition duration-150 ease-in-out">
{{ isLogin ? 'Sign Up' : 'Sign In' }}
</button>
</div>
</div> <transition name="fade">
<div v-if="message" class="fixed bottom-4 right-4 p-4 rounded-md shadow-lg" :class="messageClass">
{{ message }}
</div>
</transition>
</div>
</template> <script setup>
import { ref, computed } from 'vue'
import { UserIcon, Loader2Icon, GithubIcon, TwitterIcon, FacebookIcon } from 'lucide-vue-next' const isLogin = ref(true)
const email = ref('')
const password = ref('')
const confirmPassword = ref('')
const isLoading = ref(false)
const message = ref('') const messageClass = computed(() => {
return {
'bg-green-100 text-green-800 border-green-300': message.value.includes('successful'),
'bg-red-100 text-red-800 border-red-300': message.value.includes('failed') || message.value.includes('match')
}
}) const toggleForm = () => {
isLogin.value = !isLogin.value
email.value = ''
password.value = ''
confirmPassword.value = ''
message.value = ''
} const handleSubmit = async () => {
if (!isLogin.value && password.value !== confirmPassword.value) {
message.value = 'Passwords do not match'
return
} isLoading.value = true
message.value = '' try {
// 这里应该是实际的API调用
await new Promise(resolve => setTimeout(resolve, 1500)) message.value = isLogin.value ? 'Login successful' : 'Registration successful' // 在实际应用中,这里应该处理登录/注册成功后的逻辑,比如重定向到仪表板页面
} catch (error) {
message.value = isLogin.value ? 'Login failed' : 'Registration failed'
} finally {
isLoading.value = false
}
}
</script> <style scoped>
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s ease;
} .fade-enter-from,
.fade-leave-to {
opacity: 0;
}
</style>

效果展示

前端ai工具v0使用配置的更多相关文章

  1. webstorm前端开发工具vue环境配置及运行项目

    1:webstorm的安装:2:node.js的安装3:安装Git4:vue-cli 安装前面两步就可以把项目启动了,安装Git主要是打开命令窗口,这样就可以用liunx命令了,原理跟cmd差不多 V ...

  2. 学习安装并配置前端自动化工具Gulp

    Gulp和所有Gulp插件都是基于nodeJs来运行的,因此在你的电脑上需要安装nodeJs,安装过程请移驾安装并配置前端自动化工具--grunt.安装完成后,通过运行cmd进入DOS命令窗口,如图: ...

  3. 前端构建工具之gulp的安装和配置

    在选择构建工具时,看到更多人推荐gulp,从此入了gulp的坑- 一.安装node环境 百度谷歌一下就有了,在终端中分别输入 node -v 和 npm -v,若显示node和npm的版本号则说明no ...

  4. 前端见微知著工具篇:Grunt实现自动化

    转载说明 本篇文章为转载文章,来源为[前端福利]用grunt搭建自动化的web前端开发环境-完整教程,之所以转载,是因为本文写的太详细了,我很想自己来写,但是发现跳不出这篇文章的圈子,因为写的详尽,所 ...

  5. 前端构建工具之gulp(一)「图片压缩」

    前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...

  6. 前端构建工具之gulp_常用插件

    gulp常用插件的使用 今天来看看一下gulp的常用插件的使用 就像gruntjs需要一个Gruntfile.js文件一样,gulp也需要一个文件作为它的主文件,在gulp中这个文件叫做gulpfil ...

  7. 前端自动化工具gulp自动添加版本号

    之前,我介绍了学习安装并配置前端自动化工具Gulp,觉得gulp确实比grunt的配置简单很多,于是我决定再深入学习一下gulp,就去网上查了资料,发现gulp还可以自动添加版本号,这个功能就为我平时 ...

  8. 前端构建工具gulpjs的使用介绍及技巧

    gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nodejs中stream来读取和操作数据,其速 ...

  9. 前端构建工具gulp使用

    前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gulp中文文档 https://g ...

  10. 前端模块化工具-webpack

    详解前端模块化工具-webpack webpack是一个module bundler,抛开博大精深的汉字问题,我们暂且管他叫'模块管理工具'.随着js能做的事情越来越多,浏览器.服务器,js似乎无处不 ...

随机推荐

  1. C# 单例简单实例

    1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Li ...

  2. rust体验感受,Rust标准库需要还需加强

    了解到Rust的跨平台编译和安全性,尝试用rust写一个http调用的程序,换了几个http client库都失败了,感觉rust语言还有较大的进步空间. 环境 OS: windows 11 rust ...

  3. angularjs和ajax的结合使用 (四)

    知道的朋友了解 我不是属于讲按部就班技术的那种人.什么xx入门 ,入门到精通,入门到入土. 其实非要严格说的话已经跟angularjs 什么ajax 偏的有点远了,之所以还是叫这个名称,因为都属于we ...

  4. 一个WPF下的虚拟键盘实现

    给上位机触摸屏做一个虚拟键盘,这玩意儿不就是一排的网格里面放满button嘛 .说归这样说 依然还是有一堆细节需要你去处理的.不论如何 先画个键盘吧. 简单的从网上找个键盘位图做参照使用 4行Grid ...

  5. 通过Ollama本地部署DeepSeek R1以及简单使用

    本文介绍了在Windows环境下,通过Ollama来本地部署DeepSeek R1.该问包含了Ollama的下载.安装.安装目录迁移.大模型存储位置修改.下载DeepSeek以及通过Web UI来对话 ...

  6. 硬件设计:电路防护--TVS管

    参考资料:TVS参数及选型方法 TVS参数理解 深圳市硕凯电子有限公司元器件产品说明 TVS(Transient Voltage suppressor)或称瞬变电压抑制二极管.当TVS管两端经受瞬间的 ...

  7. 这或许是全网最全的 DeepSeek 使用指南,95% 的人都不知道的使用技巧(建议收藏)

    2025年春节过的好快,转眼间,大家又回到了各自工作岗位了,要说这个春节,什么最火,肯定绕不开DeepSeek. 几乎一夜之间,所有人都在关注DeepSeek,甚至我在老家,完全没用过AI的七大姑八大 ...

  8. mac 安装ActiveMQ

    1.http://activemq.apache.org/activemq-5154-release.html 选gz 2.cd apache-activemq-5.15.4/bin/macosx 3 ...

  9. 传国玉玺易主,ai.com竟然跳转到国产AI

    一.震惊!输入ai.com网址竟然见证历史 今天我在地址栏随手敲了个ai.com,结果网页"唰"地一下--居然跳到了国产AI新贵DeepSeek的官网!这感觉就像在胡同口买煎饼,结 ...

  10. P3306 [SDOI2013] 随机数生成器 题解

    传送门 题解 思路 由题目中可知: \[\large x_i \equiv ax_{i-1}+b\pmod{p} \] 可以得出: \[\large t=x_{n+1} \equiv a^nx_1+b ...