普通视图

PS 安装教程翻译

PS 安装教程翻译 ​

appstorrent 上 ps 安装教程是俄文,特此翻译和矫正以便后续查看。此文档适用于 Adobe Photoshop v26.10.0+

1. 安装 Adobe Creative Cloud ​

要安装Adobe Photoshop,需要Adobe Creative Cloud(完整软件包)。如果已安装Adobe Creative Clo

ud,则可以跳过此步骤。

  • 导航到“Creative Cloud”文件夹,然后运行“Adobe Creative Cloud v6.7.0 Universal.pkg”。

  • 按照标准安装程序进行操作。您需要输入管理员密码(登录系统时使用的密码)。安装完成后,单击“关

闭”。

2. 安装 Adobe Photoshop v26.10.0 ​

安装之前,建议卸载任何旧版本的Adobe Photoshop。

  1. 打开Install文件夹并运行Install文件。

    错误:“安装程序无法继续,因为安装程序文件可能已损坏。请重新下载安装程序文件”?

    右键单击“安装”,然后从上下文菜单中选择“显示软件包内容”。导航至:目录> macOS。运行安装文件(一个带有黑色图标的Unix文件)。

    另一个错误?在本文中找到解决方案。

    要打开链接,请查看完整文档(不要使用预览)。

  2. 选择您的语言,然后单击“继续”。

    安装即将开始。

  3. 等待安装完成,然后单击“关闭”。

    如果遇到错误#501,说明您尚未安装Creative Cloud组件(步骤1)。

    如果遇到错误#195:您的Mac不符合系统要求,或者磁盘空间不足。

    如果遇到错误#133:可用磁盘空间不足。

3. 激活 Adobe Photoshop ​

  1. 有两种修补程序可供选择。请选择最适合您的修补程序:
  • Adobe激活工具v1.2.3——需要访问Adobe服务器。必须使用Adobe ID(免费账户)。此补丁程序不会破坏Photoshop中的神经滤镜功能(如果在该软件中使用相同补丁程序)。

  • Adobe激活工具v2.1.2–无法访问Adobe服务器。神经过滤器将无法运行。无需Adobe ID。

建议使用Adobe激活工具v1.2.3以获得更高的稳定性和更少的激活问题。

  • 如果选择Adobe Activation Tool v1.2.3:

    启动Adobe Creative Cloud或Adobe Photoshop并登录您的Adobe帐户。我们强烈建议使用新帐户(例如,使用临时电子邮件注册)。登录后,系统将提示您开始试用或订阅。单击“退出”并

    继续激活...

  • 如果选择Adobe Activation Tool v2.1.2:请勿启动Adobe Photoshop或登录到Adobe帐户。直接继续进行激活...

  1. 在“Crack”文件夹中,使用所选补丁程序打开.dmg映像,并运行Adobe激活工具。

    如果启动时遇到问题,请将Adobe Activation Tool拖到“应用程序”文件夹中,并使用图像中的“修复”文件。或者,可以查看本文中的解决方案。

  2. 在Adobe激活工具窗口中,单击“+”区域并选择已安装的Adobe Photoshop。

  3. 一旦补丁检测到Adobe Photoshop,点击“开始激活”并输入您的管理员密码(您登录系统时使用的密码)。

  4. 如果激活成功,将出现绿色消息:“日志:激活已成功完成”。

  5. 全部完成!启动Adobe Photoshop。

    启动时,您可能会看到此窗口。不必担心,只需单击“确定”即可。

    如果遇到错误#12013:证书丢失。请转到Certs文件夹并运行AddCerts文件。

    另一个错误?在本文中找到解决方案。

    要打开链接,请查看完整文档(请勿使用预览)。

提示 ​

您可以使用Adobe激活工具v1.2.3用于Adobe Creative Cloud。

(激活示例)。

Adobe Creative Cloud位于:

/Applications/Utilities/Adobe Creative Cloud/ACC/Creative Cloud.app

使用键盘快捷键Cmd + Shift + G可以导航到指定文件夹。

激活Adobe Creative Cloud后,您可以直接从Adobe Creative Cloud下载应用程序——Adobe产品旁边

将出现一个下载按钮。

(示例)。

前端设计资源汇总

前端设计资源汇总 ​

整理前端常用设计资源

网页设计 ​

站酷(包含众多网页设计):https://www.zcool.com.cn/search/folder/fix?word=后台管理

UI世界(更全面的ui作品):http://www.uishijie.com/ui/

蓝湖(高效的产品设计协作平台):https://lanhuapp.com/

Figma(矢量图形编辑器和原型设计工具):https://www.figma.com/

Figma中文社区:https://www.figma.cool/

Readdy(ai网页设计):https://readdy.ai/

Pixso(产品设计协作一体化工具):https://pixso.cn/

美工吧(提供一站式电商美工导航服务):https://www.meigong8.com/

颜色设计 ​

Palette(调色板):https://arco.design/palette/list

ant-design(共计120个颜色,包含12个主色以及衍生色):https://ant-design.antgroup.com/docs/spec/colors-cn

tailwindcss(tailwind颜色):https://tailwindcss.com/docs/colors

字体资源 ​

100font(免费商用字体大全):https://www.100font.com/

开源字体整理:https://note.weizwz.com/resource/font/open-source-font

字图CDN(免费的中文字体公益 CDN 服务):https://chinese-font.netlify.app/zh-cn/cdn/

ZSFT(900+款免费商用字体):https://fonts.zeoseven.com/

字体天下(海量字体免费高速下载,商用需注意许可证):https://www.fonts.net.cn/

FONTSPACE(150,000+免费外文字体):https://www.fontspace.com/

图片资源 ​

Pexels(免费的图库,提供众多高质量图片和视频,查看许可证):https://www.pexels.com/

Unsplash(600W+免费图片,查看许可证):https://unsplash.com/

pngimg(包含众多免费的高清透明PNG素材资源):https://pngimg.com/

undraw(可调色彩的插画,支持svg和png格式):https://undraw.co/illustrations

PATTERN MONSTER(高度自定义svg底纹):https://pattern.monster/

Hero Patterns(免费的svg底纹合集):https://heropatterns.com/

图标资源 ​

汇总:https://note.weizwz.com/resource/image/icon-all

图片工具 ​

图片转BASE64编码:https://www.jyshare.com/front-end/59/

图片压缩和转化:https://tinypng.com/

图片转Excel:https://web.baimiaoapp.com/image-to-excel

在线抠图去背景:https://www.remove.bg/zh

带壳截图:https://mockuphone.com/

在线SVG转PNG工具:https://uutool.cn/svg2png/

动效设计 ​

LOADING.IO(加载动画设计):https://loading.io/

Motion(动画库,支持js、react、vue):https://motion.net.cn/

@vueuse/motion(vue动画库):https://motion.vueuse.org/

Inspira UI(使用Nuxt&Vue构建漂亮的动效组件):https://inspira-ui.com/

UIVERSE(最大的开源UI库):https://uiverse.io/

VitePress 添加友链界面

