当然可以! 使用 UnoCSS 的图标可以大大提升应用的视觉吸引力。我们可以使用 UnoCSS 提供的图标集来美化界面。以下是如何整合 UnoCSS 图标并美化应用的步骤:
- 首先, 在项目中安装 UnoCSS 和图标集:
bun add -d unocss @unocss/preset-icons @iconify-json/carbon- 创建一个 UnoCSS 配置文件
uno.config.ts:
import { defineConfig, presetUno, presetIcons } from 'unocss'
export default defineConfig({
presets: [
presetUno(),
presetIcons({
scale: 1.2,
warn: true,
}),
],
safelist: 'i-carbon-home i-carbon-list i-carbon-edit i-carbon-add i-carbon-checkmark i-carbon-close i-carbon-sun i-carbon-cloud i-carbon-rain'.split(' '),
})- 修改
src/index.ts文件, 添加 UnoCSS:
import { Elysia } from "elysia";
import { html } from "@elysiajs/html";
import { staticPlugin } from "@elysiajs/static";
import UnoCSS from 'unocss/vite'
import { layout } from "./views/layout";
// ... 其他导入
const app = new Elysia()
.use(html())
.use(staticPlugin())
.get("/", ({ html }) => html(layout(forecast())))
// ... 其他路由
.get("/uno.css", async () => {
const { default: uno } = await import('unocss/vite')
const { createGenerator } = await import('unocss')
const { default: presetUno } = await import('@unocss/preset-uno')
const { default: presetIcons } = await import('@unocss/preset-icons')
const uno = createGenerator({
presets: [
presetUno(),
presetIcons({
scale: 1.2,
warn: true,
}),
],
})
const { css } = await uno.generate('')
return new Response(css, {
headers: {
'content-type': 'text/css',
},
})
})
.listen(3000);
console.log(`Server is running at http://localhost:${app.server?.port}`);- 修改
src/views/layout.ts文件, 添加 UnoCSS 样式链接:
export const layout = (content: string) => `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Weather Forecast</title>
<script src="https://unpkg.com/htmx.org@1.9.6"></script>
<link href="/uno.css" rel="stylesheet">
<link href="/public/styles.css" rel="stylesheet">
</head>
<body class="bg-gray-100 text-gray-800">
<div class="container mx-auto p-4">
<h1 class="text-3xl font-bold mb-4 flex items-center"><i class="i-carbon-cloud mr-2"></i>Weather Forecast</h1>
<nav class="mb-4 flex">
<a href="/" class="mr-4 flex items-center"><i class="i-carbon-home mr-1"></i>Home</a>
<a href="/themes" class="mr-4 flex items-center"><i class="i-carbon-list mr-1"></i>Themes</a>
</nav>
${content}
</div>
</body>
</html>
`;- 修改
src/views/themes.ts文件, 使用图标美化界面:
import { Theme } from "../themes";
export const themesList = (themes: Theme[]) => `
<div class="mb-4">
<h2 class="text-2xl mb-2 flex items-center"><i class="i-carbon-list mr-2"></i>Themes</h2>
<ul>
${themes.map(theme => `
<li class="mb-2 flex items-center">
<i class="i-carbon-document mr-2"></i>${theme.name}
<button hx-get="/apply-theme/${theme.name}" hx-target="body" class="ml-2 p-1 bg-blue-500 text-white rounded flex items-center">
<i class="i-carbon-checkmark mr-1"></i>Apply
</button>
<a href="/themes/edit/${theme.name}" class="ml-2 p-1 bg-green-500 text-white rounded flex items-center">
<i class="i-carbon-edit mr-1"></i>Edit
</a>
</li>
`).join('')}
</ul>
<a href="/themes/edit" class="mt-4 inline-block p-2 bg-purple-500 text-white rounded flex items-center">
<i class="i-carbon-add mr-1"></i>Create New Theme
</a>
</div>
`;
export const themeEditor = (theme: Theme | null) => `
<div class="mb-4">
<h2 class="text-2xl mb-2 flex items-center">
<i class="i-carbon-edit mr-2"></i>${theme ? 'Edit Theme' : 'Create New Theme'}
</h2>
<form hx-post="/themes/save" hx-swap="outerHTML">
<div class="mb-2">
<label for="name" class="block flex items-center"><i class="i-carbon-text-font mr-1"></i>Theme Name:</label>
<input type="text" id="name" name="name" value="${theme?.name || ''}" required class="w-full p-2 border rounded">
</div>
<div class="mb-2">
<label for="content" class="block flex items-center"><i class="i-carbon-code mr-1"></i>Theme Content:</label>
<textarea id="content" name="content" rows="10" required class="w-full p-2 border rounded">${theme?.content || ''}</textarea>
</div>
<button type="submit" class="p-2 bg-blue-500 text-white rounded flex items-center">
<i class="i-carbon-save mr-1"></i>Save Theme
</button>
</form>
</div>
`;- 修改
src/views/forecast. Ts文件, 添加天气图标:
import { WeatherData } from "../weather";
const getWeatherIcon = (condition: string) => {
switch (condition.toLowerCase()) {
case 'sunny':
return 'i-carbon-sun';
case 'cloudy':
return 'i-carbon-cloud';
case 'rainy':
return 'i-carbon-rain';
default:
return 'i-carbon-cloud';
}
};
export const forecast = (city?: string, days?: number, weatherData?: WeatherData[]) => `
<div class="mb-4">
<form hx-get="/forecast" hx-target="#forecast" class="mb-4">
<input type="text" name="city" placeholder="Enter city" required class="p-2 border rounded mr-2">
<input type="number" name="days" placeholder="Number of days" required min="1" max="7" class="p-2 border rounded mr-2">
<button type="submit" class="p-2 bg-blue-500 text-white rounded flex items-center">
<i class="i-carbon-search mr-1"></i>Get Forecast
</button>
</form>
<div id="forecast">
${weatherData ? `
<h2 class="text-2xl mb-2">Weather Forecast for ${city} (${days} days)</h2>
<ul>
${weatherData.Map (day => `
<li class="mb-2 flex items-center">
<i class="${getWeatherIcon(day.condition)} mr-2"></i>
${day.date}: ${day.temperature}°C, ${day.condition}
</li>
`).join('')}
</ul>
` : ''}
</div>
</div>
`;这些修改将使用 UnoCSS 的图标来美化界面, 使应用更加直观和美观。图标将替代一些文字说明, 使界面更加简洁清晰。
记得在运行应用之前, 确保已经安装了所有必要的依赖, 并且 UnoCSS 配置文件已经正确设置。然后, 你可以像之前一样运行应用:
bun run dev这些改动将大大提升应用的视觉吸引力, 使用户体验更加愉悦。