zhentou 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -34,9 +34,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
34
34
  ));
35
35
 
36
36
  // node_modules/tsup/assets/cjs_shims.js
37
+ var getImportMetaUrl, importMetaUrl;
37
38
  var init_cjs_shims = __esm({
38
39
  "node_modules/tsup/assets/cjs_shims.js"() {
39
40
  "use strict";
41
+ getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.tagName.toUpperCase() === "SCRIPT" ? document.currentScript.src : new URL("main.js", document.baseURI).href;
42
+ importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
40
43
  }
41
44
  });
42
45
 
@@ -1005,7 +1008,7 @@ var require_package = __commonJS({
1005
1008
  "package.json"(exports2, module2) {
1006
1009
  module2.exports = {
1007
1010
  name: "zhentou",
1008
- version: "1.0.2",
1011
+ version: "1.0.3",
1009
1012
  description: "\u4E2D\u6587\u539F\u5B50\u5316 CSS \u6846\u67B6 - \u4F7F\u7528\u4E2D\u6587\u7C7B\u540D\u7F16\u5199\u6837\u5F0F",
1010
1013
  main: "dist/index.js",
1011
1014
  module: "dist/index.mjs",
@@ -1078,16 +1081,17 @@ init_cjs_shims();
1078
1081
  var path = __toESM(require("path"));
1079
1082
  var fs = __toESM(require("fs"));
1080
1083
  var import_url = require("url");
1084
+ var import_module = require("module");
1081
1085
  var defaultConfig = {
1082
1086
  content: ["./src/**/*.{html,js,jsx,ts,tsx,vue}"],
1083
1087
  output: "./dist/zhentou.css",
1084
1088
  extend: {}
1085
1089
  };
1086
1090
  var configFileNames = [
1087
- "zhentou.config.js",
1088
- "zhentou.config.cjs",
1091
+ "zhentou.config.ts",
1089
1092
  "zhentou.config.mjs",
1090
- "zhentou.config.ts"
1093
+ "zhentou.config.cjs",
1094
+ "zhentou.config.js"
1091
1095
  ];
1092
1096
  function findConfigFile(cwd = process.cwd()) {
1093
1097
  for (const fileName of configFileNames) {
@@ -1104,8 +1108,15 @@ async function loadConfig(cwd = process.cwd()) {
1104
1108
  return { ...defaultConfig };
1105
1109
  }
1106
1110
  try {
1107
- const fileUrl = (0, import_url.pathToFileURL)(configPath).href;
1108
- const userConfig = await import(`${fileUrl}?t=${Date.now()}`);
1111
+ let userConfig;
1112
+ if (configPath.endsWith(".cjs")) {
1113
+ const require2 = (0, import_module.createRequire)(importMetaUrl);
1114
+ delete require2.cache[require2.resolve(configPath)];
1115
+ userConfig = require2(configPath);
1116
+ } else {
1117
+ const fileUrl = (0, import_url.pathToFileURL)(configPath).href;
1118
+ userConfig = await import(`${fileUrl}?t=${Date.now()}`);
1119
+ }
1109
1120
  const config = userConfig.default || userConfig;
1110
1121
  return {
1111
1122
  ...defaultConfig,
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/presets/flex.ts","../src/presets/spacing.ts","../src/presets/sizing.ts","../src/presets/typography.ts","../src/presets/colors.ts","../src/presets/layout.ts","../src/presets/border.ts","../src/presets/effects.ts","../src/presets/index.ts","../package.json","../src/cli.ts","../src/core/context.ts","../src/core/config.ts","../src/core/scanner.ts","../src/core/extractor.ts","../src/core/generator.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import type { PresetModule } from '../types'\r\n\r\n/**\r\n * Flexbox 相关预设规则\r\n */\r\nexport const flexPreset: PresetModule = {\r\n name: 'flex',\r\n rules: {\r\n // display\r\n '弹性盒': 'display: flex;',\r\n '行内弹性盒': 'display: inline-flex;',\r\n \r\n // flex-direction\r\n '弹性行': 'flex-direction: row;',\r\n '弹性翻转行': 'flex-direction: row-reverse;',\r\n '弹性列': 'flex-direction: column;',\r\n '弹性翻转列': 'flex-direction: column-reverse;',\r\n \r\n // flex-wrap\r\n '弹性换行': 'flex-wrap: wrap;',\r\n '弹性不换行': 'flex-wrap: nowrap;',\r\n '弹性翻转换行': 'flex-wrap: wrap-reverse;',\r\n \r\n // justify-content (主轴对齐)\r\n '主轴起点': 'justify-content: flex-start;',\r\n '主轴终点': 'justify-content: flex-end;',\r\n '主轴居中': 'justify-content: center;',\r\n '主轴两端': 'justify-content: space-between;',\r\n '主轴环绕': 'justify-content: space-around;',\r\n '主轴均分': 'justify-content: space-evenly;',\r\n \r\n // align-items (交叉轴对齐)\r\n '交叉轴起点': 'align-items: flex-start;',\r\n '交叉轴终点': 'align-items: flex-end;',\r\n '交叉轴居中': 'align-items: center;',\r\n '交叉轴拉伸': 'align-items: stretch;',\r\n '交叉轴基线': 'align-items: baseline;',\r\n \r\n // align-content (多行对齐)\r\n '多行起点': 'align-content: flex-start;',\r\n '多行终点': 'align-content: flex-end;',\r\n '多行居中': 'align-content: center;',\r\n '多行两端': 'align-content: space-between;',\r\n '多行环绕': 'align-content: space-around;',\r\n '多行拉伸': 'align-content: stretch;',\r\n \r\n // align-self (单项对齐)\r\n '自身起点': 'align-self: flex-start;',\r\n '自身终点': 'align-self: flex-end;',\r\n '自身居中': 'align-self: center;',\r\n '自身拉伸': 'align-self: stretch;',\r\n '自身基线': 'align-self: baseline;',\r\n '自身自动': 'align-self: auto;',\r\n \r\n // flex 属性\r\n '弹性1': 'flex: 1;',\r\n '弹性自动': 'flex: auto;',\r\n '弹性初始': 'flex: initial;',\r\n '弹性无': 'flex: none;',\r\n \r\n // flex-grow\r\n '放大0': 'flex-grow: 0;',\r\n '放大1': 'flex-grow: 1;',\r\n \r\n // flex-shrink\r\n '收缩0': 'flex-shrink: 0;',\r\n '收缩1': 'flex-shrink: 1;',\r\n \r\n // gap\r\n '间距-0': 'gap: 0;',\r\n '间距-1': 'gap: 0.25rem;',\r\n '间距-2': 'gap: 0.5rem;',\r\n '间距-3': 'gap: 0.75rem;',\r\n '间距-4': 'gap: 1rem;',\r\n '间距-5': 'gap: 1.25rem;',\r\n '间距-6': 'gap: 1.5rem;',\r\n '间距-8': 'gap: 2rem;',\r\n '间距-10': 'gap: 2.5rem;',\r\n '间距-12': 'gap: 3rem;',\r\n '间距-16': 'gap: 4rem;',\r\n \r\n // order\r\n '顺序-1': 'order: 1;',\r\n '顺序-2': 'order: 2;',\r\n '顺序-3': 'order: 3;',\r\n '顺序首': 'order: -9999;',\r\n '顺序末': 'order: 9999;',\r\n '顺序无': 'order: 0;',\r\n }\r\n}\r\n\r\nexport default flexPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n// 间距值映射\r\nconst spacingValues: Record<string, string> = {\r\n '0': '0',\r\n '1': '0.25rem',\r\n '2': '0.5rem',\r\n '3': '0.75rem',\r\n '4': '1rem',\r\n '5': '1.25rem',\r\n '6': '1.5rem',\r\n '8': '2rem',\r\n '10': '2.5rem',\r\n '12': '3rem',\r\n '16': '4rem',\r\n '20': '5rem',\r\n '24': '6rem',\r\n '32': '8rem',\r\n '自动': 'auto',\r\n}\r\n\r\n// 生成间距规则\r\nfunction generateSpacingRules(): Record<string, string> {\r\n const rules: Record<string, string> = {}\r\n \r\n for (const [key, value] of Object.entries(spacingValues)) {\r\n // margin\r\n rules[`外边距-${key}`] = `margin: ${value};`\r\n rules[`上外边距-${key}`] = `margin-top: ${value};`\r\n rules[`右外边距-${key}`] = `margin-right: ${value};`\r\n rules[`下外边距-${key}`] = `margin-bottom: ${value};`\r\n rules[`左外边距-${key}`] = `margin-left: ${value};`\r\n rules[`水平外边距-${key}`] = `margin-left: ${value}; margin-right: ${value};`\r\n rules[`垂直外边距-${key}`] = `margin-top: ${value}; margin-bottom: ${value};`\r\n \r\n // padding\r\n rules[`内边距-${key}`] = `padding: ${value};`\r\n rules[`上内边距-${key}`] = `padding-top: ${value};`\r\n rules[`右内边距-${key}`] = `padding-right: ${value};`\r\n rules[`下内边距-${key}`] = `padding-bottom: ${value};`\r\n rules[`左内边距-${key}`] = `padding-left: ${value};`\r\n rules[`水平内边距-${key}`] = `padding-left: ${value}; padding-right: ${value};`\r\n rules[`垂直内边距-${key}`] = `padding-top: ${value}; padding-bottom: ${value};`\r\n }\r\n \r\n // 负外边距\r\n for (const [key, value] of Object.entries(spacingValues)) {\r\n if (key === '0' || key === '自动') continue\r\n rules[`负外边距-${key}`] = `margin: -${value};`\r\n rules[`上负外边距-${key}`] = `margin-top: -${value};`\r\n rules[`右负外边距-${key}`] = `margin-right: -${value};`\r\n rules[`下负外边距-${key}`] = `margin-bottom: -${value};`\r\n rules[`左负外边距-${key}`] = `margin-left: -${value};`\r\n }\r\n \r\n return rules\r\n}\r\n\r\n/**\r\n * Spacing 间距预设规则\r\n */\r\nexport const spacingPreset: PresetModule = {\r\n name: 'spacing',\r\n rules: generateSpacingRules()\r\n}\r\n\r\nexport default spacingPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n/**\r\n * Sizing 尺寸预设规则\r\n */\r\nexport const sizingPreset: PresetModule = {\r\n name: 'sizing',\r\n rules: {\r\n // width\r\n '宽度-0': 'width: 0;',\r\n '宽度-1': 'width: 0.25rem;',\r\n '宽度-2': 'width: 0.5rem;',\r\n '宽度-4': 'width: 1rem;',\r\n '宽度-8': 'width: 2rem;',\r\n '宽度-12': 'width: 3rem;',\r\n '宽度-16': 'width: 4rem;',\r\n '宽度-20': 'width: 5rem;',\r\n '宽度-24': 'width: 6rem;',\r\n '宽度-32': 'width: 8rem;',\r\n '宽度-40': 'width: 10rem;',\r\n '宽度-48': 'width: 12rem;',\r\n '宽度-56': 'width: 14rem;',\r\n '宽度-64': 'width: 16rem;',\r\n '宽度-自动': 'width: auto;',\r\n '宽度-全': 'width: 100%;',\r\n '宽度-屏': 'width: 100vw;',\r\n '宽度-最小': 'width: min-content;',\r\n '宽度-最大': 'width: max-content;',\r\n '宽度-适配': 'width: fit-content;',\r\n '宽度-1/2': 'width: 50%;',\r\n '宽度-1/3': 'width: 33.333333%;',\r\n '宽度-2/3': 'width: 66.666667%;',\r\n '宽度-1/4': 'width: 25%;',\r\n '宽度-3/4': 'width: 75%;',\r\n '宽度-1/5': 'width: 20%;',\r\n '宽度-2/5': 'width: 40%;',\r\n '宽度-3/5': 'width: 60%;',\r\n '宽度-4/5': 'width: 80%;',\r\n \r\n // min-width\r\n '最小宽度-0': 'min-width: 0;',\r\n '最小宽度-全': 'min-width: 100%;',\r\n '最小宽度-最小': 'min-width: min-content;',\r\n '最小宽度-最大': 'min-width: max-content;',\r\n '最小宽度-适配': 'min-width: fit-content;',\r\n \r\n // max-width\r\n '最大宽度-0': 'max-width: 0;',\r\n '最大宽度-全': 'max-width: 100%;',\r\n '最大宽度-无': 'max-width: none;',\r\n '最大宽度-小': 'max-width: 24rem;',\r\n '最大宽度-中': 'max-width: 28rem;',\r\n '最大宽度-大': 'max-width: 32rem;',\r\n '最大宽度-超大': 'max-width: 36rem;',\r\n '最大宽度-极大': 'max-width: 42rem;',\r\n \r\n // height\r\n '高度-0': 'height: 0;',\r\n '高度-1': 'height: 0.25rem;',\r\n '高度-2': 'height: 0.5rem;',\r\n '高度-4': 'height: 1rem;',\r\n '高度-8': 'height: 2rem;',\r\n '高度-12': 'height: 3rem;',\r\n '高度-16': 'height: 4rem;',\r\n '高度-20': 'height: 5rem;',\r\n '高度-24': 'height: 6rem;',\r\n '高度-32': 'height: 8rem;',\r\n '高度-40': 'height: 10rem;',\r\n '高度-48': 'height: 12rem;',\r\n '高度-56': 'height: 14rem;',\r\n '高度-64': 'height: 16rem;',\r\n '高度-自动': 'height: auto;',\r\n '高度-全': 'height: 100%;',\r\n '高度-屏': 'height: 100vh;',\r\n '高度-最小': 'height: min-content;',\r\n '高度-最大': 'height: max-content;',\r\n '高度-适配': 'height: fit-content;',\r\n '高度-1/2': 'height: 50%;',\r\n '高度-1/3': 'height: 33.333333%;',\r\n '高度-2/3': 'height: 66.666667%;',\r\n '高度-1/4': 'height: 25%;',\r\n '高度-3/4': 'height: 75%;',\r\n \r\n // min-height\r\n '最小高度-0': 'min-height: 0;',\r\n '最小高度-全': 'min-height: 100%;',\r\n '最小高度-屏': 'min-height: 100vh;',\r\n \r\n // max-height\r\n '最大高度-0': 'max-height: 0;',\r\n '最大高度-全': 'max-height: 100%;',\r\n '最大高度-屏': 'max-height: 100vh;',\r\n '最大高度-无': 'max-height: none;',\r\n \r\n // size (width + height)\r\n '尺寸-0': 'width: 0; height: 0;',\r\n '尺寸-4': 'width: 1rem; height: 1rem;',\r\n '尺寸-8': 'width: 2rem; height: 2rem;',\r\n '尺寸-12': 'width: 3rem; height: 3rem;',\r\n '尺寸-16': 'width: 4rem; height: 4rem;',\r\n '尺寸-20': 'width: 5rem; height: 5rem;',\r\n '尺寸-24': 'width: 6rem; height: 6rem;',\r\n '尺寸-全': 'width: 100%; height: 100%;',\r\n }\r\n}\r\n\r\nexport default sizingPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n/**\r\n * Typography 字体排版预设规则\r\n */\r\nexport const typographyPreset: PresetModule = {\r\n name: 'typography',\r\n rules: {\r\n // font-size\r\n '字号-超小': 'font-size: 0.75rem; line-height: 1rem;',\r\n '字号-小': 'font-size: 0.875rem; line-height: 1.25rem;',\r\n '字号-基础': 'font-size: 1rem; line-height: 1.5rem;',\r\n '字号-大': 'font-size: 1.125rem; line-height: 1.75rem;',\r\n '字号-超大': 'font-size: 1.25rem; line-height: 1.75rem;',\r\n '字号-2超大': 'font-size: 1.5rem; line-height: 2rem;',\r\n '字号-3超大': 'font-size: 1.875rem; line-height: 2.25rem;',\r\n '字号-4超大': 'font-size: 2.25rem; line-height: 2.5rem;',\r\n '字号-5超大': 'font-size: 3rem; line-height: 1;',\r\n '字号-6超大': 'font-size: 3.75rem; line-height: 1;',\r\n '字号-7超大': 'font-size: 4.5rem; line-height: 1;',\r\n '字号-8超大': 'font-size: 6rem; line-height: 1;',\r\n '字号-9超大': 'font-size: 8rem; line-height: 1;',\r\n \r\n // font-weight\r\n '字重-细': 'font-weight: 100;',\r\n '字重-超轻': 'font-weight: 200;',\r\n '字重-轻': 'font-weight: 300;',\r\n '字重-正常': 'font-weight: 400;',\r\n '字重-中': 'font-weight: 500;',\r\n '字重-半粗': 'font-weight: 600;',\r\n '字重-粗': 'font-weight: 700;',\r\n '字重-超粗': 'font-weight: 800;',\r\n '字重-黑': 'font-weight: 900;',\r\n \r\n // font-style\r\n '斜体': 'font-style: italic;',\r\n '非斜体': 'font-style: normal;',\r\n \r\n // text-align\r\n '文字居左': 'text-align: left;',\r\n '文字居中': 'text-align: center;',\r\n '文字居右': 'text-align: right;',\r\n '文字两端': 'text-align: justify;',\r\n '文字起点': 'text-align: start;',\r\n '文字终点': 'text-align: end;',\r\n \r\n // text-decoration\r\n '下划线': 'text-decoration-line: underline;',\r\n '上划线': 'text-decoration-line: overline;',\r\n '删除线': 'text-decoration-line: line-through;',\r\n '无装饰': 'text-decoration-line: none;',\r\n \r\n // text-transform\r\n '大写': 'text-transform: uppercase;',\r\n '小写': 'text-transform: lowercase;',\r\n '首字母大写': 'text-transform: capitalize;',\r\n '正常大小写': 'text-transform: none;',\r\n \r\n // line-height\r\n '行高-无': 'line-height: 1;',\r\n '行高-紧': 'line-height: 1.25;',\r\n '行高-窄': 'line-height: 1.375;',\r\n '行高-正常': 'line-height: 1.5;',\r\n '行高-宽': 'line-height: 1.625;',\r\n '行高-松': 'line-height: 2;',\r\n \r\n // letter-spacing\r\n '字距-紧': 'letter-spacing: -0.05em;',\r\n '字距-窄': 'letter-spacing: -0.025em;',\r\n '字距-正常': 'letter-spacing: 0;',\r\n '字距-宽': 'letter-spacing: 0.025em;',\r\n '字距-松': 'letter-spacing: 0.05em;',\r\n '字距-超松': 'letter-spacing: 0.1em;',\r\n \r\n // word-break\r\n '断词-正常': 'word-break: normal;',\r\n '断词-全部': 'word-break: break-all;',\r\n '断词-保持': 'word-break: keep-all;',\r\n \r\n // white-space\r\n '空白-正常': 'white-space: normal;',\r\n '空白-不换行': 'white-space: nowrap;',\r\n '空白-保留': 'white-space: pre;',\r\n '空白-保留换行': 'white-space: pre-line;',\r\n '空白-保留全部': 'white-space: pre-wrap;',\r\n \r\n // text-overflow\r\n '文字截断': 'overflow: hidden; text-overflow: ellipsis; white-space: nowrap;',\r\n '多行截断-2': 'overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;',\r\n '多行截断-3': 'overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3;',\r\n '多行截断-4': 'overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4;',\r\n \r\n // vertical-align\r\n '垂直对齐-基线': 'vertical-align: baseline;',\r\n '垂直对齐-顶': 'vertical-align: top;',\r\n '垂直对齐-中': 'vertical-align: middle;',\r\n '垂直对齐-底': 'vertical-align: bottom;',\r\n '垂直对齐-文字顶': 'vertical-align: text-top;',\r\n '垂直对齐-文字底': 'vertical-align: text-bottom;',\r\n \r\n // font-family\r\n '字体-无衬线': 'font-family: ui-sans-serif, system-ui, sans-serif;',\r\n '字体-衬线': 'font-family: ui-serif, Georgia, serif;',\r\n '字体-等宽': 'font-family: ui-monospace, monospace;',\r\n }\r\n}\r\n\r\nexport default typographyPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n// 颜色调色板\r\nconst colorPalette: Record<string, Record<string, string>> = {\r\n '灰': {\r\n '50': '#f9fafb',\r\n '100': '#f3f4f6',\r\n '200': '#e5e7eb',\r\n '300': '#d1d5db',\r\n '400': '#9ca3af',\r\n '500': '#6b7280',\r\n '600': '#4b5563',\r\n '700': '#374151',\r\n '800': '#1f2937',\r\n '900': '#111827',\r\n },\r\n '红': {\r\n '50': '#fef2f2',\r\n '100': '#fee2e2',\r\n '200': '#fecaca',\r\n '300': '#fca5a5',\r\n '400': '#f87171',\r\n '500': '#ef4444',\r\n '600': '#dc2626',\r\n '700': '#b91c1c',\r\n '800': '#991b1b',\r\n '900': '#7f1d1d',\r\n },\r\n '橙': {\r\n '50': '#fff7ed',\r\n '100': '#ffedd5',\r\n '200': '#fed7aa',\r\n '300': '#fdba74',\r\n '400': '#fb923c',\r\n '500': '#f97316',\r\n '600': '#ea580c',\r\n '700': '#c2410c',\r\n '800': '#9a3412',\r\n '900': '#7c2d12',\r\n },\r\n '黄': {\r\n '50': '#fefce8',\r\n '100': '#fef9c3',\r\n '200': '#fef08a',\r\n '300': '#fde047',\r\n '400': '#facc15',\r\n '500': '#eab308',\r\n '600': '#ca8a04',\r\n '700': '#a16207',\r\n '800': '#854d0e',\r\n '900': '#713f12',\r\n },\r\n '绿': {\r\n '50': '#f0fdf4',\r\n '100': '#dcfce7',\r\n '200': '#bbf7d0',\r\n '300': '#86efac',\r\n '400': '#4ade80',\r\n '500': '#22c55e',\r\n '600': '#16a34a',\r\n '700': '#15803d',\r\n '800': '#166534',\r\n '900': '#14532d',\r\n },\r\n '青': {\r\n '50': '#ecfeff',\r\n '100': '#cffafe',\r\n '200': '#a5f3fc',\r\n '300': '#67e8f9',\r\n '400': '#22d3ee',\r\n '500': '#06b6d4',\r\n '600': '#0891b2',\r\n '700': '#0e7490',\r\n '800': '#155e75',\r\n '900': '#164e63',\r\n },\r\n '蓝': {\r\n '50': '#eff6ff',\r\n '100': '#dbeafe',\r\n '200': '#bfdbfe',\r\n '300': '#93c5fd',\r\n '400': '#60a5fa',\r\n '500': '#3b82f6',\r\n '600': '#2563eb',\r\n '700': '#1d4ed8',\r\n '800': '#1e40af',\r\n '900': '#1e3a8a',\r\n },\r\n '紫': {\r\n '50': '#faf5ff',\r\n '100': '#f3e8ff',\r\n '200': '#e9d5ff',\r\n '300': '#d8b4fe',\r\n '400': '#c084fc',\r\n '500': '#a855f7',\r\n '600': '#9333ea',\r\n '700': '#7e22ce',\r\n '800': '#6b21a8',\r\n '900': '#581c87',\r\n },\r\n '粉': {\r\n '50': '#fdf2f8',\r\n '100': '#fce7f3',\r\n '200': '#fbcfe8',\r\n '300': '#f9a8d4',\r\n '400': '#f472b6',\r\n '500': '#ec4899',\r\n '600': '#db2777',\r\n '700': '#be185d',\r\n '800': '#9d174d',\r\n '900': '#831843',\r\n },\r\n}\r\n\r\n// 生成颜色规则\r\nfunction generateColorRules(): Record<string, string> {\r\n const rules: Record<string, string> = {}\r\n \r\n // 基础颜色\r\n rules['文字-透明'] = 'color: transparent;'\r\n rules['文字-黑'] = 'color: #000;'\r\n rules['文字-白'] = 'color: #fff;'\r\n rules['背景-透明'] = 'background-color: transparent;'\r\n rules['背景-黑'] = 'background-color: #000;'\r\n rules['背景-白'] = 'background-color: #fff;'\r\n rules['边框-透明'] = 'border-color: transparent;'\r\n rules['边框-黑'] = 'border-color: #000;'\r\n rules['边框-白'] = 'border-color: #fff;'\r\n \r\n // 调色板颜色\r\n for (const [colorName, shades] of Object.entries(colorPalette)) {\r\n for (const [shade, hex] of Object.entries(shades)) {\r\n // text color\r\n rules[`文字-${colorName}-${shade}`] = `color: ${hex};`\r\n // background color\r\n rules[`背景-${colorName}-${shade}`] = `background-color: ${hex};`\r\n // border color\r\n rules[`边框色-${colorName}-${shade}`] = `border-color: ${hex};`\r\n }\r\n }\r\n \r\n // opacity\r\n rules['透明度-0'] = 'opacity: 0;'\r\n rules['透明度-5'] = 'opacity: 0.05;'\r\n rules['透明度-10'] = 'opacity: 0.1;'\r\n rules['透明度-20'] = 'opacity: 0.2;'\r\n rules['透明度-25'] = 'opacity: 0.25;'\r\n rules['透明度-30'] = 'opacity: 0.3;'\r\n rules['透明度-40'] = 'opacity: 0.4;'\r\n rules['透明度-50'] = 'opacity: 0.5;'\r\n rules['透明度-60'] = 'opacity: 0.6;'\r\n rules['透明度-70'] = 'opacity: 0.7;'\r\n rules['透明度-75'] = 'opacity: 0.75;'\r\n rules['透明度-80'] = 'opacity: 0.8;'\r\n rules['透明度-90'] = 'opacity: 0.9;'\r\n rules['透明度-95'] = 'opacity: 0.95;'\r\n rules['透明度-100'] = 'opacity: 1;'\r\n \r\n return rules\r\n}\r\n\r\n/**\r\n * Colors 颜色预设规则\r\n */\r\nexport const colorsPreset: PresetModule = {\r\n name: 'colors',\r\n rules: generateColorRules()\r\n}\r\n\r\nexport default colorsPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n/**\r\n * Layout 布局预设规则\r\n */\r\nexport const layoutPreset: PresetModule = {\r\n name: 'layout',\r\n rules: {\r\n // display\r\n '块级': 'display: block;',\r\n '行内块': 'display: inline-block;',\r\n '行内': 'display: inline;',\r\n '隐藏': 'display: none;',\r\n '内容': 'display: contents;',\r\n '表格': 'display: table;',\r\n '表格行': 'display: table-row;',\r\n '表格单元': 'display: table-cell;',\r\n '网格': 'display: grid;',\r\n '行内网格': 'display: inline-grid;',\r\n '流式': 'display: flow-root;',\r\n \r\n // position\r\n '静态定位': 'position: static;',\r\n '相对定位': 'position: relative;',\r\n '绝对定位': 'position: absolute;',\r\n '固定定位': 'position: fixed;',\r\n '粘性定位': 'position: sticky;',\r\n \r\n // top/right/bottom/left\r\n '定位-0': 'inset: 0;',\r\n '上-0': 'top: 0;',\r\n '右-0': 'right: 0;',\r\n '下-0': 'bottom: 0;',\r\n '左-0': 'left: 0;',\r\n '上-1': 'top: 0.25rem;',\r\n '右-1': 'right: 0.25rem;',\r\n '下-1': 'bottom: 0.25rem;',\r\n '左-1': 'left: 0.25rem;',\r\n '上-2': 'top: 0.5rem;',\r\n '右-2': 'right: 0.5rem;',\r\n '下-2': 'bottom: 0.5rem;',\r\n '左-2': 'left: 0.5rem;',\r\n '上-4': 'top: 1rem;',\r\n '右-4': 'right: 1rem;',\r\n '下-4': 'bottom: 1rem;',\r\n '左-4': 'left: 1rem;',\r\n '上-自动': 'top: auto;',\r\n '右-自动': 'right: auto;',\r\n '下-自动': 'bottom: auto;',\r\n '左-自动': 'left: auto;',\r\n '上-全': 'top: 100%;',\r\n '右-全': 'right: 100%;',\r\n '下-全': 'bottom: 100%;',\r\n '左-全': 'left: 100%;',\r\n '上-1/2': 'top: 50%;',\r\n '右-1/2': 'right: 50%;',\r\n '下-1/2': 'bottom: 50%;',\r\n '左-1/2': 'left: 50%;',\r\n \r\n // z-index\r\n '层级-0': 'z-index: 0;',\r\n '层级-10': 'z-index: 10;',\r\n '层级-20': 'z-index: 20;',\r\n '层级-30': 'z-index: 30;',\r\n '层级-40': 'z-index: 40;',\r\n '层级-50': 'z-index: 50;',\r\n '层级-自动': 'z-index: auto;',\r\n '层级-最高': 'z-index: 9999;',\r\n '层级-最低': 'z-index: -1;',\r\n \r\n // overflow\r\n '溢出-自动': 'overflow: auto;',\r\n '溢出-隐藏': 'overflow: hidden;',\r\n '溢出-可见': 'overflow: visible;',\r\n '溢出-滚动': 'overflow: scroll;',\r\n '横向溢出-自动': 'overflow-x: auto;',\r\n '横向溢出-隐藏': 'overflow-x: hidden;',\r\n '横向溢出-可见': 'overflow-x: visible;',\r\n '横向溢出-滚动': 'overflow-x: scroll;',\r\n '纵向溢出-自动': 'overflow-y: auto;',\r\n '纵向溢出-隐藏': 'overflow-y: hidden;',\r\n '纵向溢出-可见': 'overflow-y: visible;',\r\n '纵向溢出-滚动': 'overflow-y: scroll;',\r\n \r\n // visibility\r\n '可见': 'visibility: visible;',\r\n '不可见': 'visibility: hidden;',\r\n '折叠': 'visibility: collapse;',\r\n \r\n // float\r\n '左浮动': 'float: left;',\r\n '右浮动': 'float: right;',\r\n '不浮动': 'float: none;',\r\n '清除浮动': 'clear: both;',\r\n '清除左浮动': 'clear: left;',\r\n '清除右浮动': 'clear: right;',\r\n \r\n // object-fit\r\n '对象-包含': 'object-fit: contain;',\r\n '对象-覆盖': 'object-fit: cover;',\r\n '对象-填充': 'object-fit: fill;',\r\n '对象-无': 'object-fit: none;',\r\n '对象-缩小': 'object-fit: scale-down;',\r\n \r\n // box-sizing\r\n '盒模型-边框': 'box-sizing: border-box;',\r\n '盒模型-内容': 'box-sizing: content-box;',\r\n \r\n // cursor\r\n '指针-默认': 'cursor: default;',\r\n '指针-手型': 'cursor: pointer;',\r\n '指针-等待': 'cursor: wait;',\r\n '指针-文本': 'cursor: text;',\r\n '指针-移动': 'cursor: move;',\r\n '指针-禁止': 'cursor: not-allowed;',\r\n '指针-帮助': 'cursor: help;',\r\n '指针-十字': 'cursor: crosshair;',\r\n '指针-缩放': 'cursor: zoom-in;',\r\n '指针-抓取': 'cursor: grab;',\r\n '指针-抓取中': 'cursor: grabbing;',\r\n \r\n // user-select\r\n '选择-无': 'user-select: none;',\r\n '选择-文本': 'user-select: text;',\r\n '选择-全部': 'user-select: all;',\r\n '选择-自动': 'user-select: auto;',\r\n \r\n // pointer-events\r\n '事件-无': 'pointer-events: none;',\r\n '事件-自动': 'pointer-events: auto;',\r\n \r\n // resize\r\n '调整-无': 'resize: none;',\r\n '调整-两向': 'resize: both;',\r\n '调整-横向': 'resize: horizontal;',\r\n '调整-纵向': 'resize: vertical;',\r\n }\r\n}\r\n\r\nexport default layoutPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n/**\r\n * Border 边框预设规则\r\n */\r\nexport const borderPreset: PresetModule = {\r\n name: 'border',\r\n rules: {\r\n // border-width\r\n '边框-0': 'border-width: 0;',\r\n '边框': 'border-width: 1px;',\r\n '边框-2': 'border-width: 2px;',\r\n '边框-4': 'border-width: 4px;',\r\n '边框-8': 'border-width: 8px;',\r\n '上边框-0': 'border-top-width: 0;',\r\n '上边框': 'border-top-width: 1px;',\r\n '上边框-2': 'border-top-width: 2px;',\r\n '上边框-4': 'border-top-width: 4px;',\r\n '右边框-0': 'border-right-width: 0;',\r\n '右边框': 'border-right-width: 1px;',\r\n '右边框-2': 'border-right-width: 2px;',\r\n '右边框-4': 'border-right-width: 4px;',\r\n '下边框-0': 'border-bottom-width: 0;',\r\n '下边框': 'border-bottom-width: 1px;',\r\n '下边框-2': 'border-bottom-width: 2px;',\r\n '下边框-4': 'border-bottom-width: 4px;',\r\n '左边框-0': 'border-left-width: 0;',\r\n '左边框': 'border-left-width: 1px;',\r\n '左边框-2': 'border-left-width: 2px;',\r\n '左边框-4': 'border-left-width: 4px;',\r\n \r\n // border-style\r\n '边框-实线': 'border-style: solid;',\r\n '边框-虚线': 'border-style: dashed;',\r\n '边框-点线': 'border-style: dotted;',\r\n '边框-双线': 'border-style: double;',\r\n '边框-无': 'border-style: none;',\r\n '边框-隐藏': 'border-style: hidden;',\r\n \r\n // border-radius\r\n '圆角-无': 'border-radius: 0;',\r\n '圆角-小': 'border-radius: 0.125rem;',\r\n '圆角': 'border-radius: 0.25rem;',\r\n '圆角-中': 'border-radius: 0.375rem;',\r\n '圆角-大': 'border-radius: 0.5rem;',\r\n '圆角-超大': 'border-radius: 0.75rem;',\r\n '圆角-极大': 'border-radius: 1rem;',\r\n '圆角-2极大': 'border-radius: 1.5rem;',\r\n '圆角-3极大': 'border-radius: 2rem;',\r\n '圆角-全': 'border-radius: 9999px;',\r\n \r\n // 单边圆角\r\n '上圆角-无': 'border-top-left-radius: 0; border-top-right-radius: 0;',\r\n '上圆角': 'border-top-left-radius: 0.25rem; border-top-right-radius: 0.25rem;',\r\n '上圆角-大': 'border-top-left-radius: 0.5rem; border-top-right-radius: 0.5rem;',\r\n '上圆角-全': 'border-top-left-radius: 9999px; border-top-right-radius: 9999px;',\r\n '下圆角-无': 'border-bottom-left-radius: 0; border-bottom-right-radius: 0;',\r\n '下圆角': 'border-bottom-left-radius: 0.25rem; border-bottom-right-radius: 0.25rem;',\r\n '下圆角-大': 'border-bottom-left-radius: 0.5rem; border-bottom-right-radius: 0.5rem;',\r\n '下圆角-全': 'border-bottom-left-radius: 9999px; border-bottom-right-radius: 9999px;',\r\n '左圆角-无': 'border-top-left-radius: 0; border-bottom-left-radius: 0;',\r\n '左圆角': 'border-top-left-radius: 0.25rem; border-bottom-left-radius: 0.25rem;',\r\n '左圆角-大': 'border-top-left-radius: 0.5rem; border-bottom-left-radius: 0.5rem;',\r\n '左圆角-全': 'border-top-left-radius: 9999px; border-bottom-left-radius: 9999px;',\r\n '右圆角-无': 'border-top-right-radius: 0; border-bottom-right-radius: 0;',\r\n '右圆角': 'border-top-right-radius: 0.25rem; border-bottom-right-radius: 0.25rem;',\r\n '右圆角-大': 'border-top-right-radius: 0.5rem; border-bottom-right-radius: 0.5rem;',\r\n '右圆角-全': 'border-top-right-radius: 9999px; border-bottom-right-radius: 9999px;',\r\n \r\n // outline\r\n '轮廓-无': 'outline: 2px solid transparent; outline-offset: 2px;',\r\n '轮廓': 'outline-style: solid;',\r\n '轮廓-虚线': 'outline-style: dashed;',\r\n '轮廓-点线': 'outline-style: dotted;',\r\n '轮廓-双线': 'outline-style: double;',\r\n '轮廓偏移-0': 'outline-offset: 0;',\r\n '轮廓偏移-1': 'outline-offset: 1px;',\r\n '轮廓偏移-2': 'outline-offset: 2px;',\r\n '轮廓偏移-4': 'outline-offset: 4px;',\r\n '轮廓偏移-8': 'outline-offset: 8px;',\r\n \r\n // box-shadow\r\n '阴影-小': 'box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);',\r\n '阴影': 'box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);',\r\n '阴影-中': 'box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);',\r\n '阴影-大': 'box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);',\r\n '阴影-超大': 'box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);',\r\n '阴影-极大': 'box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);',\r\n '阴影-内': 'box-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);',\r\n '阴影-无': 'box-shadow: 0 0 #0000;',\r\n }\r\n}\r\n\r\nexport default borderPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n/**\r\n * Effects 特效预设规则\r\n */\r\nexport const effectsPreset: PresetModule = {\r\n name: 'effects',\r\n rules: {\r\n // transition\r\n '过渡-无': 'transition-property: none;',\r\n '过渡-全部': 'transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms;',\r\n '过渡': 'transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms;',\r\n '过渡-颜色': 'transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms;',\r\n '过渡-透明': 'transition-property: opacity; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms;',\r\n '过渡-阴影': 'transition-property: box-shadow; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms;',\r\n '过渡-变换': 'transition-property: transform; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms;',\r\n \r\n // transition-duration\r\n '时长-75': 'transition-duration: 75ms;',\r\n '时长-100': 'transition-duration: 100ms;',\r\n '时长-150': 'transition-duration: 150ms;',\r\n '时长-200': 'transition-duration: 200ms;',\r\n '时长-300': 'transition-duration: 300ms;',\r\n '时长-500': 'transition-duration: 500ms;',\r\n '时长-700': 'transition-duration: 700ms;',\r\n '时长-1000': 'transition-duration: 1000ms;',\r\n \r\n // transition-timing-function\r\n '缓动-线性': 'transition-timing-function: linear;',\r\n '缓动-入': 'transition-timing-function: cubic-bezier(0.4, 0, 1, 1);',\r\n '缓动-出': 'transition-timing-function: cubic-bezier(0, 0, 0.2, 1);',\r\n '缓动-入出': 'transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);',\r\n \r\n // transform\r\n '变换-无': 'transform: none;',\r\n '缩放-0': 'transform: scale(0);',\r\n '缩放-50': 'transform: scale(0.5);',\r\n '缩放-75': 'transform: scale(0.75);',\r\n '缩放-90': 'transform: scale(0.9);',\r\n '缩放-95': 'transform: scale(0.95);',\r\n '缩放-100': 'transform: scale(1);',\r\n '缩放-105': 'transform: scale(1.05);',\r\n '缩放-110': 'transform: scale(1.1);',\r\n '缩放-125': 'transform: scale(1.25);',\r\n '缩放-150': 'transform: scale(1.5);',\r\n \r\n '横向缩放-0': 'transform: scaleX(0);',\r\n '横向缩放-50': 'transform: scaleX(0.5);',\r\n '横向缩放-100': 'transform: scaleX(1);',\r\n '横向缩放-150': 'transform: scaleX(1.5);',\r\n \r\n '纵向缩放-0': 'transform: scaleY(0);',\r\n '纵向缩放-50': 'transform: scaleY(0.5);',\r\n '纵向缩放-100': 'transform: scaleY(1);',\r\n '纵向缩放-150': 'transform: scaleY(1.5);',\r\n \r\n '旋转-0': 'transform: rotate(0deg);',\r\n '旋转-1': 'transform: rotate(1deg);',\r\n '旋转-2': 'transform: rotate(2deg);',\r\n '旋转-3': 'transform: rotate(3deg);',\r\n '旋转-6': 'transform: rotate(6deg);',\r\n '旋转-12': 'transform: rotate(12deg);',\r\n '旋转-45': 'transform: rotate(45deg);',\r\n '旋转-90': 'transform: rotate(90deg);',\r\n '旋转-180': 'transform: rotate(180deg);',\r\n '负旋转-1': 'transform: rotate(-1deg);',\r\n '负旋转-2': 'transform: rotate(-2deg);',\r\n '负旋转-3': 'transform: rotate(-3deg);',\r\n '负旋转-6': 'transform: rotate(-6deg);',\r\n '负旋转-12': 'transform: rotate(-12deg);',\r\n '负旋转-45': 'transform: rotate(-45deg);',\r\n '负旋转-90': 'transform: rotate(-90deg);',\r\n '负旋转-180': 'transform: rotate(-180deg);',\r\n \r\n '平移X-0': 'transform: translateX(0);',\r\n '平移X-1': 'transform: translateX(0.25rem);',\r\n '平移X-2': 'transform: translateX(0.5rem);',\r\n '平移X-4': 'transform: translateX(1rem);',\r\n '平移X-8': 'transform: translateX(2rem);',\r\n '平移X-全': 'transform: translateX(100%);',\r\n '平移X-1/2': 'transform: translateX(50%);',\r\n '负平移X-1': 'transform: translateX(-0.25rem);',\r\n '负平移X-2': 'transform: translateX(-0.5rem);',\r\n '负平移X-4': 'transform: translateX(-1rem);',\r\n '负平移X-8': 'transform: translateX(-2rem);',\r\n '负平移X-全': 'transform: translateX(-100%);',\r\n '负平移X-1/2': 'transform: translateX(-50%);',\r\n \r\n '平移Y-0': 'transform: translateY(0);',\r\n '平移Y-1': 'transform: translateY(0.25rem);',\r\n '平移Y-2': 'transform: translateY(0.5rem);',\r\n '平移Y-4': 'transform: translateY(1rem);',\r\n '平移Y-8': 'transform: translateY(2rem);',\r\n '平移Y-全': 'transform: translateY(100%);',\r\n '平移Y-1/2': 'transform: translateY(50%);',\r\n '负平移Y-1': 'transform: translateY(-0.25rem);',\r\n '负平移Y-2': 'transform: translateY(-0.5rem);',\r\n '负平移Y-4': 'transform: translateY(-1rem);',\r\n '负平移Y-8': 'transform: translateY(-2rem);',\r\n '负平移Y-全': 'transform: translateY(-100%);',\r\n '负平移Y-1/2': 'transform: translateY(-50%);',\r\n \r\n '倾斜X-0': 'transform: skewX(0deg);',\r\n '倾斜X-1': 'transform: skewX(1deg);',\r\n '倾斜X-2': 'transform: skewX(2deg);',\r\n '倾斜X-3': 'transform: skewX(3deg);',\r\n '倾斜X-6': 'transform: skewX(6deg);',\r\n '倾斜X-12': 'transform: skewX(12deg);',\r\n '负倾斜X-1': 'transform: skewX(-1deg);',\r\n '负倾斜X-2': 'transform: skewX(-2deg);',\r\n '负倾斜X-3': 'transform: skewX(-3deg);',\r\n '负倾斜X-6': 'transform: skewX(-6deg);',\r\n '负倾斜X-12': 'transform: skewX(-12deg);',\r\n \r\n '倾斜Y-0': 'transform: skewY(0deg);',\r\n '倾斜Y-1': 'transform: skewY(1deg);',\r\n '倾斜Y-2': 'transform: skewY(2deg);',\r\n '倾斜Y-3': 'transform: skewY(3deg);',\r\n '倾斜Y-6': 'transform: skewY(6deg);',\r\n '倾斜Y-12': 'transform: skewY(12deg);',\r\n '负倾斜Y-1': 'transform: skewY(-1deg);',\r\n '负倾斜Y-2': 'transform: skewY(-2deg);',\r\n '负倾斜Y-3': 'transform: skewY(-3deg);',\r\n '负倾斜Y-6': 'transform: skewY(-6deg);',\r\n '负倾斜Y-12': 'transform: skewY(-12deg);',\r\n \r\n // transform-origin\r\n '变换原点-中': 'transform-origin: center;',\r\n '变换原点-上': 'transform-origin: top;',\r\n '变换原点-右上': 'transform-origin: top right;',\r\n '变换原点-右': 'transform-origin: right;',\r\n '变换原点-右下': 'transform-origin: bottom right;',\r\n '变换原点-下': 'transform-origin: bottom;',\r\n '变换原点-左下': 'transform-origin: bottom left;',\r\n '变换原点-左': 'transform-origin: left;',\r\n '变换原点-左上': 'transform-origin: top left;',\r\n \r\n // filter\r\n '模糊-无': 'filter: blur(0);',\r\n '模糊-小': 'filter: blur(4px);',\r\n '模糊': 'filter: blur(8px);',\r\n '模糊-中': 'filter: blur(12px);',\r\n '模糊-大': 'filter: blur(16px);',\r\n '模糊-超大': 'filter: blur(24px);',\r\n '模糊-极大': 'filter: blur(40px);',\r\n '模糊-3极大': 'filter: blur(64px);',\r\n \r\n '亮度-0': 'filter: brightness(0);',\r\n '亮度-50': 'filter: brightness(0.5);',\r\n '亮度-75': 'filter: brightness(0.75);',\r\n '亮度-90': 'filter: brightness(0.9);',\r\n '亮度-95': 'filter: brightness(0.95);',\r\n '亮度-100': 'filter: brightness(1);',\r\n '亮度-105': 'filter: brightness(1.05);',\r\n '亮度-110': 'filter: brightness(1.1);',\r\n '亮度-125': 'filter: brightness(1.25);',\r\n '亮度-150': 'filter: brightness(1.5);',\r\n '亮度-200': 'filter: brightness(2);',\r\n \r\n '灰度': 'filter: grayscale(100%);',\r\n '灰度-0': 'filter: grayscale(0);',\r\n '反色': 'filter: invert(100%);',\r\n '反色-0': 'filter: invert(0);',\r\n '褐色': 'filter: sepia(100%);',\r\n '褐色-0': 'filter: sepia(0);',\r\n \r\n '饱和度-0': 'filter: saturate(0);',\r\n '饱和度-50': 'filter: saturate(0.5);',\r\n '饱和度-100': 'filter: saturate(1);',\r\n '饱和度-150': 'filter: saturate(1.5);',\r\n '饱和度-200': 'filter: saturate(2);',\r\n \r\n // backdrop-filter\r\n '背景模糊-无': 'backdrop-filter: blur(0);',\r\n '背景模糊-小': 'backdrop-filter: blur(4px);',\r\n '背景模糊': 'backdrop-filter: blur(8px);',\r\n '背景模糊-中': 'backdrop-filter: blur(12px);',\r\n '背景模糊-大': 'backdrop-filter: blur(16px);',\r\n '背景模糊-超大': 'backdrop-filter: blur(24px);',\r\n '背景模糊-极大': 'backdrop-filter: blur(40px);',\r\n '背景模糊-3极大': 'backdrop-filter: blur(64px);',\r\n \r\n // mix-blend-mode\r\n '混合-正常': 'mix-blend-mode: normal;',\r\n '混合-正片叠底': 'mix-blend-mode: multiply;',\r\n '混合-滤色': 'mix-blend-mode: screen;',\r\n '混合-叠加': 'mix-blend-mode: overlay;',\r\n '混合-变暗': 'mix-blend-mode: darken;',\r\n '混合-变亮': 'mix-blend-mode: lighten;',\r\n '混合-颜色减淡': 'mix-blend-mode: color-dodge;',\r\n '混合-颜色加深': 'mix-blend-mode: color-burn;',\r\n '混合-强光': 'mix-blend-mode: hard-light;',\r\n '混合-柔光': 'mix-blend-mode: soft-light;',\r\n '混合-差值': 'mix-blend-mode: difference;',\r\n '混合-排除': 'mix-blend-mode: exclusion;',\r\n '混合-色相': 'mix-blend-mode: hue;',\r\n '混合-饱和度': 'mix-blend-mode: saturation;',\r\n '混合-颜色': 'mix-blend-mode: color;',\r\n '混合-明度': 'mix-blend-mode: luminosity;',\r\n }\r\n}\r\n\r\nexport default effectsPreset\r\n","import type { PresetModule, RuleMap } from '../types'\r\nimport { flexPreset } from './flex'\r\nimport { spacingPreset } from './spacing'\r\nimport { sizingPreset } from './sizing'\r\nimport { typographyPreset } from './typography'\r\nimport { colorsPreset } from './colors'\r\nimport { layoutPreset } from './layout'\r\nimport { borderPreset } from './border'\r\nimport { effectsPreset } from './effects'\r\n\r\n/**\r\n * 所有默认预设模块\r\n */\r\nexport const defaultPresets: PresetModule[] = [\r\n flexPreset,\r\n spacingPreset,\r\n sizingPreset,\r\n typographyPreset,\r\n colorsPreset,\r\n layoutPreset,\r\n borderPreset,\r\n effectsPreset,\r\n]\r\n\r\n/**\r\n * 获取所有预设规则的合并结果\r\n */\r\nexport function getAllRules(presets: PresetModule[] = defaultPresets): RuleMap {\r\n const rules: RuleMap = {}\r\n \r\n for (const preset of presets) {\r\n Object.assign(rules, preset.rules)\r\n }\r\n \r\n return rules\r\n}\r\n\r\n/**\r\n * 根据预设名称获取预设模块\r\n */\r\nexport function getPresetByName(name: string): PresetModule | undefined {\r\n return defaultPresets.find(preset => preset.name === name)\r\n}\r\n\r\n// 导出所有预设模块\r\nexport {\r\n flexPreset,\r\n spacingPreset,\r\n sizingPreset,\r\n typographyPreset,\r\n colorsPreset,\r\n layoutPreset,\r\n borderPreset,\r\n effectsPreset,\r\n}\r\n","{\r\n \"name\": \"zhentou\",\r\n \"version\": \"1.0.2\",\r\n \"description\": \"中文原子化 CSS 框架 - 使用中文类名编写样式\",\r\n \"main\": \"dist/index.js\",\r\n \"module\": \"dist/index.mjs\",\r\n \"types\": \"dist/index.d.ts\",\r\n \"bin\": {\r\n \"zhentou\": \"./bin/zhentou.js\"\r\n },\r\n \"exports\": {\r\n \".\": {\r\n \"types\": \"./dist/index.d.ts\",\r\n \"require\": \"./dist/index.js\",\r\n \"import\": \"./dist/index.mjs\"\r\n },\r\n \"./postcss\": {\r\n \"types\": \"./dist/postcss.d.ts\",\r\n \"require\": \"./dist/postcss.js\",\r\n \"import\": \"./dist/postcss.mjs\"\r\n }\r\n },\r\n \"files\": [\r\n \"dist\",\r\n \"bin\",\r\n \"stubs\"\r\n ],\r\n \"scripts\": {\r\n \"build\": \"tsup\",\r\n \"dev\": \"tsup --watch\",\r\n \"prepublishOnly\": \"npm run build\"\r\n },\r\n \"keywords\": [\r\n \"css\",\r\n \"chinese\",\r\n \"atomic-css\",\r\n \"utility-css\",\r\n \"tailwind\",\r\n \"中文\",\r\n \"原子化\"\r\n ],\r\n \"author\": \"\",\r\n \"license\": \"MIT\",\r\n \"devDependencies\": {\r\n \"@types/node\": \"^20.10.0\",\r\n \"tsup\": \"^8.0.1\",\r\n \"typescript\": \"^5.3.2\"\r\n },\r\n \"dependencies\": {\r\n \"chokidar\": \"^3.5.3\",\r\n \"commander\": \"^11.1.0\",\r\n \"fast-glob\": \"^3.3.2\",\r\n \"picocolors\": \"^1.0.0\",\r\n \"postcss\": \"^8.4.32\"\r\n }\r\n}\r\n","#!/usr/bin/env node\r\nimport { Command } from 'commander'\r\nimport * as fs from 'fs'\r\nimport * as path from 'path'\r\nimport pc from 'picocolors'\r\nimport chokidar from 'chokidar'\r\nimport { build, createContext, incrementalBuild } from './core/context'\r\nimport { loadConfig, findConfigFile, validateConfig } from './core/config'\r\nimport { getFileList } from './core/scanner'\r\n\r\nconst pkg = require('../package.json')\r\n\r\nconst program = new Command()\r\n\r\nprogram\r\n .name('zhentou')\r\n .description('中文原子化 CSS 框架')\r\n .version(pkg.version)\r\n\r\n/**\r\n * init 命令 - 初始化配置文件\r\n */\r\nprogram\r\n .command('init')\r\n .description('初始化 zhentou 配置文件')\r\n .option('-f, --force', '强制覆盖已存在的配置文件')\r\n .action(async (options) => {\r\n const cwd = process.cwd()\r\n const configPath = path.resolve(cwd, 'zhentou.config.js')\r\n \r\n if (fs.existsSync(configPath) && !options.force) {\r\n console.log(pc.yellow('⚠ 配置文件已存在,使用 --force 选项可覆盖'))\r\n return\r\n }\r\n \r\n // 复制模板配置文件\r\n const templatePath = path.resolve(__dirname, '../stubs/zhentou.config.js')\r\n \r\n if (fs.existsSync(templatePath)) {\r\n fs.copyFileSync(templatePath, configPath)\r\n } else {\r\n // 如果模板不存在,直接创建\r\n const defaultConfig = `/** @type {import('zhentou').Config} */\r\nmodule.exports = {\r\n // 需要扫描的文件路径\r\n content: [\r\n './src/**/*.{html,js,jsx,ts,tsx,vue}',\r\n './public/index.html'\r\n ],\r\n // 输出 CSS 文件路径\r\n output: './dist/zhentou.css',\r\n // 扩展自定义规则\r\n extend: {\r\n // '自定义类名': 'css属性: 值;',\r\n }\r\n}\r\n`\r\n fs.writeFileSync(configPath, defaultConfig, 'utf-8')\r\n }\r\n \r\n console.log(pc.green('✓ 配置文件已创建: zhentou.config.js'))\r\n console.log('')\r\n console.log('下一步:')\r\n console.log(pc.cyan(' 1. 编辑 zhentou.config.js 配置你的项目'))\r\n console.log(pc.cyan(' 2. 运行 npx zhentou build 生成 CSS'))\r\n console.log(pc.cyan(' 3. 在你的项目中引入生成的 CSS 文件'))\r\n })\r\n\r\n/**\r\n * build 命令 - 构建 CSS\r\n */\r\nprogram\r\n .command('build')\r\n .description('构建 CSS 文件')\r\n .option('-c, --config <path>', '指定配置文件路径')\r\n .option('-o, --output <path>', '指定输出文件路径')\r\n .option('-m, --minify', '压缩输出的 CSS')\r\n .option('--full', '生成包含所有规则的完整 CSS')\r\n .action(async (options) => {\r\n const cwd = process.cwd()\r\n \r\n console.log(pc.cyan('🚀 Zhentou CSS 构建中...'))\r\n console.log('')\r\n \r\n const startTime = Date.now()\r\n \r\n try {\r\n // 检查配置文件\r\n const configPath = options.config || findConfigFile(cwd)\r\n if (!configPath) {\r\n console.log(pc.yellow('⚠ 未找到配置文件,使用默认配置'))\r\n console.log(pc.gray(' 运行 npx zhentou init 创建配置文件'))\r\n console.log('')\r\n }\r\n \r\n // 执行构建\r\n const result = await build(cwd)\r\n \r\n const elapsed = Date.now() - startTime\r\n \r\n console.log(pc.green('✓ 构建完成!'))\r\n console.log('')\r\n console.log(pc.gray('统计信息:'))\r\n console.log(pc.gray(` 扫描文件: ${result.stats.filesScanned} 个`))\r\n console.log(pc.gray(` 发现类名: ${result.stats.classesFound} 个`))\r\n console.log(pc.gray(` 有效类名: ${result.stats.classesUsed} 个`))\r\n console.log(pc.gray(` 输出文件: ${result.stats.outputPath}`))\r\n console.log(pc.gray(` 构建耗时: ${elapsed}ms`))\r\n \r\n } catch (error: any) {\r\n console.error(pc.red('✗ 构建失败:'), error.message)\r\n process.exit(1)\r\n }\r\n })\r\n\r\n/**\r\n * watch 命令 - 监听文件变化并自动重建\r\n */\r\nprogram\r\n .command('watch')\r\n .description('监听文件变化并自动重建')\r\n .option('-c, --config <path>', '指定配置文件路径')\r\n .action(async (options) => {\r\n const cwd = process.cwd()\r\n \r\n console.log(pc.cyan('👀 Zhentou CSS 监听模式启动...'))\r\n console.log('')\r\n \r\n try {\r\n // 先执行一次构建\r\n const result = await build(cwd)\r\n console.log(pc.green('✓ 初始构建完成'))\r\n console.log(pc.gray(` 输出文件: ${result.stats.outputPath}`))\r\n console.log('')\r\n \r\n // 创建上下文\r\n const ctx = await createContext(cwd)\r\n \r\n // 获取需要监听的文件列表\r\n const files = await getFileList(ctx.config, cwd)\r\n \r\n console.log(pc.gray(`正在监听 ${files.length} 个文件...`))\r\n console.log(pc.gray('按 Ctrl+C 停止监听'))\r\n console.log('')\r\n \r\n // 创建文件监听器\r\n const watcher = chokidar.watch(ctx.config.content, {\r\n cwd,\r\n ignoreInitial: true,\r\n ignored: ['**/node_modules/**', '**/dist/**', '**/.git/**'],\r\n })\r\n \r\n let rebuilding = false\r\n let pendingRebuild = false\r\n \r\n const rebuild = async (changedPath: string) => {\r\n if (rebuilding) {\r\n pendingRebuild = true\r\n return\r\n }\r\n \r\n rebuilding = true\r\n \r\n try {\r\n const startTime = Date.now()\r\n await incrementalBuild(ctx, [changedPath], cwd)\r\n const elapsed = Date.now() - startTime\r\n \r\n const relativePath = path.relative(cwd, changedPath)\r\n console.log(pc.green(`✓ 已重建`), pc.gray(`(${relativePath}, ${elapsed}ms)`))\r\n \r\n } catch (error: any) {\r\n console.error(pc.red('✗ 重建失败:'), error.message)\r\n }\r\n \r\n rebuilding = false\r\n \r\n if (pendingRebuild) {\r\n pendingRebuild = false\r\n rebuild(changedPath)\r\n }\r\n }\r\n \r\n watcher.on('change', (filePath) => {\r\n const absolutePath = path.resolve(cwd, filePath)\r\n rebuild(absolutePath)\r\n })\r\n \r\n watcher.on('add', (filePath) => {\r\n const absolutePath = path.resolve(cwd, filePath)\r\n console.log(pc.blue(`+ 新文件:`), pc.gray(filePath))\r\n rebuild(absolutePath)\r\n })\r\n \r\n watcher.on('unlink', (filePath) => {\r\n const absolutePath = path.resolve(cwd, filePath)\r\n console.log(pc.yellow(`- 删除文件:`), pc.gray(filePath))\r\n rebuild(absolutePath)\r\n })\r\n \r\n } catch (error: any) {\r\n console.error(pc.red('✗ 启动监听失败:'), error.message)\r\n process.exit(1)\r\n }\r\n })\r\n\r\n/**\r\n * list 命令 - 列出所有可用的类名\r\n */\r\nprogram\r\n .command('list')\r\n .description('列出所有可用的中文类名')\r\n .option('-s, --search <keyword>', '搜索包含关键词的类名')\r\n .option('-p, --preset <name>', '只显示指定预设的类名 (flex, spacing, sizing, typography, colors, layout, border, effects)')\r\n .action(async (options) => {\r\n const { getAllRules, getPresetByName } = await import('./presets')\r\n \r\n let rules: Record<string, string>\r\n \r\n if (options.preset) {\r\n const preset = getPresetByName(options.preset)\r\n if (!preset) {\r\n console.error(pc.red(`✗ 未找到预设: ${options.preset}`))\r\n console.log(pc.gray('可用预设: flex, spacing, sizing, typography, colors, layout, border, effects'))\r\n process.exit(1)\r\n }\r\n rules = preset.rules\r\n console.log(pc.cyan(`📦 预设: ${preset.name}`))\r\n } else {\r\n rules = getAllRules()\r\n console.log(pc.cyan('📦 所有可用的中文类名'))\r\n }\r\n \r\n console.log('')\r\n \r\n let entries = Object.entries(rules)\r\n \r\n // 搜索过滤\r\n if (options.search) {\r\n const keyword = options.search.toLowerCase()\r\n entries = entries.filter(([name, css]) => \r\n name.toLowerCase().includes(keyword) || \r\n css.toLowerCase().includes(keyword)\r\n )\r\n }\r\n \r\n // 排序\r\n entries.sort((a, b) => a[0].localeCompare(b[0], 'zh-CN'))\r\n \r\n // 输出\r\n for (const [name, css] of entries) {\r\n console.log(`${pc.green(name)} ${pc.gray('→')} ${pc.white(css)}`)\r\n }\r\n \r\n console.log('')\r\n console.log(pc.gray(`共 ${entries.length} 个类名`))\r\n })\r\n\r\n// 解析命令行参数\r\nprogram.parse()\r\n","import type { Config, Context, RuleMap, ScanResult } from '../types'\r\nimport { loadConfig } from './config'\r\nimport { scanFiles } from './scanner'\r\nimport { extractClasses, filterValidClasses } from './extractor'\r\nimport { generateCSS, writeCSS } from './generator'\r\nimport { getAllRules, defaultPresets } from '../presets'\r\n\r\n/**\r\n * 创建运行时上下文\r\n */\r\nexport async function createContext(cwd: string = process.cwd()): Promise<Context> {\r\n // 加载配置\r\n const config = await loadConfig(cwd)\r\n \r\n // 获取所有规则(预设 + 自定义扩展)\r\n const presetRules = getAllRules(defaultPresets)\r\n const rules: RuleMap = {\r\n ...presetRules,\r\n ...config.extend,\r\n }\r\n \r\n return {\r\n config,\r\n rules,\r\n usedClasses: new Set(),\r\n }\r\n}\r\n\r\n/**\r\n * 执行完整的构建流程\r\n */\r\nexport async function build(cwd: string = process.cwd()): Promise<{\r\n css: string\r\n stats: {\r\n filesScanned: number\r\n classesFound: number\r\n classesUsed: number\r\n outputPath: string\r\n }\r\n}> {\r\n // 创建上下文\r\n const ctx = await createContext(cwd)\r\n \r\n // 扫描文件\r\n const scanResults = await scanFiles(ctx.config, cwd)\r\n \r\n // 提取类名\r\n const allClasses = extractClasses(scanResults)\r\n \r\n // 筛选有效类名\r\n const validClasses = filterValidClasses(allClasses, ctx.rules)\r\n \r\n // 更新上下文\r\n ctx.usedClasses = validClasses\r\n \r\n // 生成 CSS\r\n const css = generateCSS(validClasses, ctx.rules)\r\n \r\n // 写入文件\r\n const outputPath = ctx.config.output || './dist/zhentou.css'\r\n await writeCSS(css, outputPath, cwd)\r\n \r\n return {\r\n css,\r\n stats: {\r\n filesScanned: scanResults.length,\r\n classesFound: allClasses.size,\r\n classesUsed: validClasses.size,\r\n outputPath,\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 增量更新(用于 watch 模式)\r\n */\r\nexport async function incrementalBuild(\r\n ctx: Context,\r\n changedFiles: string[],\r\n cwd: string = process.cwd()\r\n): Promise<string> {\r\n // 重新扫描变更的文件\r\n const scanResults = await scanFiles(ctx.config, cwd)\r\n \r\n // 提取类名\r\n const allClasses = extractClasses(scanResults)\r\n \r\n // 筛选有效类名\r\n const validClasses = filterValidClasses(allClasses, ctx.rules)\r\n \r\n // 更新上下文\r\n ctx.usedClasses = validClasses\r\n \r\n // 生成 CSS\r\n const css = generateCSS(validClasses, ctx.rules)\r\n \r\n // 写入文件\r\n const outputPath = ctx.config.output || './dist/zhentou.css'\r\n await writeCSS(css, outputPath, cwd)\r\n \r\n return css\r\n}\r\n\r\n/**\r\n * 获取上下文中所有规则的数量\r\n */\r\nexport function getRuleCount(ctx: Context): number {\r\n return Object.keys(ctx.rules).length\r\n}\r\n\r\n/**\r\n * 检查类名是否有效\r\n */\r\nexport function isValidClass(ctx: Context, className: string): boolean {\r\n return ctx.rules[className] !== undefined\r\n}\r\n\r\n/**\r\n * 获取类名对应的 CSS\r\n */\r\nexport function getClassCSS(ctx: Context, className: string): string | undefined {\r\n return ctx.rules[className]\r\n}\r\n","import * as path from 'path'\r\nimport * as fs from 'fs'\r\nimport { pathToFileURL } from 'url'\r\nimport type { Config } from '../types'\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const defaultConfig: Config = {\r\n content: ['./src/**/*.{html,js,jsx,ts,tsx,vue}'],\r\n output: './dist/zhentou.css',\r\n extend: {},\r\n}\r\n\r\n/**\r\n * 配置文件名列表(按优先级排序)\r\n */\r\nconst configFileNames = [\r\n 'zhentou.config.js',\r\n 'zhentou.config.cjs',\r\n 'zhentou.config.mjs',\r\n 'zhentou.config.ts',\r\n]\r\n\r\n/**\r\n * 查找配置文件\r\n */\r\nexport function findConfigFile(cwd: string = process.cwd()): string | null {\r\n for (const fileName of configFileNames) {\r\n const filePath = path.resolve(cwd, fileName)\r\n if (fs.existsSync(filePath)) {\r\n return filePath\r\n }\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * 加载配置文件\r\n */\r\nexport async function loadConfig(cwd: string = process.cwd()): Promise<Config> {\r\n const configPath = findConfigFile(cwd)\r\n \r\n if (!configPath) {\r\n return { ...defaultConfig }\r\n }\r\n \r\n try {\r\n // 使用动态 import 加载配置文件(兼容 ESM)\r\n // 添加时间戳避免缓存,支持热重载\r\n const fileUrl = pathToFileURL(configPath).href\r\n const userConfig = await import(`${fileUrl}?t=${Date.now()}`)\r\n const config = userConfig.default || userConfig\r\n \r\n // 合并配置\r\n return {\r\n ...defaultConfig,\r\n ...config,\r\n extend: {\r\n ...defaultConfig.extend,\r\n ...config.extend,\r\n },\r\n }\r\n } catch (error) {\r\n console.error(`加载配置文件失败: ${configPath}`)\r\n console.error(error)\r\n return { ...defaultConfig }\r\n }\r\n}\r\n\r\n/**\r\n * 用于在配置文件中提供类型提示的辅助函数\r\n */\r\nexport function defineConfig(config: Config): Config {\r\n return config\r\n}\r\n\r\n/**\r\n * 验证配置\r\n */\r\nexport function validateConfig(config: Config): { valid: boolean; errors: string[] } {\r\n const errors: string[] = []\r\n \r\n if (!config.content || !Array.isArray(config.content) || config.content.length === 0) {\r\n errors.push('content 必须是一个非空的字符串数组')\r\n }\r\n \r\n if (config.output && typeof config.output !== 'string') {\r\n errors.push('output 必须是一个字符串')\r\n }\r\n \r\n if (config.extend && typeof config.extend !== 'object') {\r\n errors.push('extend 必须是一个对象')\r\n }\r\n \r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n }\r\n}\r\n","import * as fs from 'fs'\r\nimport * as path from 'path'\r\nimport fg from 'fast-glob'\r\nimport type { Config, ScanResult } from '../types'\r\n\r\n/**\r\n * 扫描文件\r\n * @param config 配置对象\r\n * @param cwd 工作目录\r\n * @returns 扫描结果数组\r\n */\r\nexport async function scanFiles(\r\n config: Config,\r\n cwd: string = process.cwd()\r\n): Promise<ScanResult[]> {\r\n const results: ScanResult[] = []\r\n \r\n // 使用 fast-glob 匹配文件\r\n const files = await fg(config.content, {\r\n cwd,\r\n absolute: true,\r\n onlyFiles: true,\r\n ignore: ['**/node_modules/**', '**/dist/**', '**/.git/**'],\r\n })\r\n \r\n // 读取每个文件的内容并提取类名\r\n for (const filePath of files) {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf-8')\r\n const classes = extractClassesFromContent(content)\r\n \r\n if (classes.length > 0) {\r\n results.push({\r\n filePath,\r\n classes,\r\n })\r\n }\r\n } catch (error) {\r\n console.warn(`读取文件失败: ${filePath}`)\r\n }\r\n }\r\n \r\n return results\r\n}\r\n\r\n/**\r\n * 从文件内容中提取类名\r\n * @param content 文件内容\r\n * @returns 类名数组\r\n */\r\nfunction extractClassesFromContent(content: string): string[] {\r\n const classes = new Set<string>()\r\n \r\n // 匹配各种框架的 class 属性\r\n const patterns = [\r\n // HTML class=\"...\" 或 class='...'\r\n /class\\s*=\\s*[\"']([^\"']+)[\"']/gi,\r\n // JSX className=\"...\" 或 className='...'\r\n /className\\s*=\\s*[\"']([^\"']+)[\"']/gi,\r\n // JSX className={`...`} 模板字符串\r\n /className\\s*=\\s*\\{`([^`]+)`\\}/gi,\r\n // JSX className={\"...\"} 或 className={'...'}\r\n /className\\s*=\\s*\\{[\"']([^\"']+)[\"']\\}/gi,\r\n // Vue :class=\"...\" 动态类\r\n /:class\\s*=\\s*[\"']([^\"']+)[\"']/gi,\r\n // Vue :class=\"{...}\" 对象语法中的键\r\n /:class\\s*=\\s*[\"']\\{([^}]+)\\}[\"']/gi,\r\n // Vue :class=\"[...]\" 数组语法\r\n /:class\\s*=\\s*[\"']\\[([^\\]]+)\\][\"']/gi,\r\n ]\r\n \r\n for (const pattern of patterns) {\r\n let match\r\n while ((match = pattern.exec(content)) !== null) {\r\n const classString = match[1]\r\n // 分割类名(按空格、逗号等分隔)\r\n const classNames = classString.split(/[\\s,'\"]+/).filter(Boolean)\r\n for (const className of classNames) {\r\n // 过滤掉非中文类名和特殊字符\r\n if (containsChinese(className)) {\r\n classes.add(className.trim())\r\n }\r\n }\r\n }\r\n }\r\n \r\n return Array.from(classes)\r\n}\r\n\r\n/**\r\n * 检查字符串是否包含中文字符\r\n */\r\nfunction containsChinese(str: string): boolean {\r\n return /[\\u4e00-\\u9fa5]/.test(str)\r\n}\r\n\r\n/**\r\n * 获取文件列表(不读取内容)\r\n */\r\nexport async function getFileList(\r\n config: Config,\r\n cwd: string = process.cwd()\r\n): Promise<string[]> {\r\n return fg(config.content, {\r\n cwd,\r\n absolute: true,\r\n onlyFiles: true,\r\n ignore: ['**/node_modules/**', '**/dist/**', '**/.git/**'],\r\n })\r\n}\r\n","import type { ScanResult, RuleMap } from '../types'\r\n\r\n/**\r\n * 从扫描结果中提取所有使用的类名\r\n */\r\nexport function extractClasses(scanResults: ScanResult[]): Set<string> {\r\n const allClasses = new Set<string>()\r\n \r\n for (const result of scanResults) {\r\n for (const className of result.classes) {\r\n allClasses.add(className)\r\n }\r\n }\r\n \r\n return allClasses\r\n}\r\n\r\n/**\r\n * 从类名集合中筛选出有效的类名(在规则中存在的)\r\n */\r\nexport function filterValidClasses(classes: Set<string>, rules: RuleMap): Set<string> {\r\n const validClasses = new Set<string>()\r\n \r\n for (const className of classes) {\r\n if (rules[className]) {\r\n validClasses.add(className)\r\n }\r\n }\r\n \r\n return validClasses\r\n}\r\n\r\n/**\r\n * 从文本内容中直接提取中文类名\r\n */\r\nexport function extractClassesFromText(content: string): string[] {\r\n const classes = new Set<string>()\r\n \r\n // 匹配各种框架的 class 属性\r\n const patterns = [\r\n // HTML class=\"...\" 或 class='...'\r\n /class\\s*=\\s*[\"']([^\"']+)[\"']/gi,\r\n // JSX className=\"...\" 或 className='...'\r\n /className\\s*=\\s*[\"']([^\"']+)[\"']/gi,\r\n // JSX className={`...`} 模板字符串\r\n /className\\s*=\\s*\\{`([^`]+)`\\}/gi,\r\n // JSX className={\"...\"} 或 className={'...'}\r\n /className\\s*=\\s*\\{[\"']([^\"']+)[\"']\\}/gi,\r\n // Vue :class=\"...\" 动态类\r\n /:class\\s*=\\s*[\"']([^\"']+)[\"']/gi,\r\n // Svelte class:xxx 指令\r\n /class:([^\\s=]+)/gi,\r\n ]\r\n \r\n for (const pattern of patterns) {\r\n let match\r\n while ((match = pattern.exec(content)) !== null) {\r\n const classString = match[1]\r\n // 分割类名\r\n const classNames = classString.split(/[\\s,'\"]+/).filter(Boolean)\r\n for (const className of classNames) {\r\n if (containsChinese(className)) {\r\n classes.add(className.trim())\r\n }\r\n }\r\n }\r\n }\r\n \r\n return Array.from(classes)\r\n}\r\n\r\n/**\r\n * 检查字符串是否包含中文字符\r\n */\r\nfunction containsChinese(str: string): boolean {\r\n return /[\\u4e00-\\u9fa5]/.test(str)\r\n}\r\n\r\n/**\r\n * 统计类名使用频率\r\n */\r\nexport function countClassUsage(scanResults: ScanResult[]): Map<string, number> {\r\n const counts = new Map<string, number>()\r\n \r\n for (const result of scanResults) {\r\n for (const className of result.classes) {\r\n counts.set(className, (counts.get(className) || 0) + 1)\r\n }\r\n }\r\n \r\n return counts\r\n}\r\n\r\n/**\r\n * 查找未使用的类名\r\n */\r\nexport function findUnusedClasses(\r\n usedClasses: Set<string>,\r\n rules: RuleMap\r\n): string[] {\r\n const unusedClasses: string[] = []\r\n \r\n for (const className of Object.keys(rules)) {\r\n if (!usedClasses.has(className)) {\r\n unusedClasses.push(className)\r\n }\r\n }\r\n \r\n return unusedClasses\r\n}\r\n\r\n/**\r\n * 查找无效的类名(使用了但规则中不存在的)\r\n */\r\nexport function findInvalidClasses(\r\n usedClasses: Set<string>,\r\n rules: RuleMap\r\n): string[] {\r\n const invalidClasses: string[] = []\r\n \r\n for (const className of usedClasses) {\r\n if (!rules[className]) {\r\n invalidClasses.push(className)\r\n }\r\n }\r\n \r\n return invalidClasses\r\n}\r\n","import * as fs from 'fs'\r\nimport * as path from 'path'\r\nimport type { RuleMap, Config } from '../types'\r\n\r\n/**\r\n * 转义 CSS 选择器中的特殊字符\r\n */\r\nfunction escapeSelector(selector: string): string {\r\n // 转义 CSS 选择器中的特殊字符\r\n return selector.replace(/([\\/\\-\\:])/g, '\\\\$1')\r\n}\r\n\r\n/**\r\n * 生成单个类的 CSS 规则\r\n */\r\nfunction generateRule(className: string, cssValue: string): string {\r\n const escapedClassName = escapeSelector(className)\r\n return `.${escapedClassName} { ${cssValue} }`\r\n}\r\n\r\n/**\r\n * 生成 CSS 内容\r\n * @param usedClasses 使用的类名集合\r\n * @param rules 规则映射\r\n * @returns CSS 字符串\r\n */\r\nexport function generateCSS(usedClasses: Set<string>, rules: RuleMap): string {\r\n const cssRules: string[] = []\r\n \r\n // 添加注释头\r\n cssRules.push('/* Zhentou CSS - 中文原子化 CSS 框架 */')\r\n cssRules.push('/* 自动生成,请勿手动编辑 */')\r\n cssRules.push('')\r\n \r\n // 按类名排序以保证输出稳定\r\n const sortedClasses = Array.from(usedClasses).sort()\r\n \r\n for (const className of sortedClasses) {\r\n const cssValue = rules[className]\r\n if (cssValue) {\r\n cssRules.push(generateRule(className, cssValue))\r\n }\r\n }\r\n \r\n return cssRules.join('\\n')\r\n}\r\n\r\n/**\r\n * 生成完整的 CSS(包含所有规则)\r\n */\r\nexport function generateFullCSS(rules: RuleMap): string {\r\n const cssRules: string[] = []\r\n \r\n cssRules.push('/* Zhentou CSS - 中文原子化 CSS 框架 */')\r\n cssRules.push('/* 完整版 CSS */')\r\n cssRules.push('')\r\n \r\n const sortedClasses = Object.keys(rules).sort()\r\n \r\n for (const className of sortedClasses) {\r\n const cssValue = rules[className]\r\n cssRules.push(generateRule(className, cssValue))\r\n }\r\n \r\n return cssRules.join('\\n')\r\n}\r\n\r\n/**\r\n * 生成基础重置样式\r\n */\r\nexport function generateBaseCSS(): string {\r\n return `/* Zhentou CSS - 基础重置样式 */\r\n*, *::before, *::after {\r\n box-sizing: border-box;\r\n}\r\n\r\n* {\r\n margin: 0;\r\n}\r\n\r\nhtml, body {\r\n height: 100%;\r\n}\r\n\r\nbody {\r\n line-height: 1.5;\r\n -webkit-font-smoothing: antialiased;\r\n}\r\n\r\nimg, picture, video, canvas, svg {\r\n display: block;\r\n max-width: 100%;\r\n}\r\n\r\ninput, button, textarea, select {\r\n font: inherit;\r\n}\r\n\r\np, h1, h2, h3, h4, h5, h6 {\r\n overflow-wrap: break-word;\r\n}\r\n\r\n#root, #__next {\r\n isolation: isolate;\r\n}\r\n`\r\n}\r\n\r\n/**\r\n * 写入 CSS 文件\r\n */\r\nexport async function writeCSS(\r\n css: string,\r\n outputPath: string,\r\n cwd: string = process.cwd()\r\n): Promise<void> {\r\n const absolutePath = path.isAbsolute(outputPath)\r\n ? outputPath\r\n : path.resolve(cwd, outputPath)\r\n \r\n // 确保目录存在\r\n const dir = path.dirname(absolutePath)\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true })\r\n }\r\n \r\n // 写入文件\r\n fs.writeFileSync(absolutePath, css, 'utf-8')\r\n}\r\n\r\n/**\r\n * 格式化 CSS 输出(美化)\r\n */\r\nexport function formatCSS(css: string): string {\r\n // 简单的格式化:每个规则占一行\r\n return css\r\n .replace(/\\}\\s*/g, '}\\n')\r\n .replace(/\\n{3,}/g, '\\n\\n')\r\n .trim()\r\n}\r\n\r\n/**\r\n * 压缩 CSS\r\n */\r\nexport function minifyCSS(css: string): string {\r\n return css\r\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // 移除注释\r\n .replace(/\\s+/g, ' ') // 压缩空白\r\n .replace(/\\s*([{}:;,])\\s*/g, '$1') // 移除符号周围的空白\r\n .replace(/;}/g, '}') // 移除最后一个分号\r\n .trim()\r\n}\r\n\r\n/**\r\n * 生成统计信息\r\n */\r\nexport function generateStats(usedClasses: Set<string>, rules: RuleMap): {\r\n totalRules: number\r\n usedRules: number\r\n unusedRules: number\r\n cssSize: number\r\n} {\r\n const css = generateCSS(usedClasses, rules)\r\n \r\n return {\r\n totalRules: Object.keys(rules).length,\r\n usedRules: usedClasses.size,\r\n unusedRules: Object.keys(rules).length - usedClasses.size,\r\n cssSize: Buffer.byteLength(css, 'utf-8'),\r\n }\r\n}\r\n"],"mappings":"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","names":["exports","module","fs","path","fs","fg","fs","path","pc","defaultConfig","chokidar","getAllRules","getPresetByName"]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/presets/flex.ts","../src/presets/spacing.ts","../src/presets/sizing.ts","../src/presets/typography.ts","../src/presets/colors.ts","../src/presets/layout.ts","../src/presets/border.ts","../src/presets/effects.ts","../src/presets/index.ts","../package.json","../src/cli.ts","../src/core/context.ts","../src/core/config.ts","../src/core/scanner.ts","../src/core/extractor.ts","../src/core/generator.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import type { PresetModule } from '../types'\r\n\r\n/**\r\n * Flexbox 相关预设规则\r\n */\r\nexport const flexPreset: PresetModule = {\r\n name: 'flex',\r\n rules: {\r\n // display\r\n '弹性盒': 'display: flex;',\r\n '行内弹性盒': 'display: inline-flex;',\r\n \r\n // flex-direction\r\n '弹性行': 'flex-direction: row;',\r\n '弹性翻转行': 'flex-direction: row-reverse;',\r\n '弹性列': 'flex-direction: column;',\r\n '弹性翻转列': 'flex-direction: column-reverse;',\r\n \r\n // flex-wrap\r\n '弹性换行': 'flex-wrap: wrap;',\r\n '弹性不换行': 'flex-wrap: nowrap;',\r\n '弹性翻转换行': 'flex-wrap: wrap-reverse;',\r\n \r\n // justify-content (主轴对齐)\r\n '主轴起点': 'justify-content: flex-start;',\r\n '主轴终点': 'justify-content: flex-end;',\r\n '主轴居中': 'justify-content: center;',\r\n '主轴两端': 'justify-content: space-between;',\r\n '主轴环绕': 'justify-content: space-around;',\r\n '主轴均分': 'justify-content: space-evenly;',\r\n \r\n // align-items (交叉轴对齐)\r\n '交叉轴起点': 'align-items: flex-start;',\r\n '交叉轴终点': 'align-items: flex-end;',\r\n '交叉轴居中': 'align-items: center;',\r\n '交叉轴拉伸': 'align-items: stretch;',\r\n '交叉轴基线': 'align-items: baseline;',\r\n \r\n // align-content (多行对齐)\r\n '多行起点': 'align-content: flex-start;',\r\n '多行终点': 'align-content: flex-end;',\r\n '多行居中': 'align-content: center;',\r\n '多行两端': 'align-content: space-between;',\r\n '多行环绕': 'align-content: space-around;',\r\n '多行拉伸': 'align-content: stretch;',\r\n \r\n // align-self (单项对齐)\r\n '自身起点': 'align-self: flex-start;',\r\n '自身终点': 'align-self: flex-end;',\r\n '自身居中': 'align-self: center;',\r\n '自身拉伸': 'align-self: stretch;',\r\n '自身基线': 'align-self: baseline;',\r\n '自身自动': 'align-self: auto;',\r\n \r\n // flex 属性\r\n '弹性1': 'flex: 1;',\r\n '弹性自动': 'flex: auto;',\r\n '弹性初始': 'flex: initial;',\r\n '弹性无': 'flex: none;',\r\n \r\n // flex-grow\r\n '放大0': 'flex-grow: 0;',\r\n '放大1': 'flex-grow: 1;',\r\n \r\n // flex-shrink\r\n '收缩0': 'flex-shrink: 0;',\r\n '收缩1': 'flex-shrink: 1;',\r\n \r\n // gap\r\n '间距-0': 'gap: 0;',\r\n '间距-1': 'gap: 0.25rem;',\r\n '间距-2': 'gap: 0.5rem;',\r\n '间距-3': 'gap: 0.75rem;',\r\n '间距-4': 'gap: 1rem;',\r\n '间距-5': 'gap: 1.25rem;',\r\n '间距-6': 'gap: 1.5rem;',\r\n '间距-8': 'gap: 2rem;',\r\n '间距-10': 'gap: 2.5rem;',\r\n '间距-12': 'gap: 3rem;',\r\n '间距-16': 'gap: 4rem;',\r\n \r\n // order\r\n '顺序-1': 'order: 1;',\r\n '顺序-2': 'order: 2;',\r\n '顺序-3': 'order: 3;',\r\n '顺序首': 'order: -9999;',\r\n '顺序末': 'order: 9999;',\r\n '顺序无': 'order: 0;',\r\n }\r\n}\r\n\r\nexport default flexPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n// 间距值映射\r\nconst spacingValues: Record<string, string> = {\r\n '0': '0',\r\n '1': '0.25rem',\r\n '2': '0.5rem',\r\n '3': '0.75rem',\r\n '4': '1rem',\r\n '5': '1.25rem',\r\n '6': '1.5rem',\r\n '8': '2rem',\r\n '10': '2.5rem',\r\n '12': '3rem',\r\n '16': '4rem',\r\n '20': '5rem',\r\n '24': '6rem',\r\n '32': '8rem',\r\n '自动': 'auto',\r\n}\r\n\r\n// 生成间距规则\r\nfunction generateSpacingRules(): Record<string, string> {\r\n const rules: Record<string, string> = {}\r\n \r\n for (const [key, value] of Object.entries(spacingValues)) {\r\n // margin\r\n rules[`外边距-${key}`] = `margin: ${value};`\r\n rules[`上外边距-${key}`] = `margin-top: ${value};`\r\n rules[`右外边距-${key}`] = `margin-right: ${value};`\r\n rules[`下外边距-${key}`] = `margin-bottom: ${value};`\r\n rules[`左外边距-${key}`] = `margin-left: ${value};`\r\n rules[`水平外边距-${key}`] = `margin-left: ${value}; margin-right: ${value};`\r\n rules[`垂直外边距-${key}`] = `margin-top: ${value}; margin-bottom: ${value};`\r\n \r\n // padding\r\n rules[`内边距-${key}`] = `padding: ${value};`\r\n rules[`上内边距-${key}`] = `padding-top: ${value};`\r\n rules[`右内边距-${key}`] = `padding-right: ${value};`\r\n rules[`下内边距-${key}`] = `padding-bottom: ${value};`\r\n rules[`左内边距-${key}`] = `padding-left: ${value};`\r\n rules[`水平内边距-${key}`] = `padding-left: ${value}; padding-right: ${value};`\r\n rules[`垂直内边距-${key}`] = `padding-top: ${value}; padding-bottom: ${value};`\r\n }\r\n \r\n // 负外边距\r\n for (const [key, value] of Object.entries(spacingValues)) {\r\n if (key === '0' || key === '自动') continue\r\n rules[`负外边距-${key}`] = `margin: -${value};`\r\n rules[`上负外边距-${key}`] = `margin-top: -${value};`\r\n rules[`右负外边距-${key}`] = `margin-right: -${value};`\r\n rules[`下负外边距-${key}`] = `margin-bottom: -${value};`\r\n rules[`左负外边距-${key}`] = `margin-left: -${value};`\r\n }\r\n \r\n return rules\r\n}\r\n\r\n/**\r\n * Spacing 间距预设规则\r\n */\r\nexport const spacingPreset: PresetModule = {\r\n name: 'spacing',\r\n rules: generateSpacingRules()\r\n}\r\n\r\nexport default spacingPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n/**\r\n * Sizing 尺寸预设规则\r\n */\r\nexport const sizingPreset: PresetModule = {\r\n name: 'sizing',\r\n rules: {\r\n // width\r\n '宽度-0': 'width: 0;',\r\n '宽度-1': 'width: 0.25rem;',\r\n '宽度-2': 'width: 0.5rem;',\r\n '宽度-4': 'width: 1rem;',\r\n '宽度-8': 'width: 2rem;',\r\n '宽度-12': 'width: 3rem;',\r\n '宽度-16': 'width: 4rem;',\r\n '宽度-20': 'width: 5rem;',\r\n '宽度-24': 'width: 6rem;',\r\n '宽度-32': 'width: 8rem;',\r\n '宽度-40': 'width: 10rem;',\r\n '宽度-48': 'width: 12rem;',\r\n '宽度-56': 'width: 14rem;',\r\n '宽度-64': 'width: 16rem;',\r\n '宽度-自动': 'width: auto;',\r\n '宽度-全': 'width: 100%;',\r\n '宽度-屏': 'width: 100vw;',\r\n '宽度-最小': 'width: min-content;',\r\n '宽度-最大': 'width: max-content;',\r\n '宽度-适配': 'width: fit-content;',\r\n '宽度-1/2': 'width: 50%;',\r\n '宽度-1/3': 'width: 33.333333%;',\r\n '宽度-2/3': 'width: 66.666667%;',\r\n '宽度-1/4': 'width: 25%;',\r\n '宽度-3/4': 'width: 75%;',\r\n '宽度-1/5': 'width: 20%;',\r\n '宽度-2/5': 'width: 40%;',\r\n '宽度-3/5': 'width: 60%;',\r\n '宽度-4/5': 'width: 80%;',\r\n \r\n // min-width\r\n '最小宽度-0': 'min-width: 0;',\r\n '最小宽度-全': 'min-width: 100%;',\r\n '最小宽度-最小': 'min-width: min-content;',\r\n '最小宽度-最大': 'min-width: max-content;',\r\n '最小宽度-适配': 'min-width: fit-content;',\r\n \r\n // max-width\r\n '最大宽度-0': 'max-width: 0;',\r\n '最大宽度-全': 'max-width: 100%;',\r\n '最大宽度-无': 'max-width: none;',\r\n '最大宽度-小': 'max-width: 24rem;',\r\n '最大宽度-中': 'max-width: 28rem;',\r\n '最大宽度-大': 'max-width: 32rem;',\r\n '最大宽度-超大': 'max-width: 36rem;',\r\n '最大宽度-极大': 'max-width: 42rem;',\r\n \r\n // height\r\n '高度-0': 'height: 0;',\r\n '高度-1': 'height: 0.25rem;',\r\n '高度-2': 'height: 0.5rem;',\r\n '高度-4': 'height: 1rem;',\r\n '高度-8': 'height: 2rem;',\r\n '高度-12': 'height: 3rem;',\r\n '高度-16': 'height: 4rem;',\r\n '高度-20': 'height: 5rem;',\r\n '高度-24': 'height: 6rem;',\r\n '高度-32': 'height: 8rem;',\r\n '高度-40': 'height: 10rem;',\r\n '高度-48': 'height: 12rem;',\r\n '高度-56': 'height: 14rem;',\r\n '高度-64': 'height: 16rem;',\r\n '高度-自动': 'height: auto;',\r\n '高度-全': 'height: 100%;',\r\n '高度-屏': 'height: 100vh;',\r\n '高度-最小': 'height: min-content;',\r\n '高度-最大': 'height: max-content;',\r\n '高度-适配': 'height: fit-content;',\r\n '高度-1/2': 'height: 50%;',\r\n '高度-1/3': 'height: 33.333333%;',\r\n '高度-2/3': 'height: 66.666667%;',\r\n '高度-1/4': 'height: 25%;',\r\n '高度-3/4': 'height: 75%;',\r\n \r\n // min-height\r\n '最小高度-0': 'min-height: 0;',\r\n '最小高度-全': 'min-height: 100%;',\r\n '最小高度-屏': 'min-height: 100vh;',\r\n \r\n // max-height\r\n '最大高度-0': 'max-height: 0;',\r\n '最大高度-全': 'max-height: 100%;',\r\n '最大高度-屏': 'max-height: 100vh;',\r\n '最大高度-无': 'max-height: none;',\r\n \r\n // size (width + height)\r\n '尺寸-0': 'width: 0; height: 0;',\r\n '尺寸-4': 'width: 1rem; height: 1rem;',\r\n '尺寸-8': 'width: 2rem; height: 2rem;',\r\n '尺寸-12': 'width: 3rem; height: 3rem;',\r\n '尺寸-16': 'width: 4rem; height: 4rem;',\r\n '尺寸-20': 'width: 5rem; height: 5rem;',\r\n '尺寸-24': 'width: 6rem; height: 6rem;',\r\n '尺寸-全': 'width: 100%; height: 100%;',\r\n }\r\n}\r\n\r\nexport default sizingPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n/**\r\n * Typography 字体排版预设规则\r\n */\r\nexport const typographyPreset: PresetModule = {\r\n name: 'typography',\r\n rules: {\r\n // font-size\r\n '字号-超小': 'font-size: 0.75rem; line-height: 1rem;',\r\n '字号-小': 'font-size: 0.875rem; line-height: 1.25rem;',\r\n '字号-基础': 'font-size: 1rem; line-height: 1.5rem;',\r\n '字号-大': 'font-size: 1.125rem; line-height: 1.75rem;',\r\n '字号-超大': 'font-size: 1.25rem; line-height: 1.75rem;',\r\n '字号-2超大': 'font-size: 1.5rem; line-height: 2rem;',\r\n '字号-3超大': 'font-size: 1.875rem; line-height: 2.25rem;',\r\n '字号-4超大': 'font-size: 2.25rem; line-height: 2.5rem;',\r\n '字号-5超大': 'font-size: 3rem; line-height: 1;',\r\n '字号-6超大': 'font-size: 3.75rem; line-height: 1;',\r\n '字号-7超大': 'font-size: 4.5rem; line-height: 1;',\r\n '字号-8超大': 'font-size: 6rem; line-height: 1;',\r\n '字号-9超大': 'font-size: 8rem; line-height: 1;',\r\n \r\n // font-weight\r\n '字重-细': 'font-weight: 100;',\r\n '字重-超轻': 'font-weight: 200;',\r\n '字重-轻': 'font-weight: 300;',\r\n '字重-正常': 'font-weight: 400;',\r\n '字重-中': 'font-weight: 500;',\r\n '字重-半粗': 'font-weight: 600;',\r\n '字重-粗': 'font-weight: 700;',\r\n '字重-超粗': 'font-weight: 800;',\r\n '字重-黑': 'font-weight: 900;',\r\n \r\n // font-style\r\n '斜体': 'font-style: italic;',\r\n '非斜体': 'font-style: normal;',\r\n \r\n // text-align\r\n '文字居左': 'text-align: left;',\r\n '文字居中': 'text-align: center;',\r\n '文字居右': 'text-align: right;',\r\n '文字两端': 'text-align: justify;',\r\n '文字起点': 'text-align: start;',\r\n '文字终点': 'text-align: end;',\r\n \r\n // text-decoration\r\n '下划线': 'text-decoration-line: underline;',\r\n '上划线': 'text-decoration-line: overline;',\r\n '删除线': 'text-decoration-line: line-through;',\r\n '无装饰': 'text-decoration-line: none;',\r\n \r\n // text-transform\r\n '大写': 'text-transform: uppercase;',\r\n '小写': 'text-transform: lowercase;',\r\n '首字母大写': 'text-transform: capitalize;',\r\n '正常大小写': 'text-transform: none;',\r\n \r\n // line-height\r\n '行高-无': 'line-height: 1;',\r\n '行高-紧': 'line-height: 1.25;',\r\n '行高-窄': 'line-height: 1.375;',\r\n '行高-正常': 'line-height: 1.5;',\r\n '行高-宽': 'line-height: 1.625;',\r\n '行高-松': 'line-height: 2;',\r\n \r\n // letter-spacing\r\n '字距-紧': 'letter-spacing: -0.05em;',\r\n '字距-窄': 'letter-spacing: -0.025em;',\r\n '字距-正常': 'letter-spacing: 0;',\r\n '字距-宽': 'letter-spacing: 0.025em;',\r\n '字距-松': 'letter-spacing: 0.05em;',\r\n '字距-超松': 'letter-spacing: 0.1em;',\r\n \r\n // word-break\r\n '断词-正常': 'word-break: normal;',\r\n '断词-全部': 'word-break: break-all;',\r\n '断词-保持': 'word-break: keep-all;',\r\n \r\n // white-space\r\n '空白-正常': 'white-space: normal;',\r\n '空白-不换行': 'white-space: nowrap;',\r\n '空白-保留': 'white-space: pre;',\r\n '空白-保留换行': 'white-space: pre-line;',\r\n '空白-保留全部': 'white-space: pre-wrap;',\r\n \r\n // text-overflow\r\n '文字截断': 'overflow: hidden; text-overflow: ellipsis; white-space: nowrap;',\r\n '多行截断-2': 'overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;',\r\n '多行截断-3': 'overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3;',\r\n '多行截断-4': 'overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4;',\r\n \r\n // vertical-align\r\n '垂直对齐-基线': 'vertical-align: baseline;',\r\n '垂直对齐-顶': 'vertical-align: top;',\r\n '垂直对齐-中': 'vertical-align: middle;',\r\n '垂直对齐-底': 'vertical-align: bottom;',\r\n '垂直对齐-文字顶': 'vertical-align: text-top;',\r\n '垂直对齐-文字底': 'vertical-align: text-bottom;',\r\n \r\n // font-family\r\n '字体-无衬线': 'font-family: ui-sans-serif, system-ui, sans-serif;',\r\n '字体-衬线': 'font-family: ui-serif, Georgia, serif;',\r\n '字体-等宽': 'font-family: ui-monospace, monospace;',\r\n }\r\n}\r\n\r\nexport default typographyPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n// 颜色调色板\r\nconst colorPalette: Record<string, Record<string, string>> = {\r\n '灰': {\r\n '50': '#f9fafb',\r\n '100': '#f3f4f6',\r\n '200': '#e5e7eb',\r\n '300': '#d1d5db',\r\n '400': '#9ca3af',\r\n '500': '#6b7280',\r\n '600': '#4b5563',\r\n '700': '#374151',\r\n '800': '#1f2937',\r\n '900': '#111827',\r\n },\r\n '红': {\r\n '50': '#fef2f2',\r\n '100': '#fee2e2',\r\n '200': '#fecaca',\r\n '300': '#fca5a5',\r\n '400': '#f87171',\r\n '500': '#ef4444',\r\n '600': '#dc2626',\r\n '700': '#b91c1c',\r\n '800': '#991b1b',\r\n '900': '#7f1d1d',\r\n },\r\n '橙': {\r\n '50': '#fff7ed',\r\n '100': '#ffedd5',\r\n '200': '#fed7aa',\r\n '300': '#fdba74',\r\n '400': '#fb923c',\r\n '500': '#f97316',\r\n '600': '#ea580c',\r\n '700': '#c2410c',\r\n '800': '#9a3412',\r\n '900': '#7c2d12',\r\n },\r\n '黄': {\r\n '50': '#fefce8',\r\n '100': '#fef9c3',\r\n '200': '#fef08a',\r\n '300': '#fde047',\r\n '400': '#facc15',\r\n '500': '#eab308',\r\n '600': '#ca8a04',\r\n '700': '#a16207',\r\n '800': '#854d0e',\r\n '900': '#713f12',\r\n },\r\n '绿': {\r\n '50': '#f0fdf4',\r\n '100': '#dcfce7',\r\n '200': '#bbf7d0',\r\n '300': '#86efac',\r\n '400': '#4ade80',\r\n '500': '#22c55e',\r\n '600': '#16a34a',\r\n '700': '#15803d',\r\n '800': '#166534',\r\n '900': '#14532d',\r\n },\r\n '青': {\r\n '50': '#ecfeff',\r\n '100': '#cffafe',\r\n '200': '#a5f3fc',\r\n '300': '#67e8f9',\r\n '400': '#22d3ee',\r\n '500': '#06b6d4',\r\n '600': '#0891b2',\r\n '700': '#0e7490',\r\n '800': '#155e75',\r\n '900': '#164e63',\r\n },\r\n '蓝': {\r\n '50': '#eff6ff',\r\n '100': '#dbeafe',\r\n '200': '#bfdbfe',\r\n '300': '#93c5fd',\r\n '400': '#60a5fa',\r\n '500': '#3b82f6',\r\n '600': '#2563eb',\r\n '700': '#1d4ed8',\r\n '800': '#1e40af',\r\n '900': '#1e3a8a',\r\n },\r\n '紫': {\r\n '50': '#faf5ff',\r\n '100': '#f3e8ff',\r\n '200': '#e9d5ff',\r\n '300': '#d8b4fe',\r\n '400': '#c084fc',\r\n '500': '#a855f7',\r\n '600': '#9333ea',\r\n '700': '#7e22ce',\r\n '800': '#6b21a8',\r\n '900': '#581c87',\r\n },\r\n '粉': {\r\n '50': '#fdf2f8',\r\n '100': '#fce7f3',\r\n '200': '#fbcfe8',\r\n '300': '#f9a8d4',\r\n '400': '#f472b6',\r\n '500': '#ec4899',\r\n '600': '#db2777',\r\n '700': '#be185d',\r\n '800': '#9d174d',\r\n '900': '#831843',\r\n },\r\n}\r\n\r\n// 生成颜色规则\r\nfunction generateColorRules(): Record<string, string> {\r\n const rules: Record<string, string> = {}\r\n \r\n // 基础颜色\r\n rules['文字-透明'] = 'color: transparent;'\r\n rules['文字-黑'] = 'color: #000;'\r\n rules['文字-白'] = 'color: #fff;'\r\n rules['背景-透明'] = 'background-color: transparent;'\r\n rules['背景-黑'] = 'background-color: #000;'\r\n rules['背景-白'] = 'background-color: #fff;'\r\n rules['边框-透明'] = 'border-color: transparent;'\r\n rules['边框-黑'] = 'border-color: #000;'\r\n rules['边框-白'] = 'border-color: #fff;'\r\n \r\n // 调色板颜色\r\n for (const [colorName, shades] of Object.entries(colorPalette)) {\r\n for (const [shade, hex] of Object.entries(shades)) {\r\n // text color\r\n rules[`文字-${colorName}-${shade}`] = `color: ${hex};`\r\n // background color\r\n rules[`背景-${colorName}-${shade}`] = `background-color: ${hex};`\r\n // border color\r\n rules[`边框色-${colorName}-${shade}`] = `border-color: ${hex};`\r\n }\r\n }\r\n \r\n // opacity\r\n rules['透明度-0'] = 'opacity: 0;'\r\n rules['透明度-5'] = 'opacity: 0.05;'\r\n rules['透明度-10'] = 'opacity: 0.1;'\r\n rules['透明度-20'] = 'opacity: 0.2;'\r\n rules['透明度-25'] = 'opacity: 0.25;'\r\n rules['透明度-30'] = 'opacity: 0.3;'\r\n rules['透明度-40'] = 'opacity: 0.4;'\r\n rules['透明度-50'] = 'opacity: 0.5;'\r\n rules['透明度-60'] = 'opacity: 0.6;'\r\n rules['透明度-70'] = 'opacity: 0.7;'\r\n rules['透明度-75'] = 'opacity: 0.75;'\r\n rules['透明度-80'] = 'opacity: 0.8;'\r\n rules['透明度-90'] = 'opacity: 0.9;'\r\n rules['透明度-95'] = 'opacity: 0.95;'\r\n rules['透明度-100'] = 'opacity: 1;'\r\n \r\n return rules\r\n}\r\n\r\n/**\r\n * Colors 颜色预设规则\r\n */\r\nexport const colorsPreset: PresetModule = {\r\n name: 'colors',\r\n rules: generateColorRules()\r\n}\r\n\r\nexport default colorsPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n/**\r\n * Layout 布局预设规则\r\n */\r\nexport const layoutPreset: PresetModule = {\r\n name: 'layout',\r\n rules: {\r\n // display\r\n '块级': 'display: block;',\r\n '行内块': 'display: inline-block;',\r\n '行内': 'display: inline;',\r\n '隐藏': 'display: none;',\r\n '内容': 'display: contents;',\r\n '表格': 'display: table;',\r\n '表格行': 'display: table-row;',\r\n '表格单元': 'display: table-cell;',\r\n '网格': 'display: grid;',\r\n '行内网格': 'display: inline-grid;',\r\n '流式': 'display: flow-root;',\r\n \r\n // position\r\n '静态定位': 'position: static;',\r\n '相对定位': 'position: relative;',\r\n '绝对定位': 'position: absolute;',\r\n '固定定位': 'position: fixed;',\r\n '粘性定位': 'position: sticky;',\r\n \r\n // top/right/bottom/left\r\n '定位-0': 'inset: 0;',\r\n '上-0': 'top: 0;',\r\n '右-0': 'right: 0;',\r\n '下-0': 'bottom: 0;',\r\n '左-0': 'left: 0;',\r\n '上-1': 'top: 0.25rem;',\r\n '右-1': 'right: 0.25rem;',\r\n '下-1': 'bottom: 0.25rem;',\r\n '左-1': 'left: 0.25rem;',\r\n '上-2': 'top: 0.5rem;',\r\n '右-2': 'right: 0.5rem;',\r\n '下-2': 'bottom: 0.5rem;',\r\n '左-2': 'left: 0.5rem;',\r\n '上-4': 'top: 1rem;',\r\n '右-4': 'right: 1rem;',\r\n '下-4': 'bottom: 1rem;',\r\n '左-4': 'left: 1rem;',\r\n '上-自动': 'top: auto;',\r\n '右-自动': 'right: auto;',\r\n '下-自动': 'bottom: auto;',\r\n '左-自动': 'left: auto;',\r\n '上-全': 'top: 100%;',\r\n '右-全': 'right: 100%;',\r\n '下-全': 'bottom: 100%;',\r\n '左-全': 'left: 100%;',\r\n '上-1/2': 'top: 50%;',\r\n '右-1/2': 'right: 50%;',\r\n '下-1/2': 'bottom: 50%;',\r\n '左-1/2': 'left: 50%;',\r\n \r\n // z-index\r\n '层级-0': 'z-index: 0;',\r\n '层级-10': 'z-index: 10;',\r\n '层级-20': 'z-index: 20;',\r\n '层级-30': 'z-index: 30;',\r\n '层级-40': 'z-index: 40;',\r\n '层级-50': 'z-index: 50;',\r\n '层级-自动': 'z-index: auto;',\r\n '层级-最高': 'z-index: 9999;',\r\n '层级-最低': 'z-index: -1;',\r\n \r\n // overflow\r\n '溢出-自动': 'overflow: auto;',\r\n '溢出-隐藏': 'overflow: hidden;',\r\n '溢出-可见': 'overflow: visible;',\r\n '溢出-滚动': 'overflow: scroll;',\r\n '横向溢出-自动': 'overflow-x: auto;',\r\n '横向溢出-隐藏': 'overflow-x: hidden;',\r\n '横向溢出-可见': 'overflow-x: visible;',\r\n '横向溢出-滚动': 'overflow-x: scroll;',\r\n '纵向溢出-自动': 'overflow-y: auto;',\r\n '纵向溢出-隐藏': 'overflow-y: hidden;',\r\n '纵向溢出-可见': 'overflow-y: visible;',\r\n '纵向溢出-滚动': 'overflow-y: scroll;',\r\n \r\n // visibility\r\n '可见': 'visibility: visible;',\r\n '不可见': 'visibility: hidden;',\r\n '折叠': 'visibility: collapse;',\r\n \r\n // float\r\n '左浮动': 'float: left;',\r\n '右浮动': 'float: right;',\r\n '不浮动': 'float: none;',\r\n '清除浮动': 'clear: both;',\r\n '清除左浮动': 'clear: left;',\r\n '清除右浮动': 'clear: right;',\r\n \r\n // object-fit\r\n '对象-包含': 'object-fit: contain;',\r\n '对象-覆盖': 'object-fit: cover;',\r\n '对象-填充': 'object-fit: fill;',\r\n '对象-无': 'object-fit: none;',\r\n '对象-缩小': 'object-fit: scale-down;',\r\n \r\n // box-sizing\r\n '盒模型-边框': 'box-sizing: border-box;',\r\n '盒模型-内容': 'box-sizing: content-box;',\r\n \r\n // cursor\r\n '指针-默认': 'cursor: default;',\r\n '指针-手型': 'cursor: pointer;',\r\n '指针-等待': 'cursor: wait;',\r\n '指针-文本': 'cursor: text;',\r\n '指针-移动': 'cursor: move;',\r\n '指针-禁止': 'cursor: not-allowed;',\r\n '指针-帮助': 'cursor: help;',\r\n '指针-十字': 'cursor: crosshair;',\r\n '指针-缩放': 'cursor: zoom-in;',\r\n '指针-抓取': 'cursor: grab;',\r\n '指针-抓取中': 'cursor: grabbing;',\r\n \r\n // user-select\r\n '选择-无': 'user-select: none;',\r\n '选择-文本': 'user-select: text;',\r\n '选择-全部': 'user-select: all;',\r\n '选择-自动': 'user-select: auto;',\r\n \r\n // pointer-events\r\n '事件-无': 'pointer-events: none;',\r\n '事件-自动': 'pointer-events: auto;',\r\n \r\n // resize\r\n '调整-无': 'resize: none;',\r\n '调整-两向': 'resize: both;',\r\n '调整-横向': 'resize: horizontal;',\r\n '调整-纵向': 'resize: vertical;',\r\n }\r\n}\r\n\r\nexport default layoutPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n/**\r\n * Border 边框预设规则\r\n */\r\nexport const borderPreset: PresetModule = {\r\n name: 'border',\r\n rules: {\r\n // border-width\r\n '边框-0': 'border-width: 0;',\r\n '边框': 'border-width: 1px;',\r\n '边框-2': 'border-width: 2px;',\r\n '边框-4': 'border-width: 4px;',\r\n '边框-8': 'border-width: 8px;',\r\n '上边框-0': 'border-top-width: 0;',\r\n '上边框': 'border-top-width: 1px;',\r\n '上边框-2': 'border-top-width: 2px;',\r\n '上边框-4': 'border-top-width: 4px;',\r\n '右边框-0': 'border-right-width: 0;',\r\n '右边框': 'border-right-width: 1px;',\r\n '右边框-2': 'border-right-width: 2px;',\r\n '右边框-4': 'border-right-width: 4px;',\r\n '下边框-0': 'border-bottom-width: 0;',\r\n '下边框': 'border-bottom-width: 1px;',\r\n '下边框-2': 'border-bottom-width: 2px;',\r\n '下边框-4': 'border-bottom-width: 4px;',\r\n '左边框-0': 'border-left-width: 0;',\r\n '左边框': 'border-left-width: 1px;',\r\n '左边框-2': 'border-left-width: 2px;',\r\n '左边框-4': 'border-left-width: 4px;',\r\n \r\n // border-style\r\n '边框-实线': 'border-style: solid;',\r\n '边框-虚线': 'border-style: dashed;',\r\n '边框-点线': 'border-style: dotted;',\r\n '边框-双线': 'border-style: double;',\r\n '边框-无': 'border-style: none;',\r\n '边框-隐藏': 'border-style: hidden;',\r\n \r\n // border-radius\r\n '圆角-无': 'border-radius: 0;',\r\n '圆角-小': 'border-radius: 0.125rem;',\r\n '圆角': 'border-radius: 0.25rem;',\r\n '圆角-中': 'border-radius: 0.375rem;',\r\n '圆角-大': 'border-radius: 0.5rem;',\r\n '圆角-超大': 'border-radius: 0.75rem;',\r\n '圆角-极大': 'border-radius: 1rem;',\r\n '圆角-2极大': 'border-radius: 1.5rem;',\r\n '圆角-3极大': 'border-radius: 2rem;',\r\n '圆角-全': 'border-radius: 9999px;',\r\n \r\n // 单边圆角\r\n '上圆角-无': 'border-top-left-radius: 0; border-top-right-radius: 0;',\r\n '上圆角': 'border-top-left-radius: 0.25rem; border-top-right-radius: 0.25rem;',\r\n '上圆角-大': 'border-top-left-radius: 0.5rem; border-top-right-radius: 0.5rem;',\r\n '上圆角-全': 'border-top-left-radius: 9999px; border-top-right-radius: 9999px;',\r\n '下圆角-无': 'border-bottom-left-radius: 0; border-bottom-right-radius: 0;',\r\n '下圆角': 'border-bottom-left-radius: 0.25rem; border-bottom-right-radius: 0.25rem;',\r\n '下圆角-大': 'border-bottom-left-radius: 0.5rem; border-bottom-right-radius: 0.5rem;',\r\n '下圆角-全': 'border-bottom-left-radius: 9999px; border-bottom-right-radius: 9999px;',\r\n '左圆角-无': 'border-top-left-radius: 0; border-bottom-left-radius: 0;',\r\n '左圆角': 'border-top-left-radius: 0.25rem; border-bottom-left-radius: 0.25rem;',\r\n '左圆角-大': 'border-top-left-radius: 0.5rem; border-bottom-left-radius: 0.5rem;',\r\n '左圆角-全': 'border-top-left-radius: 9999px; border-bottom-left-radius: 9999px;',\r\n '右圆角-无': 'border-top-right-radius: 0; border-bottom-right-radius: 0;',\r\n '右圆角': 'border-top-right-radius: 0.25rem; border-bottom-right-radius: 0.25rem;',\r\n '右圆角-大': 'border-top-right-radius: 0.5rem; border-bottom-right-radius: 0.5rem;',\r\n '右圆角-全': 'border-top-right-radius: 9999px; border-bottom-right-radius: 9999px;',\r\n \r\n // outline\r\n '轮廓-无': 'outline: 2px solid transparent; outline-offset: 2px;',\r\n '轮廓': 'outline-style: solid;',\r\n '轮廓-虚线': 'outline-style: dashed;',\r\n '轮廓-点线': 'outline-style: dotted;',\r\n '轮廓-双线': 'outline-style: double;',\r\n '轮廓偏移-0': 'outline-offset: 0;',\r\n '轮廓偏移-1': 'outline-offset: 1px;',\r\n '轮廓偏移-2': 'outline-offset: 2px;',\r\n '轮廓偏移-4': 'outline-offset: 4px;',\r\n '轮廓偏移-8': 'outline-offset: 8px;',\r\n \r\n // box-shadow\r\n '阴影-小': 'box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);',\r\n '阴影': 'box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);',\r\n '阴影-中': 'box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);',\r\n '阴影-大': 'box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);',\r\n '阴影-超大': 'box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);',\r\n '阴影-极大': 'box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);',\r\n '阴影-内': 'box-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);',\r\n '阴影-无': 'box-shadow: 0 0 #0000;',\r\n }\r\n}\r\n\r\nexport default borderPreset\r\n","import type { PresetModule } from '../types'\r\n\r\n/**\r\n * Effects 特效预设规则\r\n */\r\nexport const effectsPreset: PresetModule = {\r\n name: 'effects',\r\n rules: {\r\n // transition\r\n '过渡-无': 'transition-property: none;',\r\n '过渡-全部': 'transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms;',\r\n '过渡': 'transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms;',\r\n '过渡-颜色': 'transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms;',\r\n '过渡-透明': 'transition-property: opacity; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms;',\r\n '过渡-阴影': 'transition-property: box-shadow; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms;',\r\n '过渡-变换': 'transition-property: transform; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms;',\r\n \r\n // transition-duration\r\n '时长-75': 'transition-duration: 75ms;',\r\n '时长-100': 'transition-duration: 100ms;',\r\n '时长-150': 'transition-duration: 150ms;',\r\n '时长-200': 'transition-duration: 200ms;',\r\n '时长-300': 'transition-duration: 300ms;',\r\n '时长-500': 'transition-duration: 500ms;',\r\n '时长-700': 'transition-duration: 700ms;',\r\n '时长-1000': 'transition-duration: 1000ms;',\r\n \r\n // transition-timing-function\r\n '缓动-线性': 'transition-timing-function: linear;',\r\n '缓动-入': 'transition-timing-function: cubic-bezier(0.4, 0, 1, 1);',\r\n '缓动-出': 'transition-timing-function: cubic-bezier(0, 0, 0.2, 1);',\r\n '缓动-入出': 'transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);',\r\n \r\n // transform\r\n '变换-无': 'transform: none;',\r\n '缩放-0': 'transform: scale(0);',\r\n '缩放-50': 'transform: scale(0.5);',\r\n '缩放-75': 'transform: scale(0.75);',\r\n '缩放-90': 'transform: scale(0.9);',\r\n '缩放-95': 'transform: scale(0.95);',\r\n '缩放-100': 'transform: scale(1);',\r\n '缩放-105': 'transform: scale(1.05);',\r\n '缩放-110': 'transform: scale(1.1);',\r\n '缩放-125': 'transform: scale(1.25);',\r\n '缩放-150': 'transform: scale(1.5);',\r\n \r\n '横向缩放-0': 'transform: scaleX(0);',\r\n '横向缩放-50': 'transform: scaleX(0.5);',\r\n '横向缩放-100': 'transform: scaleX(1);',\r\n '横向缩放-150': 'transform: scaleX(1.5);',\r\n \r\n '纵向缩放-0': 'transform: scaleY(0);',\r\n '纵向缩放-50': 'transform: scaleY(0.5);',\r\n '纵向缩放-100': 'transform: scaleY(1);',\r\n '纵向缩放-150': 'transform: scaleY(1.5);',\r\n \r\n '旋转-0': 'transform: rotate(0deg);',\r\n '旋转-1': 'transform: rotate(1deg);',\r\n '旋转-2': 'transform: rotate(2deg);',\r\n '旋转-3': 'transform: rotate(3deg);',\r\n '旋转-6': 'transform: rotate(6deg);',\r\n '旋转-12': 'transform: rotate(12deg);',\r\n '旋转-45': 'transform: rotate(45deg);',\r\n '旋转-90': 'transform: rotate(90deg);',\r\n '旋转-180': 'transform: rotate(180deg);',\r\n '负旋转-1': 'transform: rotate(-1deg);',\r\n '负旋转-2': 'transform: rotate(-2deg);',\r\n '负旋转-3': 'transform: rotate(-3deg);',\r\n '负旋转-6': 'transform: rotate(-6deg);',\r\n '负旋转-12': 'transform: rotate(-12deg);',\r\n '负旋转-45': 'transform: rotate(-45deg);',\r\n '负旋转-90': 'transform: rotate(-90deg);',\r\n '负旋转-180': 'transform: rotate(-180deg);',\r\n \r\n '平移X-0': 'transform: translateX(0);',\r\n '平移X-1': 'transform: translateX(0.25rem);',\r\n '平移X-2': 'transform: translateX(0.5rem);',\r\n '平移X-4': 'transform: translateX(1rem);',\r\n '平移X-8': 'transform: translateX(2rem);',\r\n '平移X-全': 'transform: translateX(100%);',\r\n '平移X-1/2': 'transform: translateX(50%);',\r\n '负平移X-1': 'transform: translateX(-0.25rem);',\r\n '负平移X-2': 'transform: translateX(-0.5rem);',\r\n '负平移X-4': 'transform: translateX(-1rem);',\r\n '负平移X-8': 'transform: translateX(-2rem);',\r\n '负平移X-全': 'transform: translateX(-100%);',\r\n '负平移X-1/2': 'transform: translateX(-50%);',\r\n \r\n '平移Y-0': 'transform: translateY(0);',\r\n '平移Y-1': 'transform: translateY(0.25rem);',\r\n '平移Y-2': 'transform: translateY(0.5rem);',\r\n '平移Y-4': 'transform: translateY(1rem);',\r\n '平移Y-8': 'transform: translateY(2rem);',\r\n '平移Y-全': 'transform: translateY(100%);',\r\n '平移Y-1/2': 'transform: translateY(50%);',\r\n '负平移Y-1': 'transform: translateY(-0.25rem);',\r\n '负平移Y-2': 'transform: translateY(-0.5rem);',\r\n '负平移Y-4': 'transform: translateY(-1rem);',\r\n '负平移Y-8': 'transform: translateY(-2rem);',\r\n '负平移Y-全': 'transform: translateY(-100%);',\r\n '负平移Y-1/2': 'transform: translateY(-50%);',\r\n \r\n '倾斜X-0': 'transform: skewX(0deg);',\r\n '倾斜X-1': 'transform: skewX(1deg);',\r\n '倾斜X-2': 'transform: skewX(2deg);',\r\n '倾斜X-3': 'transform: skewX(3deg);',\r\n '倾斜X-6': 'transform: skewX(6deg);',\r\n '倾斜X-12': 'transform: skewX(12deg);',\r\n '负倾斜X-1': 'transform: skewX(-1deg);',\r\n '负倾斜X-2': 'transform: skewX(-2deg);',\r\n '负倾斜X-3': 'transform: skewX(-3deg);',\r\n '负倾斜X-6': 'transform: skewX(-6deg);',\r\n '负倾斜X-12': 'transform: skewX(-12deg);',\r\n \r\n '倾斜Y-0': 'transform: skewY(0deg);',\r\n '倾斜Y-1': 'transform: skewY(1deg);',\r\n '倾斜Y-2': 'transform: skewY(2deg);',\r\n '倾斜Y-3': 'transform: skewY(3deg);',\r\n '倾斜Y-6': 'transform: skewY(6deg);',\r\n '倾斜Y-12': 'transform: skewY(12deg);',\r\n '负倾斜Y-1': 'transform: skewY(-1deg);',\r\n '负倾斜Y-2': 'transform: skewY(-2deg);',\r\n '负倾斜Y-3': 'transform: skewY(-3deg);',\r\n '负倾斜Y-6': 'transform: skewY(-6deg);',\r\n '负倾斜Y-12': 'transform: skewY(-12deg);',\r\n \r\n // transform-origin\r\n '变换原点-中': 'transform-origin: center;',\r\n '变换原点-上': 'transform-origin: top;',\r\n '变换原点-右上': 'transform-origin: top right;',\r\n '变换原点-右': 'transform-origin: right;',\r\n '变换原点-右下': 'transform-origin: bottom right;',\r\n '变换原点-下': 'transform-origin: bottom;',\r\n '变换原点-左下': 'transform-origin: bottom left;',\r\n '变换原点-左': 'transform-origin: left;',\r\n '变换原点-左上': 'transform-origin: top left;',\r\n \r\n // filter\r\n '模糊-无': 'filter: blur(0);',\r\n '模糊-小': 'filter: blur(4px);',\r\n '模糊': 'filter: blur(8px);',\r\n '模糊-中': 'filter: blur(12px);',\r\n '模糊-大': 'filter: blur(16px);',\r\n '模糊-超大': 'filter: blur(24px);',\r\n '模糊-极大': 'filter: blur(40px);',\r\n '模糊-3极大': 'filter: blur(64px);',\r\n \r\n '亮度-0': 'filter: brightness(0);',\r\n '亮度-50': 'filter: brightness(0.5);',\r\n '亮度-75': 'filter: brightness(0.75);',\r\n '亮度-90': 'filter: brightness(0.9);',\r\n '亮度-95': 'filter: brightness(0.95);',\r\n '亮度-100': 'filter: brightness(1);',\r\n '亮度-105': 'filter: brightness(1.05);',\r\n '亮度-110': 'filter: brightness(1.1);',\r\n '亮度-125': 'filter: brightness(1.25);',\r\n '亮度-150': 'filter: brightness(1.5);',\r\n '亮度-200': 'filter: brightness(2);',\r\n \r\n '灰度': 'filter: grayscale(100%);',\r\n '灰度-0': 'filter: grayscale(0);',\r\n '反色': 'filter: invert(100%);',\r\n '反色-0': 'filter: invert(0);',\r\n '褐色': 'filter: sepia(100%);',\r\n '褐色-0': 'filter: sepia(0);',\r\n \r\n '饱和度-0': 'filter: saturate(0);',\r\n '饱和度-50': 'filter: saturate(0.5);',\r\n '饱和度-100': 'filter: saturate(1);',\r\n '饱和度-150': 'filter: saturate(1.5);',\r\n '饱和度-200': 'filter: saturate(2);',\r\n \r\n // backdrop-filter\r\n '背景模糊-无': 'backdrop-filter: blur(0);',\r\n '背景模糊-小': 'backdrop-filter: blur(4px);',\r\n '背景模糊': 'backdrop-filter: blur(8px);',\r\n '背景模糊-中': 'backdrop-filter: blur(12px);',\r\n '背景模糊-大': 'backdrop-filter: blur(16px);',\r\n '背景模糊-超大': 'backdrop-filter: blur(24px);',\r\n '背景模糊-极大': 'backdrop-filter: blur(40px);',\r\n '背景模糊-3极大': 'backdrop-filter: blur(64px);',\r\n \r\n // mix-blend-mode\r\n '混合-正常': 'mix-blend-mode: normal;',\r\n '混合-正片叠底': 'mix-blend-mode: multiply;',\r\n '混合-滤色': 'mix-blend-mode: screen;',\r\n '混合-叠加': 'mix-blend-mode: overlay;',\r\n '混合-变暗': 'mix-blend-mode: darken;',\r\n '混合-变亮': 'mix-blend-mode: lighten;',\r\n '混合-颜色减淡': 'mix-blend-mode: color-dodge;',\r\n '混合-颜色加深': 'mix-blend-mode: color-burn;',\r\n '混合-强光': 'mix-blend-mode: hard-light;',\r\n '混合-柔光': 'mix-blend-mode: soft-light;',\r\n '混合-差值': 'mix-blend-mode: difference;',\r\n '混合-排除': 'mix-blend-mode: exclusion;',\r\n '混合-色相': 'mix-blend-mode: hue;',\r\n '混合-饱和度': 'mix-blend-mode: saturation;',\r\n '混合-颜色': 'mix-blend-mode: color;',\r\n '混合-明度': 'mix-blend-mode: luminosity;',\r\n }\r\n}\r\n\r\nexport default effectsPreset\r\n","import type { PresetModule, RuleMap } from '../types'\r\nimport { flexPreset } from './flex'\r\nimport { spacingPreset } from './spacing'\r\nimport { sizingPreset } from './sizing'\r\nimport { typographyPreset } from './typography'\r\nimport { colorsPreset } from './colors'\r\nimport { layoutPreset } from './layout'\r\nimport { borderPreset } from './border'\r\nimport { effectsPreset } from './effects'\r\n\r\n/**\r\n * 所有默认预设模块\r\n */\r\nexport const defaultPresets: PresetModule[] = [\r\n flexPreset,\r\n spacingPreset,\r\n sizingPreset,\r\n typographyPreset,\r\n colorsPreset,\r\n layoutPreset,\r\n borderPreset,\r\n effectsPreset,\r\n]\r\n\r\n/**\r\n * 获取所有预设规则的合并结果\r\n */\r\nexport function getAllRules(presets: PresetModule[] = defaultPresets): RuleMap {\r\n const rules: RuleMap = {}\r\n \r\n for (const preset of presets) {\r\n Object.assign(rules, preset.rules)\r\n }\r\n \r\n return rules\r\n}\r\n\r\n/**\r\n * 根据预设名称获取预设模块\r\n */\r\nexport function getPresetByName(name: string): PresetModule | undefined {\r\n return defaultPresets.find(preset => preset.name === name)\r\n}\r\n\r\n// 导出所有预设模块\r\nexport {\r\n flexPreset,\r\n spacingPreset,\r\n sizingPreset,\r\n typographyPreset,\r\n colorsPreset,\r\n layoutPreset,\r\n borderPreset,\r\n effectsPreset,\r\n}\r\n","{\r\n \"name\": \"zhentou\",\r\n \"version\": \"1.0.3\",\r\n \"description\": \"中文原子化 CSS 框架 - 使用中文类名编写样式\",\r\n \"main\": \"dist/index.js\",\r\n \"module\": \"dist/index.mjs\",\r\n \"types\": \"dist/index.d.ts\",\r\n \"bin\": {\r\n \"zhentou\": \"./bin/zhentou.js\"\r\n },\r\n \"exports\": {\r\n \".\": {\r\n \"types\": \"./dist/index.d.ts\",\r\n \"require\": \"./dist/index.js\",\r\n \"import\": \"./dist/index.mjs\"\r\n },\r\n \"./postcss\": {\r\n \"types\": \"./dist/postcss.d.ts\",\r\n \"require\": \"./dist/postcss.js\",\r\n \"import\": \"./dist/postcss.mjs\"\r\n }\r\n },\r\n \"files\": [\r\n \"dist\",\r\n \"bin\",\r\n \"stubs\"\r\n ],\r\n \"scripts\": {\r\n \"build\": \"tsup\",\r\n \"dev\": \"tsup --watch\",\r\n \"prepublishOnly\": \"npm run build\"\r\n },\r\n \"keywords\": [\r\n \"css\",\r\n \"chinese\",\r\n \"atomic-css\",\r\n \"utility-css\",\r\n \"tailwind\",\r\n \"中文\",\r\n \"原子化\"\r\n ],\r\n \"author\": \"\",\r\n \"license\": \"MIT\",\r\n \"devDependencies\": {\r\n \"@types/node\": \"^20.10.0\",\r\n \"tsup\": \"^8.0.1\",\r\n \"typescript\": \"^5.3.2\"\r\n },\r\n \"dependencies\": {\r\n \"chokidar\": \"^3.5.3\",\r\n \"commander\": \"^11.1.0\",\r\n \"fast-glob\": \"^3.3.2\",\r\n \"picocolors\": \"^1.0.0\",\r\n \"postcss\": \"^8.4.32\"\r\n }\r\n}\r\n","#!/usr/bin/env node\r\nimport { Command } from 'commander'\r\nimport * as fs from 'fs'\r\nimport * as path from 'path'\r\nimport pc from 'picocolors'\r\nimport chokidar from 'chokidar'\r\nimport { build, createContext, incrementalBuild } from './core/context'\r\nimport { loadConfig, findConfigFile, validateConfig } from './core/config'\r\nimport { getFileList } from './core/scanner'\r\n\r\nconst pkg = require('../package.json')\r\n\r\nconst program = new Command()\r\n\r\nprogram\r\n .name('zhentou')\r\n .description('中文原子化 CSS 框架')\r\n .version(pkg.version)\r\n\r\n/**\r\n * init 命令 - 初始化配置文件\r\n */\r\nprogram\r\n .command('init')\r\n .description('初始化 zhentou 配置文件')\r\n .option('-f, --force', '强制覆盖已存在的配置文件')\r\n .action(async (options) => {\r\n const cwd = process.cwd()\r\n const configPath = path.resolve(cwd, 'zhentou.config.js')\r\n \r\n if (fs.existsSync(configPath) && !options.force) {\r\n console.log(pc.yellow('⚠ 配置文件已存在,使用 --force 选项可覆盖'))\r\n return\r\n }\r\n \r\n // 复制模板配置文件\r\n const templatePath = path.resolve(__dirname, '../stubs/zhentou.config.js')\r\n \r\n if (fs.existsSync(templatePath)) {\r\n fs.copyFileSync(templatePath, configPath)\r\n } else {\r\n // 如果模板不存在,直接创建\r\n const defaultConfig = `/** @type {import('zhentou').Config} */\r\nmodule.exports = {\r\n // 需要扫描的文件路径\r\n content: [\r\n './src/**/*.{html,js,jsx,ts,tsx,vue}',\r\n './public/index.html'\r\n ],\r\n // 输出 CSS 文件路径\r\n output: './dist/zhentou.css',\r\n // 扩展自定义规则\r\n extend: {\r\n // '自定义类名': 'css属性: 值;',\r\n }\r\n}\r\n`\r\n fs.writeFileSync(configPath, defaultConfig, 'utf-8')\r\n }\r\n \r\n console.log(pc.green('✓ 配置文件已创建: zhentou.config.js'))\r\n console.log('')\r\n console.log('下一步:')\r\n console.log(pc.cyan(' 1. 编辑 zhentou.config.js 配置你的项目'))\r\n console.log(pc.cyan(' 2. 运行 npx zhentou build 生成 CSS'))\r\n console.log(pc.cyan(' 3. 在你的项目中引入生成的 CSS 文件'))\r\n })\r\n\r\n/**\r\n * build 命令 - 构建 CSS\r\n */\r\nprogram\r\n .command('build')\r\n .description('构建 CSS 文件')\r\n .option('-c, --config <path>', '指定配置文件路径')\r\n .option('-o, --output <path>', '指定输出文件路径')\r\n .option('-m, --minify', '压缩输出的 CSS')\r\n .option('--full', '生成包含所有规则的完整 CSS')\r\n .action(async (options) => {\r\n const cwd = process.cwd()\r\n \r\n console.log(pc.cyan('🚀 Zhentou CSS 构建中...'))\r\n console.log('')\r\n \r\n const startTime = Date.now()\r\n \r\n try {\r\n // 检查配置文件\r\n const configPath = options.config || findConfigFile(cwd)\r\n if (!configPath) {\r\n console.log(pc.yellow('⚠ 未找到配置文件,使用默认配置'))\r\n console.log(pc.gray(' 运行 npx zhentou init 创建配置文件'))\r\n console.log('')\r\n }\r\n \r\n // 执行构建\r\n const result = await build(cwd)\r\n \r\n const elapsed = Date.now() - startTime\r\n \r\n console.log(pc.green('✓ 构建完成!'))\r\n console.log('')\r\n console.log(pc.gray('统计信息:'))\r\n console.log(pc.gray(` 扫描文件: ${result.stats.filesScanned} 个`))\r\n console.log(pc.gray(` 发现类名: ${result.stats.classesFound} 个`))\r\n console.log(pc.gray(` 有效类名: ${result.stats.classesUsed} 个`))\r\n console.log(pc.gray(` 输出文件: ${result.stats.outputPath}`))\r\n console.log(pc.gray(` 构建耗时: ${elapsed}ms`))\r\n \r\n } catch (error: any) {\r\n console.error(pc.red('✗ 构建失败:'), error.message)\r\n process.exit(1)\r\n }\r\n })\r\n\r\n/**\r\n * watch 命令 - 监听文件变化并自动重建\r\n */\r\nprogram\r\n .command('watch')\r\n .description('监听文件变化并自动重建')\r\n .option('-c, --config <path>', '指定配置文件路径')\r\n .action(async (options) => {\r\n const cwd = process.cwd()\r\n \r\n console.log(pc.cyan('👀 Zhentou CSS 监听模式启动...'))\r\n console.log('')\r\n \r\n try {\r\n // 先执行一次构建\r\n const result = await build(cwd)\r\n console.log(pc.green('✓ 初始构建完成'))\r\n console.log(pc.gray(` 输出文件: ${result.stats.outputPath}`))\r\n console.log('')\r\n \r\n // 创建上下文\r\n const ctx = await createContext(cwd)\r\n \r\n // 获取需要监听的文件列表\r\n const files = await getFileList(ctx.config, cwd)\r\n \r\n console.log(pc.gray(`正在监听 ${files.length} 个文件...`))\r\n console.log(pc.gray('按 Ctrl+C 停止监听'))\r\n console.log('')\r\n \r\n // 创建文件监听器\r\n const watcher = chokidar.watch(ctx.config.content, {\r\n cwd,\r\n ignoreInitial: true,\r\n ignored: ['**/node_modules/**', '**/dist/**', '**/.git/**'],\r\n })\r\n \r\n let rebuilding = false\r\n let pendingRebuild = false\r\n \r\n const rebuild = async (changedPath: string) => {\r\n if (rebuilding) {\r\n pendingRebuild = true\r\n return\r\n }\r\n \r\n rebuilding = true\r\n \r\n try {\r\n const startTime = Date.now()\r\n await incrementalBuild(ctx, [changedPath], cwd)\r\n const elapsed = Date.now() - startTime\r\n \r\n const relativePath = path.relative(cwd, changedPath)\r\n console.log(pc.green(`✓ 已重建`), pc.gray(`(${relativePath}, ${elapsed}ms)`))\r\n \r\n } catch (error: any) {\r\n console.error(pc.red('✗ 重建失败:'), error.message)\r\n }\r\n \r\n rebuilding = false\r\n \r\n if (pendingRebuild) {\r\n pendingRebuild = false\r\n rebuild(changedPath)\r\n }\r\n }\r\n \r\n watcher.on('change', (filePath) => {\r\n const absolutePath = path.resolve(cwd, filePath)\r\n rebuild(absolutePath)\r\n })\r\n \r\n watcher.on('add', (filePath) => {\r\n const absolutePath = path.resolve(cwd, filePath)\r\n console.log(pc.blue(`+ 新文件:`), pc.gray(filePath))\r\n rebuild(absolutePath)\r\n })\r\n \r\n watcher.on('unlink', (filePath) => {\r\n const absolutePath = path.resolve(cwd, filePath)\r\n console.log(pc.yellow(`- 删除文件:`), pc.gray(filePath))\r\n rebuild(absolutePath)\r\n })\r\n \r\n } catch (error: any) {\r\n console.error(pc.red('✗ 启动监听失败:'), error.message)\r\n process.exit(1)\r\n }\r\n })\r\n\r\n/**\r\n * list 命令 - 列出所有可用的类名\r\n */\r\nprogram\r\n .command('list')\r\n .description('列出所有可用的中文类名')\r\n .option('-s, --search <keyword>', '搜索包含关键词的类名')\r\n .option('-p, --preset <name>', '只显示指定预设的类名 (flex, spacing, sizing, typography, colors, layout, border, effects)')\r\n .action(async (options) => {\r\n const { getAllRules, getPresetByName } = await import('./presets')\r\n \r\n let rules: Record<string, string>\r\n \r\n if (options.preset) {\r\n const preset = getPresetByName(options.preset)\r\n if (!preset) {\r\n console.error(pc.red(`✗ 未找到预设: ${options.preset}`))\r\n console.log(pc.gray('可用预设: flex, spacing, sizing, typography, colors, layout, border, effects'))\r\n process.exit(1)\r\n }\r\n rules = preset.rules\r\n console.log(pc.cyan(`📦 预设: ${preset.name}`))\r\n } else {\r\n rules = getAllRules()\r\n console.log(pc.cyan('📦 所有可用的中文类名'))\r\n }\r\n \r\n console.log('')\r\n \r\n let entries = Object.entries(rules)\r\n \r\n // 搜索过滤\r\n if (options.search) {\r\n const keyword = options.search.toLowerCase()\r\n entries = entries.filter(([name, css]) => \r\n name.toLowerCase().includes(keyword) || \r\n css.toLowerCase().includes(keyword)\r\n )\r\n }\r\n \r\n // 排序\r\n entries.sort((a, b) => a[0].localeCompare(b[0], 'zh-CN'))\r\n \r\n // 输出\r\n for (const [name, css] of entries) {\r\n console.log(`${pc.green(name)} ${pc.gray('→')} ${pc.white(css)}`)\r\n }\r\n \r\n console.log('')\r\n console.log(pc.gray(`共 ${entries.length} 个类名`))\r\n })\r\n\r\n// 解析命令行参数\r\nprogram.parse()\r\n","import type { Config, Context, RuleMap, ScanResult } from '../types'\r\nimport { loadConfig } from './config'\r\nimport { scanFiles } from './scanner'\r\nimport { extractClasses, filterValidClasses } from './extractor'\r\nimport { generateCSS, writeCSS } from './generator'\r\nimport { getAllRules, defaultPresets } from '../presets'\r\n\r\n/**\r\n * 创建运行时上下文\r\n */\r\nexport async function createContext(cwd: string = process.cwd()): Promise<Context> {\r\n // 加载配置\r\n const config = await loadConfig(cwd)\r\n \r\n // 获取所有规则(预设 + 自定义扩展)\r\n const presetRules = getAllRules(defaultPresets)\r\n const rules: RuleMap = {\r\n ...presetRules,\r\n ...config.extend,\r\n }\r\n \r\n return {\r\n config,\r\n rules,\r\n usedClasses: new Set(),\r\n }\r\n}\r\n\r\n/**\r\n * 执行完整的构建流程\r\n */\r\nexport async function build(cwd: string = process.cwd()): Promise<{\r\n css: string\r\n stats: {\r\n filesScanned: number\r\n classesFound: number\r\n classesUsed: number\r\n outputPath: string\r\n }\r\n}> {\r\n // 创建上下文\r\n const ctx = await createContext(cwd)\r\n \r\n // 扫描文件\r\n const scanResults = await scanFiles(ctx.config, cwd)\r\n \r\n // 提取类名\r\n const allClasses = extractClasses(scanResults)\r\n \r\n // 筛选有效类名\r\n const validClasses = filterValidClasses(allClasses, ctx.rules)\r\n \r\n // 更新上下文\r\n ctx.usedClasses = validClasses\r\n \r\n // 生成 CSS\r\n const css = generateCSS(validClasses, ctx.rules)\r\n \r\n // 写入文件\r\n const outputPath = ctx.config.output || './dist/zhentou.css'\r\n await writeCSS(css, outputPath, cwd)\r\n \r\n return {\r\n css,\r\n stats: {\r\n filesScanned: scanResults.length,\r\n classesFound: allClasses.size,\r\n classesUsed: validClasses.size,\r\n outputPath,\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 增量更新(用于 watch 模式)\r\n */\r\nexport async function incrementalBuild(\r\n ctx: Context,\r\n changedFiles: string[],\r\n cwd: string = process.cwd()\r\n): Promise<string> {\r\n // 重新扫描变更的文件\r\n const scanResults = await scanFiles(ctx.config, cwd)\r\n \r\n // 提取类名\r\n const allClasses = extractClasses(scanResults)\r\n \r\n // 筛选有效类名\r\n const validClasses = filterValidClasses(allClasses, ctx.rules)\r\n \r\n // 更新上下文\r\n ctx.usedClasses = validClasses\r\n \r\n // 生成 CSS\r\n const css = generateCSS(validClasses, ctx.rules)\r\n \r\n // 写入文件\r\n const outputPath = ctx.config.output || './dist/zhentou.css'\r\n await writeCSS(css, outputPath, cwd)\r\n \r\n return css\r\n}\r\n\r\n/**\r\n * 获取上下文中所有规则的数量\r\n */\r\nexport function getRuleCount(ctx: Context): number {\r\n return Object.keys(ctx.rules).length\r\n}\r\n\r\n/**\r\n * 检查类名是否有效\r\n */\r\nexport function isValidClass(ctx: Context, className: string): boolean {\r\n return ctx.rules[className] !== undefined\r\n}\r\n\r\n/**\r\n * 获取类名对应的 CSS\r\n */\r\nexport function getClassCSS(ctx: Context, className: string): string | undefined {\r\n return ctx.rules[className]\r\n}\r\n","import * as path from 'path'\r\nimport * as fs from 'fs'\r\nimport { pathToFileURL } from 'url'\r\nimport { createRequire } from 'module'\r\nimport type { Config } from '../types'\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const defaultConfig: Config = {\r\n content: ['./src/**/*.{html,js,jsx,ts,tsx,vue}'],\r\n output: './dist/zhentou.css',\r\n extend: {},\r\n}\r\n\r\n/**\r\n * 配置文件名列表(按优先级排序)\r\n * 注意:.cjs 优先于 .js,因为在 ESM 项目中使用 CommonJS 语法应使用 .cjs 扩展名\r\n */\r\nconst configFileNames = [\r\n 'zhentou.config.ts',\r\n 'zhentou.config.mjs',\r\n 'zhentou.config.cjs',\r\n 'zhentou.config.js',\r\n]\r\n\r\n/**\r\n * 查找配置文件\r\n */\r\nexport function findConfigFile(cwd: string = process.cwd()): string | null {\r\n for (const fileName of configFileNames) {\r\n const filePath = path.resolve(cwd, fileName)\r\n if (fs.existsSync(filePath)) {\r\n return filePath\r\n }\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * 加载配置文件\r\n */\r\nexport async function loadConfig(cwd: string = process.cwd()): Promise<Config> {\r\n const configPath = findConfigFile(cwd)\r\n \r\n if (!configPath) {\r\n return { ...defaultConfig }\r\n }\r\n \r\n try {\r\n let userConfig: any\r\n \r\n // 根据文件扩展名选择加载方式\r\n if (configPath.endsWith('.cjs')) {\r\n // CommonJS 文件使用 createRequire 加载\r\n const require = createRequire(import.meta.url)\r\n // 清除缓存以支持热重载\r\n delete require.cache[require.resolve(configPath)]\r\n userConfig = require(configPath)\r\n } else {\r\n // ESM 文件 (.mjs, .js, .ts) 使用动态 import 加载\r\n // 添加时间戳避免缓存,支持热重载\r\n const fileUrl = pathToFileURL(configPath).href\r\n userConfig = await import(`${fileUrl}?t=${Date.now()}`)\r\n }\r\n \r\n const config = userConfig.default || userConfig\r\n \r\n // 合并配置\r\n return {\r\n ...defaultConfig,\r\n ...config,\r\n extend: {\r\n ...defaultConfig.extend,\r\n ...config.extend,\r\n },\r\n }\r\n } catch (error) {\r\n console.error(`加载配置文件失败: ${configPath}`)\r\n console.error(error)\r\n return { ...defaultConfig }\r\n }\r\n}\r\n\r\n/**\r\n * 用于在配置文件中提供类型提示的辅助函数\r\n */\r\nexport function defineConfig(config: Config): Config {\r\n return config\r\n}\r\n\r\n/**\r\n * 验证配置\r\n */\r\nexport function validateConfig(config: Config): { valid: boolean; errors: string[] } {\r\n const errors: string[] = []\r\n \r\n if (!config.content || !Array.isArray(config.content) || config.content.length === 0) {\r\n errors.push('content 必须是一个非空的字符串数组')\r\n }\r\n \r\n if (config.output && typeof config.output !== 'string') {\r\n errors.push('output 必须是一个字符串')\r\n }\r\n \r\n if (config.extend && typeof config.extend !== 'object') {\r\n errors.push('extend 必须是一个对象')\r\n }\r\n \r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n }\r\n}\r\n","import * as fs from 'fs'\r\nimport * as path from 'path'\r\nimport fg from 'fast-glob'\r\nimport type { Config, ScanResult } from '../types'\r\n\r\n/**\r\n * 扫描文件\r\n * @param config 配置对象\r\n * @param cwd 工作目录\r\n * @returns 扫描结果数组\r\n */\r\nexport async function scanFiles(\r\n config: Config,\r\n cwd: string = process.cwd()\r\n): Promise<ScanResult[]> {\r\n const results: ScanResult[] = []\r\n \r\n // 使用 fast-glob 匹配文件\r\n const files = await fg(config.content, {\r\n cwd,\r\n absolute: true,\r\n onlyFiles: true,\r\n ignore: ['**/node_modules/**', '**/dist/**', '**/.git/**'],\r\n })\r\n \r\n // 读取每个文件的内容并提取类名\r\n for (const filePath of files) {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf-8')\r\n const classes = extractClassesFromContent(content)\r\n \r\n if (classes.length > 0) {\r\n results.push({\r\n filePath,\r\n classes,\r\n })\r\n }\r\n } catch (error) {\r\n console.warn(`读取文件失败: ${filePath}`)\r\n }\r\n }\r\n \r\n return results\r\n}\r\n\r\n/**\r\n * 从文件内容中提取类名\r\n * @param content 文件内容\r\n * @returns 类名数组\r\n */\r\nfunction extractClassesFromContent(content: string): string[] {\r\n const classes = new Set<string>()\r\n \r\n // 匹配各种框架的 class 属性\r\n const patterns = [\r\n // HTML class=\"...\" 或 class='...'\r\n /class\\s*=\\s*[\"']([^\"']+)[\"']/gi,\r\n // JSX className=\"...\" 或 className='...'\r\n /className\\s*=\\s*[\"']([^\"']+)[\"']/gi,\r\n // JSX className={`...`} 模板字符串\r\n /className\\s*=\\s*\\{`([^`]+)`\\}/gi,\r\n // JSX className={\"...\"} 或 className={'...'}\r\n /className\\s*=\\s*\\{[\"']([^\"']+)[\"']\\}/gi,\r\n // Vue :class=\"...\" 动态类\r\n /:class\\s*=\\s*[\"']([^\"']+)[\"']/gi,\r\n // Vue :class=\"{...}\" 对象语法中的键\r\n /:class\\s*=\\s*[\"']\\{([^}]+)\\}[\"']/gi,\r\n // Vue :class=\"[...]\" 数组语法\r\n /:class\\s*=\\s*[\"']\\[([^\\]]+)\\][\"']/gi,\r\n ]\r\n \r\n for (const pattern of patterns) {\r\n let match\r\n while ((match = pattern.exec(content)) !== null) {\r\n const classString = match[1]\r\n // 分割类名(按空格、逗号等分隔)\r\n const classNames = classString.split(/[\\s,'\"]+/).filter(Boolean)\r\n for (const className of classNames) {\r\n // 过滤掉非中文类名和特殊字符\r\n if (containsChinese(className)) {\r\n classes.add(className.trim())\r\n }\r\n }\r\n }\r\n }\r\n \r\n return Array.from(classes)\r\n}\r\n\r\n/**\r\n * 检查字符串是否包含中文字符\r\n */\r\nfunction containsChinese(str: string): boolean {\r\n return /[\\u4e00-\\u9fa5]/.test(str)\r\n}\r\n\r\n/**\r\n * 获取文件列表(不读取内容)\r\n */\r\nexport async function getFileList(\r\n config: Config,\r\n cwd: string = process.cwd()\r\n): Promise<string[]> {\r\n return fg(config.content, {\r\n cwd,\r\n absolute: true,\r\n onlyFiles: true,\r\n ignore: ['**/node_modules/**', '**/dist/**', '**/.git/**'],\r\n })\r\n}\r\n","import type { ScanResult, RuleMap } from '../types'\r\n\r\n/**\r\n * 从扫描结果中提取所有使用的类名\r\n */\r\nexport function extractClasses(scanResults: ScanResult[]): Set<string> {\r\n const allClasses = new Set<string>()\r\n \r\n for (const result of scanResults) {\r\n for (const className of result.classes) {\r\n allClasses.add(className)\r\n }\r\n }\r\n \r\n return allClasses\r\n}\r\n\r\n/**\r\n * 从类名集合中筛选出有效的类名(在规则中存在的)\r\n */\r\nexport function filterValidClasses(classes: Set<string>, rules: RuleMap): Set<string> {\r\n const validClasses = new Set<string>()\r\n \r\n for (const className of classes) {\r\n if (rules[className]) {\r\n validClasses.add(className)\r\n }\r\n }\r\n \r\n return validClasses\r\n}\r\n\r\n/**\r\n * 从文本内容中直接提取中文类名\r\n */\r\nexport function extractClassesFromText(content: string): string[] {\r\n const classes = new Set<string>()\r\n \r\n // 匹配各种框架的 class 属性\r\n const patterns = [\r\n // HTML class=\"...\" 或 class='...'\r\n /class\\s*=\\s*[\"']([^\"']+)[\"']/gi,\r\n // JSX className=\"...\" 或 className='...'\r\n /className\\s*=\\s*[\"']([^\"']+)[\"']/gi,\r\n // JSX className={`...`} 模板字符串\r\n /className\\s*=\\s*\\{`([^`]+)`\\}/gi,\r\n // JSX className={\"...\"} 或 className={'...'}\r\n /className\\s*=\\s*\\{[\"']([^\"']+)[\"']\\}/gi,\r\n // Vue :class=\"...\" 动态类\r\n /:class\\s*=\\s*[\"']([^\"']+)[\"']/gi,\r\n // Svelte class:xxx 指令\r\n /class:([^\\s=]+)/gi,\r\n ]\r\n \r\n for (const pattern of patterns) {\r\n let match\r\n while ((match = pattern.exec(content)) !== null) {\r\n const classString = match[1]\r\n // 分割类名\r\n const classNames = classString.split(/[\\s,'\"]+/).filter(Boolean)\r\n for (const className of classNames) {\r\n if (containsChinese(className)) {\r\n classes.add(className.trim())\r\n }\r\n }\r\n }\r\n }\r\n \r\n return Array.from(classes)\r\n}\r\n\r\n/**\r\n * 检查字符串是否包含中文字符\r\n */\r\nfunction containsChinese(str: string): boolean {\r\n return /[\\u4e00-\\u9fa5]/.test(str)\r\n}\r\n\r\n/**\r\n * 统计类名使用频率\r\n */\r\nexport function countClassUsage(scanResults: ScanResult[]): Map<string, number> {\r\n const counts = new Map<string, number>()\r\n \r\n for (const result of scanResults) {\r\n for (const className of result.classes) {\r\n counts.set(className, (counts.get(className) || 0) + 1)\r\n }\r\n }\r\n \r\n return counts\r\n}\r\n\r\n/**\r\n * 查找未使用的类名\r\n */\r\nexport function findUnusedClasses(\r\n usedClasses: Set<string>,\r\n rules: RuleMap\r\n): string[] {\r\n const unusedClasses: string[] = []\r\n \r\n for (const className of Object.keys(rules)) {\r\n if (!usedClasses.has(className)) {\r\n unusedClasses.push(className)\r\n }\r\n }\r\n \r\n return unusedClasses\r\n}\r\n\r\n/**\r\n * 查找无效的类名(使用了但规则中不存在的)\r\n */\r\nexport function findInvalidClasses(\r\n usedClasses: Set<string>,\r\n rules: RuleMap\r\n): string[] {\r\n const invalidClasses: string[] = []\r\n \r\n for (const className of usedClasses) {\r\n if (!rules[className]) {\r\n invalidClasses.push(className)\r\n }\r\n }\r\n \r\n return invalidClasses\r\n}\r\n","import * as fs from 'fs'\r\nimport * as path from 'path'\r\nimport type { RuleMap, Config } from '../types'\r\n\r\n/**\r\n * 转义 CSS 选择器中的特殊字符\r\n */\r\nfunction escapeSelector(selector: string): string {\r\n // 转义 CSS 选择器中的特殊字符\r\n return selector.replace(/([\\/\\-\\:])/g, '\\\\$1')\r\n}\r\n\r\n/**\r\n * 生成单个类的 CSS 规则\r\n */\r\nfunction generateRule(className: string, cssValue: string): string {\r\n const escapedClassName = escapeSelector(className)\r\n return `.${escapedClassName} { ${cssValue} }`\r\n}\r\n\r\n/**\r\n * 生成 CSS 内容\r\n * @param usedClasses 使用的类名集合\r\n * @param rules 规则映射\r\n * @returns CSS 字符串\r\n */\r\nexport function generateCSS(usedClasses: Set<string>, rules: RuleMap): string {\r\n const cssRules: string[] = []\r\n \r\n // 添加注释头\r\n cssRules.push('/* Zhentou CSS - 中文原子化 CSS 框架 */')\r\n cssRules.push('/* 自动生成,请勿手动编辑 */')\r\n cssRules.push('')\r\n \r\n // 按类名排序以保证输出稳定\r\n const sortedClasses = Array.from(usedClasses).sort()\r\n \r\n for (const className of sortedClasses) {\r\n const cssValue = rules[className]\r\n if (cssValue) {\r\n cssRules.push(generateRule(className, cssValue))\r\n }\r\n }\r\n \r\n return cssRules.join('\\n')\r\n}\r\n\r\n/**\r\n * 生成完整的 CSS(包含所有规则)\r\n */\r\nexport function generateFullCSS(rules: RuleMap): string {\r\n const cssRules: string[] = []\r\n \r\n cssRules.push('/* Zhentou CSS - 中文原子化 CSS 框架 */')\r\n cssRules.push('/* 完整版 CSS */')\r\n cssRules.push('')\r\n \r\n const sortedClasses = Object.keys(rules).sort()\r\n \r\n for (const className of sortedClasses) {\r\n const cssValue = rules[className]\r\n cssRules.push(generateRule(className, cssValue))\r\n }\r\n \r\n return cssRules.join('\\n')\r\n}\r\n\r\n/**\r\n * 生成基础重置样式\r\n */\r\nexport function generateBaseCSS(): string {\r\n return `/* Zhentou CSS - 基础重置样式 */\r\n*, *::before, *::after {\r\n box-sizing: border-box;\r\n}\r\n\r\n* {\r\n margin: 0;\r\n}\r\n\r\nhtml, body {\r\n height: 100%;\r\n}\r\n\r\nbody {\r\n line-height: 1.5;\r\n -webkit-font-smoothing: antialiased;\r\n}\r\n\r\nimg, picture, video, canvas, svg {\r\n display: block;\r\n max-width: 100%;\r\n}\r\n\r\ninput, button, textarea, select {\r\n font: inherit;\r\n}\r\n\r\np, h1, h2, h3, h4, h5, h6 {\r\n overflow-wrap: break-word;\r\n}\r\n\r\n#root, #__next {\r\n isolation: isolate;\r\n}\r\n`\r\n}\r\n\r\n/**\r\n * 写入 CSS 文件\r\n */\r\nexport async function writeCSS(\r\n css: string,\r\n outputPath: string,\r\n cwd: string = process.cwd()\r\n): Promise<void> {\r\n const absolutePath = path.isAbsolute(outputPath)\r\n ? outputPath\r\n : path.resolve(cwd, outputPath)\r\n \r\n // 确保目录存在\r\n const dir = path.dirname(absolutePath)\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true })\r\n }\r\n \r\n // 写入文件\r\n fs.writeFileSync(absolutePath, css, 'utf-8')\r\n}\r\n\r\n/**\r\n * 格式化 CSS 输出(美化)\r\n */\r\nexport function formatCSS(css: string): string {\r\n // 简单的格式化:每个规则占一行\r\n return css\r\n .replace(/\\}\\s*/g, '}\\n')\r\n .replace(/\\n{3,}/g, '\\n\\n')\r\n .trim()\r\n}\r\n\r\n/**\r\n * 压缩 CSS\r\n */\r\nexport function minifyCSS(css: string): string {\r\n return css\r\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // 移除注释\r\n .replace(/\\s+/g, ' ') // 压缩空白\r\n .replace(/\\s*([{}:;,])\\s*/g, '$1') // 移除符号周围的空白\r\n .replace(/;}/g, '}') // 移除最后一个分号\r\n .trim()\r\n}\r\n\r\n/**\r\n * 生成统计信息\r\n */\r\nexport function generateStats(usedClasses: Set<string>, rules: RuleMap): {\r\n totalRules: number\r\n usedRules: number\r\n unusedRules: number\r\n cssSize: number\r\n} {\r\n const css = generateCSS(usedClasses, rules)\r\n \r\n return {\r\n totalRules: Object.keys(rules).length,\r\n usedRules: usedClasses.size,\r\n unusedRules: Object.keys(rules).length - usedClasses.size,\r\n cssSize: Buffer.byteLength(css, 'utf-8'),\r\n }\r\n}\r\n"],"mappings":"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","names":["exports","module","fs","path","require","fs","fg","fs","path","pc","defaultConfig","chokidar","getAllRules","getPresetByName"]}