VitePress 添加友链界面 ​

效果预览

友链数据存储 ​

友链数据通常是经常需要添加和修改的,所以我们不能直接写死到页面上。这里我们单独提一个文件去存储友链数据,并且友链数据的格式基本也是类似的。

新建 links.md 文件,内容如下:

docs/pages/links.md
md
---
layout: weiz-link
title: 我的友链
description: 这是唯知笔记网站的友链界面,xxxxxx

links:
- title: 鸣谢
  desc: 建站中学习和使用了以下博客/网站的技术和分享,特别鸣谢!🫡
  list:
    - name: VitePress
      link: https://vitepress.dev/zh/
      avatar: https://vitepress.dev/vitepress-logo-mini.svg
      irregular: true
      descr: 由 Vite 和 Vue 驱动的静态站点生成器
    - name: VitePress 快速上手教程
      link: https://vitepress.yiov.top/
      avatar: https://vitepress.dev/vitepress-logo-mini.svg
      irregular: true
      descr: 如果你也想搭建它,那跟我一起做吧
- title: 传送门
  desc: 聚集众多优秀独立博客,随机传送 🚀
  list:
    - name: 十年之约
      link: https://foreverblog.cn/go.html
      avatar: https://img.foreverblog.cn/logo_en_default.png
      descr: 十年之约,奔赴某个独立博客的十年
      irregular: true
    - name: Web Teleporter
      link: https://webteleporter.top/
      avatar: https://webteleporter.top/img/logo.png
      descr: 独立博客传送门
---

注:irregular 字段是对特殊图片进行处理

友链页面创建 ​

Vitepress 中创建单独页面的方法,可以参考 VitePress 新建页面和注册组件

新建组件 ​

新建一个文件夹 docs/.vitepress/theme/components/WLink 用来存放友链组件

vue
<template>
  <div id="main">
    <div class="title">
      <h1>我的友链</h1>
    </div>
    <div class="content">
      <div class="link" v-for="(item, index) of linksData" :key="index">
        <div class="title-wrapper">
          <h3>{{ item.title }}</h3>
        </div>
        <p>{{ item.desc }}</p>
        <div class="link-list">
          <el-row class="container-row" :gutter="24">
            <el-col v-for="temp of item.list" :key="temp.link" class="link-wrapper" :xs="24" :sm="12" :md="6">
              <LinkSite :data="temp" />
            </el-col>
          </el-row>
        </div>
      </div>
    </div>
    <div class="message">
      <div class="title-wrapper">
        <h3>留链吗</h3>
      </div>
      <p>留恋的小伙伴,想要和我做友链 💞</p>
      <div class="card">
        <p>留言请参照置顶评论里的格式,siteshot 字段非必需</p>
        <Twikoo />
      </div>
    </div>
  </div>
</template>

<script setup lang='ts'>
import { useData } from 'vitepress'
import LinkSite from './LinkSite.vue'
import Twikoo from '../WTwikoo/index.vue'
import { LinkList } from '../../type/WLink'

const { frontmatter: fm } = useData()

const linksData = fm.value.links as LinkList[]
</script>

<style>
.message .twikoo {
  margin-top: 0;
}
</style>
<style lang='scss' scoped>
.content {
  margin-top: var(--weiz-spacing-8xl);
  margin-bottom: var(--weiz-spacing-12xl);
}
.title-wrapper {    
  margin: var(--weiz-spacing-8xl) 0;
  height: 1px;
  background: var(--vp-c-text-5);
  position: relative;
  > h3 {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%) translateY(-50%);
    background: var(--vp-c-bg-soft);
    padding: 0 var(--weiz-spacing-8xl);
    font-size: var(--weiz-font-size-xl);
    font-weight: var(--weiz-font-weight-bold);
    line-height: var(--weiz-text-xl-line-height);
    text-align: center;
  }
  &+p {
    margin-bottom: var(--weiz-spacing-6xl);
    font-weight: var(--weiz-font-weight-medium);
    text-align: center;
  }
}
.link-list .el-col {
    margin-bottom: var(--weiz-spacing-6xl);
}
.card {
  padding: var(--weiz-spacing-6xl);
  border-radius: var(--weiz-card-border-radius);
  background-color: var(--vp-c-bg);
  box-shadow: var(--weiz-shadow);
  > p {
    margin-bottom: var(--weiz-spacing-6xl);
  }
}
</style>
vue
<template>
  <div class="link-item">
    <a :href="data.link" :title="data.name" target="_blank">
      <div class="link-icon">
        <img v-if="!imageFailed" :class="{ irregular: data.irregular }" :src="data.avatar" @error="handleImageError()" :alt="data.name" />
        <!-- 替代内容:显示首字母 -->
        <span v-else class="iconPlaceholder">{{ data.name.charAt(0) }}</span>
      </div>
      <div class="link-info">
        <div class="link-name">{{ data.name }}</div>
        <div class="link-desc" :title="data.descr">{{ data.descr }}</div>
      </div>
    </a>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { Link } from '../../type/WLink'

const props = defineProps<{ data: Link }>()
const data = props.data

// 记录图片加载状态
const imageFailed = ref(false)

// 处理图片加载失败
const handleImageError = () => {
  imageFailed.value = true // 更新加载状态
}
</script>

<style lang="scss" scoped>
.link-item {
  position: relative;
  overflow: hidden;
  width: 100%;
  height: 100px;
  display: inline-block;
  border-radius: var(--weiz-card-border-radius);
  background-color: var(--vp-c-bg);
  box-shadow: var(--weiz-shadow);
  &:hover {
    .link-icon > img,
    .iconPlaceholder {
      transform: scale(2.4);
      &.irregular {
        transform: scale(1.6);
      }
    }
    .link-info {
      margin-left: 20px;
    }
  }
  > a {
    position: relative;
    z-index: 1;
    height: 100%;
    display: flex;
    align-items: center;
  }
  .link-icon {
    flex: 0 0 auto;
    width: 100px;
    height: 100%;
    overflow: hidden;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: var(--weiz-transition-6);
    > img {
      width: 60px;
      height: 60px;
      border-radius: 50%;
      vertical-align: top;
      object-fit: cover;
      transition: var(--weiz-transition-6);
      &[src^="https://vitepress.dev/"]
      {
        border-radius: 0;
      }
      &.irregular {
        object-fit: contain;
      }
    }
    .iconPlaceholder {
      font-size: var(--weiz-font-size-3xl);
      font-weight: var(--weiz-font-weight-bold);
      display: inline-block;
      transition: var(--weiz-transition-6);
    }
  }
  .link-info {
    flex: 1;
    height: 100%;
    display: flex;
    flex-direction: column;
    justify-content: center;
    transition: var(--weiz-transition-6);
  }
  .link-name {
    width: 100%;
    font-size: var(--weiz-font-size-st);
    line-height: var(--weiz-text-st-line-height);
    font-weight: var(--weiz-font-weight-semibold);
    margin-bottom: var(--weiz-spacing-2xl);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    transition: var(--weiz-transition-6);
  }
  .link-desc {
    width: 100%;
    padding-right: var(--weiz-spacing-6xl);
    font-weight: var(--weiz-font-weight-semibold);
    color: var(--vp-c-text-2);
    line-height: var(--weiz-text-xs-line-height);
    overflow: hidden;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;
    line-clamp: 3;
    transition: var(--weiz-transition-6);
  }
}
</style>
ts
export interface LinkList {
  // 标题
  title: string
  // 描述
  desc: string
  // 列表
  list: Link[]
}

