定制开发

自定义主题

设置主题样式

快速开始 文档中,初始化项目并启动开发服务器,在浏览器打开预览地址,可以看到默认的主题页面。

ShipAny 基于 shadcn/ui 实现主题样式切换功能,你可以选择任何一个 shadcn 样式生成器来生成主题样式,自定义 主题配色字体效果,让你的网站项目更加个性化。

推荐使用 tweakcn 作为主题样式生成器。

  1. tweakcn 样式设计面板 左上角切换预览,选择一套自己喜欢的主题样式。点击右上角的 Code 按钮,打开 Theme Code 面板。

  1. Theme Code 面板,选择 Tailwind v4 + oklcn,点击右侧的 Copy 按钮,复制主题样式代码。

  1. 将主题样式代码,粘贴到 ShipAny 项目的 src/config/style/theme.css 文件中,替换掉默认的样式代码。

  2. 再次打开项目预览地址,可以看到新的样式效果。

管理后台的主题样式也同步更新了。

设置外观

ShipAny 项目通过 .env* 文件中的 NEXT_PUBLIC_APPEARANCE 变量,控制项目默认显示的外观。此变量的默认值是 system,会根据用户电脑设置的系统主题自动切换 lightdark 模式。

如果你希望默认显示暗色主题,可以设置

NEXT_PUBLIC_APPEARANCE = "dark"

这样,用户初次访问你的网站时,看到的就是暗色主题了。

设置主题文件夹

ShipAny 支持多主题系统。基于此,你可以自定义自己的主题,实现更加个性化的页面效果。

默认的主题基于 shadcn + tailark 实现,对应的主题文件夹是 src/themes/default

ShipAny 官网 为例,演示如何设置主题文件夹,实现自定义主题效果。

  1. 先修改配置文件,启用自定义的主题
NEXT_PUBLIC_THEME = "shipany"
  1. 创建主题文件夹

src/themes 文件夹,根据配置的自定义主题名称,创建主题文件夹。

比如,这里需要创建的主题文件夹是 src/themes/shipany

  1. 实现主题内容

参考 src/themes/default 文件夹的主题文件内容,实现自定义的主题文件内容。

当访问项目页面路由时,优先从配置的主题加载对应的页面文件,如果配置的主题中找不到对应的页面文件,则会加载默认的主题页面文件。

按照下面自定义主题 shipany 的文件结构示例。

  • 访问 /,/pricing,/showcases 页面时,显示的是 src/themes/shipany/pages/{landing,pricing,showcases}.tsx 文件内容。
  • 访问 /blog,/blog/xxx,/terms-of-service,/privacy-policy 等页面时,因为在自定义的主题文件夹中没有对应的页面文件,回退显示 src/themes/default/pages/{blog,blog-detail,page-detail}.tsx 等文件内容。
  • 访问 /templates,/templates/xxx 页面时,在默认的主题系统中无定义,你需要先创建对应的页面路由文件:src/app/[locale]/(landing)/templates/page.tsxsrc/app/[locale]/(landing)/templates/[name]/page.tsx,再引入主题页面文件进行展示。

页面路由文件 src/app/[locale]/(landing)/templates/page.tsx 内容示例:

import { getThemePage } from '@/core/theme';
import { getTemplates } from '@/shared/models/template';

export default async function TemplatesPage({
  params,
  searchParams,
}: {
  params: Promise<{ locale: string }>;
  searchParams: Promise<{
    page?: number;
    pageSize?: number;
  }>;
}) {
  const { locale } = await params;
  const { page: pageNum, pageSize } = await searchParams;
  const page = pageNum || 1;
  const limit = pageSize || 30;

  // get templates from database
  const templatesData = await getTemplates({ page, limit });

  // load page component
  const Page = await getThemePage('templates');

  return <Page locale={locale} templates={templatesData} />;
}

访问 /templates 页面时,优先从 src/themes/shipany/pages 找页面文件,找不到再回退显示 src/themes/default/pages 下面的同名文件。

  1. 预览自定义主题

访问 ShipAny 官网 ,可以看到自定义主题的效果。

light 模式:

dark 模式:

参考上述自定义主题的流程,你可以选择任意你喜欢的 UI 组件库,根据你的业务特点,定制自己的项目主题,让你的项目更加地高端大气。

流行的组件库推荐: