UNPKG

ipink-theme

Version:

Theme for ui, 根据自定义的颜色值导出一套常用的Map合集, 字号、圆角、边框、字色、背景色、...

113 lines (109 loc) 3.89 kB
/** * 用于 Vue2 的store */ import { createThemeList, ThemeConfig } from "ipink-theme"; const themeList = ThemeConfig.themeList || [{"colorPrimary": "#16AD90", id: "blue", label: "经典蓝"}]; const list = createThemeList({ themeList, useDark: ThemeConfig.useDark }) || []; export default { namespaced: true, state: () => { return { id: ThemeConfig.themeId, // 当前主题 modeId: ThemeConfig.modeId, // 当前模式 light | dark themeList: list, useDark: ThemeConfig.useDark } }, getters: { theme(state){ let theme = state.themeList.find((theme) => theme.id === `${state.id}-${state.modeId}` || theme.id === state.id); if (!theme) theme = state.themeList.find((theme) => theme.id === `${state.id}-${state.modeId === "light" ? "light" : "dark"}`) if(!theme){ theme = state.themeList.find(theme => theme.id.includes(state.modeId)) if(theme) { const [id, mode] = theme.id.split("-") state.id = id; } } return theme; }, mode(state){ return state.modeId } }, mutations: { /** @desc 切换主题暗黑模式 **/ changeMode(state, id) { if (id) state.modeId = id else state.modeId = state.modeId === "light" ? "dark" : "light"; }, /** @desc 切换主题 **/ change(state, id) { if(!id) return; if(id.includes("-light")) id = id.split("-light")[0]; if(id.includes("-dark")) id = id.split("-dark")[0]; state.id = id; }, /** * @desc 添加单个主题 * @param seed { SeedOption } * @param dir 添加的方向 { "push" | "unshift" } * @return: -1 | 1 */ add(state, seed, dir) { return this.addList([seed], dir); }, /** * @desc 添加多个主题 * @param seedList { SeedOption[] } * @param dir 添加的方向 { "push" | "unshift" } * @return: -1 | 1 */ addList(state, seedList, dir) { (seedList || []).forEach((item) => { Object.keys(item).forEach((key) => { if(!item[key]) delete item[key]; }) }) const newList = createThemeList({ themeList: seedList, useDark: state.useDark }) || []; if(!newList.length) return -1; if(dir == "unshift") state.themeList = newList.concat(state.themeList) else state.themeList = state.themeList.concat(newList); return 1 }, /** * @desc 删除指定主题, 不可删除当前使用的主题 * @param id { string } * @return: -1 | 1 */ del(state, id) { const newList= []; state.themeList.forEach((theme) => { if (theme.id != id && theme.id != `${id}-dark` && theme.id != `${id}-light`) newList.push(theme); }) const status = newList.length === state.themeList.length ? -1 : 1; if(status == 1) { state.themeList = newList; if(id == state.id){ this.commit("change", newList[0].id); } } return status; }, sort(state, func) { return state.themeList = state.themeList.sort(func); }, /** * @desc 初始化主题列表, 会覆盖原有的 * @param seedList { SeedOption[] } * @return: -1 | 1 */ init(state, seedList = ThemeConfig.themeList) { const newList = createThemeList({ themeList: seedList, useDark: ThemeConfig.useDark }) || []; if(!newList.length) return -1 state.themeList = newList; this.commit("change", state.themeList[0].id); return 1; } } }