export interface Link {
  // 站点名称
  name: string
  // 站点链接
  link: string
  // 头像/站点logo
  avatar: string
  // 头像不规则
  irregular?: boolean
  // 站点描述
  descr: string
  // 站点缩略图
  siteshot?: string
}

组件注册 &ZeroWidthSpace;

新建的组件需要在主题配置中心进行注册,注册后就可以在 md页面 中使用了。比如我们 links.md 文件中的开头 layout: weiz-link

docs/.vitepress/theme/index.ts
ts
import WLink from './components/WLink/index.vue' // 友链页

export default {
  enhanceApp({ app }) {
    // 注册全局组件
    app.component('weiz-link', WLink)
  }
}

附带评论 &ZeroWidthSpace;

在组件内集成评论,直接使用评论组件,比如我的是 <Twikoo /> 评论。
Twikoo 评论的集成方式,可参考 VitePress 集成 Twikoo 评论

挑战无手写代码用 Kiro 开发一个导航网站

挑战无手写代码用 Kiro 开发一个导航网站 &ZeroWidthSpace;

Kiro 的 Spec 模式初始分三个阶段:Requirements 需求 -> Design 设计 -> Task list 任务。 这些文档都整理完后,既可以按 Task list 开始执行,中途也可以提出意见并进行修改。

梳理原始需求 &ZeroWidthSpace;

开始 Spec 模式之前,最好自己先整理下自己的原始需求。当然我的原始需求也是找通义的 Qwen3 梳理的:

经过通义的优化和最终的修改后,我的原始需求文档大概是这样

md
为了设计一个现代化的个人前端导航网站,我们需要详细规划文档需求,确保所有核心功能和技术特点都能得到充分实现。
以下是一个整理后的文档需求概览:

## 1. 项目概述

- **项目目标**:创建一个响应式、高效、用户友好的个人前端导航网站。
- **目标用户**:前端开发者、设计师、技术爱好者等。

## 2. 核心功能需求

### 2.1 响应式设计

- **支持设备**:桌面、平板、手机等不同尺寸屏幕。
- **设计原则**:确保在各种设备上都能提供一致且优化的用户体验。

### 2.2 站内实时搜索

- **搜索功能**:实现快速、准确的站内内容搜索。
- **搜索结果展示**:以清晰、直观的方式展示搜索结果。

### 2.3 可视化导航数据管理界面
- **界面设计**:提供易于操作的可视化界面,用于管理和编辑导航数据。
- **功能要求**:支持添加、删除、修改导航条目。

### 2.4 本地数据持久化存储
- **存储方式**:使用本地存储技术(如LocalStorage)保存用户数据。
- **数据安全**:确保数据的安全性和隐私性。

### 2.5 明暗主题切换
- **主题切换**:提供优雅的明暗主题切换功能,满足不同用户的视觉偏好。
- **过渡效果**:确保主题切换过程平滑无卡顿。

### 2.6 用户体验优化
- **UI设计**:采用现代化的UI设计风格,提升视觉吸引力。
- **页面加载**:优化页面加载速度,减少等待时间。
- **动画过渡**:使用流畅的动画过渡效果,增强交互体验。
- **数据编辑**:提供直观的数据编辑界面,简化操作流程。
- **数据重置确认**:设置安全的数据重置确认机制,防止误操作。

## 3. 技术实现方案
### 3.1 技术栈选择
- **框架**:基于Next.js 最新版本构建,利用其服务器端渲染和静态生成能力
- **样式**:使用Tailwind CSS最新版本实现灵活、高效的样式设计
- **组件库**:采用antdesign最新版本组件库,提供丰富的UI组件
- **动效库**:使用 React Bits 最新版,提供有趣高性能的动画特效
- **图标**:使用ant-design/icons 最新版本,满足项目需要的图标
- **状态管理**:使用redux最新版本进行全局状态管理,确保数据一致性
- **类型定义**:支持TypeScript,提高代码质量和可维护性

### 3.2 开发工具选择

- **编辑器**:Kiro 的 Spec 模式
- **AI 模型**:Claude Sonnet 4
- **开发环境**:Nodejs v20,pnpm v10

## 4. 开发与测试计划

- **开发阶段**:按照功能模块划分,逐步实现各项功能。
- **测试阶段**:进行全面的功能测试、性能测试和兼容性测试,确保网站稳定运行。

## 5. 部署与维护
- **部署方案**:选择合适的云服务提供商,进行网站部署。
- **维护计划**:定期更新网站内容,修复潜在问题,持续优化用户体验。

通过以上文档需求,帮我设计一个完整的项目。

让 Kiro 分解需求 &ZeroWidthSpace;

把原始需求扔给 kiro,让它先清醒清醒

Kiro 接着会创建三个文档,分别是 Requirements 需求、Design 设计、Task list 任务。这边也记录下:

md
# 需求文档

## 项目介绍

本项目旨在创建一个现代化的个人前端导航网站,为前端开发者、设计师和技术爱好者提供一个响应式、高效、用户友好的导航平台。该网站将集成实时搜索、可视化数据管理、本地数据持久化、主题切换等核心功能,采用Next.js + TypeScript + Tailwind CSS + Ant Design技术栈构建。

## 需求

### 需求 1 - 响应式设计

**用户故事:** 作为一个用户,我希望能在不同设备(桌面、平板、手机)上都能正常访问和使用导航网站,以便随时随地查找所需的前端资源。

#### 验收标准

1. WHEN 用户在桌面设备访问网站 THEN 系统 SHALL 显示完整的桌面版布局
2. WHEN 用户在平板设备访问网站 THEN 系统 SHALL 自动适配平板屏幕尺寸并优化布局
3. WHEN 用户在手机设备访问网站 THEN 系统 SHALL 显示移动端优化的布局
4. WHEN 用户旋转设备屏幕 THEN 系统 SHALL 实时调整布局以适应新的屏幕方向
5. WHEN 用户在任何设备上操作 THEN 系统 SHALL 保持一致的用户体验和功能可用性

### 需求 2 - 站内实时搜索

**用户故事:** 作为一个用户,我希望能够快速搜索站内的导航内容,以便高效地找到我需要的前端资源和工具。

#### 验收标准

1. WHEN 用户在搜索框输入关键词 THEN 系统 SHALL 实时显示匹配的搜索结果
2. WHEN 用户输入搜索关键词 THEN 系统 SHALL 在300毫秒内返回搜索结果
3. WHEN 搜索结果存在 THEN 系统 SHALL 高亮显示匹配的关键词
4. WHEN 用户点击搜索结果 THEN 系统 SHALL 导航到对应的资源页面或链接
5. WHEN 没有搜索结果 THEN 系统 SHALL 显示友好的"无结果"提示信息

### 需求 3 - 可视化导航数据管理

**用户故事:** 作为一个网站管理员,我希望能够通过可视化界面管理导航数据,以便轻松地添加、编辑和删除导航条目。

#### 验收标准

1. WHEN 管理员访问数据管理界面 THEN 系统 SHALL 显示所有现有的导航条目
2. WHEN 管理员点击添加按钮 THEN 系统 SHALL 显示添加新导航条目的表单
3. WHEN 管理员填写完整的导航信息并提交 THEN 系统 SHALL 成功添加新的导航条目
4. WHEN 管理员点击编辑按钮 THEN 系统 SHALL 显示预填充当前数据的编辑表单
5. WHEN 管理员点击删除按钮 THEN 系统 SHALL 显示确认对话框防止误删除
6. WHEN 管理员确认删除操作 THEN 系统 SHALL 永久删除选中的导航条目

### 需求 4 - 本地数据持久化存储

**用户故事:** 作为一个用户,我希望我的个人设置和自定义数据能够保存在本地,以便下次访问时能够保持我的个性化配置。

#### 验收标准

1. WHEN 用户修改导航数据 THEN 系统 SHALL 自动将数据保存到本地存储
2. WHEN 用户重新访问网站 THEN 系统 SHALL 从本地存储加载之前保存的数据
3. WHEN 本地存储数据损坏或不存在 THEN 系统 SHALL 加载默认的导航数据
4. WHEN 用户清除浏览器数据 THEN 系统 SHALL 能够检测到数据丢失并提供恢复选项
5. WHEN 数据保存失败 THEN 系统 SHALL 显示错误提示并提供重试选项

### 需求 5 - 明暗主题切换

**用户故事:** 作为一个用户,我希望能够在明亮和暗黑主题之间切换,以便根据我的使用环境和个人偏好选择合适的视觉主题。

#### 验收标准

1. WHEN 用户点击主题切换按钮 THEN 系统 SHALL 在明暗主题之间平滑切换
2. WHEN 主题切换完成 THEN 系统 SHALL 将用户的主题偏好保存到本地存储
3. WHEN 用户重新访问网站 THEN 系统 SHALL 自动应用用户之前选择的主题
4. WHEN 系统检测到用户的系统主题偏好 THEN 系统 SHALL 默认使用匹配的主题
5. WHEN 主题切换过程中 THEN 系统 SHALL 保持所有功能的正常可用性

### 需求 6 - 用户体验优化

**用户故事:** 作为一个用户,我希望网站具有现代化的设计和流畅的交互体验,以便获得愉悦的使用感受。

#### 验收标准

1. WHEN 用户访问网站 THEN 系统 SHALL 在2秒内完成首屏加载
2. WHEN 用户进行任何交互操作 THEN 系统 SHALL 提供即时的视觉反馈
3. WHEN 页面内容发生变化 THEN 系统 SHALL 使用平滑的动画过渡效果
4. WHEN 用户执行数据重置操作 THEN 系统 SHALL 显示明确的确认对话框
5. WHEN 用户确认重置操作 THEN 系统 SHALL 清除所有自定义数据并恢复默认状态
6. WHEN 网站在不同设备上显示 THEN 系统 SHALL 保持一致的视觉设计风格

### 需求 7 - 技术架构和性能

**用户故事:** 作为一个开发者,我希望网站采用现代化的技术栈并具有良好的性能表现,以便提供稳定可靠的服务。

#### 验收标准

1. WHEN 网站构建时 THEN 系统 SHALL 使用Next.js最新版本作为核心框架
2. WHEN 网站样式渲染时 THEN 系统 SHALL 使用Tailwind CSS提供响应式样式
3. WHEN 网站组件渲染时 THEN 系统 SHALL 使用Ant Design组件库确保UI一致性
4. WHEN 网站需要动画效果时 THEN 系统 SHALL 使用React Bits提供高性能动画
5. WHEN 网站进行状态管理时 THEN 系统 SHALL 使用Redux管理全局状态
6. WHEN 代码编写时 THEN 系统 SHALL 支持TypeScript提供类型安全
7. WHEN 网站部署后 THEN 系统 SHALL 在各主流浏览器中正常运行
md
# 设计文档

## 概述

本设计文档详细描述了现代化个人前端导航网站的技术架构、组件设计和实现方案。该网站采用Next.js 14+ 作为核心框架,结合TypeScript、Tailwind CSS、Ant Design等现代技术栈,构建一个高性能、响应式、用户友好的导航平台。

## 架构设计

### 整体架构

```mermaid
graph TB
    A[用户界面层] --> B[组件层]
    B --> C[状态管理层]
    C --> D[数据服务层]
    D --> E[本地存储层]

    A --> A1[响应式布局]
    A --> A2[主题系统]
    A --> A3[动画效果]

    B --> B1[页面组件]
    B --> B2[业务组件]
    B --> B3[通用组件]

    C --> C1[Redux Store]
    C --> C2[中间件]
    C --> C3[状态切片]

    D --> D1[搜索服务]
    D --> D2[数据管理服务]
    D --> D3[主题服务]

    E --> E1[LocalStorage]
    E --> E2[SessionStorage]
    E --> E3[IndexedDB]
```

### 技术栈架构

- **前端框架**: Next.js 14+ (App Router)
- **类型系统**: TypeScript 5+
- **样式框架**: Tailwind CSS 3+
- **组件库**: Ant Design 5+
- **状态管理**: Redux Toolkit + RTK Query
- **动画库**: React Bits + Framer Motion
- **图标库**: @ant-design/icons
- **构建工具**: Turbopack (Next.js内置)
- **包管理器**: pnpm 8+

## 组件和接口设计

### 核心组件架构

```mermaid
graph TD
    A[App Layout] --> B[Header]
    A --> C[Main Content]
    A --> D[Footer]

    B --> B1[Logo]
    B --> B2[Search Bar]
    B --> B3[Theme Toggle]
    B --> B4[Settings]

    C --> C1[Navigation Grid]
    C --> C2[Category Sidebar]
    C --> C3[Management Panel]

    C1 --> C1A[Navigation Card]
    C1 --> C1B[Category Section]

    C3 --> C3A[Add Form]
    C3 --> C3B[Edit Form]
    C3 --> C3C[Delete Confirmation]
```

### 主要组件接口

#### 1. NavigationCard 组件

```typescript
interface NavigationCardProps {
  id: string
  title: string
  description: string
  url: string
  icon?: string
  category: string
  tags: string[]
  isEditable?: boolean
  onEdit?: (id: string) => void
  onDelete?: (id: string) => void
}
```

#### 2. SearchBar 组件

```typescript
interface SearchBarProps {
  placeholder?: string
  onSearch: (query: string) => void
  onClear: () => void
  suggestions?: SearchSuggestion[]
  isLoading?: boolean
}

interface SearchSuggestion {
  id: string
  title: string
  category: string
  matchType: 'title' | 'description' | 'tag'
}
```

#### 3. ManagementPanel 组件

```typescript
interface ManagementPanelProps {
  isVisible: boolean
  mode: 'add' | 'edit' | 'view'
  currentItem?: NavigationItem
  onSave: (item: NavigationItem) => void
  onCancel: () => void
  onDelete?: (id: string) => void
}
```

#### 4. ThemeProvider 组件

```typescript
interface ThemeContextValue {
  theme: 'light' | 'dark' | 'auto'
  setTheme: (theme: 'light' | 'dark' | 'auto') => void
  isDark: boolean
}
```

## 数据模型

### 核心数据结构

#### NavigationItem 模型

```typescript
interface NavigationItem {
  id: string
  title: string
  description: string
  url: string
  icon?: string
  category: string
  tags: string[]
  createdAt: Date
  updatedAt: Date
  isActive: boolean
  sortOrder: number
}
```

#### Category 模型

```typescript
interface Category {
  id: string
  name: string
  description?: string
  icon?: string
  color?: string
  sortOrder: number
  isActive: boolean
}
```

#### UserSettings 模型

```typescript
interface UserSettings {
  theme: 'light' | 'dark' | 'auto'
  language: string
  gridColumns: number
  showDescriptions: boolean
  enableAnimations: boolean
  searchHistory: string[]
  favoriteCategories: string[]
}
```

#### AppState 模型

```typescript
interface AppState {
  navigation: {
    items: NavigationItem[]
    categories: Category[]
    filteredItems: NavigationItem[]
    searchQuery: string
    selectedCategory: string | null
    isLoading: boolean
  }
  ui: {
    theme: 'light' | 'dark' | 'auto'
    sidebarOpen: boolean
    managementPanelOpen: boolean
    currentEditItem: NavigationItem | null
  }
  settings: UserSettings
}
```

## 错误处理

### 错误类型定义

```typescript
enum ErrorType {
  NETWORK_ERROR = 'NETWORK_ERROR',
  STORAGE_ERROR = 'STORAGE_ERROR',
  VALIDATION_ERROR = 'VALIDATION_ERROR',
  PERMISSION_ERROR = 'PERMISSION_ERROR',
  UNKNOWN_ERROR = 'UNKNOWN_ERROR',
}

interface AppError {
  type: ErrorType
  message: string
  details?: any
  timestamp: Date
  recoverable: boolean
}
```

### 错误处理策略

1. **本地存储错误**
   - 检测存储空间不足
   - 提供数据导出功能
   - 自动降级到内存存储

2. **网络错误**
   - 实现重试机制
   - 显示离线状态提示
   - 缓存关键数据

3. **验证错误**
   - 实时表单验证
   - 友好的错误提示
   - 自动修复建议

4. **全局错误边界**
   - React Error Boundary
   - 错误日志收集
   - 优雅降级显示

## 性能优化策略

### 1. 代码分割和懒加载

```typescript
// 路由级别的代码分割
const ManagementPanel = lazy(() => import('./components/ManagementPanel'))
const SettingsModal = lazy(() => import('./components/SettingsModal'))

// 组件级别的条件加载
const HeavyComponent = lazy(() =>
  import('./components/HeavyComponent').then(module => ({
    default: module.HeavyComponent,
  }))
)
```

### 2. 数据优化

- 虚拟滚动处理大量导航项
- 搜索防抖和节流
- 智能缓存策略
- 增量数据更新

### 3. 渲染优化

- React.memo 优化组件重渲染
- useMemo 和 useCallback 缓存计算结果
- 图片懒加载和预加载
- CSS-in-JS 优化

### 4. 存储优化

- 数据压缩存储
- 分片存储大数据
- 定期清理过期数据
- 存储配额管理

## 响应式设计方案

### 断点设计

```css
/* Tailwind CSS 断点 */
sm: 640px   /* 小屏设备 */
md: 768px   /* 平板设备 */
lg: 1024px  /* 笔记本电脑 */
xl: 1280px  /* 桌面显示器 */
2xl: 1536px /* 大屏显示器 */
```

### 布局适配策略

1. **移动端优先设计**
   - 单列布局
   - 触摸友好的交互元素
   - 简化的导航菜单

2. **平板端适配**
   - 双列或三列网格布局
   - 侧边栏可折叠
   - 手势支持

3. **桌面端优化**
   - 多列网格布局
   - 固定侧边栏
   - 键盘快捷键支持

## 主题系统设计

### 主题配置

```typescript
interface ThemeConfig {
  colors: {
    primary: string
    secondary: string
    background: string
    surface: string
    text: {
      primary: string
      secondary: string
      disabled: string
    }
    border: string
    shadow: string
  }
  spacing: Record<string, string>
  typography: {
    fontFamily: string
    fontSize: Record<string, string>
    fontWeight: Record<string, number>
  }
  borderRadius: Record<string, string>
  animation: {
    duration: Record<string, string>
    easing: Record<string, string>
  }
}
```

### 主题切换实现

- CSS 变量动态切换
- 系统主题检测
- 平滑过渡动画
- 主题偏好持久化

## 搜索系统设计

### 搜索算法

1. **全文搜索**
   - 标题匹配(权重最高)
   - 描述内容匹配
   - 标签匹配
   - 分类匹配

2. **模糊搜索**
   - 拼音搜索支持
   - 容错匹配
   - 同义词扩展

3. **搜索优化**
   - 搜索结果排序
   - 搜索历史记录
   - 热门搜索推荐
   - 实时搜索建议

### 搜索索引结构

```typescript
interface SearchIndex {
  id: string
  title: string
  titlePinyin: string
  description: string
  tags: string[]
  category: string
  searchableText: string
  weight: number
}
```

## 测试策略

### 1. 单元测试

- 组件渲染测试
- 工具函数测试
- Redux reducer 测试
- 自定义 Hook 测试

### 2. 集成测试

- 组件交互测试
- API 集成测试
- 状态管理集成测试
- 路由导航测试

### 3. 端到端测试

- 用户流程测试
- 跨浏览器兼容性测试
- 响应式设计测试
- 性能基准测试

### 4. 可访问性测试

- 键盘导航测试
- 屏幕阅读器兼容性
- 颜色对比度检查
- ARIA 标签验证

## 部署和构建策略

### 构建优化

- 静态资源优化
- 代码压缩和混淆
- Tree shaking
- 图片优化和格式转换

### 部署方案

- Vercel 部署(推荐)
- Netlify 部署
- 自托管方案
- CDN 加速配置

### 监控和分析

- 性能监控
- 错误追踪
- 用户行为分析
- 核心 Web 指标监控
md
# 实施计划

- [ ] 1. 项目初始化和基础配置
  - 创建Next.js 14项目并配置TypeScript
  - 安装和配置Tailwind CSS、Ant Design、Redux Toolkit等核心依赖
  - 设置项目目录结构和基础文件
  - 配置ESLint、Prettier和Git hooks
  - _需求: 7.1, 7.2, 7.3, 7.5, 7.6_

- [ ] 2. 核心类型定义和数据模型
  - 创建NavigationItem、Category、UserSettings等核心数据类型
  - 定义组件Props接口和API响应类型
  - 实现数据验证schemas
  - _需求: 7.6, 3.3_

- [ ] 3. Redux状态管理架构
  - 配置Redux store和中间件
  - 创建navigation、ui、settings等状态切片
  - 实现actions和reducers
  - 添加状态持久化中间件
  - _需求: 7.5, 4.1, 4.2_

- [ ] 4. 本地存储服务层
  - 实现LocalStorage封装类
  - 创建数据序列化和反序列化工具
  - 实现数据备份和恢复功能
  - 添加存储错误处理和降级策略
  - _需求: 4.1, 4.2, 4.3, 4.4, 4.5_

- [ ] 5. 主题系统实现
  - 创建ThemeProvider和ThemeContext
  - 实现明暗主题配置和CSS变量
  - 添加系统主题检测功能
  - 实现主题切换动画效果
  - _需求: 5.1, 5.2, 5.3, 5.4, 5.5_

- [ ] 6. 基础布局组件
  - 创建AppLayout主布局组件
  - 实现Header组件(Logo、搜索栏、主题切换)
  - 创建响应式侧边栏组件
  - 实现Footer组件
  - _需求: 1.1, 1.2, 1.3, 1.4, 1.5_

- [ ] 7. 导航卡片组件
  - 创建NavigationCard基础组件
  - 实现卡片悬停和点击效果
  - 添加编辑和删除操作按钮
  - 实现卡片响应式布局
  - _需求: 6.2, 6.3, 1.1, 1.2, 1.3_

- [ ] 8. 搜索功能实现
  - 创建SearchBar组件和搜索逻辑
  - 实现实时搜索和防抖处理
  - 添加搜索结果高亮显示
  - 实现搜索历史和建议功能
  - _需求: 2.1, 2.2, 2.3, 2.4, 2.5_

- [ ] 9. 导航网格和分类显示
  - 创建NavigationGrid组件
  - 实现分类筛选功能
  - 添加网格响应式布局
  - 实现无限滚动或分页
  - _需求: 1.1, 1.2, 1.3, 1.4, 1.5_

- [ ] 10. 数据管理界面
  - 创建ManagementPanel组件
  - 实现添加导航项表单
  - 创建编辑导航项功能
  - 添加删除确认对话框
  - _需求: 3.1, 3.2, 3.3, 3.4, 3.5, 3.6_

- [ ] 11. 表单验证和错误处理
  - 实现表单字段验证规则
  - 添加实时验证反馈
  - 创建错误边界组件
  - 实现全局错误处理机制
  - _需求: 3.3, 3.5, 6.4_

- [ ] 12. 动画和过渡效果
  - 集成React Bits动画库
  - 实现页面切换动画
  - 添加组件进入/退出动画
  - 创建加载状态动画
  - _需求: 6.3, 5.5, 6.2_

- [ ] 13. 响应式设计优化
  - 实现移动端导航菜单
  - 优化平板端布局
  - 添加触摸手势支持
  - 测试各种屏幕尺寸适配
  - _需求: 1.1, 1.2, 1.3, 1.4, 1.5_

- [ ] 14. 性能优化实现
  - 添加组件懒加载
  - 实现图片懒加载
  - 优化Bundle大小
  - 添加缓存策略
  - _需求: 6.1, 7.7_

- [ ] 15. 数据重置和备份功能
  - 实现数据重置确认机制
  - 创建数据导出功能
  - 添加数据导入功能
  - 实现数据备份提醒
  - _需求: 6.5, 4.4_

- [ ] 16. 键盘快捷键支持
  - 实现搜索快捷键(Ctrl+K)
  - 添加导航快捷键
  - 创建快捷键帮助面板
  - 实现可访问性键盘导航
  - _需求: 6.2_

- [ ] 17. 单元测试编写
  - 为核心组件编写单元测试
  - 测试Redux状态管理逻辑
  - 添加工具函数测试
  - 实现测试覆盖率报告
  - _需求: 7.7_

- [ ] 18. 集成测试实现
  - 创建组件交互测试
  - 测试搜索功能集成
  - 验证数据持久化功能
  - 测试主题切换功能
  - _需求: 2.1, 2.2, 4.1, 5.1_

- [ ] 19. 端到端测试
  - 编写用户流程测试
  - 测试跨浏览器兼容性
  - 验证响应式设计
  - 性能基准测试
  - _需求: 1.1, 1.2, 1.3, 6.1, 7.7_

- [ ] 20. 生产环境优化和部署
  - 配置生产环境构建
  - 优化静态资源
  - 设置环境变量
  - 配置部署流水线
  - _需求: 7.7_

让 Kiro 执行任务 &ZeroWidthSpace;

根据 Kiro 整理好的 Task list,让它一步步执行即可。

每执行完一个任务,Kiro 都会咋 Task List 里标记完成。遇到一些执行的未信任命令,需要我们手动执行,其他时候都不用处理。

这里说一个问题,遇到 pnpm dev 执行后,需要手动停止,Kiro 才会继续思考,不然它会一直卡在那.

第一天,执行到第 10 个任务后,Kiro 提示我超出限制,需要明天再试。截止目前为止,无手动代码,只能明天继续了

未完待续……

Kiro 的执行结果 &ZeroWidthSpace;

由于 Kiro 每天限额,历经 4 天,Task List 基本执行完了。界面如下:

执行过程中全程基本无干预,按照 Task List 一步一步执行。可以看到结果非常不理想:

  1. 界面很多多余的元素,如:主题系统演示卡片、布局系统演示卡片、悬停动画卡片等,没有任何功能,也不算新手引导,又比如标签卡片上名称下面的 frontend、design 等
  2. 设置元素位置不当,比如:设置网格数量、分页还是滚动模式等,本应出现在设置界面/弹窗里,现在是在首页
  3. 诸多操作无效,设置里的网格列数,右上角的设置图标(点击无反应)等

后续通过引导,对界面重新布局,把设置归纳到弹窗里,然后引发了更多的问题

由于问题太多,我这里已经放弃了此项目

Spec 模式总结 &ZeroWidthSpace;

Kiro 的 Spec 模式目前 完全不可信任,或者说没有非常详细的 开发需求+设计稿,使用 Kiro 帮你从头设计开发一个程序是不可信的,问题多多。

这里对此过程中遇到的问题也归纳下:

  1. 项目运作时,工作模式会卡住:当它执行 npm devpnpm dev 后,工作流会卡住,需要你手动停止终端,它才会继续工作

  2. 小任务完成/解决了 bug 后,总结文字太多:不知道这个会不会消耗额度,但是感觉很繁琐也没有什么意义

  3. 解决 bug 会创建总结性文档,感觉没有这个必要

  4. 项目是否正常运作,主要靠 npm build,对于 npm dev 运行后,在界面中的存在的错误捕获不到(其实在浏览器中打开页面是会报错的)

  5. 其他小问题,比如:我多次强调使用 pnpm,但是开始下一个任务后,它还是使用 npm;经常会使用一些废弃的 API,比如 Ant DesignTabs.TabPane;对于界面上的问题,截图丢给后大概率不能识别,即使加了说明文字;等等……

Spec 模式的可行性建议 &ZeroWidthSpace;

  1. 有大量操作的/复杂的项目,可以直接放弃这个模式,问题太多
  2. 需求需要更加细致,包括技术架构、界面风格、UI组件、功能逻辑
  3. 最好有设计图,不然它给出的界面可能与你想要的相差甚远
  4. 及时打断,对于它总结性的回答,可以直接让他停止,以免消耗额度

如何快速无缝的从 vscode 转向AI编辑器 cursor、kiro、trae 等

如何快速无缝的从 vscode 转向AI编辑器 cursor、kiro、trae 等 &ZeroWidthSpace;

如果你之前经常使用 vscode 的话,这篇文章会帮助你开始使用 AI 编辑器 kiro、cursor、trae 等,因为后者的配置和插件等都和 vscode 是共通的。甚至 kiro、cursor 等都是基于开源 vscode 的变种开发而来。

如果你是第一次使用类似 vscode 的编辑器,这篇文章也会帮到你,更快了解如何去安装插件和修改配置。

以下教程都是以 kiro 为例,其他编辑器类似

插件安装 &ZeroWidthSpace;

如图,1 即插件商店入口,在 2 所在的位置输入插件名称即可搜索。第一次使用这类编辑器的同学,可以安装中文插件 3,搜索 Chinese 后选择安装。如果你和我一样主攻前端的话,上图中是我建议的插件,直接搜索安装即可。

配置修改 &ZeroWidthSpace;

修改配置两种方式,一种是可视化界面修改,如图 1 处,一种是直接修改配置文件(json 文件),如图 2,使用快捷键 shift + command + p 打开

这里建议直接第二种方式,更快速。

如果你之前有使用 vscode 的话,直接打开 vscode 的配置文件,复制过来即可。首次使用的话,可以参考我的配置

json
{
  "workbench.colorTheme": "Atom One Dark",
  "workbench.startupEditor": "none",
  "workbench.iconTheme": "material-icon-theme",
  "material-icon-theme.activeIconPack": "vue",
  "git.autofetch": true,
  "git.enableSmartCommit": true,
  "git.confirmSync": false,
  "git.ignoreMissingGitWarning": true,
  "git.openRepositoryInParentFolders": "never",
  "editor.tabSize": 2,
  "editor.fontFamily": "FiraCode Nerd Font, Consolas, 'Courier New', monospace",
  "editor.fontSize": 12,
  "editor.formatOnSaveMode": "modificationsIfAvailable",
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "javascript.format.semicolons": "remove",
  // 定义如何处理可选分号。
  //  - ignore: 不要插入或删除任何分号。
  //  - insert: 在语句末尾插入分号。
  //  - remove: 删除不必要的分号。
  "javascript.updateImportsOnFileMove.enabled": "always",
  "typescript.updateImportsOnFileMove.enabled": "always",
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[css]": {
    "editor.defaultFormatter": "vscode.css-language-features"
    // "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[scss]": {
    "editor.defaultFormatter": "vscode.css-language-features"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[jsonc]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[vue]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[json]": {
    "editor.defaultFormatter": "vscode.json-language-features"
  },
  "security.workspace.trust.untrustedFiles": "open",
  "[html]": {
    "editor.defaultFormatter": "vscode.html-language-features"
  },
  "[less]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[markdown]": {
    "editor.quickSuggestions": {
      "comments": "on",
      "strings": "on",
      "other": "on"
    },
    "diffEditor.ignoreTrimWhitespace": false
  },
  "prettier.bracketSameLine": true,
  "prettier.jsxSingleQuote": true,
  "prettier.semi": false,
  "prettier.singleQuote": true,
  "prettier.trailingComma": "none",
  "prettier.printWidth": 160,
  "html.format.wrapLineLength": 500,
  "html.format.wrapAttributes": "preserve-aligned",
  "files.associations": {
    "manifest.json": "jsonc",
    "pages.json": "jsonc"
  },
  "explorer.confirmDelete": false,
  "diffEditor.ignoreTrimWhitespace": false,
  "stylelint.packageManager": "pnpm",
  "terminal.integrated.env.windows": {},
  "extensions.ignoreRecommendations": true,
  "kiroAgent.agentModelSelection": "CLAUDE_SONNET_4_20250514_V1_0",
  "kiroAgent.trustedCommands": [
    "pnpm type-check",
    "pnpm build",
    "pnpm lint",
    "find . -name \"*.d.ts\" -not -path \"./node_modules/*\" -not -path \"./types/*\"",
    "pnpm dev",
    "npm run build",
    "npm run dev",
    "pnpm run build",
    "pnpm run dev"
  ],
}

其中部分配置是需要插件支持的,比如主题 Atom One Dark,比如格式化插件 prettier

其他 &ZeroWidthSpace;

两种模式 &ZeroWidthSpace;

kiro 有两种模式(图中 1 处):vibe 和 spec。

vibe 模式基本和 cursor 差不多,变下达指令边修改,遇到问题可以中止,提出并让他修复

spec 模式是一种全新的模式,它是从需求分析开始,帮你对需求进行整理分析,生成需求文档,然后再设计产品,最后还有任务计划文档,最后再开始执行。spec 模式尝试一种更拟人化的开发模式,对于全栈开发应该有很大的帮助

kiro 对话的快捷键如图中 1 处

命令执行 &ZeroWidthSpace;

首次使用 kiro,遇到命令执行,它会等待你的授权,需要手动允许。不过你也可以把类似的命令加入信任列表,之后它就会自动执行了。

如上图中 2 处,在设置里搜索 kiroAgent.trustedCommands 后,可以直接添加命令的信任列表

如上图中 1 处,点击 Run 直接执行,点击 Trust 后出现下图,需要继续点击,手动选择是信任 此命令的完全形式还是同类型的,点击后才会开始执行。

PS 快速替换证件照背景

PS 快速替换证件照背景 &ZeroWidthSpace;

由于替换背景照片的需求实在是太多,这里记录下一种使用 PS 快速更换证件照背景的方法,小白也可以轻松搞定

效果 &ZeroWidthSpace;

如下,可以看到人物边缘和发丝都很自然

步骤 &ZeroWidthSpace;

1. PS 中打开图片并解除锁定🔒 &ZeroWidthSpace;

2. 选择 菜单选择 主体 &ZeroWidthSpace;

3. 对选择到的主体右键,下拉选项中选择 选择并遮住 &ZeroWidthSpace;

执行后,会跳出一个新窗口,界面如下。此时人物边缘还带有一些背景,我们继续操作

4. 选择左侧第二个画笔,并根据图片边缘大小调整画笔大小,然后对着人物边缘进行涂抹 &ZeroWidthSpace;

涂抹后,看下图,人物已经比较清晰,杂色也去掉了

5. 拉动最右侧滚动条到最后,选择 净化颜色,然后点击 确定 &ZeroWidthSpace;

点击确定后,回到初始窗口

6. 初始窗口右下角有一个圆形半填充图标(新建涂层图标),点击后,选择 纯色 &ZeroWidthSpace;

此时新建了一个图层,并跳出一个颜色选择窗口,选择你需要的颜色后 确定 即可

7. 将新建的颜色图层往下拖动,拖到 背景 拷贝 这个图层的下方 &ZeroWidthSpace;

拖动完成后,效果如下。可以看到背景色已替换完成,且人物边缘和头发都很自然,没有锯齿和毛边

8. 选择 文件 -> 导出 -> 快速导出为png,如果是其他格式,选择 导出为,然后在导出选项中选择其他格式,最后确定即可 &ZeroWidthSpace;

VitePress 优化代码块样式

VitePress 优化代码块样式 &ZeroWidthSpace;

主要目标:1. 代码块支持显示所属文件,并显示文件类型图标 ;2. 将默认代码块样式修改为 mac风格

效果展示

实现 &ZeroWidthSpace;

1. 安装 vitepress-plugin-group-icons &ZeroWidthSpace;

VitePress 官方也在用的代码块插件,直接实现我们的第1个小目标

sh
pnpm add vitepress-plugin-group-icons

配置 config,并导入主题配置中

ts
import { defineConfig } from 'vitepress'
import { groupIconMdPlugin, groupIconVitePlugin } from 'vitepress-plugin-group-icons'

export default defineConfig({
  markdown: {
    config(md) {
      md.use(groupIconMdPlugin)
    },
  },
  vite: {
    plugins: [
      groupIconVitePlugin()
    ],
  }
})
ts
import Theme from 'vitepress/theme'
import 'virtual:group-icons.css'

export default Theme

2. 修改为mac风格 &ZeroWidthSpace;

新建 code.scss 文件并导入主题配置中

scss
:root {
  --macos-window-red: #FE5450;
  --macos-window-yellow: #FFB23B;
  --macos-window-green: #30C045;
}

<!--@include: @/.vitepress/theme/style/code.scss#code-block-->
ts
import './style/code.scss'

VitePress 集成 Twikoo 评论

VitePress 集成 Twikoo 评论 &ZeroWidthSpace;

Twikoo 是一个简洁、安全、免费的静态网站评论系统。

主要特点:免费搭建,部署简单,功能很完善,隐私护安全,通知发邮件,管理有内嵌,总之免费又方便

关于后端部署,大家可以看官网,或者这篇 VitePress 资源汇总 - 使用 Twikoo 评论系统。 推荐使用 Vercel 部署 (免费,需配置域名加速访问) 或者 Netlify 部署(免费)。

这篇主要讲 Vitepress 前端如何集成。

预览 &ZeroWidthSpace;

集成步骤 &ZeroWidthSpace;

1. 安装 twikoo &ZeroWidthSpace;

sh
pnpm install twikoo

2. 初始化 twikoo 组件 &ZeroWidthSpace;

.vitepress/theme/components/Twikoo.vue
vue
<template>
  <div id="twikoo"></div>
</template>

<script setup lang="ts">
import { onMounted, watch } from 'vue'
import { useRoute } from 'vitepress'

const route = useRoute()

const initTwikoo = async () => {
  // 判断是否在浏览器环境中
  if (typeof window !== 'undefined') {
    const twikoo = await import('twikoo')
    twikoo.init({
      envId: 'https://twikoo.xxx.com/', // 换成你自己配置的域名
      el: '#twikoo'
    })
  }
}

// 监听路由刷新评论
watch(route, () => {
  initTwikoo()
})

onMounted(() => {
  initTwikoo()
})
</script>

3. 组件插入 Layout 插槽 &ZeroWidthSpace;

.vitepress/theme/components/Layout.vue
vue
<script setup lang="ts">
import DefaultTheme from 'vitepress/theme'
import Twikoo from './Twikoo' //评论组件
</script>

<template>
  <DefaultTheme.Layout>
    <template #doc-after>
      <Twikoo />
    </template>
  </DefaultTheme.Layout>
</template>

美化样式 &ZeroWidthSpace;

1. 配置 twikoo &ZeroWidthSpace;

twikoo 配置面板里的插件页签,选择代码高亮主题 coy,代码复制插件 copyButton

2. 自定义 css &ZeroWidthSpace;

以下代码中使用的部分变量,可利用开发者工具在本站查找或自己配置。

.vitepress/theme/style/custom.scss
scss
<!--@include: @/.vitepress/theme/style/custom.scss#Twikoo-->

3. css 注入主题配置 &ZeroWidthSpace;

.vitepress/theme/index.ts
ts
// 全局样式
import './style/custom.scss'

参考文档 &ZeroWidthSpace;

Twikoo 官方文档

VitePress 集成 twikoo 参考解决方案

MacOS Sequoia 基础优化设置

MacOS Sequoia 基础优化设置 &ZeroWidthSpace;

记录下 MacOS Sequoia 日常使用中的一些基础配置和优化选项

系统级 &ZeroWidthSpace;

常用快捷键 &ZeroWidthSpace;

强制退出应用 option + command + esc
显示隐藏应用 command + shift + .

命令行开启临时代理 &ZeroWidthSpace;

端口号 7897 改为自己代理的端口号

sh
export https_proxy=http://127.0.0.1:7897 http_proxy=http://127.0.0.1:7897 all_proxy=socks5://127.0.0.1:7898

修改截屏默认保存位置 &ZeroWidthSpace;

截屏默认保存位置是在桌面上,截图多了之后,桌面就会比较凌乱。这里我们修改截图默认保存位置,从而保证桌面的干净整洁

  1. Pictures文件夹下新建名为 screenshots的文件夹,用来存放截图

  2. 终端输入命令: defaults write com.apple.screencapture location ~/Pictures/screenshots

启动台图标错乱 &ZeroWidthSpace;

sh
defaults write com.apple.dock ResetLaunchPad -bool true
killall Dock

关闭安装来源限制 &ZeroWidthSpace;

  1. 终端输入 sudo spctl --master-disable 后回车执行

  2. 然后在 隐私与安全性 中选择 任何来源

第三方软件 &ZeroWidthSpace;

终端插件 zsh &ZeroWidthSpace;

错误告警:command not found: nvm &ZeroWidthSpace;

  1. .zshrc 里加入
sh
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
  1. 终端输入下面命令后回车,使配置生效
sh
source ~/.zshrc
  1. 重启终端软件,查看显示效果

开启超级右键扩展 &ZeroWidthSpace;

  1. 查看扩展符标识:
sh
luginkit -m
  1. 启用扩展:
sh
sudo pluginkit -e "use" -i cn.better365.iRightMouse.iRightMouseExtension

开启FastZip扩展 &ZeroWidthSpace;

终端输入:

sh
sudo pluginkit -e "use" -i cn.better365.FastZip.Extension;killall Finder
❌