From 68434b227fc97fa34aa10ead7ca7bacb331289da Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Fri, 8 Nov 2024 12:07:21 +0800 Subject: [PATCH 001/128] [feat]rn-atomic-css --- .../builtInMixins/styleHelperMixin.ios.js | 5 +- packages/unocss-base/lib/rn.js | 8 ++ packages/unocss-base/preset-rn/index.js | 5 ++ packages/unocss-base/preset-rn/rules/color.js | 1 + packages/unocss-base/preset-rn/rules/index.js | 7 ++ .../unocss-base/preset-rn/rules/spaceing.js | 3 + packages/unocss-base/preset-rn/theme/index.js | 0 packages/unocss-plugin/lib/index.js | 11 ++- packages/unocss-plugin/lib/rn-plugin/index.js | 80 +++++++++++++++++++ .../webpack-plugin/lib/react/processStyles.js | 8 +- .../webpack-plugin/lib/react/style-helper.js | 7 +- 11 files changed, 126 insertions(+), 9 deletions(-) create mode 100644 packages/unocss-base/lib/rn.js create mode 100644 packages/unocss-base/preset-rn/index.js create mode 100644 packages/unocss-base/preset-rn/rules/color.js create mode 100644 packages/unocss-base/preset-rn/rules/index.js create mode 100644 packages/unocss-base/preset-rn/rules/spaceing.js create mode 100644 packages/unocss-base/preset-rn/theme/index.js create mode 100644 packages/unocss-plugin/lib/rn-plugin/index.js diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index da5f2ff7f0..107c707ed9 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -166,6 +166,9 @@ export default function styleHelperMixin () { const result = {} const classMap = {} // todo 全局样式在每个页面和组件中生效,以支持全局原子类,后续支持样式模块复用后可考虑移除 + if (isFunction(global.__getUnoClassMap)) { + Object.assign(classMap, global.__getUnoClassMap()); + } if (isFunction(global.__getAppClassMap)) { Object.assign(classMap, global.__getAppClassMap()) } @@ -175,7 +178,7 @@ export default function styleHelperMixin () { if (staticClass || dynamicClass) { // todo 当前为了复用小程序unocss产物,暂时进行mpEscape,等后续正式支持unocss后可不进行mpEscape - const classString = mpEscape(concat(staticClass, stringifyDynamicClass(dynamicClass))) + const classString = concat(staticClass, stringifyDynamicClass(dynamicClass)) classString.split(/\s+/).forEach((className) => { if (classMap[className]) { Object.assign(result, classMap[className]) diff --git a/packages/unocss-base/lib/rn.js b/packages/unocss-base/lib/rn.js new file mode 100644 index 0000000000..2713edb78d --- /dev/null +++ b/packages/unocss-base/lib/rn.js @@ -0,0 +1,8 @@ +const presetRn = require('../preset-rn') + +module.exports = function presetRnMpx (options = {}) { + return { + name: '@mpxjs/unocss-preset-rn', + ...presetRn + } +} diff --git a/packages/unocss-base/preset-rn/index.js b/packages/unocss-base/preset-rn/index.js new file mode 100644 index 0000000000..9f5e2c9c35 --- /dev/null +++ b/packages/unocss-base/preset-rn/index.js @@ -0,0 +1,5 @@ +const rules = require('./rules') + +module.exports = { + rules +} diff --git a/packages/unocss-base/preset-rn/rules/color.js b/packages/unocss-base/preset-rn/rules/color.js new file mode 100644 index 0000000000..d7faf17f9b --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/color.js @@ -0,0 +1 @@ +module.exports = [] diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js new file mode 100644 index 0000000000..40e1f27725 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -0,0 +1,7 @@ +const color = require('./color') +const spaceing = require('./spaceing') + +module.exports = [ + ...color, + ...spaceing +] diff --git a/packages/unocss-base/preset-rn/rules/spaceing.js b/packages/unocss-base/preset-rn/rules/spaceing.js new file mode 100644 index 0000000000..11268ae07b --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/spaceing.js @@ -0,0 +1,3 @@ +module.exports = [ + ['m-1', { padding: '40px' }] +] diff --git a/packages/unocss-base/preset-rn/theme/index.js b/packages/unocss-base/preset-rn/theme/index.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/unocss-plugin/lib/index.js b/packages/unocss-plugin/lib/index.js index 01af540984..4f903c39a5 100644 --- a/packages/unocss-plugin/lib/index.js +++ b/packages/unocss-plugin/lib/index.js @@ -7,8 +7,10 @@ const toPosix = require('@mpxjs/webpack-plugin/lib/utils/to-posix') const fixRelative = require('@mpxjs/webpack-plugin/lib/utils/fix-relative') const parseRequest = require('@mpxjs/webpack-plugin/lib/utils/parse-request') const { has } = require('@mpxjs/webpack-plugin/lib/utils/set') +const { isWeb, isReact } = require('@mpxjs/webpack-plugin/lib/utils/env') const MpxWebpackPlugin = require('@mpxjs/webpack-plugin') const UnoCSSWebpackPlugin = require('./web-plugin') +const UnoCSSRNWebpackPlugin = require('./rn-plugin') const transformerDirectives = require('@unocss/transformer-directives').default const transformerVariantGroup = require('@unocss/transformer-variant-group') const { @@ -234,11 +236,12 @@ class MpxUnocssPlugin { return } const mode = this.mode = mpxPluginInstance.options.mode - if (mode === 'web') { + if (isWeb(mode) || isReact(mode)) { const { webOptions } = this.options - if (!getPlugin(compiler, UnoCSSWebpackPlugin)) { + const webpackPlugin = isReact(mode) ? UnoCSSRNWebpackPlugin : UnoCSSWebpackPlugin + if (!getPlugin(compiler, webpackPlugin)) { // todo 考虑使用options.config/configFiles读取配置对象后再与webOptions合并后传递给UnoCSSWebpackPlugin,保障读取的config对象与mp保持一致 - compiler.options.plugins.push(new UnoCSSWebpackPlugin(webOptions)) + compiler.options.plugins.push(new webpackPlugin(webOptions)) } compiler.hooks.done.tap(PLUGIN_NAME, ({ compilation }) => { for (const dep of compilation.fileDependencies) { @@ -256,7 +259,7 @@ class MpxUnocssPlugin { }, (compilation) => { const { __mpx__: mpx } = compilation mpx.hasUnoCSS = true - if (mode === 'web') return + if (isWeb(mode) || isReact(mode)) return compilation.hooks.processAssets.tapPromise({ name: PLUGIN_NAME, stage: compilation.PROCESS_ASSETS_STAGE_ADDITIONS diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js new file mode 100644 index 0000000000..a46c295454 --- /dev/null +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -0,0 +1,80 @@ +const WebpackSources = require('webpack-sources') +const node_path = require('node:path') +const { createContext, normalizeAbsolutePath } = require('../web-plugin/utils') +const { LAYER_MARK_ALL, LAYER_PLACEHOLDER_RE, RESOLVED_ID_RE, getLayerPlaceholder, resolveId, resolveLayer } = require('../web-plugin/consts') +const { getClassMap } = require('@mpxjs/webpack-plugin/lib/react/style-helper') +const shallowStringify = require('@mpxjs/webpack-plugin/lib/utils/shallow-stringify') + +const PLUGIN_NAME = 'unocss:webpack' + +function WebpackPlugin (configOrPath, defaults) { + return { + apply (compiler) { + const ctx = createContext(configOrPath, defaults) + const { uno, filter, transformCache } = ctx + compiler.__unoCtx = ctx + // transform 提取tokens + compiler.options.module.rules.unshift({ + enforce: 'pre', + use: (data) => { + if (data.resource == null) { return [] } + + const id = normalizeAbsolutePath(data.resource + (data.resourceQuery || '')) + if (filter('', id) && !id.match(/\.html$/) && !RESOLVED_ID_RE.test(id)) { + return [{ + loader: node_path.resolve(__dirname, '../web-plugin/transform-loader') + }] + } + + return [] + } + }) + + compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => { + compilation.hooks.optimizeAssets.tapPromise(PLUGIN_NAME, async () => { + const { mode, srcMode } = compilation.__mpx__ + // 清空transformCache避免watch修改不生效 + transformCache.clear() + const tokens = new Set() + for (const module of compilation.modules) { + const assetsInfo = module.buildInfo.assetsInfo || new Map() + for (const [, { unocssTokens } = {}] of assetsInfo) { + if (unocssTokens) { + for (const token of unocssTokens) { + tokens.add(token) + } + } + } + } + const result = await uno.generate(tokens, { minify: true }) + const classMap = getClassMap({ + content: result.css, + filename: 'xxx', + mode, + srcMode, + warn: (msg) => { + console.log('RN getClassMap warn is:', msg) + }, + error: (msg) => { + console.log('RN getClassMap error is:', msg) + }, + formatValueFn: 'formatValue' + }) + const files = Object.keys(compilation.assets) + for (const file of files) { + if (file === '*') { return } + let code = compilation.assets[file].source().toString() + let replaced = false + code = code.replace('__unocssMap__', () => { + replaced = true + return shallowStringify(classMap) + }) + if (replaced) { compilation.assets[file] = new WebpackSources.RawSource(code) } + } + }) + }) + } + } +} + +module.exports = WebpackPlugin diff --git a/packages/webpack-plugin/lib/react/processStyles.js b/packages/webpack-plugin/lib/react/processStyles.js index 84d0457da4..32498978ef 100644 --- a/packages/webpack-plugin/lib/react/processStyles.js +++ b/packages/webpack-plugin/lib/react/processStyles.js @@ -23,7 +23,7 @@ module.exports = function (styles, { new Error('[style compiler][' + loaderContext.resource + ']: ' + msg) ) } - const { mode, srcMode } = loaderContext.getMpx() + const { mode, srcMode, hasUnoCSS } = loaderContext.getMpx() async.eachOfSeries(styles, (style, i, callback) => { const scoped = style.scoped || autoScope const extraOptions = { @@ -56,6 +56,12 @@ module.exports = function (styles, { error }) if (ctorType === 'app') { + if (hasUnoCSS) { + output += `global.__getUnoClassMap = function() { + const formatValue = global.__formatValue + return __unocssMap__ + };\n` + } output += `global.__getAppClassMap = function() { return ${shallowStringify(classMap)}; };\n` diff --git a/packages/webpack-plugin/lib/react/style-helper.js b/packages/webpack-plugin/lib/react/style-helper.js index c4bbe46871..c2401275d9 100644 --- a/packages/webpack-plugin/lib/react/style-helper.js +++ b/packages/webpack-plugin/lib/react/style-helper.js @@ -7,9 +7,9 @@ const numberRegExp = /^\s*(-?\d+(\.\d+)?)(px)?\s*$/ const hairlineRegExp = /^\s*hairlineWidth\s*$/ const varRegExp = /^--/ const cssPrefixExp = /^-(webkit|moz|ms|o)-/ -function getClassMap ({ content, filename, mode, srcMode, warn, error }) { +function getClassMap ({ content, filename, mode, srcMode, warn, error, formatValueFn }) { const classMap = {} - + formatValueFn = formatValueFn || 'global.__formatValue' const root = postcss.parse(content, { from: filename }) @@ -21,7 +21,8 @@ function getClassMap ({ content, filename, mode, srcMode, warn, error }) { value = matched[1] needStringify = false } else if (unitRegExp.test(value) || hairlineRegExp.test(value)) { - value = `global.__formatValue(${JSON.stringify(value)})` + // value = `global.__formatValue(${JSON.stringify(value)})` + value = `${formatValueFn}(${JSON.stringify(value)})` needStringify = false } return needStringify ? JSON.stringify(value) : value From a88cdd9b3a75d6850c420a852184c10672ab9d16 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Fri, 8 Nov 2024 12:11:07 +0800 Subject: [PATCH 002/128] [fix]lint --- .../builtInMixins/styleHelperMixin.ios.js | 58 +++++++++---------- packages/unocss-plugin/lib/index.js | 6 +- packages/unocss-plugin/lib/rn-plugin/index.js | 2 +- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index 107c707ed9..a20443b539 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -37,34 +37,34 @@ function formatValue (value) { global.__formatValue = formatValue -const escapeReg = /[()[\]{}#!.:,%'"+$]/g -const escapeMap = { - '(': '_pl_', - ')': '_pr_', - '[': '_bl_', - ']': '_br_', - '{': '_cl_', - '}': '_cr_', - '#': '_h_', - '!': '_i_', - '/': '_s_', - '.': '_d_', - ':': '_c_', - ',': '_2c_', - '%': '_p_', - '\'': '_q_', - '"': '_dq_', - '+': '_a_', - $: '_si_' -} - -const mpEscape = cached((str) => { - return str.replace(escapeReg, function (match) { - if (escapeMap[match]) return escapeMap[match] - // unknown escaped - return '_u_' - }) -}) +// const escapeReg = /[()[\]{}#!.:,%'"+$]/g +// const escapeMap = { +// '(': '_pl_', +// ')': '_pr_', +// '[': '_bl_', +// ']': '_br_', +// '{': '_cl_', +// '}': '_cr_', +// '#': '_h_', +// '!': '_i_', +// '/': '_s_', +// '.': '_d_', +// ':': '_c_', +// ',': '_2c_', +// '%': '_p_', +// '\'': '_q_', +// '"': '_dq_', +// '+': '_a_', +// $: '_si_' +// } + +// const mpEscape = cached((str) => { +// return str.replace(escapeReg, function (match) { +// if (escapeMap[match]) return escapeMap[match] +// // unknown escaped +// return '_u_' +// }) +// }) function concat (a = '', b = '') { return a ? b ? (a + ' ' + b) : a : b @@ -167,7 +167,7 @@ export default function styleHelperMixin () { const classMap = {} // todo 全局样式在每个页面和组件中生效,以支持全局原子类,后续支持样式模块复用后可考虑移除 if (isFunction(global.__getUnoClassMap)) { - Object.assign(classMap, global.__getUnoClassMap()); + Object.assign(classMap, global.__getUnoClassMap()) } if (isFunction(global.__getAppClassMap)) { Object.assign(classMap, global.__getAppClassMap()) diff --git a/packages/unocss-plugin/lib/index.js b/packages/unocss-plugin/lib/index.js index 4f903c39a5..55a10f4ad0 100644 --- a/packages/unocss-plugin/lib/index.js +++ b/packages/unocss-plugin/lib/index.js @@ -238,10 +238,10 @@ class MpxUnocssPlugin { const mode = this.mode = mpxPluginInstance.options.mode if (isWeb(mode) || isReact(mode)) { const { webOptions } = this.options - const webpackPlugin = isReact(mode) ? UnoCSSRNWebpackPlugin : UnoCSSWebpackPlugin - if (!getPlugin(compiler, webpackPlugin)) { + const WebpackPlugin = isReact(mode) ? UnoCSSRNWebpackPlugin : UnoCSSWebpackPlugin + if (!getPlugin(compiler, WebpackPlugin)) { // todo 考虑使用options.config/configFiles读取配置对象后再与webOptions合并后传递给UnoCSSWebpackPlugin,保障读取的config对象与mp保持一致 - compiler.options.plugins.push(new webpackPlugin(webOptions)) + compiler.options.plugins.push(new WebpackPlugin(webOptions)) } compiler.hooks.done.tap(PLUGIN_NAME, ({ compilation }) => { for (const dep of compilation.fileDependencies) { diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index a46c295454..0e269e2966 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -1,7 +1,7 @@ const WebpackSources = require('webpack-sources') const node_path = require('node:path') const { createContext, normalizeAbsolutePath } = require('../web-plugin/utils') -const { LAYER_MARK_ALL, LAYER_PLACEHOLDER_RE, RESOLVED_ID_RE, getLayerPlaceholder, resolveId, resolveLayer } = require('../web-plugin/consts') +const { RESOLVED_ID_RE } = require('../web-plugin/consts') const { getClassMap } = require('@mpxjs/webpack-plugin/lib/react/style-helper') const shallowStringify = require('@mpxjs/webpack-plugin/lib/utils/shallow-stringify') From f9ab9c1744c348f16c72659dae858dc8b3f25f5e Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 14 Nov 2024 11:42:51 +0800 Subject: [PATCH 003/128] [feat]add empty rule transform --- .../unocss-base/preset-rn/rules/background.js | 10 ++++++++++ packages/unocss-base/preset-rn/rules/index.js | 6 +++++- .../unocss-base/preset-rn/rules/typography.js | 11 +++++++++++ packages/unocss-base/utils/index.js | 15 +++++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 packages/unocss-base/preset-rn/rules/background.js create mode 100644 packages/unocss-base/preset-rn/rules/typography.js create mode 100644 packages/unocss-base/utils/index.js diff --git a/packages/unocss-base/preset-rn/rules/background.js b/packages/unocss-base/preset-rn/rules/background.js new file mode 100644 index 0000000000..e22d8ce9a6 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/background.js @@ -0,0 +1,10 @@ +const { genEmptyRule } = require('../../utils/index') + +module.exports = { + ...genEmptyRule( + 'bg-origin-border', + 'bg-origin-padding', + 'bg-origin-content' + // global rules: bg-origin-inherit + ) +} diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index 40e1f27725..102cf3c269 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -1,7 +1,11 @@ const color = require('./color') const spaceing = require('./spaceing') +const typography = require('./typography') +const background = require('./background') module.exports = [ ...color, - ...spaceing + ...spaceing, + ...typography, + ...background ] diff --git a/packages/unocss-base/preset-rn/rules/typography.js b/packages/unocss-base/preset-rn/rules/typography.js new file mode 100644 index 0000000000..73186b922c --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/typography.js @@ -0,0 +1,11 @@ +const { transformEmptyRule } = require('../../utils/index') +const { + textStrokes, + textIndents, + tabSizes, + whitespaces +} = require('@unocss/preset-mini/rules') + +module.exports = [ + ...transformEmptyRule(textIndents, textStrokes, tabSizes, whitespaces) +] diff --git a/packages/unocss-base/utils/index.js b/packages/unocss-base/utils/index.js new file mode 100644 index 0000000000..c1092a9b52 --- /dev/null +++ b/packages/unocss-base/utils/index.js @@ -0,0 +1,15 @@ +const EMPTY = ' ' + +const genEmptyRule = (...rules) => { + return rules.map(r => [r, () => EMPTY]) +} + +const transformEmptyRule = (...rulesArr) => { + return rulesArr.map(rules => rules.map(rule => [rule[0], () => EMPTY])) + .reduce((preV, curV) => preV.concat(curV), []) +} + +module.exports = { + genEmptyRule, + transformEmptyRule +} From e39ec8acb739b842b3598a3c0ad71edf5a9f5748 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 14 Nov 2024 15:08:50 +0800 Subject: [PATCH 004/128] [feat]add warn&errors --- packages/unocss-base/preset-rn/rules/background.js | 4 ++-- packages/unocss-base/utils/index.js | 11 ++++++++--- packages/unocss-plugin/lib/rn-plugin/index.js | 9 ++++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/unocss-base/preset-rn/rules/background.js b/packages/unocss-base/preset-rn/rules/background.js index e22d8ce9a6..a8735f6646 100644 --- a/packages/unocss-base/preset-rn/rules/background.js +++ b/packages/unocss-base/preset-rn/rules/background.js @@ -1,10 +1,10 @@ const { genEmptyRule } = require('../../utils/index') -module.exports = { +module.exports = [ ...genEmptyRule( 'bg-origin-border', 'bg-origin-padding', 'bg-origin-content' // global rules: bg-origin-inherit ) -} +] diff --git a/packages/unocss-base/utils/index.js b/packages/unocss-base/utils/index.js index c1092a9b52..05a3a8dc22 100644 --- a/packages/unocss-base/utils/index.js +++ b/packages/unocss-base/utils/index.js @@ -1,12 +1,17 @@ const EMPTY = ' ' +const ruleCallback = ([match], { generator }) => { + generator._mpx2rnUnsuportedRules = generator._mpx2rnUnsuportedRules || [] + generator._mpx2rnUnsuportedRules.push(match) + return EMPTY +} + const genEmptyRule = (...rules) => { - return rules.map(r => [r, () => EMPTY]) + return rules.map(rule => [rule, ruleCallback]) } const transformEmptyRule = (...rulesArr) => { - return rulesArr.map(rules => rules.map(rule => [rule[0], () => EMPTY])) - .reduce((preV, curV) => preV.concat(curV), []) + return rulesArr.map(rules => rules.map(rule => [rule[0], ruleCallback])).reduce((preV, curV) => preV.concat(curV), []) } module.exports = { diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index 0e269e2966..ca90bcc7c3 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -47,16 +47,19 @@ function WebpackPlugin (configOrPath, defaults) { } } const result = await uno.generate(tokens, { minify: true }) + if (uno._mpx2rnUnsuportedRules && uno._mpx2rnUnsuportedRules.length) { + compilation.errors.push(`[Mpx Unocss]: all those '${uno._mpx2rnUnsuportedRules.join(',')}' class utilities is not supported in react native mode`) + } const classMap = getClassMap({ content: result.css, - filename: 'xxx', + filename: 'mpx2rn-unocss', mode, srcMode, warn: (msg) => { - console.log('RN getClassMap warn is:', msg) + compilation.warnings.push(msg) }, error: (msg) => { - console.log('RN getClassMap error is:', msg) + compilation.errors.push(msg) }, formatValueFn: 'formatValue' }) From 450f76b774f7686dc0a8b6ca7ec4e242d4cfc49b Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 14 Nov 2024 17:38:20 +0800 Subject: [PATCH 005/128] [feat]add shadow rule --- packages/unocss-base/preset-rn/rules/index.js | 4 ++- .../unocss-base/preset-rn/rules/shadow.js | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 packages/unocss-base/preset-rn/rules/shadow.js diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index 102cf3c269..1a497eac88 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -2,10 +2,12 @@ const color = require('./color') const spaceing = require('./spaceing') const typography = require('./typography') const background = require('./background') +const shadow = require('./shadow') module.exports = [ ...color, ...spaceing, ...typography, - ...background + ...background, + ...shadow ] diff --git a/packages/unocss-base/preset-rn/rules/shadow.js b/packages/unocss-base/preset-rn/rules/shadow.js new file mode 100644 index 0000000000..d52bda4657 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/shadow.js @@ -0,0 +1,27 @@ +const { boxShadowsBase, boxShadows } = require('@unocss/preset-mini/rules') + +const findShadowColorRule = () => { + return boxShadows.find(rule => { + if (rule[0] instanceof RegExp && rule[0].test('shadow')) { + return rule + } + }) || [] +} + +const shadowColorRule = findShadowColorRule() + +module.exports = [ + [shadowColorRule[0], (match, context) => { + const rawHandler = shadowColorRule[1] + const rawResult = rawHandler(match, context) + if (rawResult['box-shadow']) { + return { + ...boxShadowsBase, + ...rawResult + } + } else { + // 工具类 + return rawResult + } + }] +] From 777dcca7ea07d27557e1076512174843aea52b03 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 14 Nov 2024 17:40:28 +0800 Subject: [PATCH 006/128] [fix]lint --- packages/unocss-base/preset-rn/rules/shadow.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/unocss-base/preset-rn/rules/shadow.js b/packages/unocss-base/preset-rn/rules/shadow.js index d52bda4657..a7f16132a8 100644 --- a/packages/unocss-base/preset-rn/rules/shadow.js +++ b/packages/unocss-base/preset-rn/rules/shadow.js @@ -5,6 +5,7 @@ const findShadowColorRule = () => { if (rule[0] instanceof RegExp && rule[0].test('shadow')) { return rule } + return false }) || [] } From c414f1796bd8e0265b8bd2aad67ec65931de546c Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 19 Nov 2024 14:45:33 +0800 Subject: [PATCH 007/128] [feat]add more rules --- .../unocss-base/preset-rn/rules/background.js | 24 +++++-- .../unocss-base/preset-rn/rules/behaviors.js | 21 ++++++ .../unocss-base/preset-rn/rules/filters.js | 34 ++++++++++ packages/unocss-base/preset-rn/rules/index.js | 8 ++- .../unocss-base/preset-rn/rules/layout.js | 18 ++++++ .../unocss-base/preset-rn/rules/typography.js | 64 ++++++++++++++++++- packages/unocss-base/utils/index.js | 62 +++++++++++++++++- packages/unocss-plugin/lib/rn-plugin/index.js | 2 +- 8 files changed, 219 insertions(+), 14 deletions(-) create mode 100644 packages/unocss-base/preset-rn/rules/behaviors.js create mode 100644 packages/unocss-base/preset-rn/rules/filters.js create mode 100644 packages/unocss-base/preset-rn/rules/layout.js diff --git a/packages/unocss-base/preset-rn/rules/background.js b/packages/unocss-base/preset-rn/rules/background.js index a8735f6646..ca6e0c9de3 100644 --- a/packages/unocss-base/preset-rn/rules/background.js +++ b/packages/unocss-base/preset-rn/rules/background.js @@ -1,10 +1,20 @@ -const { genEmptyRule } = require('../../utils/index') +const { findRawRules, transformEmptyRule } = require('../../utils/index') +const { rules } = require('@unocss/preset-wind') + +// todo background-position 剔除 +const backgroundRules = findRawRules([ + // attachments + 'bg-fixed', + 'bg-locale', + 'bg-scroll', + // repeat + /^bg-repeat-?.*/, + // origins + /^bg-origin-.*/, + // clips + /^bg-clip-.*/ +], rules) module.exports = [ - ...genEmptyRule( - 'bg-origin-border', - 'bg-origin-padding', - 'bg-origin-content' - // global rules: bg-origin-inherit - ) + ...transformEmptyRule(backgroundRules) ] diff --git a/packages/unocss-base/preset-rn/rules/behaviors.js b/packages/unocss-base/preset-rn/rules/behaviors.js new file mode 100644 index 0000000000..782ebbf96d --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/behaviors.js @@ -0,0 +1,21 @@ +const { rules } = require('@unocss/preset-wind') +const { findRawRules, transformEmptyRule } = require('../../utils') + +const overscrollBehavior = findRawRules(/overscroll-.*/, rules) +const imageRenderings = findRawRules(/image-render-*/, rules) +// todo +// const placeholder = findRawRules('$ placeholder', rules, true) +const staticListStyle = findRawRules(/list-.*/, rules) +const dynamicListStyle = [ + [/^list-(.+?)(?:-(outside|inside))?$/], + [/^list-image-(.+)$/] +] + +module.exports = [ + ...transformEmptyRule( + overscrollBehavior, + imageRenderings, + staticListStyle, + dynamicListStyle + ) +] diff --git a/packages/unocss-base/preset-rn/rules/filters.js b/packages/unocss-base/preset-rn/rules/filters.js new file mode 100644 index 0000000000..533f36e0c1 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/filters.js @@ -0,0 +1,34 @@ +const { rules } = require('@unocss/preset-wind') +const { findRawRules, ruleFallback, isFunction, transformEmptyRule } = require('../../utils') + +// todo filter 只支持部分属性 +const filters = findRawRules([ + 'filter-blur', + 'filter-brightness-1', + 'filter-contrast-1', + 'filter-grayscale-1', + 'filter-hue-rotate-1', + 'filter-invert-1', + 'filter-saturate-1', + 'filter-sepia-1' +], rules, true) + +// backdrop-filter 不支持 +const backdropFilter = findRawRules([ + /^backdrop-filter-*/ +], rules) + +const newFilters = filters.map(item => { + return [item[0], ([match], { generator }) => { + if (/^backdrop/.test(match)) { + return ruleFallback(match, generator) + } else { + return (isFunction(item[1]) && item[1]()) || '' + } + }] +}) + +module.exports = [ + ...newFilters, + ...transformEmptyRule(backdropFilter) +] diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index 1a497eac88..59d30582b2 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -3,11 +3,17 @@ const spaceing = require('./spaceing') const typography = require('./typography') const background = require('./background') const shadow = require('./shadow') +const behaviors = require('./behaviors') +const layout = require('./layout') +const filters = require('./filters') module.exports = [ ...color, ...spaceing, ...typography, ...background, - ...shadow + ...shadow, + ...behaviors, + ...layout, + ...filters ] diff --git a/packages/unocss-base/preset-rn/rules/layout.js b/packages/unocss-base/preset-rn/rules/layout.js new file mode 100644 index 0000000000..cc4950d400 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/layout.js @@ -0,0 +1,18 @@ +const { ruleCallback, ruleFallback } = require('../../utils') + +const overflows = [ + [/^(?:overflow|of)-(.+)$/, ([match, v], { generator }) => { + if (['hidden', 'visiable', 'scroll'].includes(v)) { + return { + overflow: v + } + } else { + return ruleFallback(match, generator) + } + }], + [/^(?:overflow|of)-([xy])-(.+)$/, ruleCallback] +] + +module.exports = [ + ...overflows +] diff --git a/packages/unocss-base/preset-rn/rules/typography.js b/packages/unocss-base/preset-rn/rules/typography.js index 73186b922c..a0329449a1 100644 --- a/packages/unocss-base/preset-rn/rules/typography.js +++ b/packages/unocss-base/preset-rn/rules/typography.js @@ -1,11 +1,69 @@ -const { transformEmptyRule } = require('../../utils/index') +const { transformEmptyRule, findRawRules, ruleFallback } = require('../../utils/index') +const { rules } = require('@unocss/preset-wind') const { textStrokes, textIndents, tabSizes, - whitespaces + whitespaces, + breaks, + textOverflows, + textWraps, + // fontVariantNumeric, + // fontVariantNumericBase, + verticalAligns } = require('@unocss/preset-mini/rules') +// write-orientation & write-mode +const writingOrientationsAndModes = findRawRules(/^write-?.*/, rules) +// hyphens +const hyphens = findRawRules(/^hyphens-.*/, rules) +// decoration +const textDecorations = [ + // size + [/^(?:underline|decoration)-(?:size-)?(.+)$/], // todo size 会命中其他的规则 + [/^(?:underline|decoration)-(auto|from-font)$/], + // offset + [/^(?:underline|decoration)-offset-(.+)$/] +] + +// font-variant-numberic +// const newFontVariantNumberic = fontVariantNumeric.map(item => { +// const rule = item[0] +// const rawResult = item[1]() +// if (rule === 'normal-nums') { +// return item +// } else { +// return [rule, { +// ...fontVariantNumericBase, +// ...rawResult +// }] +// } +// }) + +// vertical-align +const newVerticalAlign = verticalAligns.map(item => { + return [item[0], ([match, v], { generator }) => { + if (['auto', 'top', 'bottom', 'center'].includes(v)) { + return { 'vertical-align': v } + } else { + return ruleFallback(match, generator) + } + }] +}) + module.exports = [ - ...transformEmptyRule(textIndents, textStrokes, tabSizes, whitespaces) + ...transformEmptyRule( + textIndents, + textStrokes, + tabSizes, + whitespaces, + breaks, + textOverflows, + hyphens, + writingOrientationsAndModes, + textDecorations, + textWraps, + // newFontVariantNumberic, + newVerticalAlign + ) ] diff --git a/packages/unocss-base/utils/index.js b/packages/unocss-base/utils/index.js index 05a3a8dc22..69ade8352e 100644 --- a/packages/unocss-base/utils/index.js +++ b/packages/unocss-base/utils/index.js @@ -1,6 +1,22 @@ const EMPTY = ' ' +const isReg = (reg) => { + return reg instanceof RegExp +} + +const isString = (str) => { + return typeof str === 'string' +} + +const isFunction = (fn) => { + return typeof fn === 'function' +} + const ruleCallback = ([match], { generator }) => { + return ruleFallback(match, generator) +} + +const ruleFallback = (match, generator) => { generator._mpx2rnUnsuportedRules = generator._mpx2rnUnsuportedRules || [] generator._mpx2rnUnsuportedRules.push(match) return EMPTY @@ -11,10 +27,52 @@ const genEmptyRule = (...rules) => { } const transformEmptyRule = (...rulesArr) => { - return rulesArr.map(rules => rules.map(rule => [rule[0], ruleCallback])).reduce((preV, curV) => preV.concat(curV), []) + return rulesArr.map(rules => rules.map(rule => { + if (isString(rule[0])) { // staticRule + return [ + [rule[0], null], + [new RegExp(`^${rule[0]}$`), ruleCallback] + ] + } + return [[rule[0], ruleCallback]] + })).reduce((preV, curV) => preV.concat(...curV), []) +} + +const findRawRules = (matcher, rawRules, byReg = false) => { + if (!Array.isArray(matcher)) { + matcher = [matcher] + } + + return matcher.map(m => { + const result = [] + rawRules.forEach(r => { + const tester = r[0] + if (isString(m)) { + if (byReg) { + if (isReg(tester) && tester.test(m)) { + result.push(r) + } + } else { + if (isString(tester) && m === tester) { + result.push(r) + } + } + } else if (isReg(m)) { + if (isString(tester) && m.test(tester)) { + result.push(r) + } + } + }) + return result + }) + .filter(item => !!item.length) + .reduce((preV, curV) => preV.concat(curV), []) } module.exports = { genEmptyRule, - transformEmptyRule + transformEmptyRule, + findRawRules, + ruleFallback, + isFunction } diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index ca90bcc7c3..cd015ea52f 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -48,7 +48,7 @@ function WebpackPlugin (configOrPath, defaults) { } const result = await uno.generate(tokens, { minify: true }) if (uno._mpx2rnUnsuportedRules && uno._mpx2rnUnsuportedRules.length) { - compilation.errors.push(`[Mpx Unocss]: all those '${uno._mpx2rnUnsuportedRules.join(',')}' class utilities is not supported in react native mode`) + compilation.errors.push(`[Mpx Unocss]: all those '${uno._mpx2rnUnsuportedRules.join(', ')}' class utilities is not supported in react native mode`) } const classMap = getClassMap({ content: result.css, From ff99449df145237b5691cab667f15d49346241ae Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 21 Nov 2024 19:20:30 +0800 Subject: [PATCH 008/128] update --- packages/webpack-plugin/lib/template-compiler/compiler.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/webpack-plugin/lib/template-compiler/compiler.js b/packages/webpack-plugin/lib/template-compiler/compiler.js index bd2c60511f..cec49bae48 100644 --- a/packages/webpack-plugin/lib/template-compiler/compiler.js +++ b/packages/webpack-plugin/lib/template-compiler/compiler.js @@ -1066,6 +1066,7 @@ function processStyleReact (el, options) { const dynamicClass = getAndRemoveAttr(el, config[mode].directive.dynamicClass).val let staticClass = getAndRemoveAttr(el, 'class').val || '' staticClass = staticClass.replace(/\s+/g, ' ') + // todo hover:xxx -> hover:class 的处理 let staticHoverClass = '' if (hoverClassReg.test(el.tag)) { From 7e90afefb706bda0074540fba7c278defe911e93 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Fri, 22 Nov 2024 16:47:06 +0800 Subject: [PATCH 009/128] [feat]support hover pseudo class --- .../unocss-base/preset-rn/rules/typography.js | 2 ++ .../{theme/index.js => variants/pseudo.js} | 0 .../webpack-plugin/lib/react/style-helper.js | 2 ++ .../lib/template-compiler/compiler.js | 33 ++++++++++++++++++- 4 files changed, 36 insertions(+), 1 deletion(-) rename packages/unocss-base/preset-rn/{theme/index.js => variants/pseudo.js} (100%) diff --git a/packages/unocss-base/preset-rn/rules/typography.js b/packages/unocss-base/preset-rn/rules/typography.js index a0329449a1..d9a66fda7f 100644 --- a/packages/unocss-base/preset-rn/rules/typography.js +++ b/packages/unocss-base/preset-rn/rules/typography.js @@ -8,6 +8,7 @@ const { breaks, textOverflows, textWraps, + fontSmoothings, // fontVariantNumeric, // fontVariantNumericBase, verticalAligns @@ -63,6 +64,7 @@ module.exports = [ writingOrientationsAndModes, textDecorations, textWraps, + fontSmoothings, // newFontVariantNumberic, newVerticalAlign ) diff --git a/packages/unocss-base/preset-rn/theme/index.js b/packages/unocss-base/preset-rn/variants/pseudo.js similarity index 100% rename from packages/unocss-base/preset-rn/theme/index.js rename to packages/unocss-base/preset-rn/variants/pseudo.js diff --git a/packages/webpack-plugin/lib/react/style-helper.js b/packages/webpack-plugin/lib/react/style-helper.js index c2401275d9..221cfd69ad 100644 --- a/packages/webpack-plugin/lib/react/style-helper.js +++ b/packages/webpack-plugin/lib/react/style-helper.js @@ -77,6 +77,8 @@ function getClassMap ({ content, filename, mode, srcMode, warn, error, formatVal selectors.each(selector => { if (selector.nodes.length === 1 && selector.nodes[0].type === 'class') { classMapKeys.push(selector.nodes[0].value) + } else if (selector.nodes.length === 2 && selector.nodes[0].type === 'class' && selector.nodes[1].type === 'pseudo') { + classMapKeys.push(selector.nodes[0].value + selector.nodes[1].value) } else { error('Only single class selector is supported in react native mode temporarily.') } diff --git a/packages/webpack-plugin/lib/template-compiler/compiler.js b/packages/webpack-plugin/lib/template-compiler/compiler.js index cec49bae48..e3e1d62197 100644 --- a/packages/webpack-plugin/lib/template-compiler/compiler.js +++ b/packages/webpack-plugin/lib/template-compiler/compiler.js @@ -1061,12 +1061,35 @@ function stringifyWithResolveComputed (modelValue) { return result.join('+') } +const pseudoClassUtility = /(hover|active|focus):\S*/ +const groupByPseudo = function (staticClass) { + return staticClass + .split(' ') + .map(item => { + const result = item.match(pseudoClassUtility) + if (result) { + return { + key: result[1], + value: item + ':' + result[1] + } + } + return null + }) + .filter(Boolean) + .reduce((preV, curV) => { + const res = { ...preV } + const { key, value } = curV + res[key] = res[key] || [] + res[key].push(value) + return res + }, {}) +} + function processStyleReact (el, options) { // process class/wx:class/style/wx:style/wx:show for react native const dynamicClass = getAndRemoveAttr(el, config[mode].directive.dynamicClass).val let staticClass = getAndRemoveAttr(el, 'class').val || '' staticClass = staticClass.replace(/\s+/g, ' ') - // todo hover:xxx -> hover:class 的处理 let staticHoverClass = '' if (hoverClassReg.test(el.tag)) { @@ -1074,6 +1097,14 @@ function processStyleReact (el, options) { staticHoverClass = staticHoverClass.replace(/\s+/g, ' ') } + if (options.hasUnoCSS) { + // todo 原有的 class 可以剔除掉 + const unoPseudoClass = groupByPseudo(staticClass) + if (unoPseudoClass.hover) { + staticHoverClass = staticHoverClass + unoPseudoClass.hover.join(' ') + } + } + const dynamicStyle = getAndRemoveAttr(el, config[mode].directive.dynamicStyle).val let staticStyle = getAndRemoveAttr(el, 'style').val || '' staticStyle = staticStyle.replace(/\s+/g, ' ') From 386c0ff49db106411c65c40315d521f75ddb4ff7 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Fri, 22 Nov 2024 16:49:26 +0800 Subject: [PATCH 010/128] [feat]add hasUnoCSS for template compiler --- packages/webpack-plugin/lib/react/processTemplate.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/webpack-plugin/lib/react/processTemplate.js b/packages/webpack-plugin/lib/react/processTemplate.js index 7f1ca743d0..d24a107f6c 100644 --- a/packages/webpack-plugin/lib/react/processTemplate.js +++ b/packages/webpack-plugin/lib/react/processTemplate.js @@ -28,7 +28,8 @@ module.exports = function (template, { externalClasses, checkUsingComponents, autoVirtualHostRules, - customTextRules + customTextRules, + hasUnoCSS } = mpx const { resourcePath } = parseRequest(loaderContext.resource) const builtInComponentsMap = {} @@ -86,7 +87,8 @@ module.exports = function (template, { // web模式下实现抽象组件 componentGenerics, hasVirtualHost: matchCondition(resourcePath, autoVirtualHostRules), - isCustomText: matchCondition(resourcePath, customTextRules) + isCustomText: matchCondition(resourcePath, customTextRules), + hasUnoCSS }) if (meta.wxsContentMap) { From 11ddc5bd9a9d01c4ee5d9fc636f2c7ba6f3aade9 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 3 Dec 2024 14:27:14 +0800 Subject: [PATCH 011/128] [feat]add new rule and upgrade unocss version --- .../builtInMixins/styleHelperMixin.ios.js | 28 ++++ packages/unocss-base/lib/rn.js | 12 +- packages/unocss-base/preset-rn/index.js | 4 +- .../unocss-base/preset-rn/rules/background.js | 8 +- .../unocss-base/preset-rn/rules/behaviors.js | 16 +-- .../unocss-base/preset-rn/rules/filters.js | 18 ++- packages/unocss-base/preset-rn/rules/index.js | 4 +- .../unocss-base/preset-rn/rules/static.js | 6 + .../unocss-base/preset-rn/rules/typography.js | 21 +-- .../unocss-base/preset-rn/variants/index.js | 14 ++ .../unocss-base/preset-rn/variants/pseudo.js | 2 + .../webpack-plugin/lib/react/style-helper.js | 36 ++--- .../lib/template-compiler/compiler.js | 127 ++++++++++++++---- 13 files changed, 214 insertions(+), 82 deletions(-) create mode 100644 packages/unocss-base/preset-rn/rules/static.js create mode 100644 packages/unocss-base/preset-rn/variants/index.js diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index a20443b539..57df91849e 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -200,6 +200,34 @@ export default function styleHelperMixin () { }) } return result + }, + __getDynamicClass (dynamicClass, mediaQueryClass) { + return [dynamicClass, this.__getMediaQueryClass(mediaQueryClass)] + }, + __getMediaQueryClass (mediaQueryClass = []) { + if (!mediaQueryClass.length) return '' + // todo 后续可优化,cache 能力 + const { width, height } = Dimensions.get('screen') + const { entries, entriesMap } = global.__getUnoBreakpoints() + return mediaQueryClass.map(([className, breakpoints = []]) => { + const res = breakpoints.every(([prefix = '', point = 0]) => { + if (prefix === 'landscape') return width > height + if (prefix === 'portrait') return width <= height + const size = formatValue(entriesMap[point] || point) + const index = entries.findIndex(item => item[0] === point) + const isGtPrefix = prefix.startsWith('min-') + const isLtPrefix = prefix.startsWith('lt-') || prefix.startsWith('<') || prefix.startsWith('max-') + const isAtPrefix = prefix.startsWith('at-') || prefix.startsWith('~') + if (isGtPrefix) return width > size + if (isLtPrefix) return width < size + if (isAtPrefix && (index && index < entries.length - 1)) { + return width >= size && width < formatValue(entries[index + 1][1]) + } + return width > size + }) + + return res ? className : '' + }) } } } diff --git a/packages/unocss-base/lib/rn.js b/packages/unocss-base/lib/rn.js index 2713edb78d..abbba748b3 100644 --- a/packages/unocss-base/lib/rn.js +++ b/packages/unocss-base/lib/rn.js @@ -3,6 +3,16 @@ const presetRn = require('../preset-rn') module.exports = function presetRnMpx (options = {}) { return { name: '@mpxjs/unocss-preset-rn', - ...presetRn + ...presetRn, + theme: { + letterSpacing: { + tighter: '-0.5px', + tight: '-0.25px', + normal: '0px', + wide: '0.25px', + wider: '0.5px', + widest: '1px' + } + } } } diff --git a/packages/unocss-base/preset-rn/index.js b/packages/unocss-base/preset-rn/index.js index 9f5e2c9c35..88704e872b 100644 --- a/packages/unocss-base/preset-rn/index.js +++ b/packages/unocss-base/preset-rn/index.js @@ -1,5 +1,7 @@ const rules = require('./rules') +const varaints = require('./variants') module.exports = { - rules + rules, + varaints } diff --git a/packages/unocss-base/preset-rn/rules/background.js b/packages/unocss-base/preset-rn/rules/background.js index ca6e0c9de3..b48fc0aedb 100644 --- a/packages/unocss-base/preset-rn/rules/background.js +++ b/packages/unocss-base/preset-rn/rules/background.js @@ -1,8 +1,8 @@ const { findRawRules, transformEmptyRule } = require('../../utils/index') -const { rules } = require('@unocss/preset-wind') +const { backgroundStyles } = require('@unocss/preset-wind/rules') // todo background-position 剔除 -const backgroundRules = findRawRules([ +const NewBackgroundRules = findRawRules([ // attachments 'bg-fixed', 'bg-locale', @@ -13,8 +13,8 @@ const backgroundRules = findRawRules([ /^bg-origin-.*/, // clips /^bg-clip-.*/ -], rules) +], backgroundStyles) module.exports = [ - ...transformEmptyRule(backgroundRules) + ...transformEmptyRule(NewBackgroundRules) ] diff --git a/packages/unocss-base/preset-rn/rules/behaviors.js b/packages/unocss-base/preset-rn/rules/behaviors.js index 782ebbf96d..73683d32ba 100644 --- a/packages/unocss-base/preset-rn/rules/behaviors.js +++ b/packages/unocss-base/preset-rn/rules/behaviors.js @@ -1,21 +1,13 @@ -const { rules } = require('@unocss/preset-wind') -const { findRawRules, transformEmptyRule } = require('../../utils') +const { imageRenderings, overscrolls, listStyle } = require('@unocss/preset-wind/rules') +const { transformEmptyRule } = require('../../utils') -const overscrollBehavior = findRawRules(/overscroll-.*/, rules) -const imageRenderings = findRawRules(/image-render-*/, rules) // todo // const placeholder = findRawRules('$ placeholder', rules, true) -const staticListStyle = findRawRules(/list-.*/, rules) -const dynamicListStyle = [ - [/^list-(.+?)(?:-(outside|inside))?$/], - [/^list-image-(.+)$/] -] module.exports = [ ...transformEmptyRule( - overscrollBehavior, + overscrolls, imageRenderings, - staticListStyle, - dynamicListStyle + listStyle ) ] diff --git a/packages/unocss-base/preset-rn/rules/filters.js b/packages/unocss-base/preset-rn/rules/filters.js index 533f36e0c1..007ad154d6 100644 --- a/packages/unocss-base/preset-rn/rules/filters.js +++ b/packages/unocss-base/preset-rn/rules/filters.js @@ -1,8 +1,8 @@ -const { rules } = require('@unocss/preset-wind') +const { filters } = require('@unocss/preset-wind/rules') const { findRawRules, ruleFallback, isFunction, transformEmptyRule } = require('../../utils') // todo filter 只支持部分属性 -const filters = findRawRules([ +const newFilters = findRawRules([ 'filter-blur', 'filter-brightness-1', 'filter-contrast-1', @@ -11,14 +11,7 @@ const filters = findRawRules([ 'filter-invert-1', 'filter-saturate-1', 'filter-sepia-1' -], rules, true) - -// backdrop-filter 不支持 -const backdropFilter = findRawRules([ - /^backdrop-filter-*/ -], rules) - -const newFilters = filters.map(item => { +], filters, true).map(item => { return [item[0], ([match], { generator }) => { if (/^backdrop/.test(match)) { return ruleFallback(match, generator) @@ -28,6 +21,11 @@ const newFilters = filters.map(item => { }] }) +// backdrop-filter 不支持 +const backdropFilter = findRawRules([ + /^backdrop-filter-*/ +], filters) + module.exports = [ ...newFilters, ...transformEmptyRule(backdropFilter) diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index 59d30582b2..5ae1afbfa8 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -6,6 +6,7 @@ const shadow = require('./shadow') const behaviors = require('./behaviors') const layout = require('./layout') const filters = require('./filters') +const staticRule = require('./static') module.exports = [ ...color, @@ -15,5 +16,6 @@ module.exports = [ ...shadow, ...behaviors, ...layout, - ...filters + ...filters, + ...staticRule ] diff --git a/packages/unocss-base/preset-rn/rules/static.js b/packages/unocss-base/preset-rn/rules/static.js new file mode 100644 index 0000000000..2653362b60 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/static.js @@ -0,0 +1,6 @@ +const { backgroundBlendModes } = require('@unocss/preset-wind/rules') +const { transformEmptyRule } = require('../../utils/index') + +module.exports = transformEmptyRule( + backgroundBlendModes +) diff --git a/packages/unocss-base/preset-rn/rules/typography.js b/packages/unocss-base/preset-rn/rules/typography.js index d9a66fda7f..c653e7766c 100644 --- a/packages/unocss-base/preset-rn/rules/typography.js +++ b/packages/unocss-base/preset-rn/rules/typography.js @@ -1,5 +1,11 @@ -const { transformEmptyRule, findRawRules, ruleFallback } = require('../../utils/index') -const { rules } = require('@unocss/preset-wind') +const { transformEmptyRule, ruleFallback } = require('../../utils/index') +const { + writingModes, + writingOrientations, + hyphens + // fontVariantNumericBase, + // fontVariantNumeric +} = require('@unocss/preset-wind/rules') const { textStrokes, textIndents, @@ -9,15 +15,9 @@ const { textOverflows, textWraps, fontSmoothings, - // fontVariantNumeric, - // fontVariantNumericBase, verticalAligns } = require('@unocss/preset-mini/rules') -// write-orientation & write-mode -const writingOrientationsAndModes = findRawRules(/^write-?.*/, rules) -// hyphens -const hyphens = findRawRules(/^hyphens-.*/, rules) // decoration const textDecorations = [ // size @@ -27,7 +27,7 @@ const textDecorations = [ [/^(?:underline|decoration)-offset-(.+)$/] ] -// font-variant-numberic +// todo 覆写 font-variant-numberic,和 RN 支持的属性拉齐 // const newFontVariantNumberic = fontVariantNumeric.map(item => { // const rule = item[0] // const rawResult = item[1]() @@ -61,7 +61,8 @@ module.exports = [ breaks, textOverflows, hyphens, - writingOrientationsAndModes, + writingModes, + writingOrientations, textDecorations, textWraps, fontSmoothings, diff --git a/packages/unocss-base/preset-rn/variants/index.js b/packages/unocss-base/preset-rn/variants/index.js new file mode 100644 index 0000000000..562c163a21 --- /dev/null +++ b/packages/unocss-base/preset-rn/variants/index.js @@ -0,0 +1,14 @@ +module.exports = [ + // todo: do something for variants + // { + // name: 'custom-variant-container', + // match(matcher, ctx) { + // if (matcher.startsWith('hover:')) { + // console.log('the sm is:1111', ctx) + // return { + // } + // } + // }, + // order: -1 + // } +] diff --git a/packages/unocss-base/preset-rn/variants/pseudo.js b/packages/unocss-base/preset-rn/variants/pseudo.js index e69de29bb2..f987f0bb6f 100644 --- a/packages/unocss-base/preset-rn/variants/pseudo.js +++ b/packages/unocss-base/preset-rn/variants/pseudo.js @@ -0,0 +1,2 @@ +// todo 确认 +// view 提供了 hover-class。没有提供 focus/active state 。 diff --git a/packages/webpack-plugin/lib/react/style-helper.js b/packages/webpack-plugin/lib/react/style-helper.js index 221cfd69ad..7e556f14ab 100644 --- a/packages/webpack-plugin/lib/react/style-helper.js +++ b/packages/webpack-plugin/lib/react/style-helper.js @@ -7,27 +7,28 @@ const numberRegExp = /^\s*(-?\d+(\.\d+)?)(px)?\s*$/ const hairlineRegExp = /^\s*hairlineWidth\s*$/ const varRegExp = /^--/ const cssPrefixExp = /^-(webkit|moz|ms|o)-/ + +function formatValue (value, formatValueFn) { + let matched + let needStringify = true + if ((matched = numberRegExp.exec(value))) { + value = matched[1] + needStringify = false + } else if (unitRegExp.test(value) || hairlineRegExp.test(value)) { + // value = `global.__formatValue(${JSON.stringify(value)})` + value = `${formatValueFn}(${JSON.stringify(value)})` + needStringify = false + } + return needStringify ? JSON.stringify(value) : value +} + function getClassMap ({ content, filename, mode, srcMode, warn, error, formatValueFn }) { const classMap = {} formatValueFn = formatValueFn || 'global.__formatValue' const root = postcss.parse(content, { from: filename }) - - function formatValue (value) { - let matched - let needStringify = true - if ((matched = numberRegExp.exec(value))) { - value = matched[1] - needStringify = false - } else if (unitRegExp.test(value) || hairlineRegExp.test(value)) { - // value = `global.__formatValue(${JSON.stringify(value)})` - value = `${formatValueFn}(${JSON.stringify(value)})` - needStringify = false - } - return needStringify ? JSON.stringify(value) : value - } - + const rulesRunner = getRulesRunner({ mode, srcMode, @@ -97,5 +98,8 @@ function getClassMap ({ content, filename, mode, srcMode, warn, error, formatVal } module.exports = { - getClassMap + getClassMap, + formatValue, + unitRegExp, + numberRegExp } diff --git a/packages/webpack-plugin/lib/template-compiler/compiler.js b/packages/webpack-plugin/lib/template-compiler/compiler.js index e3e1d62197..5c5e0713e7 100644 --- a/packages/webpack-plugin/lib/template-compiler/compiler.js +++ b/packages/webpack-plugin/lib/template-compiler/compiler.js @@ -1061,28 +1061,95 @@ function stringifyWithResolveComputed (modelValue) { return result.join('+') } -const pseudoClassUtility = /(hover|active|focus):\S*/ -const groupByPseudo = function (staticClass) { - return staticClass - .split(' ') - .map(item => { - const result = item.match(pseudoClassUtility) - if (result) { +let unoVariantCached = null +const initVariants = (unoCtx) => { + if (unoVariantCached) return unoVariantCached + const { config } = unoCtx + const separators = config.separators.join('|') + const breakpoints = Object.keys(config.theme.breakpoints).join('|') + const sizePseudoReg = /(max-|min-)\\[([^\\]]*)\]:/ + const breakPointsReg = new RegExp(`([al]t-|[<~]|max-)?(${breakpoints})(?:${separators})`) + const orientationReg = new RegExp(`(landscape|portrait)(?:${separators})`) + const pseudoClassReg = new RegExp(`(hover)(?:${separators})`) // 目前仅处理了 hover 状态 + unoVariantCached = { + sizePseudo: { + rule: sizePseudoReg, + matcher (input) { return { - key: result[1], - value: item + ':' + result[1] + prefix: input[1], + point: input[2] } } - return null - }) - .filter(Boolean) - .reduce((preV, curV) => { - const res = { ...preV } - const { key, value } = curV - res[key] = res[key] || [] - res[key].push(value) - return res - }, {}) + }, + breakPoints: { + rule: breakPointsReg, + matcher (input) { + return { + prefix: input[1], + point: input[2] + } + } + }, + orientation: { + rule: orientationReg, + matcher (input) { + return { + prefix: input[1], + point: '' + } + } + }, + pseudoClassReg + } + return unoVariantCached +} + +function processVariants (staticClass = '', variants) { + const pseudoClass = {} + const pseudoWithMediaQueryClass = [] + const mediaQueryClass = [] + const bReg = [variants.sizePseudo, variants.breakPoints, variants.orientation] + const newStaticClass = staticClass.split(/\s+/).map(rawClass => { + let applied = true + const className = rawClass + const mediaQuery = [] + while (applied) { + applied = false + for (const v of bReg) { + const match = rawClass.match(v.rule) + if (match) { + const { prefix, point } = v.matcher(match) + mediaQuery.push([prefix || '', point]) + rawClass = rawClass.replace(match[0], '') + applied = true + break + } + } + if (!applied) { + break + } + } + const pseudoMatch = rawClass.match(variants.pseudoClassReg) + if (pseudoMatch) { + const pseudo = pseudoMatch[1] + if (mediaQuery.length) { + pseudoWithMediaQueryClass.push([className + ':' + pseudo, mediaQuery]) + } else { + pseudoClass[pseudo] = pseudoClass[pseudo] || [] + pseudoClass[pseudo].push(className + ':' + pseudo) + } + } else if (!pseudoMatch && mediaQuery.length) { + mediaQueryClass.push([className, mediaQuery]) + } + + return (!mediaQuery.length && !pseudoMatch) ? rawClass : '' + }).filter(Boolean).join(' ') + return { + newStaticClass, + pseudoClass, + pseudoWithMediaQueryClass, + mediaQueryClass + } } function processStyleReact (el, options) { @@ -1097,12 +1164,17 @@ function processStyleReact (el, options) { staticHoverClass = staticHoverClass.replace(/\s+/g, ' ') } + let mediaQueryClass = [] + let pseudoWithMediaQueryClass = [] if (options.hasUnoCSS) { - // todo 原有的 class 可以剔除掉 - const unoPseudoClass = groupByPseudo(staticClass) - if (unoPseudoClass.hover) { - staticHoverClass = staticHoverClass + unoPseudoClass.hover.join(' ') + const variants = initVariants(options.unoCtx) + const result = processVariants(staticClass, variants) + staticClass = result.newStaticClass + if (result.pseudoClass.hover) { + staticHoverClass = staticHoverClass + result.pseudoClass.hover.join(' ') } + mediaQueryClass = result.mediaQueryClass + pseudoWithMediaQueryClass = result.pseudoWithMediaQueryClass } const dynamicStyle = getAndRemoveAttr(el, config[mode].directive.dynamicStyle).val @@ -1114,7 +1186,7 @@ function processStyleReact (el, options) { error$1(`Attrs ${config[mode].directive.show} should have a value `) } - if (dynamicClass || staticClass || dynamicStyle || staticStyle || show) { + if (dynamicClass || staticClass || dynamicStyle || staticStyle || show || mediaQueryClass.length) { const staticClassExp = parseMustacheWithContext(staticClass).result const dynamicClassExp = parseMustacheWithContext(dynamicClass).result const staticStyleExp = parseMustacheWithContext(staticStyle).result @@ -1124,15 +1196,16 @@ function processStyleReact (el, options) { addAttrs(el, [{ name: 'style', // runtime helper - value: `{{this.__getStyle(${staticClassExp}, ${dynamicClassExp}, ${staticStyleExp}, ${dynamicStyleExp}${show === undefined ? '' : `, !(${showExp})`})}}` + value: `{{this.__getStyle(${staticClassExp}, ${mediaQueryClass.length ? `this.__getDynamicClass(${dynamicClassExp}, ${stringify(mediaQueryClass)})` : dynamicClassExp} , ${staticStyleExp}, ${dynamicStyleExp}${show === undefined ? '' : `, !(${showExp})`})}}` }]) } - if (staticHoverClass && staticHoverClass !== 'none') { + // todo pseudo element 的动态计算 + if ((staticHoverClass && staticHoverClass !== 'none') || pseudoWithMediaQueryClass.length) { const staticClassExp = parseMustacheWithContext(staticHoverClass).result addAttrs(el, [{ name: 'hover-style', - value: `{{this.__getStyle(${staticClassExp})}}` + value: `{{this.__getStyle(${staticClassExp}, ${pseudoWithMediaQueryClass.length ? `this.__getMediaQueryClass(${stringify(pseudoWithMediaQueryClass)})` : ''})}}` }]) } From 2034a02004c0a554631a93d1703c3c10ec109e78 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 3 Dec 2024 14:40:39 +0800 Subject: [PATCH 012/128] [update] --- packages/webpack-plugin/lib/react/processStyles.js | 3 +++ packages/webpack-plugin/lib/react/processTemplate.js | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/webpack-plugin/lib/react/processStyles.js b/packages/webpack-plugin/lib/react/processStyles.js index 32498978ef..1a108b17d2 100644 --- a/packages/webpack-plugin/lib/react/processStyles.js +++ b/packages/webpack-plugin/lib/react/processStyles.js @@ -57,6 +57,9 @@ module.exports = function (styles, { }) if (ctorType === 'app') { if (hasUnoCSS) { + output += `global.__getUnoBreakpoints = function () { + return __unocssBreakpoints__ + };\n` output += `global.__getUnoClassMap = function() { const formatValue = global.__formatValue return __unocssMap__ diff --git a/packages/webpack-plugin/lib/react/processTemplate.js b/packages/webpack-plugin/lib/react/processTemplate.js index d24a107f6c..0a60f2e42a 100644 --- a/packages/webpack-plugin/lib/react/processTemplate.js +++ b/packages/webpack-plugin/lib/react/processTemplate.js @@ -29,7 +29,8 @@ module.exports = function (template, { checkUsingComponents, autoVirtualHostRules, customTextRules, - hasUnoCSS + hasUnoCSS, + unoCtx } = mpx const { resourcePath } = parseRequest(loaderContext.resource) const builtInComponentsMap = {} @@ -88,7 +89,8 @@ module.exports = function (template, { componentGenerics, hasVirtualHost: matchCondition(resourcePath, autoVirtualHostRules), isCustomText: matchCondition(resourcePath, customTextRules), - hasUnoCSS + hasUnoCSS, + unoCtx }) if (meta.wxsContentMap) { From 372ab918c8f3e1077fb0c5513a04ceaf90fe4f86 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 3 Dec 2024 19:41:35 +0800 Subject: [PATCH 013/128] [feat]support modern rgb/hsl grammer --- .../webpack-plugin/lib/platform/style/wx/index.js | 11 +++++++++++ packages/webpack-plugin/lib/react/style-helper.js | 1 - 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/webpack-plugin/lib/platform/style/wx/index.js b/packages/webpack-plugin/lib/platform/style/wx/index.js index bf8bf95284..63acead62c 100644 --- a/packages/webpack-plugin/lib/platform/style/wx/index.js +++ b/packages/webpack-plugin/lib/platform/style/wx/index.js @@ -163,8 +163,19 @@ module.exports = function getSpec ({ warn, error }) { } return true } + + // 兼容现代的 rgb(1 1 1 / 0.2)/hsl(360 100% 100% / 1.0) 的写法 + const formatColor = (value) => { + const reg = /(rgb|hsl)(\(\s*(\d+\s+\d+\s+\d+(\s*\/\s*[^)]+))\s*\))/ + value = value.replace(reg, function (match, $1, $2) { + return $1 + 'a' + $2 + }) + return value + } + // prop & value 校验:过滤的不合法的属性和属性值 const verification = ({ prop, value, selector }, { mode }) => { + value = formatColor(value) return verifyProps({ prop, value, selector }, { mode }) && verifyValues({ prop, value, selector }) && ({ prop, value }) } diff --git a/packages/webpack-plugin/lib/react/style-helper.js b/packages/webpack-plugin/lib/react/style-helper.js index 7e556f14ab..ee7d0209e9 100644 --- a/packages/webpack-plugin/lib/react/style-helper.js +++ b/packages/webpack-plugin/lib/react/style-helper.js @@ -28,7 +28,6 @@ function getClassMap ({ content, filename, mode, srcMode, warn, error, formatVal const root = postcss.parse(content, { from: filename }) - const rulesRunner = getRulesRunner({ mode, srcMode, From 99dd414de96c1bd3dfad15441df20e111ecda91e Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 5 Dec 2024 14:57:55 +0800 Subject: [PATCH 014/128] [update]extra code --- packages/unocss-plugin/lib/rn-plugin/index.js | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index cd015ea52f..a834e1355b 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -7,6 +7,8 @@ const shallowStringify = require('@mpxjs/webpack-plugin/lib/utils/shallow-string const PLUGIN_NAME = 'unocss:webpack' +const reLetters = /[a-z]+/gi + function WebpackPlugin (configOrPath, defaults) { return { apply (compiler) { @@ -31,8 +33,10 @@ function WebpackPlugin (configOrPath, defaults) { }) compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => { + const mpx = compilation.__mpx__ + const { mode, srcMode } = mpx + mpx.unoCtx = uno compilation.hooks.optimizeAssets.tapPromise(PLUGIN_NAME, async () => { - const { mode, srcMode } = compilation.__mpx__ // 清空transformCache避免watch修改不生效 transformCache.clear() const tokens = new Set() @@ -55,10 +59,10 @@ function WebpackPlugin (configOrPath, defaults) { filename: 'mpx2rn-unocss', mode, srcMode, - warn: (msg) => { + warn: msg => { compilation.warnings.push(msg) }, - error: (msg) => { + error: msg => { compilation.errors.push(msg) }, formatValueFn: 'formatValue' @@ -68,10 +72,22 @@ function WebpackPlugin (configOrPath, defaults) { if (file === '*') { return } let code = compilation.assets[file].source().toString() let replaced = false - code = code.replace('__unocssMap__', () => { - replaced = true - return shallowStringify(classMap) - }) + + code = code + .replace('__unocssMap__', () => { + replaced = true + return shallowStringify(classMap) + }) + .replace('__unocssBreakpoints__', () => { + const breakpoints = uno.config.theme.breakpoints + const entries = Object.entries(breakpoints) + .sort((a, b) => Number.parseInt(a[1].replace(reLetters, '')) - Number.parseInt(b[1].replace(reLetters, ''))) + + return JSON.stringify({ + entries, + entriesMap: breakpoints + }) + }) if (replaced) { compilation.assets[file] = new WebpackSources.RawSource(code) } } }) From 7c9f994b20a2c147e569d918c63ca793dd184f8c Mon Sep 17 00:00:00 2001 From: mater Date: Thu, 5 Dec 2024 20:49:48 +0800 Subject: [PATCH 015/128] feat: upgrade unocss --- packages/unocss-plugin/lib/index.js | 56 +++++++++++-------- packages/unocss-plugin/lib/parser.js | 4 +- packages/unocss-plugin/lib/platform.js | 2 +- packages/unocss-plugin/lib/rn-plugin/index.js | 34 +++++++---- packages/unocss-plugin/lib/source.js | 5 +- packages/unocss-plugin/lib/transform.js | 9 +-- .../unocss-plugin/lib/web-plugin/consts.js | 2 +- .../unocss-plugin/lib/web-plugin/index.js | 36 ++++++++---- .../lib/web-plugin/transform-loader.js | 10 ++-- .../unocss-plugin/lib/web-plugin/utils.js | 42 +++++++------- packages/unocss-plugin/package.json | 1 + .../lib/template-compiler/compiler.js | 4 +- 12 files changed, 122 insertions(+), 83 deletions(-) diff --git a/packages/unocss-plugin/lib/index.js b/packages/unocss-plugin/lib/index.js index 55a10f4ad0..6b5821052c 100644 --- a/packages/unocss-plugin/lib/index.js +++ b/packages/unocss-plugin/lib/index.js @@ -1,35 +1,43 @@ -const path = require('path') -const { minimatch } = require('minimatch') -const unoConfig = require('@unocss/config') -const core = require('@unocss/core') -const mpxConfig = require('@mpxjs/webpack-plugin/lib/config') -const toPosix = require('@mpxjs/webpack-plugin/lib/utils/to-posix') -const fixRelative = require('@mpxjs/webpack-plugin/lib/utils/fix-relative') -const parseRequest = require('@mpxjs/webpack-plugin/lib/utils/parse-request') -const { has } = require('@mpxjs/webpack-plugin/lib/utils/set') -const { isWeb, isReact } = require('@mpxjs/webpack-plugin/lib/utils/env') -const MpxWebpackPlugin = require('@mpxjs/webpack-plugin') -const UnoCSSWebpackPlugin = require('./web-plugin') -const UnoCSSRNWebpackPlugin = require('./rn-plugin') -const transformerDirectives = require('@unocss/transformer-directives').default -const transformerVariantGroup = require('@unocss/transformer-variant-group') -const { +import * as path from 'path'; +import { minimatch } from 'minimatch'; +import * as unoConfig from '@unocss/config'; +import * as core from '@unocss/core'; +import * as mpxConfig from '@mpxjs/webpack-plugin/lib/config.js'; +import toPosix from '@mpxjs/webpack-plugin/lib/utils/to-posix.js'; +import fixRelative from '@mpxjs/webpack-plugin/lib/utils/fix-relative.js'; +import parseRequest from '@mpxjs/webpack-plugin/lib/utils/parse-request.js'; +import set from '@mpxjs/webpack-plugin/lib/utils/set.js'; +import env from '@mpxjs/webpack-plugin/lib/utils/env.js'; +import MpxWebpackPlugin from '@mpxjs/webpack-plugin'; +import { UnoCSSWebpackPlugin } from './web-plugin/index.js'; +import { UnoCSSRNWebpackPlugin } from './rn-plugin/index.js'; +import transformerDirectives from '@unocss/transformer-directives'; +import * as transformerVariantGroup from '@unocss/transformer-variant-group'; +import { parseClasses, parseStrings, parseMustache, stringifyAttr, parseComments, - parseCommentConfig -} = require('./parser') -const { getReplaceSource, getConcatSource, getRawSource } = require('./source') -const { + parseCommentConfig, +} from './parser.js'; +import { + getReplaceSource, + getConcatSource, + getRawSource +} from './source.js'; +import { transformStyle, buildAliasTransformer, transformGroups, mpEscape, - cssRequiresTransform -} = require('./transform') -const platformPreflightsMap = require('./platform') + cssRequiresTransform, +} from './transform.js'; +import * as platformPreflightsMap from './platform.js'; + +const { has } = set +const { isWeb, isReact } = env + const PLUGIN_NAME = 'MpxUnocssPlugin' function filterFile (file, scan) { @@ -527,4 +535,4 @@ class MpxUnocssPlugin { } } -module.exports = MpxUnocssPlugin +export default MpxUnocssPlugin diff --git a/packages/unocss-plugin/lib/parser.js b/packages/unocss-plugin/lib/parser.js index 1ce02abc72..3966a9ce99 100644 --- a/packages/unocss-plugin/lib/parser.js +++ b/packages/unocss-plugin/lib/parser.js @@ -1,4 +1,4 @@ -const { parseMustache, stringifyAttr } = require('@mpxjs/webpack-plugin/lib/template-compiler/compiler') +import { parseMustache, stringifyAttr } from '@mpxjs/webpack-plugin/lib/template-compiler/compiler.js' function parseClasses (content) { const output = [] @@ -78,7 +78,7 @@ function parseStrings (content) { return output } -module.exports = { +export { parseClasses, parseStrings, parseComments, diff --git a/packages/unocss-plugin/lib/platform.js b/packages/unocss-plugin/lib/platform.js index 08ba96519b..793a88a20a 100644 --- a/packages/unocss-plugin/lib/platform.js +++ b/packages/unocss-plugin/lib/platform.js @@ -1,6 +1,6 @@ // todo 此处进行跨端preflights定义,保障跨端样式表现一致,待补充完善 // todo 目前不支持声明web preflight,待完善 -module.exports = { +export default { ali: [ { getCSS: () => ` diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index a834e1355b..3c947d190c 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -1,9 +1,13 @@ -const WebpackSources = require('webpack-sources') -const node_path = require('node:path') -const { createContext, normalizeAbsolutePath } = require('../web-plugin/utils') -const { RESOLVED_ID_RE } = require('../web-plugin/consts') -const { getClassMap } = require('@mpxjs/webpack-plugin/lib/react/style-helper') -const shallowStringify = require('@mpxjs/webpack-plugin/lib/utils/shallow-stringify') +import WebpackSources from 'webpack-sources'; +import * as nodePath from 'node:path'; +import { createContext, normalizeAbsolutePath } from '../web-plugin/utils.js'; +import { RESOLVED_ID_RE } from '../web-plugin/consts.js'; +import { getClassMap } from '@mpxjs/webpack-plugin/lib/react/style-helper.js'; +import shallowStringify from '@mpxjs/webpack-plugin/lib/utils/shallow-stringify.js'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); // 当前文件的绝对路径 +const __dirname = nodePath.dirname(__filename); // 当前文件的目录路径 const PLUGIN_NAME = 'unocss:webpack' @@ -13,7 +17,7 @@ function WebpackPlugin (configOrPath, defaults) { return { apply (compiler) { const ctx = createContext(configOrPath, defaults) - const { uno, filter, transformCache } = ctx + const { filter, transformCache } = ctx compiler.__unoCtx = ctx // transform 提取tokens compiler.options.module.rules.unshift({ @@ -24,7 +28,7 @@ function WebpackPlugin (configOrPath, defaults) { const id = normalizeAbsolutePath(data.resource + (data.resourceQuery || '')) if (filter('', id) && !id.match(/\.html$/) && !RESOLVED_ID_RE.test(id)) { return [{ - loader: node_path.resolve(__dirname, '../web-plugin/transform-loader') + loader: nodePath.resolve(__dirname, '../web-plugin/transform-loader') }] } @@ -32,11 +36,15 @@ function WebpackPlugin (configOrPath, defaults) { } }) + + compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => { const mpx = compilation.__mpx__ const { mode, srcMode } = mpx - mpx.unoCtx = uno + console.log(ctx.ready); + ctx.ready.then(() => mpx.unoCtx = ctx.uno) compilation.hooks.optimizeAssets.tapPromise(PLUGIN_NAME, async () => { + await ctx.ready // 清空transformCache避免watch修改不生效 transformCache.clear() const tokens = new Set() @@ -50,6 +58,7 @@ function WebpackPlugin (configOrPath, defaults) { } } } + const { uno } = ctx const result = await uno.generate(tokens, { minify: true }) if (uno._mpx2rnUnsuportedRules && uno._mpx2rnUnsuportedRules.length) { compilation.errors.push(`[Mpx Unocss]: all those '${uno._mpx2rnUnsuportedRules.join(', ')}' class utilities is not supported in react native mode`) @@ -79,10 +88,9 @@ function WebpackPlugin (configOrPath, defaults) { return shallowStringify(classMap) }) .replace('__unocssBreakpoints__', () => { - const breakpoints = uno.config.theme.breakpoints + const breakpoints = uno.config.theme.breakpoints || {} const entries = Object.entries(breakpoints) .sort((a, b) => Number.parseInt(a[1].replace(reLetters, '')) - Number.parseInt(b[1].replace(reLetters, ''))) - return JSON.stringify({ entries, entriesMap: breakpoints @@ -96,4 +104,6 @@ function WebpackPlugin (configOrPath, defaults) { } } -module.exports = WebpackPlugin +export { + WebpackPlugin as UnoCSSRNWebpackPlugin +} diff --git a/packages/unocss-plugin/lib/source.js b/packages/unocss-plugin/lib/source.js index 2c29592bf9..389aa1b3f0 100644 --- a/packages/unocss-plugin/lib/source.js +++ b/packages/unocss-plugin/lib/source.js @@ -1,4 +1,5 @@ -const { ReplaceSource, RawSource, ConcatSource, Source } = require('webpack').sources +import webpack from 'webpack'; +const { ReplaceSource, RawSource, ConcatSource, Source } = webpack.sources; function getRawSource (s) { if (s instanceof RawSource) { return s } @@ -17,7 +18,7 @@ function getConcatSource (s) { return new ConcatSource(s) } -module.exports = { +export { getRawSource, getReplaceSource, getConcatSource diff --git a/packages/unocss-plugin/lib/transform.js b/packages/unocss-plugin/lib/transform.js index bf0daffc95..91fdf0fd3f 100644 --- a/packages/unocss-plugin/lib/transform.js +++ b/packages/unocss-plugin/lib/transform.js @@ -1,6 +1,7 @@ -const MagicString = require('magic-string') -const transformerDirectives = require('@unocss/transformer-directives').default -const { getReplaceSource } = require('./source') +import MagicString from 'magic-string'; +import transformerDirectives from '@unocss/transformer-directives'; +import { getReplaceSource } from './source.js'; + const escapedReg = /\\(.)/g function mpEscape (str, escapeMap = {}) { @@ -81,7 +82,7 @@ async function transformStyle ( return code } -module.exports = { +export { cssRequiresTransform, transformGroups, mpEscape, diff --git a/packages/unocss-plugin/lib/web-plugin/consts.js b/packages/unocss-plugin/lib/web-plugin/consts.js index e56289c26c..6d91c54604 100644 --- a/packages/unocss-plugin/lib/web-plugin/consts.js +++ b/packages/unocss-plugin/lib/web-plugin/consts.js @@ -29,7 +29,7 @@ function getLayerPlaceholder (layer) { return `#--unocss--{layer:${layer}}` } -module.exports = { +export { LAYER_MARK_ALL, LAYER_PLACEHOLDER_RE, RESOLVED_ID_RE, diff --git a/packages/unocss-plugin/lib/web-plugin/index.js b/packages/unocss-plugin/lib/web-plugin/index.js index 860e398b32..83e308e0da 100644 --- a/packages/unocss-plugin/lib/web-plugin/index.js +++ b/packages/unocss-plugin/lib/web-plugin/index.js @@ -1,13 +1,25 @@ -const WebpackSources = require('webpack-sources') -const VirtualModulesPlugin = require('webpack-virtual-modules') -const node_path = require('node:path') -const process = require('process') -const fs = require('fs') -const { createContext, getPath, normalizeAbsolutePath } = require('./utils') -const { LAYER_MARK_ALL, LAYER_PLACEHOLDER_RE, RESOLVED_ID_RE, getLayerPlaceholder, resolveId, resolveLayer } = require('./consts') +import * as WebpackSources from 'webpack-sources'; +import VirtualModulesPlugin from 'webpack-virtual-modules'; +import * as nodePath from 'node:path'; +import * as process from 'process'; +import * as fs from 'fs'; +import { + createContext, + getPath, + normalizeAbsolutePath +} from './utils.js'; +import { + LAYER_MARK_ALL, + LAYER_PLACEHOLDER_RE, + RESOLVED_ID_RE, + getLayerPlaceholder, + resolveId, + resolveLayer +} from './consts.js'; + const PLUGIN_NAME = 'unocss:webpack' -const VIRTUAL_MODULE_PREFIX = node_path.resolve(process.cwd(), '_virtual_') +const VIRTUAL_MODULE_PREFIX = nodePath.resolve(process.cwd(), '_virtual_') function WebpackPlugin (configOrPath, defaults) { return { @@ -81,7 +93,7 @@ function WebpackPlugin (configOrPath, defaults) { const id = normalizeAbsolutePath(data.resource + (data.resourceQuery || '')) if (filter('', id) && !id.match(/\.html$/) && !RESOLVED_ID_RE.test(id)) { return [{ - loader: node_path.resolve(__dirname, './transform-loader') + loader: nodePath.resolve(__dirname, './transform-loader') }] } @@ -91,6 +103,7 @@ function WebpackPlugin (configOrPath, defaults) { compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => { compilation.hooks.optimizeAssets.tapPromise(PLUGIN_NAME, async () => { + await ctx.ready // 清空transformCache避免watch修改不生效 transformCache.clear() const tokens = new Set() @@ -133,4 +146,7 @@ function getLayer (id) { } return layer } -module.exports = WebpackPlugin + +export { + WebpackPlugin as UnoCSSWebpackPlugin +} diff --git a/packages/unocss-plugin/lib/web-plugin/transform-loader.js b/packages/unocss-plugin/lib/web-plugin/transform-loader.js index fd151e6bf5..6a026906ce 100644 --- a/packages/unocss-plugin/lib/web-plugin/transform-loader.js +++ b/packages/unocss-plugin/lib/web-plugin/transform-loader.js @@ -1,7 +1,7 @@ -const { applyTransformers, isCssId } = require('./utils') -const parseComponent = require('@mpxjs/webpack-plugin/lib/parser') -const genComponentTag = require('@mpxjs/webpack-plugin/lib/utils/gen-component-tag') -const path = require('path') +import { applyTransformers, isCssId } from './utils.js'; +import parseComponent from '@mpxjs/webpack-plugin/lib/parser.js'; +import genComponentTag from '@mpxjs/webpack-plugin/lib/utils/gen-component-tag.js'; +import * as path from 'path'; async function transform (code, map) { const callback = this.async() @@ -78,4 +78,4 @@ async function transform (code, map) { } } -module.exports = transform +export default transform diff --git a/packages/unocss-plugin/lib/web-plugin/utils.js b/packages/unocss-plugin/lib/web-plugin/utils.js index dfdabcc510..26ef9629a9 100644 --- a/packages/unocss-plugin/lib/web-plugin/utils.js +++ b/packages/unocss-plugin/lib/web-plugin/utils.js @@ -1,9 +1,9 @@ -const pluginutils = require('@rollup/pluginutils') -const config = require('@unocss/config') -const core = require('@unocss/core') -const node_path = require('node:path') -const MagicString = require('magic-string') -const remapping = require('@ampproject/remapping') +import * as pluginutils from '@rollup/pluginutils'; +import * as config from '@unocss/config'; +import * as core from '@unocss/core'; +import * as nodePath from 'node:path'; +import MagicString from 'magic-string'; +import remapping from '@ampproject/remapping'; const INCLUDE_COMMENT = '@unocss-include' const IGNORE_COMMENT = '@unocss-ignore' @@ -18,12 +18,22 @@ const cssIdRE = /\.(wxss|acss|css|qss|ttss|jxss|ddss)($|\?)/ function createContext (configOrPath, defaults = {}, extraConfigSources = []) { const root = process.cwd() let rawConfig = {} - const uno = core.createGenerator(rawConfig, defaults) + const ctx = { + get ready () { + return ready + }, + filter, + uno: undefined, + extract, + transformCache: new Map() + } + const unoPromise = core.createGenerator(rawConfig, defaults) let rollupFilter = pluginutils.createFilter(defaultInclude, defaultExclude) const idFilter = pluginutils.createFilter([sfcIdRE, templateIdRE, cssIdRE, core.cssIdRE]) const ready = reloadConfig() async function reloadConfig () { + const uno = ctx.uno = await unoPromise const result = await config.loadConfig(root, configOrPath, extraConfigSources, defaults) rawConfig = result.config uno.setConfig(rawConfig) @@ -65,7 +75,7 @@ function createContext (configOrPath, defaults = {}, extraConfigSources = []) { async function extract (code, id) { const tokens = new Set() - await uno.applyExtractors(code, id, tokens) + await ctx.uno.applyExtractors(code, id, tokens) if (tokens.size > 0) { this.emitFile(id, '', undefined, { skipEmit: true, @@ -84,15 +94,7 @@ function createContext (configOrPath, defaults = {}, extraConfigSources = []) { return code.includes(INCLUDE_COMMENT) || code.includes(CSS_PLACEHOLDER) || rollupFilter(id.replace(/\?v=\w+$/, '')) } - return { - get ready () { - return ready - }, - filter, - uno, - extract, - transformCache: new Map() - } + return ctx } async function applyTransformers (ctx, original, id) { @@ -128,8 +130,8 @@ async function applyTransformers (ctx, original, id) { } function normalizeAbsolutePath (path) { - if (node_path.isAbsolute(path)) { - return node_path.normalize(path) + if (nodePath.isAbsolute(path)) { + return nodePath.normalize(path) } else { return path } @@ -143,7 +145,7 @@ function isCssId (id) { return core.cssIdRE.test(id) || cssIdRE.test(id) } -module.exports = { +export { createContext, applyTransformers, getPath, diff --git a/packages/unocss-plugin/package.json b/packages/unocss-plugin/package.json index 2aa66e4341..4ed70157c2 100644 --- a/packages/unocss-plugin/package.json +++ b/packages/unocss-plugin/package.json @@ -3,6 +3,7 @@ "version": "2.9.54", "description": "mpx unocss webpack plugin", "main": "lib/index.js", + "type": "module", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, diff --git a/packages/webpack-plugin/lib/template-compiler/compiler.js b/packages/webpack-plugin/lib/template-compiler/compiler.js index 5c5e0713e7..195957fbec 100644 --- a/packages/webpack-plugin/lib/template-compiler/compiler.js +++ b/packages/webpack-plugin/lib/template-compiler/compiler.js @@ -1066,8 +1066,8 @@ const initVariants = (unoCtx) => { if (unoVariantCached) return unoVariantCached const { config } = unoCtx const separators = config.separators.join('|') - const breakpoints = Object.keys(config.theme.breakpoints).join('|') - const sizePseudoReg = /(max-|min-)\\[([^\\]]*)\]:/ + const breakpoints = Object.keys(config.theme.breakpoints || {}).join('|') + const sizePseudoReg = /(max-|min-)\[([^\]]*)\]:/ const breakPointsReg = new RegExp(`([al]t-|[<~]|max-)?(${breakpoints})(?:${separators})`) const orientationReg = new RegExp(`(landscape|portrait)(?:${separators})`) const pseudoClassReg = new RegExp(`(hover)(?:${separators})`) // 目前仅处理了 hover 状态 From 27c13ac9353418bad82a0b2067dc2f812c87f67b Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Fri, 6 Dec 2024 10:51:17 +0800 Subject: [PATCH 016/128] [fix]formatValue --- .../webpack-plugin/lib/react/style-helper.js | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/webpack-plugin/lib/react/style-helper.js b/packages/webpack-plugin/lib/react/style-helper.js index ee7d0209e9..44a5c6ac01 100644 --- a/packages/webpack-plugin/lib/react/style-helper.js +++ b/packages/webpack-plugin/lib/react/style-helper.js @@ -8,23 +8,25 @@ const hairlineRegExp = /^\s*hairlineWidth\s*$/ const varRegExp = /^--/ const cssPrefixExp = /^-(webkit|moz|ms|o)-/ -function formatValue (value, formatValueFn) { - let matched - let needStringify = true - if ((matched = numberRegExp.exec(value))) { - value = matched[1] - needStringify = false - } else if (unitRegExp.test(value) || hairlineRegExp.test(value)) { - // value = `global.__formatValue(${JSON.stringify(value)})` - value = `${formatValueFn}(${JSON.stringify(value)})` - needStringify = false +function createFormatValue (formatValueFn) { + formatValueFn = formatValueFn || 'global.__formatValue' + return function (value) { + let matched + let needStringify = true + if ((matched = numberRegExp.exec(value))) { + value = matched[1] + needStringify = false + } else if (unitRegExp.test(value) || hairlineRegExp.test(value)) { + value = `${formatValueFn}(${JSON.stringify(value)})` + needStringify = false + } + return needStringify ? JSON.stringify(value) : value } - return needStringify ? JSON.stringify(value) : value } function getClassMap ({ content, filename, mode, srcMode, warn, error, formatValueFn }) { const classMap = {} - formatValueFn = formatValueFn || 'global.__formatValue' + const formatValue = createFormatValue(formatValueFn) const root = postcss.parse(content, { from: filename }) @@ -98,7 +100,6 @@ function getClassMap ({ content, filename, mode, srcMode, warn, error, formatVal module.exports = { getClassMap, - formatValue, unitRegExp, numberRegExp } From 3da4fee441fb5f0191da141b03d79c3d8df6a2fd Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 10 Dec 2024 10:48:32 +0800 Subject: [PATCH 017/128] fix: preset --- packages/unocss-base/lib/index.js | 4 ++-- packages/unocss-base/lib/rn.js | 4 ++-- packages/unocss-base/preset-rn/index.js | 6 +++--- .../unocss-base/preset-rn/rules/background.js | 6 +++--- .../unocss-base/preset-rn/rules/behaviors.js | 6 +++--- packages/unocss-base/preset-rn/rules/color.js | 2 +- .../unocss-base/preset-rn/rules/filters.js | 6 +++--- packages/unocss-base/preset-rn/rules/index.js | 20 +++++++++---------- .../unocss-base/preset-rn/rules/layout.js | 4 ++-- .../unocss-base/preset-rn/rules/shadow.js | 4 ++-- .../unocss-base/preset-rn/rules/spaceing.js | 2 +- .../unocss-base/preset-rn/rules/static.js | 6 +++--- .../unocss-base/preset-rn/rules/typography.js | 12 +++++------ .../unocss-base/preset-rn/variants/index.js | 2 +- packages/unocss-base/utils/index.js | 5 +++-- packages/unocss-plugin/lib/rn-plugin/index.js | 4 +++- 16 files changed, 48 insertions(+), 45 deletions(-) diff --git a/packages/unocss-base/lib/index.js b/packages/unocss-base/lib/index.js index 670dbd383d..2fb632e336 100644 --- a/packages/unocss-base/lib/index.js +++ b/packages/unocss-base/lib/index.js @@ -1,9 +1,9 @@ -const { presetUno } = require('@unocss/preset-uno') +import { presetUno } from '@unocss/preset-uno' // eslint-disable-next-line const remRE = /(-?[\.\d]+)rem/g -module.exports = function presetMpx (options = {}) { +export default function presetMpx (options = {}) { const uno = presetUno(options) const { baseFontSize = 37.5 } = options return { diff --git a/packages/unocss-base/lib/rn.js b/packages/unocss-base/lib/rn.js index abbba748b3..619617cd62 100644 --- a/packages/unocss-base/lib/rn.js +++ b/packages/unocss-base/lib/rn.js @@ -1,6 +1,6 @@ -const presetRn = require('../preset-rn') +import presetRn from '../preset-rn/index.js' -module.exports = function presetRnMpx (options = {}) { +export default function presetRnMpx (options = {}) { return { name: '@mpxjs/unocss-preset-rn', ...presetRn, diff --git a/packages/unocss-base/preset-rn/index.js b/packages/unocss-base/preset-rn/index.js index 88704e872b..f6fcff1cac 100644 --- a/packages/unocss-base/preset-rn/index.js +++ b/packages/unocss-base/preset-rn/index.js @@ -1,7 +1,7 @@ -const rules = require('./rules') -const varaints = require('./variants') +import rules from './rules/index.js' +import varaints from './variants/index.js' -module.exports = { +export default { rules, varaints } diff --git a/packages/unocss-base/preset-rn/rules/background.js b/packages/unocss-base/preset-rn/rules/background.js index b48fc0aedb..6761a36384 100644 --- a/packages/unocss-base/preset-rn/rules/background.js +++ b/packages/unocss-base/preset-rn/rules/background.js @@ -1,5 +1,5 @@ -const { findRawRules, transformEmptyRule } = require('../../utils/index') -const { backgroundStyles } = require('@unocss/preset-wind/rules') +import { findRawRules, transformEmptyRule } from '../../utils/index.js' +import { backgroundStyles } from '@unocss/preset-wind/rules' // todo background-position 剔除 const NewBackgroundRules = findRawRules([ @@ -15,6 +15,6 @@ const NewBackgroundRules = findRawRules([ /^bg-clip-.*/ ], backgroundStyles) -module.exports = [ +export default [ ...transformEmptyRule(NewBackgroundRules) ] diff --git a/packages/unocss-base/preset-rn/rules/behaviors.js b/packages/unocss-base/preset-rn/rules/behaviors.js index 73683d32ba..49f5991dba 100644 --- a/packages/unocss-base/preset-rn/rules/behaviors.js +++ b/packages/unocss-base/preset-rn/rules/behaviors.js @@ -1,10 +1,10 @@ -const { imageRenderings, overscrolls, listStyle } = require('@unocss/preset-wind/rules') -const { transformEmptyRule } = require('../../utils') +import { imageRenderings, overscrolls, listStyle } from '@unocss/preset-wind/rules' +import { transformEmptyRule } from '../../utils/index.js' // todo // const placeholder = findRawRules('$ placeholder', rules, true) -module.exports = [ +export default [ ...transformEmptyRule( overscrolls, imageRenderings, diff --git a/packages/unocss-base/preset-rn/rules/color.js b/packages/unocss-base/preset-rn/rules/color.js index d7faf17f9b..9859f07972 100644 --- a/packages/unocss-base/preset-rn/rules/color.js +++ b/packages/unocss-base/preset-rn/rules/color.js @@ -1 +1 @@ -module.exports = [] +export default [] diff --git a/packages/unocss-base/preset-rn/rules/filters.js b/packages/unocss-base/preset-rn/rules/filters.js index 007ad154d6..2c63344d83 100644 --- a/packages/unocss-base/preset-rn/rules/filters.js +++ b/packages/unocss-base/preset-rn/rules/filters.js @@ -1,5 +1,5 @@ -const { filters } = require('@unocss/preset-wind/rules') -const { findRawRules, ruleFallback, isFunction, transformEmptyRule } = require('../../utils') +import { filters } from '@unocss/preset-wind/rules' +import { findRawRules, ruleFallback, isFunction, transformEmptyRule } from '../../utils/index.js' // todo filter 只支持部分属性 const newFilters = findRawRules([ @@ -26,7 +26,7 @@ const backdropFilter = findRawRules([ /^backdrop-filter-*/ ], filters) -module.exports = [ +export default [ ...newFilters, ...transformEmptyRule(backdropFilter) ] diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index 5ae1afbfa8..fd8f6659b9 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -1,14 +1,14 @@ -const color = require('./color') -const spaceing = require('./spaceing') -const typography = require('./typography') -const background = require('./background') -const shadow = require('./shadow') -const behaviors = require('./behaviors') -const layout = require('./layout') -const filters = require('./filters') -const staticRule = require('./static') +import color from './color.js'; +import spaceing from './spaceing.js'; +import typography from './typography.js'; +import background from './background.js'; +import shadow from './shadow.js'; +import behaviors from './behaviors.js'; +import layout from './layout.js'; +import filters from './filters.js'; +import staticRule from './static.js'; -module.exports = [ +export default [ ...color, ...spaceing, ...typography, diff --git a/packages/unocss-base/preset-rn/rules/layout.js b/packages/unocss-base/preset-rn/rules/layout.js index cc4950d400..e8979bdda6 100644 --- a/packages/unocss-base/preset-rn/rules/layout.js +++ b/packages/unocss-base/preset-rn/rules/layout.js @@ -1,4 +1,4 @@ -const { ruleCallback, ruleFallback } = require('../../utils') +import { ruleCallback, ruleFallback } from '../../utils/index.js' const overflows = [ [/^(?:overflow|of)-(.+)$/, ([match, v], { generator }) => { @@ -13,6 +13,6 @@ const overflows = [ [/^(?:overflow|of)-([xy])-(.+)$/, ruleCallback] ] -module.exports = [ +export default [ ...overflows ] diff --git a/packages/unocss-base/preset-rn/rules/shadow.js b/packages/unocss-base/preset-rn/rules/shadow.js index a7f16132a8..ac24e3786d 100644 --- a/packages/unocss-base/preset-rn/rules/shadow.js +++ b/packages/unocss-base/preset-rn/rules/shadow.js @@ -1,4 +1,4 @@ -const { boxShadowsBase, boxShadows } = require('@unocss/preset-mini/rules') +import { boxShadowsBase, boxShadows } from '@unocss/preset-mini/rules' const findShadowColorRule = () => { return boxShadows.find(rule => { @@ -11,7 +11,7 @@ const findShadowColorRule = () => { const shadowColorRule = findShadowColorRule() -module.exports = [ +export default [ [shadowColorRule[0], (match, context) => { const rawHandler = shadowColorRule[1] const rawResult = rawHandler(match, context) diff --git a/packages/unocss-base/preset-rn/rules/spaceing.js b/packages/unocss-base/preset-rn/rules/spaceing.js index 11268ae07b..3e5c089beb 100644 --- a/packages/unocss-base/preset-rn/rules/spaceing.js +++ b/packages/unocss-base/preset-rn/rules/spaceing.js @@ -1,3 +1,3 @@ -module.exports = [ +export default [ ['m-1', { padding: '40px' }] ] diff --git a/packages/unocss-base/preset-rn/rules/static.js b/packages/unocss-base/preset-rn/rules/static.js index 2653362b60..6e7adbbc56 100644 --- a/packages/unocss-base/preset-rn/rules/static.js +++ b/packages/unocss-base/preset-rn/rules/static.js @@ -1,6 +1,6 @@ -const { backgroundBlendModes } = require('@unocss/preset-wind/rules') -const { transformEmptyRule } = require('../../utils/index') +import { backgroundBlendModes } from '@unocss/preset-wind/rules' +import { transformEmptyRule } from '../../utils/index.js' -module.exports = transformEmptyRule( +export default transformEmptyRule( backgroundBlendModes ) diff --git a/packages/unocss-base/preset-rn/rules/typography.js b/packages/unocss-base/preset-rn/rules/typography.js index c653e7766c..9c1e291cac 100644 --- a/packages/unocss-base/preset-rn/rules/typography.js +++ b/packages/unocss-base/preset-rn/rules/typography.js @@ -1,12 +1,12 @@ -const { transformEmptyRule, ruleFallback } = require('../../utils/index') -const { +import { transformEmptyRule, ruleFallback } from '../../utils/index.js' +import { writingModes, writingOrientations, hyphens // fontVariantNumericBase, // fontVariantNumeric -} = require('@unocss/preset-wind/rules') -const { +} from '@unocss/preset-wind/rules' +import { textStrokes, textIndents, tabSizes, @@ -16,7 +16,7 @@ const { textWraps, fontSmoothings, verticalAligns -} = require('@unocss/preset-mini/rules') +} from '@unocss/preset-mini/rules' // decoration const textDecorations = [ @@ -52,7 +52,7 @@ const newVerticalAlign = verticalAligns.map(item => { }] }) -module.exports = [ +export default [ ...transformEmptyRule( textIndents, textStrokes, diff --git a/packages/unocss-base/preset-rn/variants/index.js b/packages/unocss-base/preset-rn/variants/index.js index 562c163a21..2432cf4725 100644 --- a/packages/unocss-base/preset-rn/variants/index.js +++ b/packages/unocss-base/preset-rn/variants/index.js @@ -1,4 +1,4 @@ -module.exports = [ +export default [ // todo: do something for variants // { // name: 'custom-variant-container', diff --git a/packages/unocss-base/utils/index.js b/packages/unocss-base/utils/index.js index 69ade8352e..5622cf1226 100644 --- a/packages/unocss-base/utils/index.js +++ b/packages/unocss-base/utils/index.js @@ -69,10 +69,11 @@ const findRawRules = (matcher, rawRules, byReg = false) => { .reduce((preV, curV) => preV.concat(curV), []) } -module.exports = { +export { genEmptyRule, transformEmptyRule, findRawRules, ruleFallback, - isFunction + isFunction, + ruleCallback } diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index 3c947d190c..c8f6c16f59 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -41,7 +41,6 @@ function WebpackPlugin (configOrPath, defaults) { compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => { const mpx = compilation.__mpx__ const { mode, srcMode } = mpx - console.log(ctx.ready); ctx.ready.then(() => mpx.unoCtx = ctx.uno) compilation.hooks.optimizeAssets.tapPromise(PLUGIN_NAME, async () => { await ctx.ready @@ -82,6 +81,9 @@ function WebpackPlugin (configOrPath, defaults) { let code = compilation.assets[file].source().toString() let replaced = false + console.log(2222, classMap); + + code = code .replace('__unocssMap__', () => { replaced = true From f898f6b9aa0d6144268a678d2d7d0447f7640843 Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 10 Dec 2024 10:48:55 +0800 Subject: [PATCH 018/128] fix: type --- packages/unocss-base/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/unocss-base/package.json b/packages/unocss-base/package.json index 68b8ec19dd..906bc14247 100644 --- a/packages/unocss-base/package.json +++ b/packages/unocss-base/package.json @@ -6,6 +6,7 @@ "directories": { "lib": "lib" }, + "type": "module", "scripts": {}, "author": "", "license": "Apache-2.0", From cc0cbf87c6e24c3f415a58f3806732883280a8a5 Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 10 Dec 2024 11:00:39 +0800 Subject: [PATCH 019/128] fix: unocss ready --- packages/unocss-plugin/lib/rn-plugin/index.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index c8f6c16f59..9b28c4634a 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -41,7 +41,6 @@ function WebpackPlugin (configOrPath, defaults) { compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => { const mpx = compilation.__mpx__ const { mode, srcMode } = mpx - ctx.ready.then(() => mpx.unoCtx = ctx.uno) compilation.hooks.optimizeAssets.tapPromise(PLUGIN_NAME, async () => { await ctx.ready // 清空transformCache避免watch修改不生效 @@ -80,10 +79,6 @@ function WebpackPlugin (configOrPath, defaults) { if (file === '*') { return } let code = compilation.assets[file].source().toString() let replaced = false - - console.log(2222, classMap); - - code = code .replace('__unocssMap__', () => { replaced = true @@ -102,6 +97,11 @@ function WebpackPlugin (configOrPath, defaults) { } }) }) + + compiler.hooks.make.tapPromise(PLUGIN_NAME, (compilation) => { + const mpx = compilation.__mpx__ + return ctx.ready.then(() => mpx.unoCtx = ctx.uno) + }) } } } From 13fd97d03924b8af3cde6188b621b5f2a9def56d Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 10 Dec 2024 19:50:23 +0800 Subject: [PATCH 020/128] =?UTF-8?q?fix:=20uno=E5=AD=98=E5=82=A8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/unocss-plugin/lib/rn-plugin/index.js | 27 +++--- .../unocss-plugin/lib/web-plugin/index.js | 23 +++-- .../lib/web-plugin/transform-loader.js | 1 - .../unocss-plugin/lib/web-plugin/utils.js | 93 +++++++++---------- 4 files changed, 73 insertions(+), 71 deletions(-) diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index 9b28c4634a..38d163e0e9 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -16,9 +16,6 @@ const reLetters = /[a-z]+/gi function WebpackPlugin (configOrPath, defaults) { return { apply (compiler) { - const ctx = createContext(configOrPath, defaults) - const { filter, transformCache } = ctx - compiler.__unoCtx = ctx // transform 提取tokens compiler.options.module.rules.unshift({ enforce: 'pre', @@ -26,7 +23,7 @@ function WebpackPlugin (configOrPath, defaults) { if (data.resource == null) { return [] } const id = normalizeAbsolutePath(data.resource + (data.resourceQuery || '')) - if (filter('', id) && !id.match(/\.html$/) && !RESOLVED_ID_RE.test(id)) { + if (compiler.__unoCtx.filter('', id) && !id.match(/\.html$/) && !RESOLVED_ID_RE.test(id)) { return [{ loader: nodePath.resolve(__dirname, '../web-plugin/transform-loader') }] @@ -36,15 +33,14 @@ function WebpackPlugin (configOrPath, defaults) { } }) - - compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => { - const mpx = compilation.__mpx__ - const { mode, srcMode } = mpx compilation.hooks.optimizeAssets.tapPromise(PLUGIN_NAME, async () => { - await ctx.ready + const mpx = compilation.__mpx__ + const { mode, srcMode } = mpx + const ctx = compiler.__unoCtx + const uno = ctx.uno // 清空transformCache避免watch修改不生效 - transformCache.clear() + ctx.transformCache.clear() const tokens = new Set() for (const module of compilation.modules) { const assetsInfo = module.buildInfo.assetsInfo || new Map() @@ -56,7 +52,6 @@ function WebpackPlugin (configOrPath, defaults) { } } } - const { uno } = ctx const result = await uno.generate(tokens, { minify: true }) if (uno._mpx2rnUnsuportedRules && uno._mpx2rnUnsuportedRules.length) { compilation.errors.push(`[Mpx Unocss]: all those '${uno._mpx2rnUnsuportedRules.join(', ')}' class utilities is not supported in react native mode`) @@ -98,9 +93,15 @@ function WebpackPlugin (configOrPath, defaults) { }) }) - compiler.hooks.make.tapPromise(PLUGIN_NAME, (compilation) => { + compiler.hooks.thisCompilation.tap('MpxWebpackPlugin', (compilation) => { const mpx = compilation.__mpx__ - return ctx.ready.then(() => mpx.unoCtx = ctx.uno) + mpx.unoCtx = compiler.__unoCtx.uno + }) + + compiler.hooks.beforeCompile.tapPromise(PLUGIN_NAME, async (compilation) => { + const ctx = await createContext(configOrPath, defaults) + compiler.__unoCtx = ctx + return ctx }) } } diff --git a/packages/unocss-plugin/lib/web-plugin/index.js b/packages/unocss-plugin/lib/web-plugin/index.js index 83e308e0da..f2a8d4f017 100644 --- a/packages/unocss-plugin/lib/web-plugin/index.js +++ b/packages/unocss-plugin/lib/web-plugin/index.js @@ -24,8 +24,6 @@ const VIRTUAL_MODULE_PREFIX = nodePath.resolve(process.cwd(), '_virtual_') function WebpackPlugin (configOrPath, defaults) { return { apply (compiler) { - const ctx = createContext(configOrPath, defaults) - const { uno, filter, transformCache } = ctx const entries = new Set() const __vfsModules = new Set() let __vfs = null @@ -39,7 +37,7 @@ function WebpackPlugin (configOrPath, defaults) { __vfs = new VirtualModulesPlugin() compiler.options.plugins.push(__vfs) } - compiler.__unoCtx = ctx + // 添加解析虚拟模块插件 import 'uno.css' 并且注入layer代码 const resolverPlugin = { apply (resolver) { @@ -91,7 +89,7 @@ function WebpackPlugin (configOrPath, defaults) { if (data.resource == null) { return [] } const id = normalizeAbsolutePath(data.resource + (data.resourceQuery || '')) - if (filter('', id) && !id.match(/\.html$/) && !RESOLVED_ID_RE.test(id)) { + if (compiler.__unoCtx.filter('', id) && !id.match(/\.html$/) && !RESOLVED_ID_RE.test(id)) { return [{ loader: nodePath.resolve(__dirname, './transform-loader') }] @@ -103,9 +101,10 @@ function WebpackPlugin (configOrPath, defaults) { compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => { compilation.hooks.optimizeAssets.tapPromise(PLUGIN_NAME, async () => { - await ctx.ready + const ctx = compiler.__unoCtx + const uno = ctx.uno // 清空transformCache避免watch修改不生效 - transformCache.clear() + ctx.transformCache.clear() const tokens = new Set() for (const module of compilation.modules) { const assetsInfo = module.buildInfo.assetsInfo || new Map() @@ -135,9 +134,21 @@ function WebpackPlugin (configOrPath, defaults) { } }) }) + + compiler.hooks.thisCompilation.tap('MpxWebpackPlugin', (compilation) => { + const mpx = compilation.__mpx__ + mpx.unoCtx = compiler.__unoCtx.uno + }) + + compiler.hooks.make.tapPromise(PLUGIN_NAME, async (compilation) => { + const ctx = await createContext(configOrPath, defaults) + compiler.__unoCtx = ctx + return ctx + }) } } } + function getLayer (id) { let layer = resolveLayer(getPath(id)) if (!layer) { diff --git a/packages/unocss-plugin/lib/web-plugin/transform-loader.js b/packages/unocss-plugin/lib/web-plugin/transform-loader.js index 6a026906ce..5be03cce6d 100644 --- a/packages/unocss-plugin/lib/web-plugin/transform-loader.js +++ b/packages/unocss-plugin/lib/web-plugin/transform-loader.js @@ -8,7 +8,6 @@ async function transform (code, map) { const ctx = this._compiler.__unoCtx const mpx = this.getMpx() if (!ctx || !mpx) return callback(null, code, map) - await ctx.ready // 使用resourcePath而不是resource作为id,规避query的影响 const id = this.resourcePath const { extract, transformCache } = ctx diff --git a/packages/unocss-plugin/lib/web-plugin/utils.js b/packages/unocss-plugin/lib/web-plugin/utils.js index 26ef9629a9..f2d9df9f9b 100644 --- a/packages/unocss-plugin/lib/web-plugin/utils.js +++ b/packages/unocss-plugin/lib/web-plugin/utils.js @@ -15,67 +15,53 @@ const sfcIdRE = /\.(vue|mpx)($|\?)/ const templateIdRE = /\.(wxml|axml|swan|qml|ttml|qxml|jxml|ddml|html)($|\?)/ const cssIdRE = /\.(wxss|acss|css|qss|ttss|jxss|ddss)($|\?)/ -function createContext (configOrPath, defaults = {}, extraConfigSources = []) { +async function createContext (configOrPath, defaults = {}, extraConfigSources = []) { const root = process.cwd() let rawConfig = {} - const ctx = { - get ready () { - return ready - }, - filter, - uno: undefined, - extract, - transformCache: new Map() - } - const unoPromise = core.createGenerator(rawConfig, defaults) + + const uno = await core.createGenerator(rawConfig, defaults) let rollupFilter = pluginutils.createFilter(defaultInclude, defaultExclude) const idFilter = pluginutils.createFilter([sfcIdRE, templateIdRE, cssIdRE, core.cssIdRE]) - const ready = reloadConfig() - - async function reloadConfig () { - const uno = ctx.uno = await unoPromise - const result = await config.loadConfig(root, configOrPath, extraConfigSources, defaults) - rawConfig = result.config - uno.setConfig(rawConfig) - rollupFilter = pluginutils.createFilter( - rawConfig.include || defaultInclude, - rawConfig.exclude || defaultExclude - ) - const presets = /* @__PURE__ */ new Set() - uno.config.presets.forEach((i) => { - if (!i.name) { - return - } - if (presets.has(i.name)) { - console.warn(`[unocss] duplication of preset ${i.name} found, there might be something wrong with your config.`) - } else { - presets.add(i.name) - } - }) - const transformers = uno.config.transformers - if (transformers) { - const pre = [] - const normal = [] - const post = [] - transformers.forEach(i => { - if (i.enforce === 'pre') pre.push(i) - else if (i.enforce === 'post') post.push(i) - else normal.push(i) - }) - uno.config.transformers = [ - ...pre, - ...normal, - ...post - ] + const result = await config.loadConfig(root, configOrPath, extraConfigSources, defaults) + rawConfig = result.config + uno.setConfig(rawConfig) + rollupFilter = pluginutils.createFilter( + rawConfig.include || defaultInclude, + rawConfig.exclude || defaultExclude + ) + const presets = /* @__PURE__ */ new Set() + uno.config.presets.forEach((i) => { + if (!i.name) { + return } + if (presets.has(i.name)) { + console.warn(`[unocss] duplication of preset ${i.name} found, there might be something wrong with your config.`) + } else { + presets.add(i.name) + } + }) - return result + const transformers = uno.config.transformers + if (transformers) { + const pre = [] + const normal = [] + const post = [] + transformers.forEach(i => { + if (i.enforce === 'pre') pre.push(i) + else if (i.enforce === 'post') post.push(i) + else normal.push(i) + }) + uno.config.transformers = [ + ...pre, + ...normal, + ...post + ] } async function extract (code, id) { const tokens = new Set() - await ctx.uno.applyExtractors(code, id, tokens) + await uno.applyExtractors(code, id, tokens) if (tokens.size > 0) { this.emitFile(id, '', undefined, { skipEmit: true, @@ -94,7 +80,12 @@ function createContext (configOrPath, defaults = {}, extraConfigSources = []) { return code.includes(INCLUDE_COMMENT) || code.includes(CSS_PLACEHOLDER) || rollupFilter(id.replace(/\?v=\w+$/, '')) } - return ctx + return { + filter, + uno, + extract, + transformCache: new Map() + } } async function applyTransformers (ctx, original, id) { From f3789ca07723ffa8d1a3e2a1fcd5be1628fe9f58 Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 17 Dec 2024 14:56:28 +0800 Subject: [PATCH 021/128] fix: mpx instance --- packages/unocss-plugin/lib/rn-plugin/index.js | 2 +- packages/unocss-plugin/lib/web-plugin/index.js | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index 38d163e0e9..3f3c207d74 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -93,7 +93,7 @@ function WebpackPlugin (configOrPath, defaults) { }) }) - compiler.hooks.thisCompilation.tap('MpxWebpackPlugin', (compilation) => { + compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => { const mpx = compilation.__mpx__ mpx.unoCtx = compiler.__unoCtx.uno }) diff --git a/packages/unocss-plugin/lib/web-plugin/index.js b/packages/unocss-plugin/lib/web-plugin/index.js index f2a8d4f017..b4756d58ca 100644 --- a/packages/unocss-plugin/lib/web-plugin/index.js +++ b/packages/unocss-plugin/lib/web-plugin/index.js @@ -1,4 +1,4 @@ -import * as WebpackSources from 'webpack-sources'; +import WebpackSources from 'webpack-sources'; import VirtualModulesPlugin from 'webpack-virtual-modules'; import * as nodePath from 'node:path'; import * as process from 'process'; @@ -16,7 +16,10 @@ import { resolveId, resolveLayer } from './consts.js'; +import { dirname } from 'path'; +import { fileURLToPath } from 'url'; +const __dirname = dirname(fileURLToPath(import.meta.url)); const PLUGIN_NAME = 'unocss:webpack' const VIRTUAL_MODULE_PREFIX = nodePath.resolve(process.cwd(), '_virtual_') @@ -116,6 +119,7 @@ function WebpackPlugin (configOrPath, defaults) { } } } + debugger const result = await uno.generate(tokens, { minify: true }) const files = Object.keys(compilation.assets) for (const file of files) { @@ -135,12 +139,12 @@ function WebpackPlugin (configOrPath, defaults) { }) }) - compiler.hooks.thisCompilation.tap('MpxWebpackPlugin', (compilation) => { + compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => { const mpx = compilation.__mpx__ mpx.unoCtx = compiler.__unoCtx.uno }) - compiler.hooks.make.tapPromise(PLUGIN_NAME, async (compilation) => { + compiler.hooks.beforeCompile.tapPromise(PLUGIN_NAME, async (compilation) => { const ctx = await createContext(configOrPath, defaults) compiler.__unoCtx = ctx return ctx From d86b308d54025e2daa232d6be22bcc44d1bda0de Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 17 Dec 2024 15:26:19 +0800 Subject: [PATCH 022/128] fix: remove debugg --- packages/unocss-plugin/lib/web-plugin/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/unocss-plugin/lib/web-plugin/index.js b/packages/unocss-plugin/lib/web-plugin/index.js index b4756d58ca..276bac41c1 100644 --- a/packages/unocss-plugin/lib/web-plugin/index.js +++ b/packages/unocss-plugin/lib/web-plugin/index.js @@ -119,7 +119,6 @@ function WebpackPlugin (configOrPath, defaults) { } } } - debugger const result = await uno.generate(tokens, { minify: true }) const files = Object.keys(compilation.assets) for (const file of files) { From dc507295fa2dbd0b2551632816a07a12cc910c20 Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 17 Dec 2024 16:02:35 +0800 Subject: [PATCH 023/128] fix: lint --- .../unocss-base/preset-rn/rules/background.js | 4 +- .../unocss-base/preset-rn/rules/filters.js | 2 +- packages/unocss-base/preset-rn/rules/index.js | 18 ++++---- packages/unocss-plugin/lib/index.js | 42 +++++++++---------- packages/unocss-plugin/lib/rn-plugin/index.js | 18 ++++---- packages/unocss-plugin/lib/source.js | 4 +- packages/unocss-plugin/lib/transform.js | 6 +-- .../unocss-plugin/lib/web-plugin/index.js | 22 +++++----- .../lib/web-plugin/transform-loader.js | 8 ++-- .../unocss-plugin/lib/web-plugin/utils.js | 12 +++--- 10 files changed, 69 insertions(+), 67 deletions(-) diff --git a/packages/unocss-base/preset-rn/rules/background.js b/packages/unocss-base/preset-rn/rules/background.js index 6761a36384..99bf8f0f38 100644 --- a/packages/unocss-base/preset-rn/rules/background.js +++ b/packages/unocss-base/preset-rn/rules/background.js @@ -1,5 +1,5 @@ -import { findRawRules, transformEmptyRule } from '../../utils/index.js' -import { backgroundStyles } from '@unocss/preset-wind/rules' +import { findRawRules, transformEmptyRule } from '../../utils/index.js' +import { backgroundStyles } from '@unocss/preset-wind/rules' // todo background-position 剔除 const NewBackgroundRules = findRawRules([ diff --git a/packages/unocss-base/preset-rn/rules/filters.js b/packages/unocss-base/preset-rn/rules/filters.js index 2c63344d83..83c420a7a5 100644 --- a/packages/unocss-base/preset-rn/rules/filters.js +++ b/packages/unocss-base/preset-rn/rules/filters.js @@ -1,5 +1,5 @@ import { filters } from '@unocss/preset-wind/rules' -import { findRawRules, ruleFallback, isFunction, transformEmptyRule } from '../../utils/index.js' +import { findRawRules, ruleFallback, isFunction, transformEmptyRule } from '../../utils/index.js' // todo filter 只支持部分属性 const newFilters = findRawRules([ diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index fd8f6659b9..cec1d0bf77 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -1,12 +1,12 @@ -import color from './color.js'; -import spaceing from './spaceing.js'; -import typography from './typography.js'; -import background from './background.js'; -import shadow from './shadow.js'; -import behaviors from './behaviors.js'; -import layout from './layout.js'; -import filters from './filters.js'; -import staticRule from './static.js'; +import color from './color.js' +import spaceing from './spaceing.js' +import typography from './typography.js' +import background from './background.js' +import shadow from './shadow.js' +import behaviors from './behaviors.js' +import layout from './layout.js' +import filters from './filters.js' +import staticRule from './static.js' export default [ ...color, diff --git a/packages/unocss-plugin/lib/index.js b/packages/unocss-plugin/lib/index.js index 6b5821052c..4b1d4536e4 100644 --- a/packages/unocss-plugin/lib/index.js +++ b/packages/unocss-plugin/lib/index.js @@ -1,39 +1,39 @@ -import * as path from 'path'; -import { minimatch } from 'minimatch'; -import * as unoConfig from '@unocss/config'; -import * as core from '@unocss/core'; -import * as mpxConfig from '@mpxjs/webpack-plugin/lib/config.js'; -import toPosix from '@mpxjs/webpack-plugin/lib/utils/to-posix.js'; -import fixRelative from '@mpxjs/webpack-plugin/lib/utils/fix-relative.js'; -import parseRequest from '@mpxjs/webpack-plugin/lib/utils/parse-request.js'; -import set from '@mpxjs/webpack-plugin/lib/utils/set.js'; -import env from '@mpxjs/webpack-plugin/lib/utils/env.js'; -import MpxWebpackPlugin from '@mpxjs/webpack-plugin'; -import { UnoCSSWebpackPlugin } from './web-plugin/index.js'; -import { UnoCSSRNWebpackPlugin } from './rn-plugin/index.js'; -import transformerDirectives from '@unocss/transformer-directives'; -import * as transformerVariantGroup from '@unocss/transformer-variant-group'; +import * as path from 'path' +import { minimatch } from 'minimatch' +import * as unoConfig from '@unocss/config' +import * as core from '@unocss/core' +import * as mpxConfig from '@mpxjs/webpack-plugin/lib/config.js' +import toPosix from '@mpxjs/webpack-plugin/lib/utils/to-posix.js' +import fixRelative from '@mpxjs/webpack-plugin/lib/utils/fix-relative.js' +import parseRequest from '@mpxjs/webpack-plugin/lib/utils/parse-request.js' +import set from '@mpxjs/webpack-plugin/lib/utils/set.js' +import env from '@mpxjs/webpack-plugin/lib/utils/env.js' +import MpxWebpackPlugin from '@mpxjs/webpack-plugin' +import { UnoCSSWebpackPlugin } from './web-plugin/index.js' +import { UnoCSSRNWebpackPlugin } from './rn-plugin/index.js' +import transformerDirectives from '@unocss/transformer-directives' +import * as transformerVariantGroup from '@unocss/transformer-variant-group' import { parseClasses, parseStrings, parseMustache, stringifyAttr, parseComments, - parseCommentConfig, -} from './parser.js'; + parseCommentConfig +} from './parser.js' import { getReplaceSource, getConcatSource, getRawSource -} from './source.js'; +} from './source.js' import { transformStyle, buildAliasTransformer, transformGroups, mpEscape, - cssRequiresTransform, -} from './transform.js'; -import * as platformPreflightsMap from './platform.js'; + cssRequiresTransform +} from './transform.js' +import * as platformPreflightsMap from './platform.js' const { has } = set const { isWeb, isReact } = env diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index 3f3c207d74..9ebcb2a9e2 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -1,13 +1,13 @@ -import WebpackSources from 'webpack-sources'; -import * as nodePath from 'node:path'; -import { createContext, normalizeAbsolutePath } from '../web-plugin/utils.js'; -import { RESOLVED_ID_RE } from '../web-plugin/consts.js'; -import { getClassMap } from '@mpxjs/webpack-plugin/lib/react/style-helper.js'; -import shallowStringify from '@mpxjs/webpack-plugin/lib/utils/shallow-stringify.js'; -import { fileURLToPath } from 'url'; +import WebpackSources from 'webpack-sources' +import * as nodePath from 'node:path' +import { createContext, normalizeAbsolutePath } from '../web-plugin/utils.js' +import { RESOLVED_ID_RE } from '../web-plugin/consts.js' +import { getClassMap } from '@mpxjs/webpack-plugin/lib/react/style-helper.js' +import shallowStringify from '@mpxjs/webpack-plugin/lib/utils/shallow-stringify.js' +import { fileURLToPath } from 'url' -const __filename = fileURLToPath(import.meta.url); // 当前文件的绝对路径 -const __dirname = nodePath.dirname(__filename); // 当前文件的目录路径 +const __filename = fileURLToPath(import.meta.url) // 当前文件的绝对路径 +const __dirname = nodePath.dirname(__filename) // 当前文件的目录路径 const PLUGIN_NAME = 'unocss:webpack' diff --git a/packages/unocss-plugin/lib/source.js b/packages/unocss-plugin/lib/source.js index 389aa1b3f0..124e22b1ce 100644 --- a/packages/unocss-plugin/lib/source.js +++ b/packages/unocss-plugin/lib/source.js @@ -1,5 +1,5 @@ -import webpack from 'webpack'; -const { ReplaceSource, RawSource, ConcatSource, Source } = webpack.sources; +import webpack from 'webpack' +const { ReplaceSource, RawSource, ConcatSource, Source } = webpack.sources function getRawSource (s) { if (s instanceof RawSource) { return s } diff --git a/packages/unocss-plugin/lib/transform.js b/packages/unocss-plugin/lib/transform.js index 91fdf0fd3f..0e2b46f614 100644 --- a/packages/unocss-plugin/lib/transform.js +++ b/packages/unocss-plugin/lib/transform.js @@ -1,6 +1,6 @@ -import MagicString from 'magic-string'; -import transformerDirectives from '@unocss/transformer-directives'; -import { getReplaceSource } from './source.js'; +import MagicString from 'magic-string' +import transformerDirectives from '@unocss/transformer-directives' +import { getReplaceSource } from './source.js' const escapedReg = /\\(.)/g diff --git a/packages/unocss-plugin/lib/web-plugin/index.js b/packages/unocss-plugin/lib/web-plugin/index.js index 276bac41c1..18f487ed03 100644 --- a/packages/unocss-plugin/lib/web-plugin/index.js +++ b/packages/unocss-plugin/lib/web-plugin/index.js @@ -1,13 +1,13 @@ -import WebpackSources from 'webpack-sources'; -import VirtualModulesPlugin from 'webpack-virtual-modules'; -import * as nodePath from 'node:path'; -import * as process from 'process'; -import * as fs from 'fs'; +import WebpackSources from 'webpack-sources' +import VirtualModulesPlugin from 'webpack-virtual-modules' +import * as nodePath from 'node:path' +import * as process from 'process' +import * as fs from 'fs' import { createContext, getPath, normalizeAbsolutePath -} from './utils.js'; +} from './utils.js' import { LAYER_MARK_ALL, LAYER_PLACEHOLDER_RE, @@ -15,11 +15,11 @@ import { getLayerPlaceholder, resolveId, resolveLayer -} from './consts.js'; -import { dirname } from 'path'; -import { fileURLToPath } from 'url'; +} from './consts.js' +import { dirname } from 'path' +import { fileURLToPath } from 'url' -const __dirname = dirname(fileURLToPath(import.meta.url)); +const __dirname = dirname(fileURLToPath(import.meta.url)) const PLUGIN_NAME = 'unocss:webpack' const VIRTUAL_MODULE_PREFIX = nodePath.resolve(process.cwd(), '_virtual_') @@ -103,6 +103,8 @@ function WebpackPlugin (configOrPath, defaults) { }) compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => { + console.log(12313, !!compilation) + compilation.hooks.optimizeAssets.tapPromise(PLUGIN_NAME, async () => { const ctx = compiler.__unoCtx const uno = ctx.uno diff --git a/packages/unocss-plugin/lib/web-plugin/transform-loader.js b/packages/unocss-plugin/lib/web-plugin/transform-loader.js index 5be03cce6d..366aa43eea 100644 --- a/packages/unocss-plugin/lib/web-plugin/transform-loader.js +++ b/packages/unocss-plugin/lib/web-plugin/transform-loader.js @@ -1,7 +1,7 @@ -import { applyTransformers, isCssId } from './utils.js'; -import parseComponent from '@mpxjs/webpack-plugin/lib/parser.js'; -import genComponentTag from '@mpxjs/webpack-plugin/lib/utils/gen-component-tag.js'; -import * as path from 'path'; +import { applyTransformers, isCssId } from './utils.js' +import parseComponent from '@mpxjs/webpack-plugin/lib/parser.js' +import genComponentTag from '@mpxjs/webpack-plugin/lib/utils/gen-component-tag.js' +import * as path from 'path' async function transform (code, map) { const callback = this.async() diff --git a/packages/unocss-plugin/lib/web-plugin/utils.js b/packages/unocss-plugin/lib/web-plugin/utils.js index f2d9df9f9b..c88558bada 100644 --- a/packages/unocss-plugin/lib/web-plugin/utils.js +++ b/packages/unocss-plugin/lib/web-plugin/utils.js @@ -1,9 +1,9 @@ -import * as pluginutils from '@rollup/pluginutils'; -import * as config from '@unocss/config'; -import * as core from '@unocss/core'; -import * as nodePath from 'node:path'; -import MagicString from 'magic-string'; -import remapping from '@ampproject/remapping'; +import * as pluginutils from '@rollup/pluginutils' +import * as config from '@unocss/config' +import * as core from '@unocss/core' +import * as nodePath from 'node:path' +import MagicString from 'magic-string' +import remapping from '@ampproject/remapping' const INCLUDE_COMMENT = '@unocss-include' const IGNORE_COMMENT = '@unocss-ignore' From 57ce2f82322b5ad66cdb07267381b361ccdd9b8d Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 17 Dec 2024 16:17:21 +0800 Subject: [PATCH 024/128] fix: remove console --- packages/unocss-plugin/lib/web-plugin/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/unocss-plugin/lib/web-plugin/index.js b/packages/unocss-plugin/lib/web-plugin/index.js index 18f487ed03..9d20fe57a6 100644 --- a/packages/unocss-plugin/lib/web-plugin/index.js +++ b/packages/unocss-plugin/lib/web-plugin/index.js @@ -103,8 +103,6 @@ function WebpackPlugin (configOrPath, defaults) { }) compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => { - console.log(12313, !!compilation) - compilation.hooks.optimizeAssets.tapPromise(PLUGIN_NAME, async () => { const ctx = compiler.__unoCtx const uno = ctx.uno From 320ace5fbe6f196ead7a60aa443068cfe26c2773 Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 17 Dec 2024 16:54:41 +0800 Subject: [PATCH 025/128] fix: minimatch --- packages/unocss-plugin/lib/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/unocss-plugin/lib/index.js b/packages/unocss-plugin/lib/index.js index 4b1d4536e4..6548cb878b 100644 --- a/packages/unocss-plugin/lib/index.js +++ b/packages/unocss-plugin/lib/index.js @@ -1,5 +1,5 @@ import * as path from 'path' -import { minimatch } from 'minimatch' +import minimatch from 'minimatch' import * as unoConfig from '@unocss/config' import * as core from '@unocss/core' import * as mpxConfig from '@mpxjs/webpack-plugin/lib/config.js' From abf1b6f84c2eed8a4d9d802f9d1e428bf0a8dd04 Mon Sep 17 00:00:00 2001 From: mater Date: Wed, 18 Dec 2024 19:11:56 +0800 Subject: [PATCH 026/128] feat: preset --- packages/unocss-base/package.json | 2 +- .../unocss-base/preset-rn/rules/layout.js | 25 +++++------ .../preset-rn/rules/layout/display.js | 16 ++++++++ .../preset-rn/rules/layout/flex.js | 41 +++++++++++++++++++ .../preset-rn/rules/layout/floats.js | 9 ++++ .../preset-rn/rules/layout/overflows.js | 19 +++++++++ .../preset-rn/rules/layout/positions.js | 35 ++++++++++++++++ packages/unocss-plugin/lib/index.js | 2 +- packages/unocss-plugin/package.json | 10 ++--- 9 files changed, 137 insertions(+), 22 deletions(-) create mode 100644 packages/unocss-base/preset-rn/rules/layout/display.js create mode 100644 packages/unocss-base/preset-rn/rules/layout/flex.js create mode 100644 packages/unocss-base/preset-rn/rules/layout/floats.js create mode 100644 packages/unocss-base/preset-rn/rules/layout/overflows.js create mode 100644 packages/unocss-base/preset-rn/rules/layout/positions.js diff --git a/packages/unocss-base/package.json b/packages/unocss-base/package.json index 906bc14247..71816b43d2 100644 --- a/packages/unocss-base/package.json +++ b/packages/unocss-base/package.json @@ -15,6 +15,6 @@ "access": "public" }, "dependencies": { - "@unocss/preset-uno": "^0.52.7" + "@unocss/preset-uno": "^0.65.1" } } diff --git a/packages/unocss-base/preset-rn/rules/layout.js b/packages/unocss-base/preset-rn/rules/layout.js index e8979bdda6..4cb4b0dcbb 100644 --- a/packages/unocss-base/preset-rn/rules/layout.js +++ b/packages/unocss-base/preset-rn/rules/layout.js @@ -1,18 +1,13 @@ -import { ruleCallback, ruleFallback } from '../../utils/index.js' - -const overflows = [ - [/^(?:overflow|of)-(.+)$/, ([match, v], { generator }) => { - if (['hidden', 'visiable', 'scroll'].includes(v)) { - return { - overflow: v - } - } else { - return ruleFallback(match, generator) - } - }], - [/^(?:overflow|of)-([xy])-(.+)$/, ruleCallback] -] +import { displays } from './layout/display.js' +import { flex } from './layout/flex.js' +import { floats } from './layout/floats.js' +import { overflows } from './layout/overflows.js' +import { positions } from './layout/positions.js' export default [ - ...overflows + ...overflows, + ...floats, + ...displays, + ...flex, + ...positions ] diff --git a/packages/unocss-base/preset-rn/rules/layout/display.js b/packages/unocss-base/preset-rn/rules/layout/display.js new file mode 100644 index 0000000000..31456ec974 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/layout/display.js @@ -0,0 +1,16 @@ +import { displays } from '@unocss/preset-mini/rules' +import { findRawRules, transformEmptyRule } from '../../../utils/index.js' + +// display不支持的属性抽离并覆盖 +const displaysRules = [...transformEmptyRule(findRawRules([ + 'inline', + 'block', + 'inline-block', + 'contents', + 'flow-root', + 'list-item' +], displays))] + +export { + displaysRules as displays +} diff --git a/packages/unocss-base/preset-rn/rules/layout/flex.js b/packages/unocss-base/preset-rn/rules/layout/flex.js new file mode 100644 index 0000000000..c169d08c7f --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/layout/flex.js @@ -0,0 +1,41 @@ +import { flex } from '@unocss/preset-mini/rules' +import { findRawRules, transformEmptyRule } from '../../../utils/index.js' + +/** + flex + flex-auto + flex-basis-lg + flex-basis-none + flex-basis-sm + flex-basis-xl + flex-basis-xs + flex-col + flex-col-reverse + flex-initial + flex-inline + flex-none + flex-nowrap + flex-row + flex-row-reverse + flex-wrap + flex-wrap-reverse + flex-1 + flex-basis-2xl + flex-basis-3xl + flex-grow-0 + flex-grow-1 + flex-grow-2 + flex-shrink-0 + flex-shrink-1 + flex-shrink-2 + */ + +// flex 不支持的属性抽离并覆盖 +const flexRules = [...transformEmptyRule(findRawRules([ + 'flex-inline', + 'inline-flex' +], flex))] + +export { + flexRules as flex +} diff --git a/packages/unocss-base/preset-rn/rules/layout/floats.js b/packages/unocss-base/preset-rn/rules/layout/floats.js new file mode 100644 index 0000000000..a45095e87e --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/layout/floats.js @@ -0,0 +1,9 @@ +import { floats } from '@unocss/preset-mini/rules' +import { transformEmptyRule } from '../../../utils/index.js' + +// flex 不支持的属性抽离并覆盖 +const floatsRules = transformEmptyRule(floats) + +export { + floatsRules as floats +} diff --git a/packages/unocss-base/preset-rn/rules/layout/overflows.js b/packages/unocss-base/preset-rn/rules/layout/overflows.js new file mode 100644 index 0000000000..ecb4c83796 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/layout/overflows.js @@ -0,0 +1,19 @@ +import { ruleCallback, ruleFallback } from '../../../utils/index.js' + +const overflows = [ + [ + /^(?:overflow|of)-(.+)$/, + ([match, v], { generator }) => { + if (['hidden', 'visiable', 'scroll'].includes(v)) { + return { + overflow: v + } + } else { + return ruleFallback(match, generator) + } + } + ], + [/^(?:overflow|of)-([xy])-(.+)$/, ruleCallback] +] + +export { overflows } diff --git a/packages/unocss-base/preset-rn/rules/layout/positions.js b/packages/unocss-base/preset-rn/rules/layout/positions.js new file mode 100644 index 0000000000..11d821fe77 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/layout/positions.js @@ -0,0 +1,35 @@ +import { positions } from '@unocss/preset-mini/rules' +import { ruleCallback } from '../../../utils' + +/** + position-absolute + position-inherit + position-fixed + position-initial + position-relative + position-revert + position-revert-layer + position-unset + position-sticky + position-static + */ + +const unSupport = ['inherit', 'fixed', 'initial', 'revert', 'revert-layer', 'unset', 'sticky'] + +// position 不支持的属性抽离并覆盖 +const positionsRules = [ + ...positions.map(v => { + const [regex, matcher, meta] = v + return [ + regex, + (...args) => { + const [[, v]] = args + if (unSupport.includes(v)) return ruleCallback(...args) + return matcher(...args) + }, + meta + ] + }) +] + +export { positionsRules as positions } diff --git a/packages/unocss-plugin/lib/index.js b/packages/unocss-plugin/lib/index.js index 6548cb878b..4b1d4536e4 100644 --- a/packages/unocss-plugin/lib/index.js +++ b/packages/unocss-plugin/lib/index.js @@ -1,5 +1,5 @@ import * as path from 'path' -import minimatch from 'minimatch' +import { minimatch } from 'minimatch' import * as unoConfig from '@unocss/config' import * as core from '@unocss/core' import * as mpxConfig from '@mpxjs/webpack-plugin/lib/config.js' diff --git a/packages/unocss-plugin/package.json b/packages/unocss-plugin/package.json index 4ed70157c2..b40d070c54 100644 --- a/packages/unocss-plugin/package.json +++ b/packages/unocss-plugin/package.json @@ -20,13 +20,13 @@ "dependencies": { "@ampproject/remapping": "^2.2.1", "@rollup/pluginutils": "^5.0.2", - "@unocss/config": "0.52.7", - "@unocss/core": "0.52.7", - "@unocss/transformer-directives": "^0.52.1", - "@unocss/transformer-variant-group": "^0.52.1", + "@unocss/config": "^0.65.1", + "@unocss/core": "^0.65.1", + "@unocss/transformer-directives": "^0.65.1", + "@unocss/transformer-variant-group": "^0.65.1", "magic-string": "^0.30.3", "minimatch": "^9.0.1", - "unocss": "^0.52.7", + "unocss": "^0.65.1", "webpack-sources": "^3.2.3", "webpack-virtual-modules": "^0.6.0" } From ea891f80f690d479fad126d9838f6e25cb27494d Mon Sep 17 00:00:00 2001 From: mater Date: Fri, 20 Dec 2024 17:55:50 +0800 Subject: [PATCH 027/128] feat: preset --- packages/unocss-base/preset-rn/rules/align.js | 38 ++++++ .../unocss-base/preset-rn/rules/animation.js | 6 + .../unocss-base/preset-rn/rules/background.js | 33 +++--- .../unocss-base/preset-rn/rules/behaviors.js | 6 +- packages/unocss-base/preset-rn/rules/color.js | 7 +- .../unocss-base/preset-rn/rules/columns.js | 6 + .../unocss-base/preset-rn/rules/container.js | 10 ++ .../unocss-base/preset-rn/rules/divide.js | 19 +++ packages/unocss-base/preset-rn/rules/flex.js | 12 ++ packages/unocss-base/preset-rn/rules/gap.js | 8 ++ .../unocss-base/preset-rn/rules/global.js | 8 ++ packages/unocss-base/preset-rn/rules/grid.js | 9 ++ packages/unocss-base/preset-rn/rules/index.js | 111 ++++++++++++++++-- .../unocss-base/preset-rn/rules/layout.js | 28 +++-- .../preset-rn/rules/layout/display.js | 16 --- .../preset-rn/rules/layout/flex.js | 41 ------- .../preset-rn/rules/layout/floats.js | 9 -- .../preset-rn/rules/layout/overflows.js | 19 --- .../preset-rn/rules/layout/positions.js | 35 ------ .../unocss-base/preset-rn/rules/line-clamp.js | 8 ++ .../preset-rn/rules/placeholder.js | 6 + .../unocss-base/preset-rn/rules/positions.js | 90 ++++++++++++++ .../unocss-base/preset-rn/rules/scrolls.js | 8 ++ packages/unocss-base/preset-rn/rules/size.js | 1 + .../unocss-base/preset-rn/rules/spaceing.js | 3 - .../unocss-base/preset-rn/rules/spacing.js | 59 ++++++++++ .../unocss-base/preset-rn/rules/static.js | 79 ++++++++++++- packages/unocss-base/preset-rn/rules/svg.js | 1 + packages/unocss-base/preset-rn/rules/table.js | 6 + .../preset-rn/rules/touch-actions.js | 6 + .../unocss-base/preset-rn/rules/transform.js | 1 + .../unocss-base/preset-rn/rules/transition.js | 1 + .../unocss-base/preset-rn/rules/typography.js | 19 +-- .../preset-rn/rules/view-transition.js | 8 ++ packages/unocss-base/utils/index.js | 74 +++++++----- 35 files changed, 578 insertions(+), 213 deletions(-) create mode 100644 packages/unocss-base/preset-rn/rules/align.js create mode 100644 packages/unocss-base/preset-rn/rules/animation.js create mode 100644 packages/unocss-base/preset-rn/rules/columns.js create mode 100644 packages/unocss-base/preset-rn/rules/container.js create mode 100644 packages/unocss-base/preset-rn/rules/divide.js create mode 100644 packages/unocss-base/preset-rn/rules/flex.js create mode 100644 packages/unocss-base/preset-rn/rules/gap.js create mode 100644 packages/unocss-base/preset-rn/rules/global.js create mode 100644 packages/unocss-base/preset-rn/rules/grid.js delete mode 100644 packages/unocss-base/preset-rn/rules/layout/display.js delete mode 100644 packages/unocss-base/preset-rn/rules/layout/flex.js delete mode 100644 packages/unocss-base/preset-rn/rules/layout/floats.js delete mode 100644 packages/unocss-base/preset-rn/rules/layout/overflows.js delete mode 100644 packages/unocss-base/preset-rn/rules/layout/positions.js create mode 100644 packages/unocss-base/preset-rn/rules/line-clamp.js create mode 100644 packages/unocss-base/preset-rn/rules/placeholder.js create mode 100644 packages/unocss-base/preset-rn/rules/positions.js create mode 100644 packages/unocss-base/preset-rn/rules/scrolls.js create mode 100644 packages/unocss-base/preset-rn/rules/size.js delete mode 100644 packages/unocss-base/preset-rn/rules/spaceing.js create mode 100644 packages/unocss-base/preset-rn/rules/spacing.js create mode 100644 packages/unocss-base/preset-rn/rules/svg.js create mode 100644 packages/unocss-base/preset-rn/rules/table.js create mode 100644 packages/unocss-base/preset-rn/rules/touch-actions.js create mode 100644 packages/unocss-base/preset-rn/rules/transform.js create mode 100644 packages/unocss-base/preset-rn/rules/transition.js create mode 100644 packages/unocss-base/preset-rn/rules/view-transition.js diff --git a/packages/unocss-base/preset-rn/rules/align.js b/packages/unocss-base/preset-rn/rules/align.js new file mode 100644 index 0000000000..4a4f811a5f --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/align.js @@ -0,0 +1,38 @@ +import { textAligns, verticalAligns } from '@unocss/preset-mini/rules' +import { findRawRules, ruleCallback, transformEmptyRule } from '../../utils/index.js' + +const support = [ + 'mid', + 'start', + 'btm', + 'end', + 'auto', + 'top', + 'bottom', + 'middle' +] + +const verticalAlignsRules = verticalAligns.map(v => { + const [regex, matcher, ...another] = v + return [ + regex, + (...args) => { + const [[, v]] = args + if (support.includes(v)) return matcher(...args) + return ruleCallback(...args) + }, + ...another + ] +}) + +const textAlignValuesRules = transformEmptyRule( + findRawRules( + ['text-start', 'text-end', 'text-align-start', 'text-align-end'], + textAligns + ) +) + +export { + verticalAlignsRules as verticalAligns, + textAlignValuesRules as textAligns +} diff --git a/packages/unocss-base/preset-rn/rules/animation.js b/packages/unocss-base/preset-rn/rules/animation.js new file mode 100644 index 0000000000..18dfb73ade --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/animation.js @@ -0,0 +1,6 @@ +import { animations } from '@unocss/preset-wind/rules' +import { transformEmptyRule } from '../../utils/index.js' + +const animationsRules = transformEmptyRule(animations) + +export { animationsRules as animations } diff --git a/packages/unocss-base/preset-rn/rules/background.js b/packages/unocss-base/preset-rn/rules/background.js index 99bf8f0f38..5f8ccc9aff 100644 --- a/packages/unocss-base/preset-rn/rules/background.js +++ b/packages/unocss-base/preset-rn/rules/background.js @@ -1,20 +1,21 @@ -import { findRawRules, transformEmptyRule } from '../../utils/index.js' import { backgroundStyles } from '@unocss/preset-wind/rules' +import { findRawRules } from '../../utils/index.js' // todo background-position 剔除 -const NewBackgroundRules = findRawRules([ - // attachments - 'bg-fixed', - 'bg-locale', - 'bg-scroll', - // repeat - /^bg-repeat-?.*/, - // origins - /^bg-origin-.*/, - // clips - /^bg-clip-.*/ -], backgroundStyles) +const NewBackgroundRules = findRawRules( + [ + // attachments + 'bg-fixed', + 'bg-locale', + 'bg-scroll', + // repeat + /^bg-repeat-?.*/, + // origins + /^bg-origin-.*/, + // clips + /^bg-clip-.*/ + ], + backgroundStyles +) -export default [ - ...transformEmptyRule(NewBackgroundRules) -] +export { NewBackgroundRules as backgroundStyles } diff --git a/packages/unocss-base/preset-rn/rules/behaviors.js b/packages/unocss-base/preset-rn/rules/behaviors.js index 49f5991dba..db778cd036 100644 --- a/packages/unocss-base/preset-rn/rules/behaviors.js +++ b/packages/unocss-base/preset-rn/rules/behaviors.js @@ -1,4 +1,5 @@ import { imageRenderings, overscrolls, listStyle } from '@unocss/preset-wind/rules' +import { appearance, outline, willChange } from '@unocss/preset-mini/rules' import { transformEmptyRule } from '../../utils/index.js' // todo @@ -8,6 +9,9 @@ export default [ ...transformEmptyRule( overscrolls, imageRenderings, - listStyle + listStyle, + outline, + willChange, + appearance ) ] diff --git a/packages/unocss-base/preset-rn/rules/color.js b/packages/unocss-base/preset-rn/rules/color.js index 9859f07972..a8201e4408 100644 --- a/packages/unocss-base/preset-rn/rules/color.js +++ b/packages/unocss-base/preset-rn/rules/color.js @@ -1 +1,6 @@ -export default [] +import { colorScheme } from '@unocss/preset-mini/rules' +import { transformEmptyRule } from '../../utils/index.js' + +const colorSchemeRules = transformEmptyRule(colorScheme) + +export { colorSchemeRules as colorScheme } diff --git a/packages/unocss-base/preset-rn/rules/columns.js b/packages/unocss-base/preset-rn/rules/columns.js new file mode 100644 index 0000000000..510a083d43 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/columns.js @@ -0,0 +1,6 @@ +import { columns } from '@unocss/preset-wind/rules' +import { transformEmptyRule } from '../../utils/index.js' + +const columnsRules = transformEmptyRule(columns) + +export { columnsRules as columns } diff --git a/packages/unocss-base/preset-rn/rules/container.js b/packages/unocss-base/preset-rn/rules/container.js new file mode 100644 index 0000000000..785be40087 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/container.js @@ -0,0 +1,10 @@ +import { containerParent } from '@unocss/preset-mini/rules' +import { transformEmptyRule } from '../../utils/index.js' + +const containerParentRules = transformEmptyRule(containerParent) + +// TODO wind container + +export { + containerParentRules as containerParent +} diff --git a/packages/unocss-base/preset-rn/rules/divide.js b/packages/unocss-base/preset-rn/rules/divide.js new file mode 100644 index 0000000000..b1769b0a01 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/divide.js @@ -0,0 +1,19 @@ +import { divide } from '@unocss/preset-wind/rules' +import { ruleCallback } from '../../utils/index.js' + +const unSupport = ['s', 'e', 'bs', 'be', 'is', 'ie', 'block', 'inline'] + +const divideRules = divide.map(v => { + const [regex, matcher, ...another] = v + return [ + regex, + (...args) => { + const [[, direction]] = args + if (unSupport.includes(direction)) return ruleCallback(...args) + return matcher(...args) + }, + ...another + ] +}) + +export { divideRules as divide } diff --git a/packages/unocss-base/preset-rn/rules/flex.js b/packages/unocss-base/preset-rn/rules/flex.js new file mode 100644 index 0000000000..36d1b4eab4 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/flex.js @@ -0,0 +1,12 @@ +import { flex } from '@unocss/preset-mini/rules' +import { findRawRules, transformEmptyRule } from '../../utils/index.js' + +// flex 不支持的属性抽离并覆盖 +const flexRules = transformEmptyRule(findRawRules([ + 'flex-inline', + 'inline-flex' +], flex)) + +export { + flexRules as flex +} diff --git a/packages/unocss-base/preset-rn/rules/gap.js b/packages/unocss-base/preset-rn/rules/gap.js new file mode 100644 index 0000000000..36c5b5d403 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/gap.js @@ -0,0 +1,8 @@ +import { gaps } from '@unocss/preset-mini/rules' + +// TODO 这里要看下 gaps 的实现 需要移除grid +const gapsRules = gaps + +export { + gapsRules as gaps +} diff --git a/packages/unocss-base/preset-rn/rules/global.js b/packages/unocss-base/preset-rn/rules/global.js new file mode 100644 index 0000000000..8513fb2bed --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/global.js @@ -0,0 +1,8 @@ +import { + globalKeywords, + transformEmptyRule +} from '../../utils/index.js' + +export const globalRules = transformEmptyRule( + globalKeywords.map(v => [new RegExp(`.*-${v}$`)]) +) diff --git a/packages/unocss-base/preset-rn/rules/grid.js b/packages/unocss-base/preset-rn/rules/grid.js new file mode 100644 index 0000000000..ba9b837def --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/grid.js @@ -0,0 +1,9 @@ +import { grids } from '@unocss/preset-mini/rules' +import { transformEmptyRule } from '../../utils/index.js' + +// flex 不支持的属性抽离并覆盖 +const gridsRules = transformEmptyRule(grids) + +export { + gridsRules as grids +} diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index cec1d0bf77..ff97e9c3e9 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -1,21 +1,112 @@ -import color from './color.js' -import spaceing from './spaceing.js' +import { colorScheme } from './color.js' +import { backgroundStyles } from './background.js' +import { margins, paddings, spaces } from './spacing.js' import typography from './typography.js' -import background from './background.js' import shadow from './shadow.js' import behaviors from './behaviors.js' -import layout from './layout.js' +import { overflows } from './layout.js' import filters from './filters.js' -import staticRule from './static.js' +import { + appearances, + backgroundBlendModes, + contains, + cursors, + displays, + resizes, + whitespaces, + contentVisibility, + contents, + breaks, + textWraps, + textOverflows, + fontStyles, + fontSmoothings, + hyphens +} from './static.js' +import { + flexGridJustifiesAlignments, + justifies, + orders, + placements, + positions, + insets, + floats, + boxSizing +} from './positions.js' +import { flex } from './flex.js' +import { globalRules } from './global.js' +import { textAligns, verticalAligns } from './align.js' +import { containerParent } from './container.js' +import { animations } from './animation.js' +import { columns } from './columns.js' +import { divide } from './divide.js' +import { placeholders } from './placeholder.js' +import { scrolls } from './scrolls.js' +import { tables } from './table.js' +import { touchActions } from './touch-actions.js' +import { viewTransition } from './view-transition.js' export default [ - ...color, - ...spaceing, ...typography, - ...background, ...shadow, ...behaviors, - ...layout, ...filters, - ...staticRule + // align + ...verticalAligns, + ...textAligns, + // color + ...colorScheme, + ...backgroundStyles, + // container + ...containerParent, + // layout + ...overflows, + // positions + ...floats, + ...flex, + ...positions, + ...justifies, + ...orders, + ...placements, + ...insets, + ...flexGridJustifiesAlignments, + ...boxSizing, + // static + ...displays, + ...backgroundBlendModes, + ...appearances, + ...cursors, + ...contains, + ...resizes, + ...whitespaces, + ...contentVisibility, + ...contents, + ...breaks, + ...textWraps, + ...textOverflows, + ...fontStyles, + ...fontSmoothings, + ...hyphens, + // spaceing + ...paddings, + ...margins, + ...spaces, + // animations, + ...animations, + // columns + ...columns, + // divide + ...divide, + // placeholder + ...placeholders, + // scrolls + ...scrolls, + // tables + ...tables, + // touchActions + ...touchActions, + // view-transition + ...viewTransition, + // global + ...globalRules ] diff --git a/packages/unocss-base/preset-rn/rules/layout.js b/packages/unocss-base/preset-rn/rules/layout.js index 4cb4b0dcbb..e732192f18 100644 --- a/packages/unocss-base/preset-rn/rules/layout.js +++ b/packages/unocss-base/preset-rn/rules/layout.js @@ -1,13 +1,19 @@ -import { displays } from './layout/display.js' -import { flex } from './layout/flex.js' -import { floats } from './layout/floats.js' -import { overflows } from './layout/overflows.js' -import { positions } from './layout/positions.js' +import { ruleCallback, ruleFallback } from '../../utils/index.js' -export default [ - ...overflows, - ...floats, - ...displays, - ...flex, - ...positions +const overflows = [ + [ + /^(?:overflow|of)-(.+)$/, + ([match, v], { generator }) => { + if (['hidden', 'visiable', 'scroll'].includes(v)) { + return { + overflow: v + } + } else { + return ruleFallback(match, generator) + } + } + ], + [/^(?:overflow|of)-([xy])-(.+)$/, ruleCallback] ] + +export { overflows } diff --git a/packages/unocss-base/preset-rn/rules/layout/display.js b/packages/unocss-base/preset-rn/rules/layout/display.js deleted file mode 100644 index 31456ec974..0000000000 --- a/packages/unocss-base/preset-rn/rules/layout/display.js +++ /dev/null @@ -1,16 +0,0 @@ -import { displays } from '@unocss/preset-mini/rules' -import { findRawRules, transformEmptyRule } from '../../../utils/index.js' - -// display不支持的属性抽离并覆盖 -const displaysRules = [...transformEmptyRule(findRawRules([ - 'inline', - 'block', - 'inline-block', - 'contents', - 'flow-root', - 'list-item' -], displays))] - -export { - displaysRules as displays -} diff --git a/packages/unocss-base/preset-rn/rules/layout/flex.js b/packages/unocss-base/preset-rn/rules/layout/flex.js deleted file mode 100644 index c169d08c7f..0000000000 --- a/packages/unocss-base/preset-rn/rules/layout/flex.js +++ /dev/null @@ -1,41 +0,0 @@ -import { flex } from '@unocss/preset-mini/rules' -import { findRawRules, transformEmptyRule } from '../../../utils/index.js' - -/** - flex - flex-auto - flex-basis-lg - flex-basis-none - flex-basis-sm - flex-basis-xl - flex-basis-xs - flex-col - flex-col-reverse - flex-initial - flex-inline - flex-none - flex-nowrap - flex-row - flex-row-reverse - flex-wrap - flex-wrap-reverse - flex-1 - flex-basis-2xl - flex-basis-3xl - flex-grow-0 - flex-grow-1 - flex-grow-2 - flex-shrink-0 - flex-shrink-1 - flex-shrink-2 - */ - -// flex 不支持的属性抽离并覆盖 -const flexRules = [...transformEmptyRule(findRawRules([ - 'flex-inline', - 'inline-flex' -], flex))] - -export { - flexRules as flex -} diff --git a/packages/unocss-base/preset-rn/rules/layout/floats.js b/packages/unocss-base/preset-rn/rules/layout/floats.js deleted file mode 100644 index a45095e87e..0000000000 --- a/packages/unocss-base/preset-rn/rules/layout/floats.js +++ /dev/null @@ -1,9 +0,0 @@ -import { floats } from '@unocss/preset-mini/rules' -import { transformEmptyRule } from '../../../utils/index.js' - -// flex 不支持的属性抽离并覆盖 -const floatsRules = transformEmptyRule(floats) - -export { - floatsRules as floats -} diff --git a/packages/unocss-base/preset-rn/rules/layout/overflows.js b/packages/unocss-base/preset-rn/rules/layout/overflows.js deleted file mode 100644 index ecb4c83796..0000000000 --- a/packages/unocss-base/preset-rn/rules/layout/overflows.js +++ /dev/null @@ -1,19 +0,0 @@ -import { ruleCallback, ruleFallback } from '../../../utils/index.js' - -const overflows = [ - [ - /^(?:overflow|of)-(.+)$/, - ([match, v], { generator }) => { - if (['hidden', 'visiable', 'scroll'].includes(v)) { - return { - overflow: v - } - } else { - return ruleFallback(match, generator) - } - } - ], - [/^(?:overflow|of)-([xy])-(.+)$/, ruleCallback] -] - -export { overflows } diff --git a/packages/unocss-base/preset-rn/rules/layout/positions.js b/packages/unocss-base/preset-rn/rules/layout/positions.js deleted file mode 100644 index 11d821fe77..0000000000 --- a/packages/unocss-base/preset-rn/rules/layout/positions.js +++ /dev/null @@ -1,35 +0,0 @@ -import { positions } from '@unocss/preset-mini/rules' -import { ruleCallback } from '../../../utils' - -/** - position-absolute - position-inherit - position-fixed - position-initial - position-relative - position-revert - position-revert-layer - position-unset - position-sticky - position-static - */ - -const unSupport = ['inherit', 'fixed', 'initial', 'revert', 'revert-layer', 'unset', 'sticky'] - -// position 不支持的属性抽离并覆盖 -const positionsRules = [ - ...positions.map(v => { - const [regex, matcher, meta] = v - return [ - regex, - (...args) => { - const [[, v]] = args - if (unSupport.includes(v)) return ruleCallback(...args) - return matcher(...args) - }, - meta - ] - }) -] - -export { positionsRules as positions } diff --git a/packages/unocss-base/preset-rn/rules/line-clamp.js b/packages/unocss-base/preset-rn/rules/line-clamp.js new file mode 100644 index 0000000000..07740b2795 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/line-clamp.js @@ -0,0 +1,8 @@ +import { lineClamps } from '@unocss/preset-wind/rules' +import { transformEmptyRule } from '../../utils/index.js' + +const lineClampsRules = transformEmptyRule(lineClamps) + +export { + lineClampsRules as lineClamps +} diff --git a/packages/unocss-base/preset-rn/rules/placeholder.js b/packages/unocss-base/preset-rn/rules/placeholder.js new file mode 100644 index 0000000000..6495f82645 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/placeholder.js @@ -0,0 +1,6 @@ +import { placeholders } from '@unocss/preset-wind/rules' +import { transformEmptyRule } from '../../utils/index.js' + +const placeholdersRules = transformEmptyRule(placeholders) + +export { placeholdersRules as placeholders } diff --git a/packages/unocss-base/preset-rn/rules/positions.js b/packages/unocss-base/preset-rn/rules/positions.js new file mode 100644 index 0000000000..3f4b0c08eb --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/positions.js @@ -0,0 +1,90 @@ +import { + positions, + justifies, + orders, + alignments, + placements, + insets, + floats, + boxSizing +} from '@unocss/preset-mini/rules' +import { + findRawRules, + ruleCallback, + transformEmptyRule +} from '../../utils/index.js' + +const unSupport = ['sticky'] +// position 不支持的属性抽离并覆盖 +const positionsRules = positions.map(v => { + const [regex, matcher, ...another] = v + return [ + regex, + (...args) => { + const [[, v]] = args + if (unSupport.includes(v)) return ruleCallback(...args) + return matcher(...args) + }, + ...another + ] +}) + +// 不支持的规则过滤覆盖 +const justifiesRules = [ + ...transformEmptyRule( + findRawRules( + [ + 'justify-left', + 'justify-right', + 'justify-stretch', + 'justify-items-center', + 'justify-items-end', + 'justify-items-start', + 'justify-items-stretch', + 'justify-self-auto', + 'justify-self-center', + 'justify-self-end', + 'justify-self-stretch', + 'justify-self-start' + ], + justifies + ) + ) +] + +const ordersRules = transformEmptyRule(orders) + +const placementsRules = transformEmptyRule(placements) + +const flexGridJustifiesAlignmentsRules = transformEmptyRule([ + // flex部分不支持 + ...[...justifiesRules, ...placementsRules].map( + ([k, v]) => [`flex-${k}`, v] + ), + // grid全部不支持 + ...[...justifies, ...alignments, ...placements].map(([k, v]) => [ + `grid-${k}`, + v + ]) +]) + +// TODO +const insetsRules = [...insets] + +// floats 不支持的属性抽离并覆盖 +const floatsRules = transformEmptyRule(floats) + +const boxSizingRules = transformEmptyRule( + findRawRules(['box-content'], boxSizing) +) + +export { + positionsRules as positions, + justifiesRules as justifies, + ordersRules as orders, + placementsRules as placements, + flexGridJustifiesAlignmentsRules as flexGridJustifiesAlignments, + insetsRules as insets, + floatsRules as floats, + boxSizingRules as boxSizing +} diff --git a/packages/unocss-base/preset-rn/rules/scrolls.js b/packages/unocss-base/preset-rn/rules/scrolls.js new file mode 100644 index 0000000000..89f8b3774a --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/scrolls.js @@ -0,0 +1,8 @@ +import { scrolls } from '@unocss/preset-wind/rules' +import { transformEmptyRule } from '../../utils/index.js' + +const scrollsRules = transformEmptyRule(scrolls) + +export { + scrollsRules as scrolls +} diff --git a/packages/unocss-base/preset-rn/rules/size.js b/packages/unocss-base/preset-rn/rules/size.js new file mode 100644 index 0000000000..700862bcc3 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/size.js @@ -0,0 +1 @@ +// TODO 这里要看下 diff --git a/packages/unocss-base/preset-rn/rules/spaceing.js b/packages/unocss-base/preset-rn/rules/spaceing.js deleted file mode 100644 index 3e5c089beb..0000000000 --- a/packages/unocss-base/preset-rn/rules/spaceing.js +++ /dev/null @@ -1,3 +0,0 @@ -export default [ - ['m-1', { padding: '40px' }] -] diff --git a/packages/unocss-base/preset-rn/rules/spacing.js b/packages/unocss-base/preset-rn/rules/spacing.js new file mode 100644 index 0000000000..50636cd665 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/spacing.js @@ -0,0 +1,59 @@ +import { margins, paddings } from '@unocss/preset-mini/rules' +import { spaces } from '@unocss/preset-wind/rules' +import { ruleCallback } from '../../utils/index.js' + +const unSupport = [ + 's', + 'e', + 'bs', + 'be', + 'is', + 'ie', + 'block', + 'inline' +] + +const paddingsRules = paddings.map(v => { + const [regex, matcher, ...another] = v + return [ + regex, + (...args) => { + const [[, direction]] = args + if (unSupport.includes(direction)) return ruleCallback(...args) + return matcher(...args) + }, + ...another + ] +}) + +const marginsRules = margins.map(v => { + const [regex, matcher, ...another] = v + return [ + regex, + (...args) => { + const [[, direction]] = args + if (unSupport.includes(direction)) return ruleCallback(...args) + return matcher(...args) + }, + ...another + ] +}) + +const spacesRules = spaces.map(v => { + const [regex, matcher, ...another] = v + return [ + regex, + (...args) => { + const [[, direction]] = args + if (unSupport.includes(direction)) return ruleCallback(...args) + return matcher(...args) + }, + ...another + ] +}) + +export { + paddingsRules as paddings, + marginsRules as margins, + spacesRules as spaces +} diff --git a/packages/unocss-base/preset-rn/rules/static.js b/packages/unocss-base/preset-rn/rules/static.js index 6e7adbbc56..ef5c63670b 100644 --- a/packages/unocss-base/preset-rn/rules/static.js +++ b/packages/unocss-base/preset-rn/rules/static.js @@ -1,6 +1,77 @@ -import { backgroundBlendModes } from '@unocss/preset-wind/rules' -import { transformEmptyRule } from '../../utils/index.js' +import { + appearances, + breaks, + contains, + contents, + contentVisibility, + cursors, + displays, + fontSmoothings, + fontStyles, + resizes, + textOverflows, + textWraps, + whitespaces +} from '@unocss/preset-mini/rules' +import { backgroundBlendModes, hyphens } from '@unocss/preset-wind/rules' +import { findRawRules, transformEmptyRule } from '../../utils/index.js' -export default transformEmptyRule( - backgroundBlendModes +// display不支持的属性抽离并覆盖 +const displaysRules = transformEmptyRule( + findRawRules( + ['inline', 'block', 'inline-block', 'contents', 'flow-root', 'list-item'], + displays + ) ) + +const backgroundBlendModesRules = transformEmptyRule(backgroundBlendModes) + +const appearancesRules = transformEmptyRule( + findRawRules(['visible', 'invisible'], appearances) +) + +const cursorsRules = transformEmptyRule(cursors) + +const containsRules = transformEmptyRule(contains) + +const resizesRules = transformEmptyRule(resizes) + +const whitespacesRules = transformEmptyRule(whitespaces) + +const contentVisibilityRules = transformEmptyRule(contentVisibility) + +const contentsRules = transformEmptyRule(contents) + +const breaksRules = transformEmptyRule(breaks) + +const textWrapsRules = transformEmptyRule(textWraps) + +const textOverflowsRules = transformEmptyRule( + findRawRules(['text-ellipsis', 'text-clip'], textOverflows) +) + +const fontStylesRules = transformEmptyRule( + findRawRules(['oblique', 'font-oblique'], fontStyles) +) + +const fontSmoothingsRules = transformEmptyRule(fontSmoothings) + +const hyphensRules = transformEmptyRule(hyphens) + +export { + backgroundBlendModesRules as backgroundBlendModes, + displaysRules as displays, + appearancesRules as appearances, + cursorsRules as cursors, + containsRules as contains, + resizesRules as resizes, + whitespacesRules as whitespaces, + contentVisibilityRules as contentVisibility, + contentsRules as contents, + breaksRules as breaks, + textWrapsRules as textWraps, + textOverflowsRules as textOverflows, + fontStylesRules as fontStyles, + fontSmoothingsRules as fontSmoothings, + hyphensRules as hyphens +} diff --git a/packages/unocss-base/preset-rn/rules/svg.js b/packages/unocss-base/preset-rn/rules/svg.js new file mode 100644 index 0000000000..83a89f0dc9 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/svg.js @@ -0,0 +1 @@ +// svg stroke 看起来装了其它就可以支持部分属性 diff --git a/packages/unocss-base/preset-rn/rules/table.js b/packages/unocss-base/preset-rn/rules/table.js new file mode 100644 index 0000000000..7ae503ebf5 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/table.js @@ -0,0 +1,6 @@ +import { tables } from '@unocss/preset-wind/rules' +import { transformEmptyRule } from '../../utils/index.js' + +const tablesRules = transformEmptyRule(tables) + +export { tablesRules as tables } diff --git a/packages/unocss-base/preset-rn/rules/touch-actions.js b/packages/unocss-base/preset-rn/rules/touch-actions.js new file mode 100644 index 0000000000..8b5ea712ac --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/touch-actions.js @@ -0,0 +1,6 @@ +import { touchActions } from '@unocss/preset-wind/rules' +import { transformEmptyRule } from '../../utils/index.js' + +const touchActionsRules = transformEmptyRule(touchActions) + +export { touchActionsRules as touchActions } diff --git a/packages/unocss-base/preset-rn/rules/transform.js b/packages/unocss-base/preset-rn/rules/transform.js new file mode 100644 index 0000000000..5ccb051971 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/transform.js @@ -0,0 +1 @@ +// transform-gpu ? preserve-3d ? diff --git a/packages/unocss-base/preset-rn/rules/transition.js b/packages/unocss-base/preset-rn/rules/transition.js new file mode 100644 index 0000000000..bdc9a1f544 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/transition.js @@ -0,0 +1 @@ +// 实验性支持 diff --git a/packages/unocss-base/preset-rn/rules/typography.js b/packages/unocss-base/preset-rn/rules/typography.js index 9c1e291cac..8258b817b6 100644 --- a/packages/unocss-base/preset-rn/rules/typography.js +++ b/packages/unocss-base/preset-rn/rules/typography.js @@ -1,4 +1,4 @@ -import { transformEmptyRule, ruleFallback } from '../../utils/index.js' +import { transformEmptyRule } from '../../utils/index.js' import { writingModes, writingOrientations, @@ -14,8 +14,7 @@ import { breaks, textOverflows, textWraps, - fontSmoothings, - verticalAligns + fontSmoothings } from '@unocss/preset-mini/rules' // decoration @@ -41,17 +40,6 @@ const textDecorations = [ // } // }) -// vertical-align -const newVerticalAlign = verticalAligns.map(item => { - return [item[0], ([match, v], { generator }) => { - if (['auto', 'top', 'bottom', 'center'].includes(v)) { - return { 'vertical-align': v } - } else { - return ruleFallback(match, generator) - } - }] -}) - export default [ ...transformEmptyRule( textIndents, @@ -65,8 +53,7 @@ export default [ writingOrientations, textDecorations, textWraps, - fontSmoothings, + fontSmoothings // newFontVariantNumberic, - newVerticalAlign ) ] diff --git a/packages/unocss-base/preset-rn/rules/view-transition.js b/packages/unocss-base/preset-rn/rules/view-transition.js new file mode 100644 index 0000000000..86030db380 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/view-transition.js @@ -0,0 +1,8 @@ +import { viewTransition } from '@unocss/preset-wind/rules' +import { transformEmptyRule } from '../../utils/index.js' + +const viewTransitionRules = transformEmptyRule(viewTransition) + +export { + viewTransitionRules as viewTransition +} diff --git a/packages/unocss-base/utils/index.js b/packages/unocss-base/utils/index.js index 5622cf1226..28a6d798e5 100644 --- a/packages/unocss-base/utils/index.js +++ b/packages/unocss-base/utils/index.js @@ -1,14 +1,14 @@ const EMPTY = ' ' -const isReg = (reg) => { +const isReg = reg => { return reg instanceof RegExp } -const isString = (str) => { +const isString = str => { return typeof str === 'string' } -const isFunction = (fn) => { +const isFunction = fn => { return typeof fn === 'function' } @@ -27,15 +27,20 @@ const genEmptyRule = (...rules) => { } const transformEmptyRule = (...rulesArr) => { - return rulesArr.map(rules => rules.map(rule => { - if (isString(rule[0])) { // staticRule - return [ - [rule[0], null], - [new RegExp(`^${rule[0]}$`), ruleCallback] - ] - } - return [[rule[0], ruleCallback]] - })).reduce((preV, curV) => preV.concat(...curV), []) + return rulesArr + .map(rules => + rules.map(rule => { + if (isString(rule[0])) { + // staticRule + return [ + [rule[0], null], + [new RegExp(`^${rule[0]}$`), ruleCallback] + ] + } + return [[rule[0], ruleCallback]] + }) + ) + .reduce((preV, curV) => preV.concat(...curV), []) } const findRawRules = (matcher, rawRules, byReg = false) => { @@ -43,30 +48,37 @@ const findRawRules = (matcher, rawRules, byReg = false) => { matcher = [matcher] } - return matcher.map(m => { - const result = [] - rawRules.forEach(r => { - const tester = r[0] - if (isString(m)) { - if (byReg) { - if (isReg(tester) && tester.test(m)) { - result.push(r) + return matcher + .map(m => { + const result = [] + rawRules.forEach(r => { + const tester = r[0] + if (isString(m)) { + if (byReg) { + if (isReg(tester) && tester.test(m)) { + result.push(r) + } + } else { + if (isString(tester) && m === tester) { + result.push(r) + } } - } else { - if (isString(tester) && m === tester) { + } else if (isReg(m)) { + if (isString(tester) && m.test(tester)) { result.push(r) } } - } else if (isReg(m)) { - if (isString(tester) && m.test(tester)) { - result.push(r) - } - } + }) + return result }) - return result - }) - .filter(item => !!item.length) - .reduce((preV, curV) => preV.concat(curV), []) + .filter(item => !!item.length) + .reduce((preV, curV) => preV.concat(curV), []) +} + +export const globalKeywords = ['inherit', 'initial', 'revert', 'revert-layer', 'unset'] + +export const makeGlobalStaticRules = prefix => { + return globalKeywords.map(v => `${prefix}-${v}`) } export { From e238722be47039d1d491b458e0ff3edf1581ec4f Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Mon, 23 Dec 2024 14:58:10 +0800 Subject: [PATCH 028/128] [update]add new rules --- packages/unocss-base/lib/index.js | 1 + packages/unocss-base/lib/rn.js | 11 +++++++ .../unocss-base/preset-rn/rules/behaviors.js | 4 ++- .../unocss-base/preset-rn/rules/divider.js | 4 +++ packages/unocss-base/preset-rn/rules/index.js | 6 +++- packages/unocss-base/preset-rn/rules/ring.js | 4 +++ .../unocss-base/preset-rn/rules/shadow.js | 33 +++++++------------ .../unocss-base/preset-rn/rules/static.js | 5 +-- 8 files changed, 43 insertions(+), 25 deletions(-) create mode 100644 packages/unocss-base/preset-rn/rules/divider.js create mode 100644 packages/unocss-base/preset-rn/rules/ring.js diff --git a/packages/unocss-base/lib/index.js b/packages/unocss-base/lib/index.js index 2fb632e336..6fce37b29e 100644 --- a/packages/unocss-base/lib/index.js +++ b/packages/unocss-base/lib/index.js @@ -3,6 +3,7 @@ import { presetUno } from '@unocss/preset-uno' // eslint-disable-next-line const remRE = /(-?[\.\d]+)rem/g +// todo process.env.MPX_CURRENT_TARGET_MODE export default function presetMpx (options = {}) { const uno = presetUno(options) const { baseFontSize = 37.5 } = options diff --git a/packages/unocss-base/lib/rn.js b/packages/unocss-base/lib/rn.js index 619617cd62..910e9bf7d4 100644 --- a/packages/unocss-base/lib/rn.js +++ b/packages/unocss-base/lib/rn.js @@ -5,6 +5,7 @@ export default function presetRnMpx (options = {}) { name: '@mpxjs/unocss-preset-rn', ...presetRn, theme: { + preflightRoot: [], letterSpacing: { tighter: '-0.5px', tight: '-0.25px', @@ -12,6 +13,16 @@ export default function presetRnMpx (options = {}) { wide: '0.25px', wider: '0.5px', widest: '1px' + }, + boxShadow: { + DEFAULT: '0 1px 3px rgba(0 0 0 / 0.1)', + none: '0 0 rgba(0 0 0 / 0)', + sm: '0 1px 2px rgba(0 0 0 / 0.05)', + md: '0 4px 6px rgba(0 0 0 / 0.1)', + lg: '0 10px 15px rgba(0 0 0 / 0.1)', + xl: '0 20px 25px rgba(0 0 0 / 0.1)', + '2xl': '0 25px 50px rgba(0 0 0 / 0.25)', + inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)' } } } diff --git a/packages/unocss-base/preset-rn/rules/behaviors.js b/packages/unocss-base/preset-rn/rules/behaviors.js index 49f5991dba..655ef146cd 100644 --- a/packages/unocss-base/preset-rn/rules/behaviors.js +++ b/packages/unocss-base/preset-rn/rules/behaviors.js @@ -1,4 +1,5 @@ import { imageRenderings, overscrolls, listStyle } from '@unocss/preset-wind/rules' +import { outline } from '@unocss/preset-mini/rules' import { transformEmptyRule } from '../../utils/index.js' // todo @@ -8,6 +9,7 @@ export default [ ...transformEmptyRule( overscrolls, imageRenderings, - listStyle + listStyle, + outline ) ] diff --git a/packages/unocss-base/preset-rn/rules/divider.js b/packages/unocss-base/preset-rn/rules/divider.js new file mode 100644 index 0000000000..ddd5f0d229 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/divider.js @@ -0,0 +1,4 @@ +import { divides } from '@unocss/preset-wind/rules' +import { transformEmptyRule } from '../../utils/index.js' + +export default transformEmptyRule(divides) diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index cec1d0bf77..0b1c438399 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -7,6 +7,8 @@ import behaviors from './behaviors.js' import layout from './layout.js' import filters from './filters.js' import staticRule from './static.js' +import divider from './divider.js' +import ring from './ring.js' export default [ ...color, @@ -17,5 +19,7 @@ export default [ ...behaviors, ...layout, ...filters, - ...staticRule + ...staticRule, + ...divider, + ...ring ] diff --git a/packages/unocss-base/preset-rn/rules/ring.js b/packages/unocss-base/preset-rn/rules/ring.js new file mode 100644 index 0000000000..b6d2bd27ae --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/ring.js @@ -0,0 +1,4 @@ +import { rings } from '@unocss/preset-mini/rules' +import { transformEmptyRule } from '../../utils' + +export default transformEmptyRule(rings) diff --git a/packages/unocss-base/preset-rn/rules/shadow.js b/packages/unocss-base/preset-rn/rules/shadow.js index ac24e3786d..533bce0a85 100644 --- a/packages/unocss-base/preset-rn/rules/shadow.js +++ b/packages/unocss-base/preset-rn/rules/shadow.js @@ -1,28 +1,19 @@ -import { boxShadowsBase, boxShadows } from '@unocss/preset-mini/rules' +import { colorableShadows, colorResolver, h, hasParseableColor } from '@unocss/preset-mini/utils' -const findShadowColorRule = () => { - return boxShadows.find(rule => { - if (rule[0] instanceof RegExp && rule[0].test('shadow')) { - return rule - } - return false - }) || [] -} - -const shadowColorRule = findShadowColorRule() +const boxShadows = [ + [/^shadow(?:-(.+))?$/, (match, context) => { + const [, d] = match + const { theme } = context + const v = theme.boxShadow?.[d || 'DEFAULT'] + const c = d ? h.bracket.cssvar(d) : undefined -export default [ - [shadowColorRule[0], (match, context) => { - const rawHandler = shadowColorRule[1] - const rawResult = rawHandler(match, context) - if (rawResult['box-shadow']) { + if ((v != null || c != null) && !hasParseableColor(c, theme, 'shadowColor')) { return { - ...boxShadowsBase, - ...rawResult + 'box-shadow': colorableShadows(v || c, '--un-shadow-color').join(',') } - } else { - // 工具类 - return rawResult } + return colorResolver('--un-shadow-color', 'shadow', 'shadowColor')(match, context) }] ] + +export default boxShadows diff --git a/packages/unocss-base/preset-rn/rules/static.js b/packages/unocss-base/preset-rn/rules/static.js index 6e7adbbc56..f74fc7cae7 100644 --- a/packages/unocss-base/preset-rn/rules/static.js +++ b/packages/unocss-base/preset-rn/rules/static.js @@ -1,6 +1,7 @@ -import { backgroundBlendModes } from '@unocss/preset-wind/rules' +import { backgroundBlendModes, mixBlendModes } from '@unocss/preset-wind/rules' import { transformEmptyRule } from '../../utils/index.js' export default transformEmptyRule( - backgroundBlendModes + backgroundBlendModes, + mixBlendModes ) From dbccab7b5df10b0c3ab94518c23f461fa6e71714 Mon Sep 17 00:00:00 2001 From: mater Date: Mon, 23 Dec 2024 15:39:32 +0800 Subject: [PATCH 029/128] fix: rules --- .../unocss-base/preset-rn/rules/container.js | 7 ++++--- packages/unocss-base/preset-rn/rules/divide.js | 6 +++--- packages/unocss-base/preset-rn/rules/gap.js | 15 +++++++++++++-- packages/unocss-base/preset-rn/rules/index.js | 18 +++++++++++++----- .../unocss-base/preset-rn/rules/positions.js | 5 ----- packages/unocss-base/preset-rn/rules/size.js | 1 - packages/unocss-base/preset-rn/rules/svg.js | 7 ++++++- .../unocss-base/preset-rn/rules/transform.js | 1 - .../unocss-base/preset-rn/rules/transition.js | 7 ++++++- packages/unocss-base/utils/index.js | 1 + 10 files changed, 46 insertions(+), 22 deletions(-) delete mode 100644 packages/unocss-base/preset-rn/rules/size.js delete mode 100644 packages/unocss-base/preset-rn/rules/transform.js diff --git a/packages/unocss-base/preset-rn/rules/container.js b/packages/unocss-base/preset-rn/rules/container.js index 785be40087..2d1653f420 100644 --- a/packages/unocss-base/preset-rn/rules/container.js +++ b/packages/unocss-base/preset-rn/rules/container.js @@ -1,10 +1,11 @@ import { containerParent } from '@unocss/preset-mini/rules' +import { container } from '@unocss/preset-wind/rules' import { transformEmptyRule } from '../../utils/index.js' const containerParentRules = transformEmptyRule(containerParent) - -// TODO wind container +const containerRules = transformEmptyRule(container) export { - containerParentRules as containerParent + containerParentRules as containerParent, + containerRules as container } diff --git a/packages/unocss-base/preset-rn/rules/divide.js b/packages/unocss-base/preset-rn/rules/divide.js index b1769b0a01..7711fe9969 100644 --- a/packages/unocss-base/preset-rn/rules/divide.js +++ b/packages/unocss-base/preset-rn/rules/divide.js @@ -1,9 +1,9 @@ -import { divide } from '@unocss/preset-wind/rules' +import { divides } from '@unocss/preset-wind/rules' import { ruleCallback } from '../../utils/index.js' const unSupport = ['s', 'e', 'bs', 'be', 'is', 'ie', 'block', 'inline'] -const divideRules = divide.map(v => { +const divideRules = divides.map(v => { const [regex, matcher, ...another] = v return [ regex, @@ -16,4 +16,4 @@ const divideRules = divide.map(v => { ] }) -export { divideRules as divide } +export { divideRules as divides } diff --git a/packages/unocss-base/preset-rn/rules/gap.js b/packages/unocss-base/preset-rn/rules/gap.js index 36c5b5d403..94db3261aa 100644 --- a/packages/unocss-base/preset-rn/rules/gap.js +++ b/packages/unocss-base/preset-rn/rules/gap.js @@ -1,7 +1,18 @@ import { gaps } from '@unocss/preset-mini/rules' +import { ruleCallback } from '../../utils/index.js' -// TODO 这里要看下 gaps 的实现 需要移除grid -const gapsRules = gaps +const gapsRules = gaps.map(v => { + const [regex, matcher, ...another] = v + return [ + regex, + (...args) => { + const [[a]] = args + if (a.startsWith('grid')) return ruleCallback(...args) + return matcher(...args) + }, + ...another + ] +}) export { gapsRules as gaps diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index ff97e9c3e9..77d508c635 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -29,22 +29,24 @@ import { orders, placements, positions, - insets, floats, boxSizing } from './positions.js' import { flex } from './flex.js' import { globalRules } from './global.js' import { textAligns, verticalAligns } from './align.js' -import { containerParent } from './container.js' +import { container, containerParent } from './container.js' import { animations } from './animation.js' import { columns } from './columns.js' -import { divide } from './divide.js' +import { divides } from './divide.js' import { placeholders } from './placeholder.js' import { scrolls } from './scrolls.js' import { tables } from './table.js' import { touchActions } from './touch-actions.js' import { viewTransition } from './view-transition.js' +import { gaps } from './gap.js' +import { transitions } from './transition.js' +import { svgUtilities } from './svg.js' export default [ ...typography, @@ -59,6 +61,7 @@ export default [ ...backgroundStyles, // container ...containerParent, + ...container, // layout ...overflows, // positions @@ -68,7 +71,6 @@ export default [ ...justifies, ...orders, ...placements, - ...insets, ...flexGridJustifiesAlignments, ...boxSizing, // static @@ -96,7 +98,7 @@ export default [ // columns ...columns, // divide - ...divide, + ...divides, // placeholder ...placeholders, // scrolls @@ -107,6 +109,12 @@ export default [ ...touchActions, // view-transition ...viewTransition, + // gap + ...gaps, + // transition + ...transitions, + // svg + ...svgUtilities, // global ...globalRules ] diff --git a/packages/unocss-base/preset-rn/rules/positions.js b/packages/unocss-base/preset-rn/rules/positions.js index 3f4b0c08eb..b371f7b2de 100644 --- a/packages/unocss-base/preset-rn/rules/positions.js +++ b/packages/unocss-base/preset-rn/rules/positions.js @@ -4,7 +4,6 @@ import { orders, alignments, placements, - insets, floats, boxSizing } from '@unocss/preset-mini/rules' @@ -68,9 +67,6 @@ const flexGridJustifiesAlignmentsRules = transformEmptyRule([ ]) ]) -// TODO -const insetsRules = [...insets] - // floats 不支持的属性抽离并覆盖 const floatsRules = transformEmptyRule(floats) @@ -84,7 +80,6 @@ export { ordersRules as orders, placementsRules as placements, flexGridJustifiesAlignmentsRules as flexGridJustifiesAlignments, - insetsRules as insets, floatsRules as floats, boxSizingRules as boxSizing } diff --git a/packages/unocss-base/preset-rn/rules/size.js b/packages/unocss-base/preset-rn/rules/size.js deleted file mode 100644 index 700862bcc3..0000000000 --- a/packages/unocss-base/preset-rn/rules/size.js +++ /dev/null @@ -1 +0,0 @@ -// TODO 这里要看下 diff --git a/packages/unocss-base/preset-rn/rules/svg.js b/packages/unocss-base/preset-rn/rules/svg.js index 83a89f0dc9..6a9bd3c010 100644 --- a/packages/unocss-base/preset-rn/rules/svg.js +++ b/packages/unocss-base/preset-rn/rules/svg.js @@ -1 +1,6 @@ -// svg stroke 看起来装了其它就可以支持部分属性 +import { svgUtilities } from '@unocss/preset-mini/rules' +import { transformEmptyRule } from '../../utils/index.js' + +const svgUtilitiesRules = transformEmptyRule(svgUtilities) + +export { svgUtilitiesRules as svgUtilities } diff --git a/packages/unocss-base/preset-rn/rules/transform.js b/packages/unocss-base/preset-rn/rules/transform.js deleted file mode 100644 index 5ccb051971..0000000000 --- a/packages/unocss-base/preset-rn/rules/transform.js +++ /dev/null @@ -1 +0,0 @@ -// transform-gpu ? preserve-3d ? diff --git a/packages/unocss-base/preset-rn/rules/transition.js b/packages/unocss-base/preset-rn/rules/transition.js index bdc9a1f544..80f077f94e 100644 --- a/packages/unocss-base/preset-rn/rules/transition.js +++ b/packages/unocss-base/preset-rn/rules/transition.js @@ -1 +1,6 @@ -// 实验性支持 +import { transitions } from '@unocss/preset-mini/rules' +import { transformEmptyRule } from '../../utils/index.js' + +const transitionsRules = transformEmptyRule(transitions) + +export { transitionsRules as transitions } diff --git a/packages/unocss-base/utils/index.js b/packages/unocss-base/utils/index.js index 28a6d798e5..237733f673 100644 --- a/packages/unocss-base/utils/index.js +++ b/packages/unocss-base/utils/index.js @@ -17,6 +17,7 @@ const ruleCallback = ([match], { generator }) => { } const ruleFallback = (match, generator) => { + console.log(1212313, match, !!generator) generator._mpx2rnUnsuportedRules = generator._mpx2rnUnsuportedRules || [] generator._mpx2rnUnsuportedRules.push(match) return EMPTY From f5f416008f00e271d667af79f9143f916a8bbd17 Mon Sep 17 00:00:00 2001 From: mater Date: Mon, 23 Dec 2024 15:41:04 +0800 Subject: [PATCH 030/128] fix: console --- packages/unocss-base/utils/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/unocss-base/utils/index.js b/packages/unocss-base/utils/index.js index 237733f673..28a6d798e5 100644 --- a/packages/unocss-base/utils/index.js +++ b/packages/unocss-base/utils/index.js @@ -17,7 +17,6 @@ const ruleCallback = ([match], { generator }) => { } const ruleFallback = (match, generator) => { - console.log(1212313, match, !!generator) generator._mpx2rnUnsuportedRules = generator._mpx2rnUnsuportedRules || [] generator._mpx2rnUnsuportedRules.push(match) return EMPTY From dc6373f4cf0c2af19d44369d9df3853bef134085 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Mon, 23 Dec 2024 16:11:54 +0800 Subject: [PATCH 031/128] [update]optimize combine preset --- packages/unocss-base/lib/index.js | 14 +++++++++++--- packages/unocss-base/lib/rn.js | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/unocss-base/lib/index.js b/packages/unocss-base/lib/index.js index 6fce37b29e..009ec6d406 100644 --- a/packages/unocss-base/lib/index.js +++ b/packages/unocss-base/lib/index.js @@ -1,12 +1,19 @@ import { presetUno } from '@unocss/preset-uno' +import presetRn from './rn.js' // eslint-disable-next-line const remRE = /(-?[\.\d]+)rem/g -// todo process.env.MPX_CURRENT_TARGET_MODE export default function presetMpx (options = {}) { const uno = presetUno(options) const { baseFontSize = 37.5 } = options + const mpxCurrentTargetMode = process.env.MPX_CURRENT_TARGET_MODE + const isReact = mpxCurrentTargetMode === 'ios' || mpxCurrentTargetMode === 'android' + const extraPresets = [] + if (isReact) { + extraPresets.push(presetRn()) + } + return { ...uno, name: '@mpxjs/unocss-base', @@ -18,11 +25,12 @@ export default function presetMpx (options = {}) { util.entries.forEach((i) => { const value = i[1] if (typeof value === 'string' && remRE.test(value)) { - i[1] = value.replace(remRE, (_, p1) => process.env.MPX_CURRENT_TARGET_MODE === 'web' + i[1] = value.replace(remRE, (_, p1) => mpxCurrentTargetMode === 'web' ? `${p1 * baseFontSize * (100 / 750).toFixed(8)}vw` : `${p1 * baseFontSize}rpx`) } }) - } + }, + presets: extraPresets } } diff --git a/packages/unocss-base/lib/rn.js b/packages/unocss-base/lib/rn.js index 910e9bf7d4..430665c338 100644 --- a/packages/unocss-base/lib/rn.js +++ b/packages/unocss-base/lib/rn.js @@ -1,6 +1,6 @@ import presetRn from '../preset-rn/index.js' -export default function presetRnMpx (options = {}) { +export default function presetRnMpx () { return { name: '@mpxjs/unocss-preset-rn', ...presetRn, From b5e03c41c7817a3941555d3f58ee283bee50a9aa Mon Sep 17 00:00:00 2001 From: mater Date: Mon, 23 Dec 2024 17:10:37 +0800 Subject: [PATCH 032/128] fix: divide support --- packages/unocss-base/preset-rn/rules/divide.js | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/packages/unocss-base/preset-rn/rules/divide.js b/packages/unocss-base/preset-rn/rules/divide.js index 7711fe9969..bb490d0988 100644 --- a/packages/unocss-base/preset-rn/rules/divide.js +++ b/packages/unocss-base/preset-rn/rules/divide.js @@ -1,19 +1,6 @@ import { divides } from '@unocss/preset-wind/rules' -import { ruleCallback } from '../../utils/index.js' +import { transformEmptyRule } from '../../utils/index.js' -const unSupport = ['s', 'e', 'bs', 'be', 'is', 'ie', 'block', 'inline'] - -const divideRules = divides.map(v => { - const [regex, matcher, ...another] = v - return [ - regex, - (...args) => { - const [[, direction]] = args - if (unSupport.includes(direction)) return ruleCallback(...args) - return matcher(...args) - }, - ...another - ] -}) +const divideRules = transformEmptyRule(divides) export { divideRules as divides } From c4c982531a29bf961d6770210c8b8085c4728508 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 24 Dec 2024 11:48:19 +0800 Subject: [PATCH 033/128] [feat]support dark mode --- .../builtInMixins/styleHelperMixin.ios.js | 38 +++---------------- .../lib/template-compiler/compiler.js | 14 ++++++- 2 files changed, 18 insertions(+), 34 deletions(-) diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index 57df91849e..0ba7cecb9e 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -1,5 +1,5 @@ import { isObject, isArray, dash2hump, isFunction, cached, getFocusedNavigation } from '@mpxjs/utils' -import { Dimensions, StyleSheet } from 'react-native' +import { Dimensions, StyleSheet, Appearance } from 'react-native' function rpx (value) { const { width } = Dimensions.get('screen') @@ -37,35 +37,6 @@ function formatValue (value) { global.__formatValue = formatValue -// const escapeReg = /[()[\]{}#!.:,%'"+$]/g -// const escapeMap = { -// '(': '_pl_', -// ')': '_pr_', -// '[': '_bl_', -// ']': '_br_', -// '{': '_cl_', -// '}': '_cr_', -// '#': '_h_', -// '!': '_i_', -// '/': '_s_', -// '.': '_d_', -// ':': '_c_', -// ',': '_2c_', -// '%': '_p_', -// '\'': '_q_', -// '"': '_dq_', -// '+': '_a_', -// $: '_si_' -// } - -// const mpEscape = cached((str) => { -// return str.replace(escapeReg, function (match) { -// if (escapeMap[match]) return escapeMap[match] -// // unknown escaped -// return '_u_' -// }) -// }) - function concat (a = '', b = '') { return a ? b ? (a + ' ' + b) : a : b } @@ -208,11 +179,14 @@ export default function styleHelperMixin () { if (!mediaQueryClass.length) return '' // todo 后续可优化,cache 能力 const { width, height } = Dimensions.get('screen') + const colorScheme = Appearance.getColorScheme() const { entries, entriesMap } = global.__getUnoBreakpoints() - return mediaQueryClass.map(([className, breakpoints = []]) => { - const res = breakpoints.every(([prefix = '', point = 0]) => { + return mediaQueryClass.map(([className, querypoints = []]) => { + const res = querypoints.every(([prefix = '', point = 0]) => { if (prefix === 'landscape') return width > height if (prefix === 'portrait') return width <= height + if (prefix === 'dark') return colorScheme === 'dark' + if (prefix === 'light') return colorScheme === 'light' const size = formatValue(entriesMap[point] || point) const index = entries.findIndex(item => item[0] === point) const isGtPrefix = prefix.startsWith('min-') diff --git a/packages/webpack-plugin/lib/template-compiler/compiler.js b/packages/webpack-plugin/lib/template-compiler/compiler.js index 195957fbec..3804673d61 100644 --- a/packages/webpack-plugin/lib/template-compiler/compiler.js +++ b/packages/webpack-plugin/lib/template-compiler/compiler.js @@ -1071,6 +1071,7 @@ const initVariants = (unoCtx) => { const breakPointsReg = new RegExp(`([al]t-|[<~]|max-)?(${breakpoints})(?:${separators})`) const orientationReg = new RegExp(`(landscape|portrait)(?:${separators})`) const pseudoClassReg = new RegExp(`(hover)(?:${separators})`) // 目前仅处理了 hover 状态 + const colorSchemeReg = new RegExp(`(dark|light)(?:${separators})`) unoVariantCached = { sizePseudo: { rule: sizePseudoReg, @@ -1099,7 +1100,16 @@ const initVariants = (unoCtx) => { } } }, - pseudoClassReg + colorScheme: { + rule: colorSchemeReg, + matcher (input) { + return { + prefix: input[1], + point: '' + } + } + }, + pseudoClassReg, } return unoVariantCached } @@ -1108,7 +1118,7 @@ function processVariants (staticClass = '', variants) { const pseudoClass = {} const pseudoWithMediaQueryClass = [] const mediaQueryClass = [] - const bReg = [variants.sizePseudo, variants.breakPoints, variants.orientation] + const bReg = [variants.sizePseudo, variants.breakPoints, variants.orientation, variants.colorScheme] const newStaticClass = staticClass.split(/\s+/).map(rawClass => { let applied = true const className = rawClass From 8d21de4ab94bbfd4473eede98956999ce59aa44c Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 24 Dec 2024 14:10:52 +0800 Subject: [PATCH 034/128] [update]typograph rule --- .../unocss-base/preset-rn/rules/typography.js | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/packages/unocss-base/preset-rn/rules/typography.js b/packages/unocss-base/preset-rn/rules/typography.js index 9c1e291cac..3da6c174d3 100644 --- a/packages/unocss-base/preset-rn/rules/typography.js +++ b/packages/unocss-base/preset-rn/rules/typography.js @@ -2,9 +2,8 @@ import { transformEmptyRule, ruleFallback } from '../../utils/index.js' import { writingModes, writingOrientations, - hyphens - // fontVariantNumericBase, - // fontVariantNumeric + hyphens, + fontVariantNumeric } from '@unocss/preset-wind/rules' import { textStrokes, @@ -27,20 +26,6 @@ const textDecorations = [ [/^(?:underline|decoration)-offset-(.+)$/] ] -// todo 覆写 font-variant-numberic,和 RN 支持的属性拉齐 -// const newFontVariantNumberic = fontVariantNumeric.map(item => { -// const rule = item[0] -// const rawResult = item[1]() -// if (rule === 'normal-nums') { -// return item -// } else { -// return [rule, { -// ...fontVariantNumericBase, -// ...rawResult -// }] -// } -// }) - // vertical-align const newVerticalAlign = verticalAligns.map(item => { return [item[0], ([match, v], { generator }) => { @@ -66,7 +51,7 @@ export default [ textDecorations, textWraps, fontSmoothings, - // newFontVariantNumberic, + fontVariantNumeric, newVerticalAlign ) ] From a3dacd49fab9282e0249e4ab85377a4021b2e07f Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 24 Dec 2024 15:31:20 +0800 Subject: [PATCH 035/128] [update]border rule --- packages/unocss-base/preset-rn/rules/border.js | 17 +++++++++++++++++ packages/unocss-base/preset-rn/rules/index.js | 4 +++- packages/unocss-base/preset-rn/rules/ring.js | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 packages/unocss-base/preset-rn/rules/border.js diff --git a/packages/unocss-base/preset-rn/rules/border.js b/packages/unocss-base/preset-rn/rules/border.js new file mode 100644 index 0000000000..f4f5c4ee23 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/border.js @@ -0,0 +1,17 @@ +import { borders } from '@unocss/preset-mini/rules' +import { ruleCallback } from '../../utils/index.js' + +const bordersRules = borders.map(v => { + const [regex, matcher, ...another] = v + return [ + regex, + (...args) => { + const [[, a]] = args + if (['block', 'inline'].includes(a)) return ruleCallback(...args) + return matcher(...args) + }, + ...another + ] +}) + +export default bordersRules diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index 0b1c438399..dd37bc5427 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -9,6 +9,7 @@ import filters from './filters.js' import staticRule from './static.js' import divider from './divider.js' import ring from './ring.js' +import border from './border.js' export default [ ...color, @@ -21,5 +22,6 @@ export default [ ...filters, ...staticRule, ...divider, - ...ring + ...ring, + ...border ] diff --git a/packages/unocss-base/preset-rn/rules/ring.js b/packages/unocss-base/preset-rn/rules/ring.js index b6d2bd27ae..edc99c5eab 100644 --- a/packages/unocss-base/preset-rn/rules/ring.js +++ b/packages/unocss-base/preset-rn/rules/ring.js @@ -1,4 +1,4 @@ import { rings } from '@unocss/preset-mini/rules' -import { transformEmptyRule } from '../../utils' +import { transformEmptyRule } from '../../utils/index.js' export default transformEmptyRule(rings) From 30e96f7678d7fa66eb59cbc4c41a89c66ee85a18 Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 24 Dec 2024 16:21:18 +0800 Subject: [PATCH 036/128] fix: preset --- packages/unocss-base/preset-rn/rules/behaviors.js | 7 +++++-- packages/unocss-base/preset-rn/rules/index.js | 6 +++++- packages/unocss-base/preset-rn/rules/spacing.js | 15 ++------------- packages/unocss-base/preset-rn/rules/static.js | 10 ++++++++-- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/packages/unocss-base/preset-rn/rules/behaviors.js b/packages/unocss-base/preset-rn/rules/behaviors.js index db778cd036..ff9d22798a 100644 --- a/packages/unocss-base/preset-rn/rules/behaviors.js +++ b/packages/unocss-base/preset-rn/rules/behaviors.js @@ -1,4 +1,4 @@ -import { imageRenderings, overscrolls, listStyle } from '@unocss/preset-wind/rules' +import { imageRenderings, overscrolls, listStyle, accents, carets } from '@unocss/preset-wind/rules' import { appearance, outline, willChange } from '@unocss/preset-mini/rules' import { transformEmptyRule } from '../../utils/index.js' @@ -12,6 +12,9 @@ export default [ listStyle, outline, willChange, - appearance + appearance, + accents, + carets, + willChange ) ] diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index 77d508c635..8f84932aeb 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -21,7 +21,9 @@ import { textOverflows, fontStyles, fontSmoothings, - hyphens + hyphens, + objectPositions, + isolations } from './static.js' import { flexGridJustifiesAlignments, @@ -89,6 +91,8 @@ export default [ ...fontStyles, ...fontSmoothings, ...hyphens, + ...objectPositions, + ...isolations, // spaceing ...paddings, ...margins, diff --git a/packages/unocss-base/preset-rn/rules/spacing.js b/packages/unocss-base/preset-rn/rules/spacing.js index 50636cd665..5aea724497 100644 --- a/packages/unocss-base/preset-rn/rules/spacing.js +++ b/packages/unocss-base/preset-rn/rules/spacing.js @@ -1,6 +1,6 @@ import { margins, paddings } from '@unocss/preset-mini/rules' import { spaces } from '@unocss/preset-wind/rules' -import { ruleCallback } from '../../utils/index.js' +import { ruleCallback, transformEmptyRule } from '../../utils/index.js' const unSupport = [ 's', @@ -39,18 +39,7 @@ const marginsRules = margins.map(v => { ] }) -const spacesRules = spaces.map(v => { - const [regex, matcher, ...another] = v - return [ - regex, - (...args) => { - const [[, direction]] = args - if (unSupport.includes(direction)) return ruleCallback(...args) - return matcher(...args) - }, - ...another - ] -}) +const spacesRules = transformEmptyRule(spaces) export { paddingsRules as paddings, diff --git a/packages/unocss-base/preset-rn/rules/static.js b/packages/unocss-base/preset-rn/rules/static.js index ef5c63670b..6d210916b1 100644 --- a/packages/unocss-base/preset-rn/rules/static.js +++ b/packages/unocss-base/preset-rn/rules/static.js @@ -13,7 +13,7 @@ import { textWraps, whitespaces } from '@unocss/preset-mini/rules' -import { backgroundBlendModes, hyphens } from '@unocss/preset-wind/rules' +import { backgroundBlendModes, hyphens, isolations, objectPositions } from '@unocss/preset-wind/rules' import { findRawRules, transformEmptyRule } from '../../utils/index.js' // display不支持的属性抽离并覆盖 @@ -58,6 +58,10 @@ const fontSmoothingsRules = transformEmptyRule(fontSmoothings) const hyphensRules = transformEmptyRule(hyphens) +const objectPositionsRules = transformEmptyRule(objectPositions) + +const isolationsRules = transformEmptyRule(isolations) + export { backgroundBlendModesRules as backgroundBlendModes, displaysRules as displays, @@ -73,5 +77,7 @@ export { textOverflowsRules as textOverflows, fontStylesRules as fontStyles, fontSmoothingsRules as fontSmoothings, - hyphensRules as hyphens + hyphensRules as hyphens, + objectPositionsRules as objectPositions, + isolationsRules as isolations } From eaaf945d1f0934ae6991341431c9f0da1fd6cbdd Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 24 Dec 2024 20:59:49 +0800 Subject: [PATCH 037/128] fix: transform --- packages/unocss-base/preset-rn/rules/index.js | 3 + .../unocss-base/preset-rn/rules/transforms.js | 65 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 packages/unocss-base/preset-rn/rules/transforms.js diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index 20e1728ca8..e2fa45397a 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -52,6 +52,7 @@ import { transitions } from './transition.js' import { svgUtilities } from './svg.js' import ring from './ring.js' import border from './border.js' +import { transforms } from './transforms.js' export default [ ...typography, @@ -125,6 +126,8 @@ export default [ ...transitions, // svg ...svgUtilities, + // transforms + ...transforms, // global ...globalRules ] diff --git a/packages/unocss-base/preset-rn/rules/transforms.js b/packages/unocss-base/preset-rn/rules/transforms.js new file mode 100644 index 0000000000..d76a133a4a --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/transforms.js @@ -0,0 +1,65 @@ +import { transforms } from '@unocss/preset-mini/rules' + +const transformBase = { + '--un-rotate': '0deg', + '--un-rotate-x': '0deg', + '--un-rotate-y': '0deg', + '--un-rotate-z': '0deg', + '--un-scale-x': 1, + '--un-scale-y': 1, + '--un-scale-z': 1, + '--un-skew-x': '0deg', + '--un-skew-y': '0deg', + '--un-translate-x': 0, + '--un-translate-y': 0, + '--un-translate-z': 0 +} + +const checkVars = [ + '--un-rotate', + '--un-rotate-x', + '--un-rotate-y', + '--un-rotate-z', + '--un-skew-x', + '--un-skew-y' +] + +function getPreflight (preflightKeys) { + return Object.fromEntries(preflightKeys.map(key => [key, transformBase[key]])) +} + +const transformRules = transforms.map(v => { + const [regex, matcher, ...another] = v + const options = another[0] + if (options && options.custom && options.custom.preflightKeys) { + if (typeof matcher === 'function') { + return [ + regex, + (...args) => { + let res = matcher(...args) + if (res) { + const preflight = getPreflight(options.custom.preflightKeys) + if (Array.isArray(res)) { + res = Object.fromEntries(res) + } + res = Object.assign(preflight, res) + checkVars.forEach(key => { + if (res[key] !== undefined && res[key] === 0) { + res[key] = '0deg' + } + }) + } + return res + }, + ...another + ] + } + if (typeof matcher === 'object') { + const preflight = getPreflight(options.custom.preflightKeys) + Object.assign(matcher, preflight) + } + } + return v +}) + +export { transformRules as transforms } From c5cbd43f444da9e980dc347f36df7dad060b9612 Mon Sep 17 00:00:00 2001 From: mater Date: Wed, 25 Dec 2024 10:41:25 +0800 Subject: [PATCH 038/128] fix: format --- packages/unocss-base/utils/index.js | 68 +++++++++++++---------------- 1 file changed, 31 insertions(+), 37 deletions(-) diff --git a/packages/unocss-base/utils/index.js b/packages/unocss-base/utils/index.js index 28a6d798e5..0f1e460341 100644 --- a/packages/unocss-base/utils/index.js +++ b/packages/unocss-base/utils/index.js @@ -1,14 +1,14 @@ const EMPTY = ' ' -const isReg = reg => { +const isReg = (reg) => { return reg instanceof RegExp } -const isString = str => { +const isString = (str) => { return typeof str === 'string' } -const isFunction = fn => { +const isFunction = (fn) => { return typeof fn === 'function' } @@ -27,20 +27,15 @@ const genEmptyRule = (...rules) => { } const transformEmptyRule = (...rulesArr) => { - return rulesArr - .map(rules => - rules.map(rule => { - if (isString(rule[0])) { - // staticRule - return [ - [rule[0], null], - [new RegExp(`^${rule[0]}$`), ruleCallback] - ] - } - return [[rule[0], ruleCallback]] - }) - ) - .reduce((preV, curV) => preV.concat(...curV), []) + return rulesArr.map(rules => rules.map(rule => { + if (isString(rule[0])) { // staticRule + return [ + [rule[0], null], + [new RegExp(`^${rule[0]}$`), ruleCallback] + ] + } + return [[rule[0], ruleCallback]] + })).reduce((preV, curV) => preV.concat(...curV), []) } const findRawRules = (matcher, rawRules, byReg = false) => { @@ -48,31 +43,30 @@ const findRawRules = (matcher, rawRules, byReg = false) => { matcher = [matcher] } - return matcher - .map(m => { - const result = [] - rawRules.forEach(r => { - const tester = r[0] - if (isString(m)) { - if (byReg) { - if (isReg(tester) && tester.test(m)) { - result.push(r) - } - } else { - if (isString(tester) && m === tester) { - result.push(r) - } + return matcher.map(m => { + const result = [] + rawRules.forEach(r => { + const tester = r[0] + if (isString(m)) { + if (byReg) { + if (isReg(tester) && tester.test(m)) { + result.push(r) } - } else if (isReg(m)) { - if (isString(tester) && m.test(tester)) { + } else { + if (isString(tester) && m === tester) { result.push(r) } } - }) - return result + } else if (isReg(m)) { + if (isString(tester) && m.test(tester)) { + result.push(r) + } + } }) - .filter(item => !!item.length) - .reduce((preV, curV) => preV.concat(curV), []) + return result + }) + .filter(item => !!item.length) + .reduce((preV, curV) => preV.concat(curV), []) } export const globalKeywords = ['inherit', 'initial', 'revert', 'revert-layer', 'unset'] From 7e1327e47bd05b286644349ab19b95ae10959b5b Mon Sep 17 00:00:00 2001 From: mater Date: Wed, 25 Dec 2024 19:36:18 +0800 Subject: [PATCH 039/128] fix: support rule --- packages/unocss-base/preset-rn/rules/background.js | 6 +++--- packages/unocss-base/preset-rn/rules/positions.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/unocss-base/preset-rn/rules/background.js b/packages/unocss-base/preset-rn/rules/background.js index 5f8ccc9aff..25b1faef50 100644 --- a/packages/unocss-base/preset-rn/rules/background.js +++ b/packages/unocss-base/preset-rn/rules/background.js @@ -1,8 +1,8 @@ import { backgroundStyles } from '@unocss/preset-wind/rules' -import { findRawRules } from '../../utils/index.js' +import { findRawRules, transformEmptyRule } from '../../utils/index.js' // todo background-position 剔除 -const NewBackgroundRules = findRawRules( +const NewBackgroundRules = transformEmptyRule(findRawRules( [ // attachments 'bg-fixed', @@ -16,6 +16,6 @@ const NewBackgroundRules = findRawRules( /^bg-clip-.*/ ], backgroundStyles -) +)) export { NewBackgroundRules as backgroundStyles } diff --git a/packages/unocss-base/preset-rn/rules/positions.js b/packages/unocss-base/preset-rn/rules/positions.js index b371f7b2de..ddb2061ada 100644 --- a/packages/unocss-base/preset-rn/rules/positions.js +++ b/packages/unocss-base/preset-rn/rules/positions.js @@ -13,7 +13,7 @@ import { transformEmptyRule } from '../../utils/index.js' -const unSupport = ['sticky'] +const unSupport = ['sticky', 'fixed'] // position 不支持的属性抽离并覆盖 const positionsRules = positions.map(v => { const [regex, matcher, ...another] = v From 8161d1b1df8f792ec8bc6ba39510652dd66b072c Mon Sep 17 00:00:00 2001 From: mater Date: Thu, 26 Dec 2024 10:40:51 +0800 Subject: [PATCH 040/128] fix: wx build error --- legacy/windicss-plugin/lib/index.js | 2 +- packages/unocss-plugin/lib/index.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/legacy/windicss-plugin/lib/index.js b/legacy/windicss-plugin/lib/index.js index df2410a8c7..3de75d356f 100644 --- a/legacy/windicss-plugin/lib/index.js +++ b/legacy/windicss-plugin/lib/index.js @@ -165,7 +165,7 @@ class MpxWindicssPlugin { if (filepath) { compilation.fileDependencies.add(filepath) // fix jiti require cache for watch - delete require.cache[filepath] + // delete require.cache[filepath] } if (!config) { diff --git a/packages/unocss-plugin/lib/index.js b/packages/unocss-plugin/lib/index.js index 4b1d4536e4..e86212252b 100644 --- a/packages/unocss-plugin/lib/index.js +++ b/packages/unocss-plugin/lib/index.js @@ -2,7 +2,7 @@ import * as path from 'path' import { minimatch } from 'minimatch' import * as unoConfig from '@unocss/config' import * as core from '@unocss/core' -import * as mpxConfig from '@mpxjs/webpack-plugin/lib/config.js' +import mpxConfig from '@mpxjs/webpack-plugin/lib/config.js' import toPosix from '@mpxjs/webpack-plugin/lib/utils/to-posix.js' import fixRelative from '@mpxjs/webpack-plugin/lib/utils/fix-relative.js' import parseRequest from '@mpxjs/webpack-plugin/lib/utils/parse-request.js' @@ -220,7 +220,7 @@ class MpxUnocssPlugin { sources.forEach((item) => { compilation.fileDependencies.add(item) // fix jiti require cache for watch - delete require.cache[item] + // delete require.cache[item] }) const platformPreflights = platformPreflightsMap[mode] || [] From 77e9d1af0fa12d83bbd95e008dda5cc062d2c542 Mon Sep 17 00:00:00 2001 From: mater Date: Thu, 26 Dec 2024 10:46:53 +0800 Subject: [PATCH 041/128] fix: import --- packages/unocss-plugin/lib/index.js | 4 ++-- packages/unocss-plugin/lib/rn-plugin/index.js | 2 +- packages/unocss-plugin/lib/web-plugin/index.js | 7 +++---- packages/unocss-plugin/lib/web-plugin/utils.js | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/unocss-plugin/lib/index.js b/packages/unocss-plugin/lib/index.js index e86212252b..13497e0eee 100644 --- a/packages/unocss-plugin/lib/index.js +++ b/packages/unocss-plugin/lib/index.js @@ -12,7 +12,7 @@ import MpxWebpackPlugin from '@mpxjs/webpack-plugin' import { UnoCSSWebpackPlugin } from './web-plugin/index.js' import { UnoCSSRNWebpackPlugin } from './rn-plugin/index.js' import transformerDirectives from '@unocss/transformer-directives' -import * as transformerVariantGroup from '@unocss/transformer-variant-group' +import transformerVariantGroup from '@unocss/transformer-variant-group' import { parseClasses, parseStrings, @@ -33,7 +33,7 @@ import { mpEscape, cssRequiresTransform } from './transform.js' -import * as platformPreflightsMap from './platform.js' +import platformPreflightsMap from './platform.js' const { has } = set const { isWeb, isReact } = env diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index 9ebcb2a9e2..199463b87b 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -1,5 +1,5 @@ import WebpackSources from 'webpack-sources' -import * as nodePath from 'node:path' +import nodePath from 'path' import { createContext, normalizeAbsolutePath } from '../web-plugin/utils.js' import { RESOLVED_ID_RE } from '../web-plugin/consts.js' import { getClassMap } from '@mpxjs/webpack-plugin/lib/react/style-helper.js' diff --git a/packages/unocss-plugin/lib/web-plugin/index.js b/packages/unocss-plugin/lib/web-plugin/index.js index 9d20fe57a6..34bf444867 100644 --- a/packages/unocss-plugin/lib/web-plugin/index.js +++ b/packages/unocss-plugin/lib/web-plugin/index.js @@ -1,8 +1,8 @@ import WebpackSources from 'webpack-sources' import VirtualModulesPlugin from 'webpack-virtual-modules' -import * as nodePath from 'node:path' -import * as process from 'process' -import * as fs from 'fs' +import nodePath, { dirname } from 'path' +import process from 'process' +import fs from 'fs' import { createContext, getPath, @@ -16,7 +16,6 @@ import { resolveId, resolveLayer } from './consts.js' -import { dirname } from 'path' import { fileURLToPath } from 'url' const __dirname = dirname(fileURLToPath(import.meta.url)) diff --git a/packages/unocss-plugin/lib/web-plugin/utils.js b/packages/unocss-plugin/lib/web-plugin/utils.js index c88558bada..89d431a636 100644 --- a/packages/unocss-plugin/lib/web-plugin/utils.js +++ b/packages/unocss-plugin/lib/web-plugin/utils.js @@ -1,7 +1,7 @@ import * as pluginutils from '@rollup/pluginutils' import * as config from '@unocss/config' import * as core from '@unocss/core' -import * as nodePath from 'node:path' +import nodePath from 'path' import MagicString from 'magic-string' import remapping from '@ampproject/remapping' From b918849d0f161a07bd8075e3eef8c3f92690ee80 Mon Sep 17 00:00:00 2001 From: mater Date: Thu, 26 Dec 2024 11:37:22 +0800 Subject: [PATCH 042/128] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4transform?= =?UTF-8?q?=E4=BB=8E=E4=B8=80=E4=BA=9B=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/unocss-base/preset-rn/rules/transforms.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/unocss-base/preset-rn/rules/transforms.js b/packages/unocss-base/preset-rn/rules/transforms.js index d76a133a4a..bc18df1070 100644 --- a/packages/unocss-base/preset-rn/rules/transforms.js +++ b/packages/unocss-base/preset-rn/rules/transforms.js @@ -38,16 +38,15 @@ const transformRules = transforms.map(v => { (...args) => { let res = matcher(...args) if (res) { - const preflight = getPreflight(options.custom.preflightKeys) if (Array.isArray(res)) { res = Object.fromEntries(res) } - res = Object.assign(preflight, res) checkVars.forEach(key => { if (res[key] !== undefined && res[key] === 0) { res[key] = '0deg' } }) + delete res.transform } return res }, From dd43b0776c9f338f593d16c9503a9e6b5e658a62 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 26 Dec 2024 11:38:02 +0800 Subject: [PATCH 043/128] [update]preset --- packages/unocss-base/lib/index.js | 2 +- packages/unocss-base/lib/rn.js | 29 ------------------- packages/unocss-base/preset-rn/index.js | 11 ++++--- packages/unocss-base/preset-rn/theme.js | 21 ++++++++++++++ .../unocss-base/preset-rn/variants/index.js | 14 --------- .../unocss-base/preset-rn/variants/pseudo.js | 2 -- 6 files changed, 29 insertions(+), 50 deletions(-) delete mode 100644 packages/unocss-base/lib/rn.js create mode 100644 packages/unocss-base/preset-rn/theme.js delete mode 100644 packages/unocss-base/preset-rn/variants/index.js delete mode 100644 packages/unocss-base/preset-rn/variants/pseudo.js diff --git a/packages/unocss-base/lib/index.js b/packages/unocss-base/lib/index.js index 009ec6d406..887945a8f2 100644 --- a/packages/unocss-base/lib/index.js +++ b/packages/unocss-base/lib/index.js @@ -1,5 +1,5 @@ import { presetUno } from '@unocss/preset-uno' -import presetRn from './rn.js' +import presetRn from '../preset-rn/index.js' // eslint-disable-next-line const remRE = /(-?[\.\d]+)rem/g diff --git a/packages/unocss-base/lib/rn.js b/packages/unocss-base/lib/rn.js deleted file mode 100644 index 430665c338..0000000000 --- a/packages/unocss-base/lib/rn.js +++ /dev/null @@ -1,29 +0,0 @@ -import presetRn from '../preset-rn/index.js' - -export default function presetRnMpx () { - return { - name: '@mpxjs/unocss-preset-rn', - ...presetRn, - theme: { - preflightRoot: [], - letterSpacing: { - tighter: '-0.5px', - tight: '-0.25px', - normal: '0px', - wide: '0.25px', - wider: '0.5px', - widest: '1px' - }, - boxShadow: { - DEFAULT: '0 1px 3px rgba(0 0 0 / 0.1)', - none: '0 0 rgba(0 0 0 / 0)', - sm: '0 1px 2px rgba(0 0 0 / 0.05)', - md: '0 4px 6px rgba(0 0 0 / 0.1)', - lg: '0 10px 15px rgba(0 0 0 / 0.1)', - xl: '0 20px 25px rgba(0 0 0 / 0.1)', - '2xl': '0 25px 50px rgba(0 0 0 / 0.25)', - inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)' - } - } - } -} diff --git a/packages/unocss-base/preset-rn/index.js b/packages/unocss-base/preset-rn/index.js index f6fcff1cac..95be9bfd76 100644 --- a/packages/unocss-base/preset-rn/index.js +++ b/packages/unocss-base/preset-rn/index.js @@ -1,7 +1,10 @@ import rules from './rules/index.js' -import varaints from './variants/index.js' +import theme from './theme.js' -export default { - rules, - varaints +export default function presetRnMpx() { + return { + name: '@mpxjs/unocss-preset-rn', + rules, + theme + } } diff --git a/packages/unocss-base/preset-rn/theme.js b/packages/unocss-base/preset-rn/theme.js new file mode 100644 index 0000000000..5246340c28 --- /dev/null +++ b/packages/unocss-base/preset-rn/theme.js @@ -0,0 +1,21 @@ +export default { + preflightRoot: [], + letterSpacing: { + tighter: '-0.5px', + tight: '-0.25px', + normal: '0px', + wide: '0.25px', + wider: '0.5px', + widest: '1px' + }, + boxShadow: { + DEFAULT: '0 1px 3px rgba(0 0 0 / 0.1)', + none: '0 0 rgba(0 0 0 / 0)', + sm: '0 1px 2px rgba(0 0 0 / 0.05)', + md: '0 4px 6px rgba(0 0 0 / 0.1)', + lg: '0 10px 15px rgba(0 0 0 / 0.1)', + xl: '0 20px 25px rgba(0 0 0 / 0.1)', + '2xl': '0 25px 50px rgba(0 0 0 / 0.25)', + inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)' + } +} diff --git a/packages/unocss-base/preset-rn/variants/index.js b/packages/unocss-base/preset-rn/variants/index.js deleted file mode 100644 index 2432cf4725..0000000000 --- a/packages/unocss-base/preset-rn/variants/index.js +++ /dev/null @@ -1,14 +0,0 @@ -export default [ - // todo: do something for variants - // { - // name: 'custom-variant-container', - // match(matcher, ctx) { - // if (matcher.startsWith('hover:')) { - // console.log('the sm is:1111', ctx) - // return { - // } - // } - // }, - // order: -1 - // } -] diff --git a/packages/unocss-base/preset-rn/variants/pseudo.js b/packages/unocss-base/preset-rn/variants/pseudo.js deleted file mode 100644 index f987f0bb6f..0000000000 --- a/packages/unocss-base/preset-rn/variants/pseudo.js +++ /dev/null @@ -1,2 +0,0 @@ -// todo 确认 -// view 提供了 hover-class。没有提供 focus/active state 。 From db17b592092e84991d1a5682227c90f9fa976e1c Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 26 Dec 2024 14:32:46 +0800 Subject: [PATCH 044/128] [fix] --- packages/unocss-base/preset-rn/theme.js | 2 +- packages/unocss-plugin/lib/index.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/unocss-base/preset-rn/theme.js b/packages/unocss-base/preset-rn/theme.js index 5246340c28..b30341e74d 100644 --- a/packages/unocss-base/preset-rn/theme.js +++ b/packages/unocss-base/preset-rn/theme.js @@ -16,6 +16,6 @@ export default { lg: '0 10px 15px rgba(0 0 0 / 0.1)', xl: '0 20px 25px rgba(0 0 0 / 0.1)', '2xl': '0 25px 50px rgba(0 0 0 / 0.25)', - inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)' + inner: 'inset 0 2px 4px 0 rgba(0 0 0 / 0.05)' } } diff --git a/packages/unocss-plugin/lib/index.js b/packages/unocss-plugin/lib/index.js index 6548cb878b..6b6cd1505a 100644 --- a/packages/unocss-plugin/lib/index.js +++ b/packages/unocss-plugin/lib/index.js @@ -2,7 +2,7 @@ import * as path from 'path' import minimatch from 'minimatch' import * as unoConfig from '@unocss/config' import * as core from '@unocss/core' -import * as mpxConfig from '@mpxjs/webpack-plugin/lib/config.js' +import mpxConfig from '@mpxjs/webpack-plugin/lib/config.js' import toPosix from '@mpxjs/webpack-plugin/lib/utils/to-posix.js' import fixRelative from '@mpxjs/webpack-plugin/lib/utils/fix-relative.js' import parseRequest from '@mpxjs/webpack-plugin/lib/utils/parse-request.js' @@ -12,7 +12,7 @@ import MpxWebpackPlugin from '@mpxjs/webpack-plugin' import { UnoCSSWebpackPlugin } from './web-plugin/index.js' import { UnoCSSRNWebpackPlugin } from './rn-plugin/index.js' import transformerDirectives from '@unocss/transformer-directives' -import * as transformerVariantGroup from '@unocss/transformer-variant-group' +import transformerVariantGroup from '@unocss/transformer-variant-group' import { parseClasses, parseStrings, @@ -220,7 +220,7 @@ class MpxUnocssPlugin { sources.forEach((item) => { compilation.fileDependencies.add(item) // fix jiti require cache for watch - delete require.cache[item] + // delete require.cache[item] }) const platformPreflights = platformPreflightsMap[mode] || [] From dc6a12f6f8376df148b7f46eb8faa944b968efbc Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 26 Dec 2024 14:40:12 +0800 Subject: [PATCH 045/128] [fix]merge code from master --- .../src/platform/builtInMixins/styleHelperMixin.ios.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index a1f39e26f8..7c85f98bae 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -1,10 +1,5 @@ -<<<<<<< HEAD -import { isObject, isArray, dash2hump, isFunction, cached, getFocusedNavigation } from '@mpxjs/utils' +import { isObject, isArray, dash2hump, cached } from '@mpxjs/utils' import { Dimensions, StyleSheet, Appearance } from 'react-native' -======= -import { isObject, isArray, dash2hump, cached, isEmptyObject } from '@mpxjs/utils' -import { Dimensions, StyleSheet } from 'react-native' ->>>>>>> master let { width, height } = Dimensions.get('screen') @@ -176,7 +171,7 @@ export default function styleHelperMixin () { display: 'none' }) } - return result + return isEmptyObject(result) ? empty : result }, __getDynamicClass (dynamicClass, mediaQueryClass) { return [dynamicClass, this.__getMediaQueryClass(mediaQueryClass)] From 6d7a499a4ad74b2335dd1ebcd06a564ea180697a Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 26 Dec 2024 14:42:04 +0800 Subject: [PATCH 046/128] [fix]some method --- .../core/src/platform/builtInMixins/styleHelperMixin.ios.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index 7c85f98bae..338d2d7ac7 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -1,4 +1,4 @@ -import { isObject, isArray, dash2hump, cached } from '@mpxjs/utils' +import { isObject, isArray, dash2hump, cached, isEmptyObject } from '@mpxjs/utils' import { Dimensions, StyleSheet, Appearance } from 'react-native' let { width, height } = Dimensions.get('screen') From 769f7c7895ea0eef399ff0ff3835b3b0358c5f7b Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 26 Dec 2024 14:57:20 +0800 Subject: [PATCH 047/128] [fix]some error --- packages/unocss-plugin/lib/index.js | 2 +- packages/webpack-plugin/lib/react/processStyles.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/unocss-plugin/lib/index.js b/packages/unocss-plugin/lib/index.js index 564c8156e4..1b05752eb3 100644 --- a/packages/unocss-plugin/lib/index.js +++ b/packages/unocss-plugin/lib/index.js @@ -1,5 +1,5 @@ import * as path from 'path' -import minimatch from 'minimatch' +import { minimatch } from 'minimatch' import * as unoConfig from '@unocss/config' import * as core from '@unocss/core' import mpxConfig from '@mpxjs/webpack-plugin/lib/config.js' diff --git a/packages/webpack-plugin/lib/react/processStyles.js b/packages/webpack-plugin/lib/react/processStyles.js index e0a695540c..ca6bbeac35 100644 --- a/packages/webpack-plugin/lib/react/processStyles.js +++ b/packages/webpack-plugin/lib/react/processStyles.js @@ -63,7 +63,7 @@ module.exports = function (styles, { };\n let __unoClassMap global.__getUnoClassMap = function () { - if (__unoClassMap) { + if (!__unoClassMap) { __unoClassMap = __unoCssMapPlaceholder__ } return __unoClassMap From ce5fbd3aa9d5b2ced8046d94c6ee041b16d54ea8 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 26 Dec 2024 15:01:26 +0800 Subject: [PATCH 048/128] [fix]lint --- packages/unocss-base/preset-rn/index.js | 2 +- packages/webpack-plugin/lib/template-compiler/compiler.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/unocss-base/preset-rn/index.js b/packages/unocss-base/preset-rn/index.js index 95be9bfd76..6636a58e5f 100644 --- a/packages/unocss-base/preset-rn/index.js +++ b/packages/unocss-base/preset-rn/index.js @@ -1,7 +1,7 @@ import rules from './rules/index.js' import theme from './theme.js' -export default function presetRnMpx() { +export default function presetRnMpx () { return { name: '@mpxjs/unocss-preset-rn', rules, diff --git a/packages/webpack-plugin/lib/template-compiler/compiler.js b/packages/webpack-plugin/lib/template-compiler/compiler.js index 2568e22769..10c0354f27 100644 --- a/packages/webpack-plugin/lib/template-compiler/compiler.js +++ b/packages/webpack-plugin/lib/template-compiler/compiler.js @@ -1113,7 +1113,7 @@ const initVariants = (unoCtx) => { } } }, - pseudoClassReg, + pseudoClassReg } return unoVariantCached } From 5be0325dc0af2f3c3d00f96513adb914bbcfb648 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 26 Dec 2024 15:04:51 +0800 Subject: [PATCH 049/128] [update]the order of unocss and app css --- .../core/src/platform/builtInMixins/styleHelperMixin.ios.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index 338d2d7ac7..070bff2fec 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -149,11 +149,11 @@ export default function styleHelperMixin () { classString.split(/\s+/).forEach((className) => { if (classMap[className]) { Object.assign(result, classMap[className]) - } else if (unoClassMap[className]) { - Object.assign(result, unoClassMap[className]) } else if (appClassMap[className]) { // todo 全局样式在每个页面和组件中生效,以支持全局原子类,后续支持样式模块复用后可考虑移除 Object.assign(result, appClassMap[className]) + } else if (unoClassMap[className]) { + Object.assign(result, unoClassMap[className]) } else if (this.__props[className] && isObject(this.__props[className])) { // externalClasses必定以对象形式传递下来 Object.assign(result, this.__props[className]) From e14884b3586d93bdba2a69a0c85f6e25bfa81912 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 26 Dec 2024 15:33:34 +0800 Subject: [PATCH 050/128] little adjust --- .../core/src/platform/builtInMixins/styleHelperMixin.ios.js | 1 - packages/unocss-base/lib/index.js | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index 070bff2fec..95fe6eaaa6 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -178,7 +178,6 @@ export default function styleHelperMixin () { }, __getMediaQueryClass (mediaQueryClass = []) { if (!mediaQueryClass.length) return '' - // todo 后续可优化,cache 能力 const { width, height } = Dimensions.get('screen') const colorScheme = Appearance.getColorScheme() const { entries, entriesMap } = global.__getUnoBreakpoints() diff --git a/packages/unocss-base/lib/index.js b/packages/unocss-base/lib/index.js index 887945a8f2..4e82bf7898 100644 --- a/packages/unocss-base/lib/index.js +++ b/packages/unocss-base/lib/index.js @@ -5,14 +5,15 @@ import presetRn from '../preset-rn/index.js' const remRE = /(-?[\.\d]+)rem/g export default function presetMpx (options = {}) { - const uno = presetUno(options) - const { baseFontSize = 37.5 } = options const mpxCurrentTargetMode = process.env.MPX_CURRENT_TARGET_MODE const isReact = mpxCurrentTargetMode === 'ios' || mpxCurrentTargetMode === 'android' const extraPresets = [] if (isReact) { extraPresets.push(presetRn()) + options.dark = 'media' } + const uno = presetUno(options) + const { baseFontSize = 37.5 } = options return { ...uno, From c66de7267461e79afdf57c4ff897dabe7664412a Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 26 Dec 2024 16:42:26 +0800 Subject: [PATCH 051/128] [update]clear code --- .../unocss-base/preset-rn/rules/typography.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/packages/unocss-base/preset-rn/rules/typography.js b/packages/unocss-base/preset-rn/rules/typography.js index 610c746b64..7d29f300cb 100644 --- a/packages/unocss-base/preset-rn/rules/typography.js +++ b/packages/unocss-base/preset-rn/rules/typography.js @@ -25,21 +25,6 @@ const textDecorations = [ [/^(?:underline|decoration)-offset-(.+)$/] ] -// todo 覆写 font-variant-numberic,和 RN 支持的属性拉齐 -// const newFontVariantNumberic = fontVariantNumeric.map(item => { -// const rule = item[0] -// const rawResult = item[1]() -// if (rule === 'normal-nums') { -// return item -// } else { -// return [rule, { -// ...fontVariantNumericBase, -// ...rawResult -// }] -// } -// }) -// vertical-align - export default [ ...transformEmptyRule( textIndents, @@ -54,7 +39,6 @@ export default [ textDecorations, textWraps, fontSmoothings, - // newFontVariantNumberic, fontVariantNumeric ) ] From 459165eb90291b4325451566ee5c3e53452220eb Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 26 Dec 2024 18:31:23 +0800 Subject: [PATCH 052/128] [update]decoration & filter --- .../unocss-base/preset-rn/rules/decoration.js | 38 ++++++++++ .../unocss-base/preset-rn/rules/filters.js | 72 ++++++++++++------- packages/unocss-base/preset-rn/rules/index.js | 2 + .../unocss-base/preset-rn/rules/typography.js | 10 --- 4 files changed, 85 insertions(+), 37 deletions(-) create mode 100644 packages/unocss-base/preset-rn/rules/decoration.js diff --git a/packages/unocss-base/preset-rn/rules/decoration.js b/packages/unocss-base/preset-rn/rules/decoration.js new file mode 100644 index 0000000000..844ea95075 --- /dev/null +++ b/packages/unocss-base/preset-rn/rules/decoration.js @@ -0,0 +1,38 @@ +import { textDecorations } from '@unocss/preset-mini/rules' +import { transformEmptyRule, ruleCallback, findRawRules } from '../../utils/index.js' + +const unSupport = [ + 'auto', + 'from-font', + 'overline' +] + +const textDecorationsRules = textDecorations.map(v => { + const [regex, matcher, ...another] = v + if (typeof matcher === 'function') { + return [ + regex, + (...args) => { + const [[, v]] = args + if (unSupport.includes(v)) return ruleCallback(...args) + const res = matcher(...args) + if (res['text-decoration-thickness'] || res['text-underline-offset']) { + return ruleCallback(...args) + } + return res + }, + ...another + ] + } + return v +}) + +const textDecorationsWavyStyle = transformEmptyRule( + findRawRules(['underline-wavy', 'decoration-wavy'], textDecorationsRules) +) + +textDecorationsRules.push(...textDecorationsWavyStyle) + +export { + textDecorationsRules as textDecorations +} diff --git a/packages/unocss-base/preset-rn/rules/filters.js b/packages/unocss-base/preset-rn/rules/filters.js index 83c420a7a5..875535ded9 100644 --- a/packages/unocss-base/preset-rn/rules/filters.js +++ b/packages/unocss-base/preset-rn/rules/filters.js @@ -1,32 +1,50 @@ -import { filters } from '@unocss/preset-wind/rules' -import { findRawRules, ruleFallback, isFunction, transformEmptyRule } from '../../utils/index.js' +import { filters, filterBase } from '@unocss/preset-wind/rules' +import { transformEmptyRule, findRawRules, ruleCallback } from '../../utils/index.js' -// todo filter 只支持部分属性 -const newFilters = findRawRules([ - 'filter-blur', - 'filter-brightness-1', - 'filter-contrast-1', - 'filter-grayscale-1', - 'filter-hue-rotate-1', - 'filter-invert-1', - 'filter-saturate-1', - 'filter-sepia-1' -], filters, true).map(item => { - return [item[0], ([match], { generator }) => { - if (/^backdrop/.test(match)) { - return ruleFallback(match, generator) - } else { - return (isFunction(item[1]) && item[1]()) || '' - } - }] +const filterValue = [ + 'blur', + 'brightness', + 'contrast', + 'grayscale', + 'hue-rotate', + 'invert', + 'saturate', + 'sepia' +] + +const newFilters = filters.map(v => { + const [regex, matcher, ...another] = v + if (typeof matcher === 'function') { + return [ + regex, + (...args) => { + const [[r]] = args + if (/^backdrop/.test(r)) return ruleCallback(...args) + const res = matcher(...args) + // 统一作为工具类使用 + if (filterValue.some(i => r.includes(i))) { + delete res.filter + } + return res + }, + ...another + ] + } + return v }) -// backdrop-filter 不支持 -const backdropFilter = findRawRules([ - /^backdrop-filter-*/ -], filters) +const backDropFilter = transformEmptyRule( + findRawRules(['backdrop-filter', 'backdrop-filter-none'], filters) +) -export default [ - ...newFilters, - ...transformEmptyRule(backdropFilter) +const filterBaseRule = [ + ['filter', null], + ['filter', { + ...filterBase, + filter: 'var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)' + }] ] + +newFilters.push(...backDropFilter, ...filterBaseRule) + +export default newFilters diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index e2fa45397a..d9830f2368 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -53,9 +53,11 @@ import { svgUtilities } from './svg.js' import ring from './ring.js' import border from './border.js' import { transforms } from './transforms.js' +import { textDecorations } from './decoration.js' export default [ ...typography, + ...textDecorations, ...shadow, ...behaviors, ...filters, diff --git a/packages/unocss-base/preset-rn/rules/typography.js b/packages/unocss-base/preset-rn/rules/typography.js index 7d29f300cb..069054a998 100644 --- a/packages/unocss-base/preset-rn/rules/typography.js +++ b/packages/unocss-base/preset-rn/rules/typography.js @@ -16,15 +16,6 @@ import { fontSmoothings } from '@unocss/preset-mini/rules' -// decoration -const textDecorations = [ - // size - [/^(?:underline|decoration)-(?:size-)?(.+)$/], // todo size 会命中其他的规则 - [/^(?:underline|decoration)-(auto|from-font)$/], - // offset - [/^(?:underline|decoration)-offset-(.+)$/] -] - export default [ ...transformEmptyRule( textIndents, @@ -36,7 +27,6 @@ export default [ hyphens, writingModes, writingOrientations, - textDecorations, textWraps, fontSmoothings, fontVariantNumeric From c6dbef1497329b4e71541f28c066af38a51a6a82 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Fri, 27 Dec 2024 16:59:53 +0800 Subject: [PATCH 053/128] [update]add font theme --- packages/unocss-base/preset-rn/theme.js | 7 +++++++ packages/unocss-base/utils/index.js | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/packages/unocss-base/preset-rn/theme.js b/packages/unocss-base/preset-rn/theme.js index b30341e74d..eabbbd4017 100644 --- a/packages/unocss-base/preset-rn/theme.js +++ b/packages/unocss-base/preset-rn/theme.js @@ -1,3 +1,5 @@ +import { platformSelect } from '../utils/index.js' + export default { preflightRoot: [], letterSpacing: { @@ -17,5 +19,10 @@ export default { xl: '0 20px 25px rgba(0 0 0 / 0.1)', '2xl': '0 25px 50px rgba(0 0 0 / 0.25)', inner: 'inset 0 2px 4px 0 rgba(0 0 0 / 0.05)' + }, + fontFamily: { + sans: platformSelect({ android: 'san-serif', ios: "'system font'" }), + serif: platformSelect({ android: 'serif', ios: 'Georgia' }), + mono: platformSelect({ android: 'mono', ios: "'Courier New'" }) } } diff --git a/packages/unocss-base/utils/index.js b/packages/unocss-base/utils/index.js index 0f1e460341..1f932546ae 100644 --- a/packages/unocss-base/utils/index.js +++ b/packages/unocss-base/utils/index.js @@ -75,6 +75,11 @@ export const makeGlobalStaticRules = prefix => { return globalKeywords.map(v => `${prefix}-${v}`) } +export const platformSelect = (options = {}) => { + const platform = process.env.MPX_CURRENT_TARGET_MODE + return options[platform] || '' +} + export { genEmptyRule, transformEmptyRule, From 8d38f4d544a9a2222f6e04758822c7d904e8df1a Mon Sep 17 00:00:00 2001 From: mater Date: Thu, 2 Jan 2025 16:11:59 +0800 Subject: [PATCH 054/128] feat: docs --- docs-vuepress/.vuepress/config.js | 127 ++- docs-vuepress/.vuepress/enhanceApp.js | 5 + .../theme/global-components/ColorsPalette.vue | 28 + .../theme/global-components/SingleColor.vue | 39 + .../guide/platform/{index.md => platform.md} | 2 +- docs-vuepress/guide/platform/web.md | 1 + docs-vuepress/unocss/introduce.md | 1 + docs-vuepress/unocss/utilities.md | 80 ++ .../utilities/accessibility/screen-readers.md | 38 + .../unocss/utilities/animations/animation.md | 48 ++ .../unocss/utilities/animations/transforms.md | 431 ++++++++++ .../utilities/animations/transitions.md | 133 ++++ .../backgrounds/background-blend-mode.md | 14 + .../utilities/backgrounds/background.md | 209 +++++ .../unocss/utilities/backgrounds/gradients.md | 68 ++ .../behaviors/box-decoration-break.md | 16 + .../utilities/behaviors/image-rendering.md | 15 + .../unocss/utilities/behaviors/listings.md | 54 ++ .../unocss/utilities/behaviors/overflow.md | 18 + .../behaviors/overscroll-behavior.md | 25 + .../unocss/utilities/behaviors/placeholder.md | 61 ++ .../unocss/utilities/borders/border.md | 129 +++ .../unocss/utilities/borders/divider.md | 166 ++++ .../unocss/utilities/borders/outline.md | 73 ++ .../unocss/utilities/borders/ring.md | 170 ++++ .../unocss/utilities/effects/box-shadow.md | 63 ++ .../utilities/effects/mix-blend-mode.md | 17 + .../unocss/utilities/effects/opacity.md | 29 + .../utilities/filters/backdrop-filter.md | 312 ++++++++ .../unocss/utilities/filters/filter.md | 261 ++++++ .../unocss/utilities/general/colors.md | 33 + docs-vuepress/unocss/utilities/general/svg.md | 159 ++++ .../unocss/utilities/general/typography.md | 742 ++++++++++++++++++ .../unocss/utilities/general/variables.md | 3 + .../unocss/utilities/general/variants.md | 206 +++++ .../utilities/interactivity/accent-color.md | 14 + .../utilities/interactivity/appearance.md | 21 + .../unocss/utilities/interactivity/caret.md | 61 ++ .../unocss/utilities/interactivity/cursor.md | 37 + .../utilities/interactivity/pointer-events.md | 15 + .../unocss/utilities/interactivity/resize.md | 13 + .../interactivity/scroll-behavior.md | 18 + .../utilities/interactivity/scroll-snap.md | 43 + .../utilities/interactivity/touch-action.md | 36 + .../utilities/interactivity/user-select.md | 11 + .../utilities/interactivity/will-change.md | 10 + .../unocss/utilities/layout/aspect-ratio.md | 48 ++ .../unocss/utilities/layout/columns.md | 62 ++ .../unocss/utilities/layout/container.md | 87 ++ .../unocss/utilities/layout/display.md | 176 +++++ .../unocss/utilities/layout/flexbox.md | 205 +++++ docs-vuepress/unocss/utilities/layout/grid.md | 613 +++++++++++++++ .../unocss/utilities/layout/positioning.md | 490 ++++++++++++ .../unocss/utilities/layout/sizing.md | 223 ++++++ .../unocss/utilities/layout/spacing.md | 365 +++++++++ .../unocss/utilities/layout/tables.md | 571 ++++++++++++++ package.json | 18 +- 57 files changed, 6910 insertions(+), 3 deletions(-) create mode 100644 docs-vuepress/.vuepress/theme/global-components/ColorsPalette.vue create mode 100644 docs-vuepress/.vuepress/theme/global-components/SingleColor.vue rename docs-vuepress/guide/platform/{index.md => platform.md} (99%) create mode 100644 docs-vuepress/unocss/introduce.md create mode 100644 docs-vuepress/unocss/utilities.md create mode 100644 docs-vuepress/unocss/utilities/accessibility/screen-readers.md create mode 100644 docs-vuepress/unocss/utilities/animations/animation.md create mode 100644 docs-vuepress/unocss/utilities/animations/transforms.md create mode 100644 docs-vuepress/unocss/utilities/animations/transitions.md create mode 100644 docs-vuepress/unocss/utilities/backgrounds/background-blend-mode.md create mode 100644 docs-vuepress/unocss/utilities/backgrounds/background.md create mode 100644 docs-vuepress/unocss/utilities/backgrounds/gradients.md create mode 100644 docs-vuepress/unocss/utilities/behaviors/box-decoration-break.md create mode 100644 docs-vuepress/unocss/utilities/behaviors/image-rendering.md create mode 100644 docs-vuepress/unocss/utilities/behaviors/listings.md create mode 100644 docs-vuepress/unocss/utilities/behaviors/overflow.md create mode 100644 docs-vuepress/unocss/utilities/behaviors/overscroll-behavior.md create mode 100644 docs-vuepress/unocss/utilities/behaviors/placeholder.md create mode 100644 docs-vuepress/unocss/utilities/borders/border.md create mode 100644 docs-vuepress/unocss/utilities/borders/divider.md create mode 100644 docs-vuepress/unocss/utilities/borders/outline.md create mode 100644 docs-vuepress/unocss/utilities/borders/ring.md create mode 100644 docs-vuepress/unocss/utilities/effects/box-shadow.md create mode 100644 docs-vuepress/unocss/utilities/effects/mix-blend-mode.md create mode 100644 docs-vuepress/unocss/utilities/effects/opacity.md create mode 100644 docs-vuepress/unocss/utilities/filters/backdrop-filter.md create mode 100644 docs-vuepress/unocss/utilities/filters/filter.md create mode 100644 docs-vuepress/unocss/utilities/general/colors.md create mode 100644 docs-vuepress/unocss/utilities/general/svg.md create mode 100644 docs-vuepress/unocss/utilities/general/typography.md create mode 100644 docs-vuepress/unocss/utilities/general/variables.md create mode 100644 docs-vuepress/unocss/utilities/general/variants.md create mode 100644 docs-vuepress/unocss/utilities/interactivity/accent-color.md create mode 100644 docs-vuepress/unocss/utilities/interactivity/appearance.md create mode 100644 docs-vuepress/unocss/utilities/interactivity/caret.md create mode 100644 docs-vuepress/unocss/utilities/interactivity/cursor.md create mode 100644 docs-vuepress/unocss/utilities/interactivity/pointer-events.md create mode 100644 docs-vuepress/unocss/utilities/interactivity/resize.md create mode 100644 docs-vuepress/unocss/utilities/interactivity/scroll-behavior.md create mode 100644 docs-vuepress/unocss/utilities/interactivity/scroll-snap.md create mode 100644 docs-vuepress/unocss/utilities/interactivity/touch-action.md create mode 100644 docs-vuepress/unocss/utilities/interactivity/user-select.md create mode 100644 docs-vuepress/unocss/utilities/interactivity/will-change.md create mode 100644 docs-vuepress/unocss/utilities/layout/aspect-ratio.md create mode 100644 docs-vuepress/unocss/utilities/layout/columns.md create mode 100644 docs-vuepress/unocss/utilities/layout/container.md create mode 100644 docs-vuepress/unocss/utilities/layout/display.md create mode 100644 docs-vuepress/unocss/utilities/layout/flexbox.md create mode 100644 docs-vuepress/unocss/utilities/layout/grid.md create mode 100644 docs-vuepress/unocss/utilities/layout/positioning.md create mode 100644 docs-vuepress/unocss/utilities/layout/sizing.md create mode 100644 docs-vuepress/unocss/utilities/layout/spacing.md create mode 100644 docs-vuepress/unocss/utilities/layout/tables.md diff --git a/docs-vuepress/.vuepress/config.js b/docs-vuepress/.vuepress/config.js index 796588e020..c4714e9bf8 100644 --- a/docs-vuepress/.vuepress/config.js +++ b/docs-vuepress/.vuepress/config.js @@ -1,4 +1,107 @@ const { headerPlugin } = require('./headerMdPlugin') +const { presetUno } = require('unocss') +const UnoCSS = require('@unocss/webpack').default + +const unocss = { + '/unocss': [ + { + title: 'General', + children: [ + '/unocss/utilities/general/colors', + '/unocss/utilities/general/typography', + '/unocss/utilities/general/svg', + '/unocss/utilities/general/variants', + ], + }, + { + title: 'Accessibility', + children: [ + '/unocss/utilities/accessibility/screen-readers' + ], + }, + { + title: 'Animations', + children: [ + '/unocss/utilities/animations/animation', + '/unocss/utilities/animations/transforms', + '/unocss/utilities/animations/transitions' + ], + }, + { + title: 'Backgrounds', + children: [ + '/unocss/utilities/backgrounds/background', + '/unocss/utilities/backgrounds/gradients', + '/unocss/utilities/backgrounds/background-blend-mode' + ], + }, + { + title: 'Behaviors', + children: [ + '/unocss/utilities/behaviors/box-decoration-break', + '/unocss/utilities/behaviors/image-rendering', + '/unocss/utilities/behaviors/listings', + '/unocss/utilities/behaviors/overflow', + '/unocss/utilities/behaviors/overscroll-behavior', + '/unocss/utilities/behaviors/placeholder', + ], + }, + { + title: 'Borders', + children: [ + '/unocss/utilities/borders/border', + '/unocss/utilities/borders/divider', + '/unocss/utilities/borders/outline', + '/unocss/utilities/borders/ring', + ], + }, + { + title: 'Effects', + children: [ + '/unocss/utilities/effects/box-shadow', + '/unocss/utilities/effects/opacity', + '/unocss/utilities/effects/mix-blend-mode', + ], + }, + { + title: 'Filters', + children: [ + '/unocss/utilities/filters/filter', + '/unocss/utilities/filters/backdrop-filter', + ], + }, + { + title: 'Interactivity', + children: [ + '/unocss/utilities/interactivity/accent-color', + '/unocss/utilities/interactivity/appearance', + '/unocss/utilities/interactivity/cursor', + '/unocss/utilities/interactivity/caret', + '/unocss/utilities/interactivity/pointer-events', + '/unocss/utilities/interactivity/resize', + '/unocss/utilities/interactivity/scroll-behavior', + '/unocss/utilities/interactivity/touch-action', + '/unocss/utilities/interactivity/user-select', + '/unocss/utilities/interactivity/will-change', + ], + }, + { + title: 'Layout', + children: [ + // { title: 'Aspect Ratio', link: '/unocss/utilities/layout/aspect-ratio' }, + '/unocss/utilities/layout/columns', + '/unocss/utilities/layout/container', + '/unocss/utilities/layout/display', + '/unocss/utilities/layout/flexbox', + '/unocss/utilities/layout/grid', + '/unocss/utilities/layout/positioning', + '/unocss/utilities/layout/sizing', + '/unocss/utilities/layout/spacing', + '/unocss/utilities/layout/tables', + ], + }, + ] +} const sidebar = { '/guide/': [ @@ -119,7 +222,8 @@ const sidebar = { { title: '小程序跨端组件库 Mpx-cube-ui 开源啦', path: 'mpx-cube-ui' }, { title: 'Mpx-cli 插件化改造', path: 'mpx-cli-next' }, { title: 'Mpx 小程序单元测试能力建设与实践', path: 'unit-test'} - ] + ], + ...unocss } const nav = [ @@ -178,6 +282,27 @@ module.exports = { chainWebpack: (config, isServer) => { // 添加node_modules避免resolve错误 config.resolve.modules.add('node_modules') + config.module.rule('vue').uses.delete('cache-loader') + config.module.rule('tsx').uses.delete('cache-loader') + config.merge({ + cache: false + }) + config.plugin('extract-css').use(require('mini-css-extract-plugin'), [ + { + filename: '[name].css', + chunkFilename: '[name].[hash:9].css' + } + ]) + }, + configureWebpack: { + plugins: [ + UnoCSS({ + presets: [ + presetUno() + ], + configFile: false + }) + ] }, markdown: { // markdown-it-toc 的选项 diff --git a/docs-vuepress/.vuepress/enhanceApp.js b/docs-vuepress/.vuepress/enhanceApp.js index 878e2134de..dc9b21589e 100644 --- a/docs-vuepress/.vuepress/enhanceApp.js +++ b/docs-vuepress/.vuepress/enhanceApp.js @@ -1,3 +1,8 @@ +import a from 'uno.css' + +console.log(a); + + export default ({ router }) => { if (typeof process === 'undefined' || process.env.VUE_ENV !== 'server') { router.onReady(() => { diff --git a/docs-vuepress/.vuepress/theme/global-components/ColorsPalette.vue b/docs-vuepress/.vuepress/theme/global-components/ColorsPalette.vue new file mode 100644 index 0000000000..b51e4dd693 --- /dev/null +++ b/docs-vuepress/.vuepress/theme/global-components/ColorsPalette.vue @@ -0,0 +1,28 @@ + + + diff --git a/docs-vuepress/.vuepress/theme/global-components/SingleColor.vue b/docs-vuepress/.vuepress/theme/global-components/SingleColor.vue new file mode 100644 index 0000000000..6dd577884e --- /dev/null +++ b/docs-vuepress/.vuepress/theme/global-components/SingleColor.vue @@ -0,0 +1,39 @@ + + diff --git a/docs-vuepress/guide/platform/index.md b/docs-vuepress/guide/platform/platform.md similarity index 99% rename from docs-vuepress/guide/platform/index.md rename to docs-vuepress/guide/platform/platform.md index 290c3407c1..f01ebc3a0b 100644 --- a/docs-vuepress/guide/platform/index.md +++ b/docs-vuepress/guide/platform/platform.md @@ -11,7 +11,7 @@ Mpx以微信增强DSL为基础,支持跨端输出至多端小程序、web和 new MpxwebpackPlugin({ // mode为mpx编译的目标平台,可选值有(wx|ali|swan|qq|tt|jd|web|ios|android|harmony) mode: 'ali', - // srcMode为mpx编译的源码平台,目前仅支持wx + // srcMode为mpx编译的源码平台,目前仅支持wx srcMode: 'wx' }) ``` diff --git a/docs-vuepress/guide/platform/web.md b/docs-vuepress/guide/platform/web.md index e69de29bb2..9ec4f99340 100644 --- a/docs-vuepress/guide/platform/web.md +++ b/docs-vuepress/guide/platform/web.md @@ -0,0 +1 @@ +# 123 diff --git a/docs-vuepress/unocss/introduce.md b/docs-vuepress/unocss/introduce.md new file mode 100644 index 0000000000..bfd470dddb --- /dev/null +++ b/docs-vuepress/unocss/introduce.md @@ -0,0 +1 @@ +# 介绍 diff --git a/docs-vuepress/unocss/utilities.md b/docs-vuepress/unocss/utilities.md new file mode 100644 index 0000000000..f310f10e90 --- /dev/null +++ b/docs-vuepress/unocss/utilities.md @@ -0,0 +1,80 @@ +# Utilities + +## General + +- [Colors](/unocss/utilities/general/colors) +- [Typography](/unocss/utilities/general/typography) +- [SVG](/unocss/utilities/general/svg) +- [Variants](/unocss/utilities/general/variants) + +## Accessibility + +- [Screen Readers](/unocss/utilities/accessibility/screen-readers) + +## Animations + +- [Animation](/unocss/utilities/animations/animation) +- [Transforms](/unocss/utilities/animations/transforms) +- [Transitions](/unocss/utilities/animations/transitions) + +## Backgrounds + +- [Background](/unocss/utilities/backgrounds/background) +- [Gradients](/unocss/utilities/backgrounds/gradients) +- [Background Blend Mode](/unocss/utilities/backgrounds/background-blend-mode) + +## Behaviors + +- [Box Decoration Break](/unocss/utilities/behaviors/box-decoration-break) +- [Image Rendering](/unocss/utilities/behaviors/image-rendering) +- [Listings](/unocss/utilities/behaviors/listings) +- [Overflow](/unocss/utilities/behaviors/overflow) +- [Overscroll Behavior](/unocss/utilities/behaviors/overscroll-behavior) +- [Placeholder](/unocss/utilities/behaviors/placeholder) + +## Borders + +- [Border](/unocss/utilities/borders/border) +- [Divider](/unocss/utilities/borders/divider) +- [Outline](/unocss/utilities/borders/outline) +- [Ring](/unocss/utilities/borders/ring) + +## Effects + +- [Box Shadow](/unocss/utilities/effects/box-shadow) +- [Opacity](/unocss/utilities/effects/opacity) +- [Mix Blend Mode](/unocss/utilities/effects/mix-blend-mode) + +## Filters + +- [Filter](/unocss/utilities/filters/filter) +- [Backdrop Filter](/unocss/utilities/filters/backdrop-filter) + +## Interactivity + +- [Accent Color](/unocss/utilities/interactivity/accent-color) +- [Appearance](/unocss/utilities/interactivity/appearance) +- [Cursor](/unocss/utilities/interactivity/cursor) +- [Caret](/unocss/utilities/interactivity/caret) +- [Pointer Events](/unocss/utilities/interactivity/pointer-events) +- [Resize](/unocss/utilities/interactivity/resize) +- [Scroll Behavior](/unocss/utilities/interactivity/scroll-behavior) +- [Touch Action](/unocss/utilities/interactivity/touch-action) +- [User Select](/unocss/utilities/interactivity/user-select) +- [Will Change](/unocss/utilities/interactivity/will-change) + +## Layout + +- [Columns](/unocss/utilities/layout/columns) +- [Container](/unocss/utilities/layout/container) +- [Display](/unocss/utilities/layout/display) +- [Flexbox](/unocss/utilities/layout/flexbox) +- [Grid](/unocss/utilities/layout/grid) +- [Positioning](/unocss/utilities/layout/positioning) +- [Sizing](/unocss/utilities/layout/sizing) +- [Spacing](/unocss/utilities/layout/spacing) +- [Tables](/unocss/utilities/layout/tables) + +::: tip +Use the search bar to quickly find the utilities you need. +::: diff --git a/docs-vuepress/unocss/utilities/accessibility/screen-readers.md b/docs-vuepress/unocss/utilities/accessibility/screen-readers.md new file mode 100644 index 0000000000..7b47a6d6a4 --- /dev/null +++ b/docs-vuepress/unocss/utilities/accessibility/screen-readers.md @@ -0,0 +1,38 @@ +# Screen Readers + +Utilities for improving accessibility with screen readers. + +| Class | Properties | +| :---------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| sr-only | position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0; | +| not-sr-only | position: static;
width: auto;
height: auto;
padding: 0;
margin: 0;
overflow: visible;
clip: auto;
white-space: normal; | + +## Usage + +Use sr-only to hide an element visually without hiding it from screen readers: + +```html + + + Settings + +``` + +Use not-sr-only to undo sr-only, making an element visible to sighted users as well as screen readers. This can be +useful when you want to visually hide something on small screens but show it on larger screens for example: + +```html + + + Settings + +``` + +By default, responsive and focus variants are generated for these utilities. You can use focus:not-sr-only to make an +element visually hidden by default but visible when the user tabs to it — useful for "skip to content" links: + +```html + + Skip to content + +``` \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/animations/animation.md b/docs-vuepress/unocss/utilities/animations/animation.md new file mode 100644 index 0000000000..798f9ccf6d --- /dev/null +++ b/docs-vuepress/unocss/utilities/animations/animation.md @@ -0,0 +1,48 @@ +# Animation + +Utilities for animating elements with CSS animations. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + animation: { + 'spin-slow': 'spin 3s linear infinite', + }, + }, + }, +} +``` + +To add new animation @keyframes, use the keyframes section of your theme configuration: + +```js windi.config.js +export default { + theme: { + extend: { + keyframes: { + wiggle: { + '0%, 100%': { transform: 'rotate(-3deg)' }, + '50%': { transform: 'rotate(3deg)' }, + }, + }, + }, + }, +} +``` + + \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/animations/transforms.md b/docs-vuepress/unocss/utilities/animations/transforms.md new file mode 100644 index 0000000000..05076f2dd1 --- /dev/null +++ b/docs-vuepress/unocss/utilities/animations/transforms.md @@ -0,0 +1,431 @@ +# Transforms + +## Transform Type + +Utilities for controlling transform behavior. + + + +## Transform Style + +The transform-style utility sets whether children of an element are positioned in the 3D space or are flattened in the plane of the element. + + + +## Transform Origin + +Utilities for specifying the origin for an element's transformations. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + transformOrigin: { + 24: '6rem', + full: '100%', + }, + }, + }, +} +``` + + + +## Transform Rotate + +Utilities for rotating elements with transform. + + + + + +```js windi.config.js +export default { + theme: { + rotate: { + sq: '90deg', + }, + }, +} +``` + + + +### Rotate X + + + +### Rotate Y + + + +### Rotate Z + + + +## Transform Scale + +Utilities for scaling elements with transform. + + + +### Scale X + + + +### Scale Y + + + +### Scale Z + + + + + +```js windi.config.js +export default { + theme: { + scale: { + half: '.5', + full: '1', + }, + }, +} +``` + + + +## Transform Skew + +Utilities for skewing elements with transform. + +### Skew X + + + +### Skew Y + + + + + +```js windi.config.js +export default { + theme: { + extend: { + skew: { + sq: '90deg', + }, + }, + }, +} +``` + + + +## Transform Translate + +Utilities for translating elements with transform. + +### Translate X + + + +### Translate Y + + + +### Translate Z + + + + + +You can customize the global spacing scale in the theme.spacing or theme.extend.spacing sections of your windi.config.js file: + +```js windi.config.js +export default { + theme: { + extend: { + spacing: { + 72: '18rem', + 84: '21rem', + 96: '24rem', + }, + }, + }, +} +``` + +To customize the translate scale separately, use the theme.translate section of your windi.config.js file. + +```js windi.config.js +export default { + theme: { + extend: { + translate: { + '1/7': '14.2857143%', + '2/7': '28.5714286%', + '3/7': '42.8571429%', + '4/7': '57.1428571%', + '5/7': '71.4285714%', + '6/7': '85.7142857%', + }, + }, + }, +} +``` + + + +## Perspective + +The `perspect` utility determines the distance between the z=0 plane and the user in order to give a 3D-positioned element some perspective. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + perspective: { + '8xl': '96rem', + '9xl': '128rem', + }, + }, + }, +} +``` + + + + +## Perspective Origin + +The `perspect-origin` utility determines the position at which the viewer is looking. It is used as the vanishing point by the [perspect](#perspective) utility. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + perspectiveOrigin: { + tb150: '150% 150%', + tb200: '200% 200%', + }, + }, + }, +} +``` + + \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/animations/transitions.md b/docs-vuepress/unocss/utilities/animations/transitions.md new file mode 100644 index 0000000000..ed3e2d5f6f --- /dev/null +++ b/docs-vuepress/unocss/utilities/animations/transitions.md @@ -0,0 +1,133 @@ +# Transitions + +## Transition Property + +Utilities for controlling which CSS properties transition. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + transitionProperty: { + height: 'height', + spacing: 'margin, padding', + }, + }, + }, +} +``` + + + +## Transition Duration + +Utilities for controlling the duration of CSS transitions. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + transitionDuration: { + zero: '0ms', + long: '2000ms', + }, + }, + }, +} +``` + + + +## Transition Timing Function + +Utilities for controlling the easing of CSS transitions. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + transitionTimingFunction: { + 'in-expo': 'cubic-bezier(0.95, 0.05, 0.795, 0.035)', + 'out-expo': 'cubic-bezier(0.19, 1, 0.22, 1)', + }, + }, + }, +} +``` + + + +## Transition Delay + +Utilities for controlling the delay of CSS transitions. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + transitionDelay: { + zero: '0ms', + long: '2000ms', + }, + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/backgrounds/background-blend-mode.md b/docs-vuepress/unocss/utilities/backgrounds/background-blend-mode.md new file mode 100644 index 0000000000..5c75e527a1 --- /dev/null +++ b/docs-vuepress/unocss/utilities/backgrounds/background-blend-mode.md @@ -0,0 +1,14 @@ +# Background Blend Mode + +Utilities for controlling how an element's background image should blend with its background color. + + diff --git a/docs-vuepress/unocss/utilities/backgrounds/background.md b/docs-vuepress/unocss/utilities/backgrounds/background.md new file mode 100644 index 0000000000..cf4a870c60 --- /dev/null +++ b/docs-vuepress/unocss/utilities/backgrounds/background.md @@ -0,0 +1,209 @@ +# Background + +## Background Attachment + +Utilities for controlling how a background image behaves when scrolling. + + + +## Background Clip + +Utilities for controlling the bounding box of an element's background. + + + + + +## Background Color + +Utilities for controlling an element's background color. + + + + + +```js windi.config.js +export default { + theme: { + backgroundColor: theme => ({ + ...theme('colors'), + primary: '#3490dc', + secondary: '#ffed4a', + danger: '#e3342f', + }), + }, +} +``` + + + +## Background Opacity + +Utilities for controlling the opacity of an element's background color. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + opacity: { + light: '0.15', + }, + }, + }, +} +``` + + + +## Background Position + +Utilities for controlling the position of an element's background image. + + + + + +```js windi.config.js +export default { + theme: { + backgroundPosition: { + 'bottom': 'bottom', + 'bottom-4': 'center bottom 1rem', + 'center': 'center', + 'left': 'left', + 'left-bottom': 'left bottom', + 'left-top': 'left top', + 'right': 'right', + 'right-bottom': 'right bottom', + 'right-top': 'right top', + 'top': 'top', + 'top-4': 'center top 1rem', + }, + }, +} +``` + + + +## Background Repeat + +Utilities for controlling the repetition of an element's background image. + + + +## Background Size + +Utilities for controlling the background size of an element's background image. + + + + + +```js +export default { + theme: { + backgroundSize: { + 'auto': 'auto', + 'cover': 'cover', + 'contain': 'contain', + '50%': '50%', + '16': '4rem', + }, + }, +} +``` + + + +## Background Origin + +Utilities for controlling the background origin of an element's background image. + + diff --git a/docs-vuepress/unocss/utilities/backgrounds/gradients.md b/docs-vuepress/unocss/utilities/backgrounds/gradients.md new file mode 100644 index 0000000000..4993730fbb --- /dev/null +++ b/docs-vuepress/unocss/utilities/backgrounds/gradients.md @@ -0,0 +1,68 @@ +# Gradients + +Utilities for controlling background gradients. + +## Gradient Direction + + + + + +```js windi.config.js +export default { + theme: { + extend: { + backgroundImage: theme => ({ + 'hero-pattern': 'url(\'/img/hero-pattern.svg\')', + 'footer-texture': 'url(\'/img/footer-texture.png\')', + }), + }, + }, +} +``` + + + +## Gradient From + + + +## Gradient Via + + + +## Gradient To + + diff --git a/docs-vuepress/unocss/utilities/behaviors/box-decoration-break.md b/docs-vuepress/unocss/utilities/behaviors/box-decoration-break.md new file mode 100644 index 0000000000..69233a7b2b --- /dev/null +++ b/docs-vuepress/unocss/utilities/behaviors/box-decoration-break.md @@ -0,0 +1,16 @@ +# Box Decoration Break + +Utilities for controlling how element fragments should be rendered across multiple lines, columns, or pages. + + diff --git a/docs-vuepress/unocss/utilities/behaviors/image-rendering.md b/docs-vuepress/unocss/utilities/behaviors/image-rendering.md new file mode 100644 index 0000000000..1fd210a88e --- /dev/null +++ b/docs-vuepress/unocss/utilities/behaviors/image-rendering.md @@ -0,0 +1,15 @@ +# Image Rendering + +The `image-render` utility defines how the browser should render an image if it is scaled up or down from its original +dimensions. By default, each browser will attempt to apply aliasing to this scaled image in order to prevent distortion, +but this can sometimes be a problem if we want the image to preserve its original pixelated form. + + diff --git a/docs-vuepress/unocss/utilities/behaviors/listings.md b/docs-vuepress/unocss/utilities/behaviors/listings.md new file mode 100644 index 0000000000..b6c5f2de8e --- /dev/null +++ b/docs-vuepress/unocss/utilities/behaviors/listings.md @@ -0,0 +1,54 @@ +# Listings + +## List Style Type + +Utilities for controlling the bullet/number style of a list. + + + + + +```js windi.config.js +export default { + theme: { + listStyleType: { + none: 'none', + disc: 'disc', + decimal: 'decimal', + square: 'square', + roman: 'upper-roman', + }, + }, +} +``` + + + +## List Style Position + +Utilities for controlling the position of bullets/numbers in lists. + + \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/behaviors/overflow.md b/docs-vuepress/unocss/utilities/behaviors/overflow.md new file mode 100644 index 0000000000..8e3a7d3617 --- /dev/null +++ b/docs-vuepress/unocss/utilities/behaviors/overflow.md @@ -0,0 +1,18 @@ +# Overflow + +Utilities for controlling how an element handles content that is too large for the container. + + diff --git a/docs-vuepress/unocss/utilities/behaviors/overscroll-behavior.md b/docs-vuepress/unocss/utilities/behaviors/overscroll-behavior.md new file mode 100644 index 0000000000..4c098b6849 --- /dev/null +++ b/docs-vuepress/unocss/utilities/behaviors/overscroll-behavior.md @@ -0,0 +1,25 @@ +# Overscroll Behavior + +Utilities for controlling how the browser behaves when reaching the boundary of a scrolling area. + +- Use `auto` to make it possible for the user to continue scrolling a parent scroll area when they reach the boundary of + the primary scroll area. +- Use `none` to prevent scrolling in the target area from triggering scrolling in the parent element, and also prevent + "bounce" effects when scrolling past the end of the container. +- Use `contain` to prevent scrolling in the target area from triggering scrolling in the parent element, but preserve + "bounce" effects when scrolling past the end of the container in operating systems that support it. + + \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/behaviors/placeholder.md b/docs-vuepress/unocss/utilities/behaviors/placeholder.md new file mode 100644 index 0000000000..f0ad7f958e --- /dev/null +++ b/docs-vuepress/unocss/utilities/behaviors/placeholder.md @@ -0,0 +1,61 @@ +# Placeholder + +## Placeholder Color + +Utilities for controlling the color of placeholder text. + + + + + +```js windi.config.js +export default { + theme: { + placeholderColor: { + primary: '#3490dc', + secondary: '#ffed4a', + danger: '#e3342f', + }, + }, +} +``` + + + +## Placeholder Opacity + +Utilities for controlling the opacity of an element's placeholder color. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + placeholderOpacity: { + light: '0.1', + }, + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/borders/border.md b/docs-vuepress/unocss/utilities/borders/border.md new file mode 100644 index 0000000000..37ff0ce167 --- /dev/null +++ b/docs-vuepress/unocss/utilities/borders/border.md @@ -0,0 +1,129 @@ +# Border + +## Border Radius + +Utilities for controlling the border radius of an element. + + + + + +```js windi.config.js +export default { + theme: { + borderRadius: { + none: '0', + sm: '0.125rem', + DEFAULT: '4px', + md: '0.375rem', + lg: '0.5rem', + full: '9999px', + large: '12px', + }, + }, +} +``` + + + +## Border Width + +Utilities for controlling the width of an element's borders. + + + + + +```js windi.config.js +export default { + theme: { + borderWidth: { + DEFAULT: '1px', + none: '0', + sm: '2px', + }, + }, +} +``` + + + +## Border Color + +Utilities for controlling the color of an element's borders. + + + + + +You can customize your color palette by editing the `theme.colors` section of your `windi.config.js` file, or customize just your border colors using the theme.borderColor section. + +```js windi.config.js +export default { + theme: { + borderColor: theme => ({ + ...theme('colors'), + DEFAULT: theme('colors.gray.300', 'currentColor'), + primary: '#3490dc', + secondary: '#ffed4a', + danger: '#e3342f', + }), + }, +} +``` + + + +## Border Opacity + +Utilities for controlling the opacity of an element's border color. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + borderOpacity: { + light: '0.1', + }, + }, + }, +} +``` + + + +## Border Style + +Utilities for controlling the style of an element's borders. + + diff --git a/docs-vuepress/unocss/utilities/borders/divider.md b/docs-vuepress/unocss/utilities/borders/divider.md new file mode 100644 index 0000000000..061bc69b2d --- /dev/null +++ b/docs-vuepress/unocss/utilities/borders/divider.md @@ -0,0 +1,166 @@ +# Divider + +## Divider Width + +Utilities for controlling the border width between elements. + +#### Divide Y + + + +#### Divide X + + + + + +The divide width scale inherits its values from the `borderWidth` scale by default, so if you'd like to customize your values for both border width and divide width together, use the `theme.borderWidth` section of your `windi.config.js` file. + +```js windi.config.js +export default { + theme: { + borderWidth: { + DEFAULT: '1px', + 0: '0', + 2: '2px', + 3: '3px', + 4: '4px', + 6: '6px', + 8: '8px', + }, + }, +} +``` + +To customize only the divide width values, use the theme.divideWidth section of your windi.config.js file. + +```js windi.config.js +export default { + theme: { + divideWidth: { + DEFAULT: '1px', + 0: '0', + 2: '2px', + 3: '3px', + 4: '4px', + 6: '6px', + 8: '8px', + }, + }, +} +``` + + + +## Divider Color + +Utilities for controlling the border color between elements. + + + + + +```js windi.config.js +export default { + theme: { + divideColor: theme => ({ + ...theme('borderColors'), + primary: '#3490dc', + secondary: '#ffed4a', + danger: '#e3342f', + }), + }, +} +``` + + + +## Divider Opacity + +Utilities for controlling the opacity borders between elements. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + divideOpacity: { + 10: '0.1', + 20: '0.2', + 95: '0.95', + }, + }, + }, +} +``` + + + +## Divider Style + +Utilities for controlling the border style between elements. + + diff --git a/docs-vuepress/unocss/utilities/borders/outline.md b/docs-vuepress/unocss/utilities/borders/outline.md new file mode 100644 index 0000000000..4718f866ee --- /dev/null +++ b/docs-vuepress/unocss/utilities/borders/outline.md @@ -0,0 +1,73 @@ +# Outline + +Utilities for controlling an element's outline. + + + +## Outline Solid + + + +## Outline Dotted + + + + + +```js windi.config.js +export default { + theme: { + extend: { + outline: { + blue: '2px solid #0000ff', + }, + }, + }, +} +``` + +You can also provide an outline-offset value for any custom outline utilities using a tuple of the form [outline, outlineOffset]: + +```js windi.config.js +export default { + theme: { + extend: { + outline: { + blue: ['2px solid #0000ff', '1px'], + }, + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/borders/ring.md b/docs-vuepress/unocss/utilities/borders/ring.md new file mode 100644 index 0000000000..cfc30d24cf --- /dev/null +++ b/docs-vuepress/unocss/utilities/borders/ring.md @@ -0,0 +1,170 @@ +# Ring + +## Ring Width + +Utilities for creating outline rings with box-shadows. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + ringWidth: { + DEFAULT: '2px', + 6: '6px', + 10: '10px', + }, + }, + }, +} +``` + + + +## Ring Color + +Utilities for setting the color of outline rings. + + + + + +```js windi.config.js +const colors = require('windicss/colors') + +export default { + theme: { + ringColor: { + white: colors.white, + pink: colors.fuchsia, + }, + }, +} +``` + + + +## Ring Opacity + +Utilities for setting the opacity of outline rings. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + ringOpacity: { + 15: '0.15', + 35: '0.35', + 65: '0.65', + }, + }, + }, +} +``` + + + +## Ring Offset Width + +Utilities for simulating an offset when adding outline rings. + + + + + + +```js windi.config.js +export default { + theme: { + extend: { + ringOffsetWidth: { + 3: '3px', + 6: '6px', + 10: '10px', + }, + }, + }, +} +``` + + + +## Ring Offset Color + +Utilities for setting the color of outline ring offsets. + + + + + +```js windi.config.js +const colors = require('windicss/colors') + +export default { + theme: { + ringOffsetColor: { + white: colors.white, + pink: colors.fuchsia, + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/effects/box-shadow.md b/docs-vuepress/unocss/utilities/effects/box-shadow.md new file mode 100644 index 0000000000..c8aa3d7755 --- /dev/null +++ b/docs-vuepress/unocss/utilities/effects/box-shadow.md @@ -0,0 +1,63 @@ +# Box Shadow + +## Box Shadow Size + +Utilities for controlling the box shadow of an element. + + + + + +```js windi.config.js +export default { + theme: { + boxShadow: { + 'sm': '0 1px 2px 0 rgba(0, 0, 0, 0.05)', + 'DEFAULT': '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)', // If a DEFAULT shadow is provided, it will be used for the non-suffixed shadow utility. + 'md': '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)', + 'lg': '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)', + 'xl': '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)', + '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)', + '3xl': '0 35px 60px -15px rgba(0, 0, 0, 0.3)', + 'inner': 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)', + 'none': 'none', + }, + }, +} +``` + + + +## Box Shadow Color + + + + + +```js windi.config.js +export default { + theme: { + boxShadowColor: { + gray: '#1c1c1e', + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/effects/mix-blend-mode.md b/docs-vuepress/unocss/utilities/effects/mix-blend-mode.md new file mode 100644 index 0000000000..0dd7b83f7b --- /dev/null +++ b/docs-vuepress/unocss/utilities/effects/mix-blend-mode.md @@ -0,0 +1,17 @@ +# Mix Blend Mode + +Utilities for controlling how an element should blend with the background. + + diff --git a/docs-vuepress/unocss/utilities/effects/opacity.md b/docs-vuepress/unocss/utilities/effects/opacity.md new file mode 100644 index 0000000000..b6aa2a20f3 --- /dev/null +++ b/docs-vuepress/unocss/utilities/effects/opacity.md @@ -0,0 +1,29 @@ +# Opacity + +Utilities for controlling the opacity of an element. + + + + + + +```js windi.config.js +export default { + theme: { + opacity: { + light: '0.25', + full: '1', + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/filters/backdrop-filter.md b/docs-vuepress/unocss/utilities/filters/backdrop-filter.md new file mode 100644 index 0000000000..198ce3a704 --- /dev/null +++ b/docs-vuepress/unocss/utilities/filters/backdrop-filter.md @@ -0,0 +1,312 @@ +# Backdrop Filter + +Utilities for enabling and disabling backdrop filters on an element. + + + +## Backdrop Blur + + + + + +```js windi.config.js +export default { + theme: { + backdropBlur: { + '4xl': '72px', + '5xl': '96px', + '6xl': '128px', + }, + }, +} +``` + + + +## Backdrop Brightness + + + + + +```js windi.config.js +export default { + theme: { + backdropBrightness: { + sm: '50', + md: '100', + lg: '150', + }, + }, +} +``` + + + +## Backdrop Contrast + + + + + +```js windi.config.js +export default { + theme: { + backdropContrast: { + sm: '50', + md: '100', + lg: '150', + }, + }, +} +``` + + + +## Backdrop Grayscale + + + + + +```js windi.config.js +export default { + theme: { + backdropGrayscale: { + 50: '0.5', + 80: '0.8', + }, + }, +} +``` + + + +## Backdrop Hue Rotate + + + + + +```js windi.config.js +export default { + theme: { + backdropHueRotate: { + sm: '60', + lg: '90', + xl: '180', + }, + }, +} +``` + + + +## Backdrop Invert + + + + + +```js windi.config.js +export default { + theme: { + backdropInvert: { + sm: '0.5', + lg: '0.8', + }, + }, +} +``` + + + +## Backdrop Opacity + + + + + + +```js windi.config.js +export default { + theme: { + backdropOpacity: { + sm: '0.5', + lg: '0.8', + }, + }, +} +``` + + + +## Backdrop Saturate + + + + + +```js windi.config.js +export default { + theme: { + backdropSaturate: { + sm: '0.5', + md: '1', + lg: '1.5', + }, + }, +} +``` + + + +## Backdrop Sepia + + + + + +```js windi.config.js +export default { + theme: { + backdropSepia: { + sm: '0.5', + md: '0.8', + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/filters/filter.md b/docs-vuepress/unocss/utilities/filters/filter.md new file mode 100644 index 0000000000..a8c6ff1144 --- /dev/null +++ b/docs-vuepress/unocss/utilities/filters/filter.md @@ -0,0 +1,261 @@ +# Filter + +Utilities for enabling and disabling filters on an element. + + + +## Filter Blur + + + + + +```js windi.config.js +export default { + theme: { + blur: { + '4xl': '72px', + '5xl': '96px', + '6xl': '128px', + }, + }, +} +``` + + + +## Filter Brightness + + + + + +```js windi.config.js +export default { + theme: { + brightness: { + sm: '50', + md: '100', + lg: '150', + }, + }, +} +``` + + + +## Filter Contrast + + + + + +```js windi.config.js +export default { + theme: { + contrast: { + sm: '50', + md: '100', + lg: '150', + }, + }, +} +``` + + + +## Filter Drop Shadow + + + + + +```js windi.config.js +export default { + theme: { + dropShadow: { + '3xl': 'drop-shadow(0 30px 30px rgba(0, 0, 0, 0.2))', + '4xl': 'drop-shadow(0 40px 40px rgba(0, 0, 0, 0.3))', + }, + }, +} +``` + + + +## Filter Grayscale + + + + + +```js windi.config.js +export default { + theme: { + grayscale: { + 50: '0.5', + 80: '0.8', + }, + }, +} +``` + + + +## Filter Hue Rotate + + + + + +```js windi.config.js +export default { + theme: { + hueRotate: { + sm: '60', + lg: '90', + xl: '180', + }, + }, +} +``` + + + +## Filter Invert + + + + + +```js windi.config.js +export default { + theme: { + invert: { + sm: '0.5', + lg: '0.8', + }, + }, +} +``` + + + +## Filter Saturate + + + + + +```js windi.config.js +export default { + theme: { + saturate: { + sm: '0.5', + md: '1', + lg: '1.5', + }, + }, +} +``` + + + +## Filter Sepia + + + + + +```js windi.config.js +export default { + theme: { + sepia: { + sm: '0.5', + md: '0.8', + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/general/colors.md b/docs-vuepress/unocss/utilities/general/colors.md new file mode 100644 index 0000000000..fdd0fcecd2 --- /dev/null +++ b/docs-vuepress/unocss/utilities/general/colors.md @@ -0,0 +1,33 @@ +# Colors + + + +## Customization + +```ts windi.config.js +export default { + theme: { + colors: { + // Configure your color palette here + }, + }, +} +``` + +### Reuse Colors + +All the colors from the palette are enabled by default. If you want to set alias or reuse some colors from the palette, you can import them from `windicss/colors` module. + +```ts windi.config.js +import colors from 'windicss/colors' + +export default { + theme: { + extend: { + colors: { + grey: colors.gray, + }, + }, + }, +} +``` diff --git a/docs-vuepress/unocss/utilities/general/svg.md b/docs-vuepress/unocss/utilities/general/svg.md new file mode 100644 index 0000000000..093987810f --- /dev/null +++ b/docs-vuepress/unocss/utilities/general/svg.md @@ -0,0 +1,159 @@ +# SVG + +## Fill Color + +Utilities for styling the fill of SVG elements. + + + + + +```js windi.config.js +export default { + theme: { + fill: theme => ({ + red: theme('colors.red.500'), + green: theme('colors.green.500'), + blue: theme('colors.blue.500'), + }), + }, +} +``` + + + +## Stroke Color + +Utilities for styling the stroke of SVG elements. + + + + + +```js windi.config.js +export default { + theme: { + stroke: theme => ({ + red: theme('colors.red.500'), + green: theme('colors.green.500'), + blue: theme('colors.blue.500'), + }), + }, +} +``` + + + +## Stroke DashArray + +The `stroke-dash` utility is a presentation utility defining the pattern of dashes and gaps used to paint the outline of the shape; + + + +## Stroke DashOffset + +The `stroke-offset` utility is a presentation utility defining an offset on the rendering of the associated dash array. + + + +## Stroke LineCap + +The `stroke-cap` utility is a presentation utility defining the shape to be used at the end of open subpaths when they are stroked. + + + +## Stroke LineJoin + +The `stroke-join` utility is a presentation utility defining the shape to be used at the corners of paths when they are stroked. + + + +## Stroke Width + +Utilities for styling the stroke width of SVG elements. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + strokeWidth: { + sm: '4', + lg: '8', + }, + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/general/typography.md b/docs-vuepress/unocss/utilities/general/typography.md new file mode 100644 index 0000000000..1ad18e277f --- /dev/null +++ b/docs-vuepress/unocss/utilities/general/typography.md @@ -0,0 +1,742 @@ +# Typography + +## Font Family + +Utilities for controlling the font family of an element. + + + + + +```js +export default { + theme: { + extend: { + fontFamily: { + sans: ['ui-sans-serif', 'system-ui'], + serif: ['ui-serif', 'Georgia'], + mono: ['ui-monospace', 'SFMono-Regular'], + display: ['Oswald'], + body: ['Open Sans'], + }, + }, + }, +} +``` + +Font families can be specified as an array or as a simple comma-delimited string: + +```json5 +{ + // Array format: + "sans": ["Helvetica", "Arial", "sans-serif"], + // Comma-delimited format: + "sans": "Helvetica, Arial, sans-serif", +} +``` + +Note that Windi CSS does not automatically escape font names for you. If you're using a font that contains an invalid identifier, wrap it in quotes or escape the invalid characters. + +```json5 +{ + // Won't work: + "sans": ["Exo 2", /* ... */], + // Add quotes: + "sans": ["\"Exo 2\"", /* ... */], +} +``` + + + +## Font Size + +Utilities for controlling the font size of an element. + + + + + +```js windi.config.js +export default { + theme: { + fontSize: { + 'xs': '.75rem', + 'sm': '.875rem', + 'tiny': '.875rem', + 'base': '1rem', + 'lg': '1.125rem', + 'xl': '1.25rem', + '2xl': '1.5rem', + '3xl': '1.875rem', + '4xl': '2.25rem', + '5xl': '3rem', + '6xl': '4rem', + '7xl': '5rem', + }, + }, +} +``` + +You can provide a default line-height for each of your font-sizes using a tuple of the form [fontSize, lineHeight] in your windi.config.js file. + +```js windi.config.js +export default { + theme: { + fontSize: { + sm: ['14px', '20px'], + base: ['16px', '24px'], + lg: ['20px', '28px'], + xl: ['24px', '32px'], + }, + }, +} +``` + +If you also want to provide a default letter-spacing value for a font size, you can do so using a tuple of the form `[fontSize, { letterSpacing, lineHeight }]` in your windi.config.js file. + +```js windi.config.js +export default { + theme: { + fontSize: { + '2xl': ['24px', { + letterSpacing: '-0.01em', + }], + // Or with a default line-height as well + '3xl': ['32px', { + letterSpacing: '-0.02em', + lineHeight: '40px', + }], + }, + }, +} +``` + + + +## Font Smoothing + +Utilities for controlling the font smoothing of an element. + + + +## Font Style + +Utilities for controlling the style of text. + + + +## Font Weight + +Utilities for controlling the font weight of an element. + + + + + +```js windi.config.js +export default { + theme: { + fontWeight: { + 'hairline': 100, + 'extra-light': 100, + 'thin': 200, + 'light': 300, + 'normal': 400, + 'medium': 500, + 'semibold': 600, + 'bold': 700, + 'extrabold': 800, + 'extra-bold': 800, + 'black': 900, + }, + }, +} +``` + + + +## Font Variant Numeric + +Utilities for controlling the variant of numbers. + + + +## Hyphens + +The hyphens utilities specifies how words should be hyphenated when text wraps across multiple lines. It can prevent hyphenation entirely, hyphenate at manually-specified points within the text, or let the browser automatically insert hyphens where appropriate. + + + +## Letter Spacing + +Utilities for controlling the tracking (letter spacing) of an element. + + + + + +```js windi.config.js +export default { + theme: { + letterSpacing: { + tightest: '-.075em', + tighter: '-.05em', + tight: '-.025em', + normal: '0', + wide: '.025em', + wider: '.05em', + widest: '.25em', + }, + }, +} +``` + + + +## Line Height + +Utilities for controlling the leading (line height) of an element. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + lineHeight: { + 'extra-loose': '2.5', + }, + }, + }, +} +``` + + + +## Tab Size + +The tab-size utilities are used to customize the width of tab characters (U+0009). + + + + + +```js windi.config.js +export default { + theme: { + tabSize: { + sm: '2', + md: '4', + lg: '8', + }, + }, +} +``` + + + +## Text Alignment + +Utilities for controlling the alignment of text. + + + +## Text Color + +Utilities for controlling the text color of an element. + + + + + +```js windi.config.js +export default { + theme: { + textColor: { + primary: '#3490dc', + secondary: '#ffed4a', + danger: '#e3342f', + }, + }, +} +``` + + + +## Text Decoration + +Utilities for controlling the decoration of text. + +### Text Decoration Type + +Utilities for controlling the type of text decoration. + + + +### Text Decoration Color + +Utilities for controlling the color of text decoration. + + + + + +```js windi.config.js +export default { + theme: { + textDecorationColor: { + primary: '#3490dc', + secondary: '#ffed4a', + danger: '#e3342f', + }, + }, +} +``` + + + +### Text Decoration Style + +Utilities for controlling the style of text decoration. + + + +### Text Decoration Thickness + +Utilities for controlling the thickness of text decorations. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + textDecorationLength: { + sm: '1px', + md: '2px', + lg: '4px', + }, + }, + }, +} +``` + + + +### Text Decoration Offset + +Utilities for controlling the offset of text decoration. + + + + + +```js windi.config.js +export default { + theme: { + textDecorationOffset: { + sm: '1px', + md: '2px', + lg: '4px', + }, + }, +} +``` + + + +### Text Decoration Opacity + +Utilities for controlling the opacity of an element's decoration color. This is a fallback of +[Text Decoration Color](#text-decoration-color) beginning with WindiCSS v3.4.0. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + textDecorationOpacity: { + 10: '0.1', + 20: '0.2', + 95: '0.95', + }, + }, + }, +} +``` + + + +## Text Indent + +Utilities for controlling the indentation of text. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + textIndent: { + '4xl': '5rem', + '5xl': '6rem', + }, + }, + }, +} +``` + + + +## Text Opacity + +Utilities for controlling the opacity of an element's text color. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + textOpacity: { + 10: '0.1', + 20: '0.2', + 95: '0.95', + }, + }, + }, +} +``` + + + +## Text Shadow + +Utilities for controlling the shadow of a text element. + + + + + +```js windi.config.js +export default { + theme: { + textShadow: { + 'DEFAULT': '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)', // If a DEFAULT shadow is provided, it will be used for the non-suffixed shadow utility. + '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)', + '3xl': '0 35px 60px -15px rgba(0, 0, 0, 0.3)', + }, + }, +} +``` + + + +## Text Stroke + +Utilities for controlling the stroke of a text element. + +### Text Stroke Width + +Utilities for controlling the width of text stroke. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + textStrokeWidth: { + 'xl': '6', + '2xl': '8', + }, + }, + }, +} +``` + + + +### Text Stroke Color + +Utilities for controlling the color of text stroke. + + + + + +```js windi.config.js +export default { + theme: { + textStrokeColor: { + primary: '#3490dc', + secondary: '#ffed4a', + danger: '#e3342f', + }, + }, +} +``` + + + +## Text Transform + +Utilities for controlling the transformation of text. + + + +## Text Overflow + +Utilities for controlling text overflow in an element. + + + +## Vertical Alignment + +Utilities for controlling the vertical alignment of an inline or table-cell box. + + + +## Whitespace + +Utilities for controlling an element's white-space property. + + + +## Word Break + +Utilities for controlling word breaks in an element. + + + +## Writing Mode + +The `writing-mode` utility sets whether lines of text are laid out horizontally or vertically, as well as the direction in which blocks progress. When set for an entire document, it should be set on the root element (html element for HTML documents). + + + +## Writing Orientation + +The `writing-orientation` utility sets the orientation of the text characters in a line. It only affects text in vertical mode (when `writing-mode` is not `horizontal-tb`). It is useful for controlling the display of languages that use vertical script, and also for making vertical table headers. + + diff --git a/docs-vuepress/unocss/utilities/general/variables.md b/docs-vuepress/unocss/utilities/general/variables.md new file mode 100644 index 0000000000..a452526573 --- /dev/null +++ b/docs-vuepress/unocss/utilities/general/variables.md @@ -0,0 +1,3 @@ +# Variables + +> TODO: diff --git a/docs-vuepress/unocss/utilities/general/variants.md b/docs-vuepress/unocss/utilities/general/variants.md new file mode 100644 index 0000000000..34bd56086b --- /dev/null +++ b/docs-vuepress/unocss/utilities/general/variants.md @@ -0,0 +1,206 @@ +[pseudo-selector]: https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes + +# Variants + +Variants allow you to specify under what circumstances your utilities will be activated. + +You may use the screen size, system theme, or any [pseudo-selector], such as `:hover`. + +You specify a variant by using the `:` separator, and you can combine them arbitrarily as in: + +``` +sm:bg-red-500 sm:hover:bg-green-300 dark:bg-white +``` + +## Screen Variants + +### Mobile First + +| Variant | Rule | Description | +| :------ | :--- | :---------- | +| sm | @media (min-width: 640px) { ... } | Enable utility when the screen width is greater than 640px | +| md | @media (min-width: 768px) { ... } | Enable utility when the screen width is greater than 768px | +| lg | @media (min-width: 1024px) { ... } | Enable utility when the screen width is greater than 1024px | +| xl | @media (min-width: 1280px) { ... } | Enable utility when the screen width is greater than 1280px | +| 2xl | @media (min-width: 1536px) { ... } | Enable utility when the screen width is greater than 1536px | + +### Desktop First + +| Variant | Rule | Description | +| :------ | :--- | :---------- | +| + +### Parent Selectors + +| Variant | Rule | Description | +| :------ | :--- | :---------- | +| group-hover | `.group:hover .${utility} { ... }` | Targets an element when a marked parent matches the hover pseudo-class. | +| group-focus | `.group:focus .${utility} { ... }` | Targets an element when a marked parent matches the focus pseudo-class. | +| group-active | `.group:active .${utility} { ... }` | Targets an element when a marked parent matches the active pseudo-class. | +| group-visited | `.group:visited .${utility} { ... }` | Targets an element when a marked parent matches the visited pseudo-class. | + + +### Child Selectors + +| Variant | Rule | Description | +| :------ | :--- | :---------- | +| svg | `.${utility} svg { ... }` | Targets svg nodes. | +| all | `.${utility} * { ... }` | Targets all nodes. | +| children | `.${utility} > * { ... }` | Targets children nodes. | +| siblings | `.${utility} ~ * { ... }` | Targets siblings nodes . | +| sibling | `.${utility} + * { ... }` | Targets first sibling node. | + + +### Media Query + +| Variant | Rule | Description | +| :------ | :--- | :---------- | +| motion-safe | `@media (prefers-reduced-motion: no-preference) { ... }` | Targets the prefers-reduced-motion: no-preference media query. +| motion-reduce | `@media (prefers-reduced-motion: reduce) { ... }` | Targets the prefers-reduced-motion: reduce media query. + +## Theme Variants + +### Default + +| Variant | Rule | Description | +| :------ | :--- | :---------- | +| dark | `@media (prefers-color-scheme: dark) { ... }` or `.dark .{utility} { ... }` | Enable utility base on user configuration | +| light | `@media (prefers-color-scheme: light) { ... }` or `.light .{utility} { ... }` | Enable utility base on user configuration | + +### Following System + +| Variant | Rule | Description | +| :------ | :--- | :---------- | +| @dark | `@media (prefers-color-scheme: dark) { ... }` | Enable utility when the system turns on dark mode | +| @light | `@media (prefers-color-scheme: light) { ... }` | Enable utility when the system turns on light mode | + +### Following Application + +| Variant | Rule | Description | +| :------ | :--- | :---------- | +| .dark | `.dark .{utility} { ... }` | Enable utility base on application dark mode | +| .light | `.light .{utility} { ... }` | Enable utility base on application light mode | + +## Orientation Variants + +| Variant | Rule | Description | +| :-------- | :---------------------------------------- | :--------------------------------------------------------- | +| portrait | `@media (orientation: portrait) { ... }` | Enable utility when the device is in portrait orientation | +| landscape | `@media (orientation: landscape) { ... }` | Enable utility when the device is in landscape orientation | diff --git a/docs-vuepress/unocss/utilities/interactivity/accent-color.md b/docs-vuepress/unocss/utilities/interactivity/accent-color.md new file mode 100644 index 0000000000..7d77f96ea4 --- /dev/null +++ b/docs-vuepress/unocss/utilities/interactivity/accent-color.md @@ -0,0 +1,14 @@ +# Accent Color + +Utilities for controlling the accented color of a form control. + + diff --git a/docs-vuepress/unocss/utilities/interactivity/appearance.md b/docs-vuepress/unocss/utilities/interactivity/appearance.md new file mode 100644 index 0000000000..5ce662c6ec --- /dev/null +++ b/docs-vuepress/unocss/utilities/interactivity/appearance.md @@ -0,0 +1,21 @@ +# Appearance + +Utilities for suppressing native form control styling. + + diff --git a/docs-vuepress/unocss/utilities/interactivity/caret.md b/docs-vuepress/unocss/utilities/interactivity/caret.md new file mode 100644 index 0000000000..80a82329c0 --- /dev/null +++ b/docs-vuepress/unocss/utilities/interactivity/caret.md @@ -0,0 +1,61 @@ +# Caret + +## Caret Color + +Utilities for controlling the color of insertion text. + + + + + +```js windi.config.js +export default { + theme: { + caretColor: { + primary: '#3490dc', + secondary: '#ffed4a', + danger: '#e3342f', + }, + }, +} +``` + + + +## Caret Opacity + +Utilities for controlling the opacity of an element's caret color. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + caretOpacity: { + light: '0.1', + }, + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/interactivity/cursor.md b/docs-vuepress/unocss/utilities/interactivity/cursor.md new file mode 100644 index 0000000000..db7af303e3 --- /dev/null +++ b/docs-vuepress/unocss/utilities/interactivity/cursor.md @@ -0,0 +1,37 @@ +# Cursor + +Utilities for controlling the cursor style when hovering over an element. + + + + + +```js windi.config.js +export default { + theme: { + cursor: { + 'auto': 'auto', + 'default': 'default', + 'pointer': 'pointer', + 'wait': 'wait', + 'text': 'text', + 'move': 'move', + 'not-allowed': 'not-allowed', + 'crosshair': 'crosshair', + 'zoom-in': 'zoom-in', + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/interactivity/pointer-events.md b/docs-vuepress/unocss/utilities/interactivity/pointer-events.md new file mode 100644 index 0000000000..1012759bff --- /dev/null +++ b/docs-vuepress/unocss/utilities/interactivity/pointer-events.md @@ -0,0 +1,15 @@ +# Pointer Events + +Utilities for controlling whether an element responds to pointer events. + + diff --git a/docs-vuepress/unocss/utilities/interactivity/resize.md b/docs-vuepress/unocss/utilities/interactivity/resize.md new file mode 100644 index 0000000000..010efba148 --- /dev/null +++ b/docs-vuepress/unocss/utilities/interactivity/resize.md @@ -0,0 +1,13 @@ +# Resize + +Utilities for controlling how an element can be resized. + + \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/interactivity/scroll-behavior.md b/docs-vuepress/unocss/utilities/interactivity/scroll-behavior.md new file mode 100644 index 0000000000..338856f814 --- /dev/null +++ b/docs-vuepress/unocss/utilities/interactivity/scroll-behavior.md @@ -0,0 +1,18 @@ +# Scroll Behavior + +Utilities for controlling the scroll behavior of an element. + +| Class | Properties | +| :------------ | :----------------------- | +| scroll-auto | scroll-behavior: auto; | +| scroll-smooth | scroll-behavior: smooth; | + +## Usage + +Use the `scroll-smooth` utilities to enable smooth scrolling within an element. + +```html + + + +``` diff --git a/docs-vuepress/unocss/utilities/interactivity/scroll-snap.md b/docs-vuepress/unocss/utilities/interactivity/scroll-snap.md new file mode 100644 index 0000000000..8bf8599abb --- /dev/null +++ b/docs-vuepress/unocss/utilities/interactivity/scroll-snap.md @@ -0,0 +1,43 @@ +# Scroll Snap + +## Scroll Snap Align + +| Class | Properties | Description | +| :---------------------------- | :------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | +| `snap-start` | scroll-snap-align: start | | +| `snap-end` | scroll-snap-align: end | | +| `snap-center` | scroll-snap-align: center | | + +## Scroll Snap Stop + +| Class | Properties | Description | +| :---------------------------- | :------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | +| `snap-normal` | scroll-snap-stop: normal | | +| `snap-always` | scroll-snap-stop: always | | + +## Scroll Snap Type + +| Class | Properties | Description | +| :---------------------------- | :------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | +| `snap` | scroll-snap-type:
var(--scroll-snap-axis, both)
var(--scroll-snap-strictness, mandatory) | main snap class | +| __Strictness__ | | | +| `snap-none` | --scroll-snap-strictness: none | | +| `snap-mandatory` | --scroll-snap-strictness: mandatory | | +| `snap-proximity` | --scroll-snap-strictness: proximity | | +| __Axis__ | | | +| `snap-x` | --scroll-snap-axis: x | | +| `snap-y` | --scroll-snap-axis: y | | +| `snap-block` | --scroll-snap-axis: block | | +| `snap-inline` | --scroll-snap-axis: inline | | +| `snap-both` | --scroll-snap-axis: both | | + +## Margin, Padding and Other + +| Class | Properties | Description | +| :---------------------------- | :------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | +| __Margin__ | | | +| `snap-m${direction}-${value}` | scroll-snap-margin`${direction}`: `${value}` | same [Margin Utilities](/utilities/layout/spacing#margin) | +| __Padding__ | | | +| `snap-p${direction}-${value}` | scroll-snap-padding`${direction}`: `${value}` | same [Padding Utilities](/utilities/layout/spacing#padding) | +| __Other__ | | | +| `scrollbar-hide` | scrollbar-width: none
::-webkit-scrollbar: {
  display: none
} | visual hide scrollbar | \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/interactivity/touch-action.md b/docs-vuepress/unocss/utilities/interactivity/touch-action.md new file mode 100644 index 0000000000..caa23d54a8 --- /dev/null +++ b/docs-vuepress/unocss/utilities/interactivity/touch-action.md @@ -0,0 +1,36 @@ +# Touch Action + +Utilities for controlling how an element can be scrolled and zoomed on touchscreens. + +| Class | Properties | +| :---------------- | :-------------------------- | +| touch-auto | touch-action: auto; | +| touch-none | touch-action: none; | +| touch-pan-x | touch-action: pan-x; | +| touch-pan-left | touch-action: pan-left; | +| touch-pan-right | touch-action: pan-right; | +| touch-pan-y | touch-action: pan-y; | +| touch-pan-up | touch-action: pan-up; | +| touch-pan-down | touch-action: pan-down; | +| touch-pinch-zoom | touch-action: pinch-zoom; | +| touch-manipulation| touch-action: manipulation; | + +## Usage + +Use the `touch-{action}` utilities to control how an element can be scrolled (panned) and zoomed (pinched) on ` +touchscreens. + +```html +
+ +
+
+ +
+
+ +
+
+ +
+``` diff --git a/docs-vuepress/unocss/utilities/interactivity/user-select.md b/docs-vuepress/unocss/utilities/interactivity/user-select.md new file mode 100644 index 0000000000..bf6383c08f --- /dev/null +++ b/docs-vuepress/unocss/utilities/interactivity/user-select.md @@ -0,0 +1,11 @@ +# User Select + +Utilities for controlling whether the user can select text in an element. + + diff --git a/docs-vuepress/unocss/utilities/interactivity/will-change.md b/docs-vuepress/unocss/utilities/interactivity/will-change.md new file mode 100644 index 0000000000..834eb1f5fb --- /dev/null +++ b/docs-vuepress/unocss/utilities/interactivity/will-change.md @@ -0,0 +1,10 @@ +# Will Change + +Utilities for optimizing upcoming animations of elements that are expected to change. + +| Class | Properties | +| :-------------------- | :---------------------------- | +| will-change-auto | will-change: auto; | +| will-change-scroll | will-change: scroll-position; | +| will-change-contents | will-change: contents; | +| will-change-transform | will-change: transform; | diff --git a/docs-vuepress/unocss/utilities/layout/aspect-ratio.md b/docs-vuepress/unocss/utilities/layout/aspect-ratio.md new file mode 100644 index 0000000000..ffecc2362c --- /dev/null +++ b/docs-vuepress/unocss/utilities/layout/aspect-ratio.md @@ -0,0 +1,48 @@ +# Aspect Ratio + +## Utilities + +| Class | Properties | +| :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `aspect-auto` | aspect-ratio: auto; | +| `aspect-square` | aspect-ratio: 1 / 1; | +| `aspect-video` | aspect-ratio: 16 / 9; | +| `aspect-none` | position: 'static';
paddingBottom: '0';
'> *': {
 position: 'static';
 height: 'auto';
 width: 'auto';
 top: 'auto';
 right: 'auto';
 bottom: 'auto';
 left: 'auto';
} | +| `aspect-w-${float}` | --tw-aspect-w: `${float};` | +| `aspect-h-${float}` | --tw-aspect-h: `${float};` | +| `aspect-${fraction}` | position: 'relative';
paddingBottom: `${percent};`
'> *': {
 position: 'absolute';
 height: '100%';
 width: '100%';
 top: '0';
 right: '0';
 bottom: '0';
 left: '0';
} | + +*** + +`aspect-w-${float}` will add the following base styles: + +```css +.aspect-w-${float} { + position: 'relative'; + padding-bottom: 'calc(var(--tw-aspect-h) / var(--tw-aspect-w) * 100%)'; +} + +.aspect-w-${float} > * { + position: 'absolute'; + height: '100%'; + width: '100%'; + top: '0'; + right: '0'; + bottom: '0'; + left: '0'; +} +``` + +## Usage + +```js windi.config.js +export default { + theme: { + // ... + }, + plugins: [ + require('windicss/plugin/aspect-ratio'), + // ... + ], +} +``` diff --git a/docs-vuepress/unocss/utilities/layout/columns.md b/docs-vuepress/unocss/utilities/layout/columns.md new file mode 100644 index 0000000000..1780e7a546 --- /dev/null +++ b/docs-vuepress/unocss/utilities/layout/columns.md @@ -0,0 +1,62 @@ +# Columns + +## Columns + +Utilities for controlling the number of columns within an element. + + + +## Break After + +Utilities for controlling how a column or page should break after an element. + +| Class | Properties | +| :--------------------- | :----------------------- | +| break-after-auto | break-after: auto; | +| break-after-avoid | break-after: avoid; | +| break-after-all | break-after: all; | +| break-after-avoid-page | break-after: avoid-page; | +| break-after-page | break-after: page; | +| break-after-left | break-after: left; | +| break-after-right | break-after: right; | +| break-after-column | break-after: column; | + +## Break Before + +Utilities for controlling how a column or page should break before an element. + +| Class | Properties | +| :---------------------- | :------------------------ | +| break-before-auto | break-before: auto; | +| break-before-avoid | break-before: avoid; | +| break-before-all | break-before: all; | +| break-before-avoid-page | break-before: avoid-page; | +| break-before-page | break-before: page; | +| break-before-left | break-before: left; | +| break-before-right | break-before: right; | +| break-before-column | break-before: column; | + +## Break Inside + +Utilities for controlling how a column or page should break within an element. + +| Class | Properties | +| :------------------------ | :-------------------------- | +| break-inside-auto | break-inside: auto; | +| break-inside-avoid | break-inside: avoid; | +| break-inside-avoid-page | break-inside: avoid-page; | +| break-inside-avoid-column | break-inside: avoid-column; | diff --git a/docs-vuepress/unocss/utilities/layout/container.md b/docs-vuepress/unocss/utilities/layout/container.md new file mode 100644 index 0000000000..ba7c7da579 --- /dev/null +++ b/docs-vuepress/unocss/utilities/layout/container.md @@ -0,0 +1,87 @@ +# Container + +## Container + +A component for fixing an element's width to the current breakpoint. + +| Class | Breakpoint | Properties | +| :-------- | :------------- | :----------------- | +| container | *None* | width: 100%; | +| | sm *(640px)* | max-width: 640px; | +| | md *(768px)* | max-width: 768px; | +| | lg *(1024px)* | max-width: 1024px; | +| | xl *(1280px)* | max-width: 1280px; | +| | 2xl *(1536px)* | max-width: 1536px; | + +### Usage + +To center a container, use the mx-auto utility: + +```html +
+ +
+``` + +To add horizontal padding, use the `px-{size}` utilities: + +```html +
+ +
+``` + +To use a container at only a certain breakpoint and up: + +```html + +
+ +
+``` + + + +#### Centering by default + +```js windi.config.js +export default { + theme: { + container: { + center: true, + }, + }, +} +``` + +#### Horizontal padding + +```js windi.config.js +export default { + theme: { + container: { + padding: '2rem', + }, + }, +} +``` + +Specify a different padding amount for each breakpoint + +```js windi.config.js +export default { + theme: { + container: { + padding: { + 'DEFAULT': '1rem', + 'sm': '2rem', + 'lg': '4rem', + 'xl': '5rem', + '2xl': '6rem', + }, + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/layout/display.md b/docs-vuepress/unocss/utilities/layout/display.md new file mode 100644 index 0000000000..e5b0fec0d9 --- /dev/null +++ b/docs-vuepress/unocss/utilities/layout/display.md @@ -0,0 +1,176 @@ +# Display + +## Block + +The `block` utility generates a block element box, generating line breaks both before and after the element when in the +normal flow. + + + +## Inline Block + +The `inline-block` utility generates a block element box that will be flowed with surrounding content as if it were a +single inline box (behaving much like a replaced element would). + + + +## Inline + +The `inline` utility generates one or more inline element boxes that do not generate line breaks before or after +themselves. In normal flow, the next element will be on the same line if there is space. + + + +## Flow Root + +The `flow-root` utility generates a block element box that establishes a new +[block formatting context](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_formatting_context), defining +where the formatting root lies. + +| Class | Properties | +| :-------- | :------------------ | +| flow-root | display: flow-root; | + + + +## Contents + +The `contents` utilities don't produce a specific box by themselves. They are replaced by their pseudo-box and their +child boxes. + + + +## Hidden + +Turns off the `display` of an element so that it has no effect on layout (the document is rendered as though the element +did not exist). All descendant elements also have their display turned off. To have an element take up the space that it +would normally take, but without actually rendering anything, use the [visibility](#visibility) property instead. + + + +## Visibility + +Utilities for controlling the visibility of an element. The `visibility` CSS property shows or hides an element without +changing the layout of a document. The property can also hide rows or columns in a ``. + + + +## Backface Visibility + +The `backface` utility sets whether the back face of an element is visible when turned towards the user. + + + +## List Item + +The `list-item` utility generates a `::marker` pseudo-element with the content specified by its +[list-style](/utilities/general/typography#list-style-type) properties (for example a bullet point) together with a +principal box of the specified type for its own contents. + + \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/layout/flexbox.md b/docs-vuepress/unocss/utilities/layout/flexbox.md new file mode 100644 index 0000000000..0cda8b7fcd --- /dev/null +++ b/docs-vuepress/unocss/utilities/layout/flexbox.md @@ -0,0 +1,205 @@ +# Flexbox + +## Flex + +Use `flex` to create a block-level flex container. + + + +## Flex Basis + +Utilities for controlling the initial size of flex items. + + + +## Inline Flex + +Use `inline-flex` to create an inline flex container. + + + +## Flex Direction + +Utilities for controlling the direction of flex items. + + + +## Flex Wrap + +Utilities for controlling how flex items wrap. + + + +## Flex Stretch + +Utilities for controlling how flex items both grow and shrink. + + + + + +```js windi.config.js +export default { + theme: { + flex: { + 1: '1 1 0%', + auto: '1 1 auto', + initial: '0 1 auto', + inherit: 'inherit', + none: 'none', + 2: '2 2 0%', + }, + }, +} +``` + + + +## Flex Grow + +Utilities for controlling how flex items grow. + + + + + +```js windi.config.js +export default { + theme: { + flexGrow: { + 0: 0, + DEFAULT: 2, + 1: 1, + }, + }, +} +``` + + + +## Flex Shrink + +Utilities for controlling how flex items shrink. + + + + + +```js windi.config.js +export default { + theme: { + flexShrink: { + 0: 0, + DEFAULT: 2, + 1: 1, + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/layout/grid.md b/docs-vuepress/unocss/utilities/layout/grid.md new file mode 100644 index 0000000000..d3b132c38a --- /dev/null +++ b/docs-vuepress/unocss/utilities/layout/grid.md @@ -0,0 +1,613 @@ +# Grid + +## Grid + +Use `grid` to create a grid container. + + + +## Inline Grid + +Use `inline-grid` to create an inline grid container. + + + +## Grid Template Columns + +Utilities for specifying the columns in a grid layout. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + gridTemplateColumns: { + nt: 'repeat(16, minmax(0, 1fr))', + footer: '200px minmax(900px, 1fr) 100px', + }, + }, + }, +} +``` + + + +## Grid Template Rows + +Utilities for specifying the rows in a grid layout. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + gridTemplateRows: { + layout: '200px minmax(900px, 1fr) 100px', + }, + }, + }, +} +``` + + + +## Grid Column Span + +Utilities for specifying the column size of an element in a grid layout. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + gridColumn: { + 'span-16': 'span 16 / span 16', + }, + }, + }, +} +``` + + + +## Grid Row Span + +Utilities for specifying the row size of an element in a grid layout. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + gridRow: { + 'span-16': 'span 16 / span 16', + }, + }, + }, +} +``` + + + +## Grid Column Start + +Utilities to make an element start at the nth grid line. These utilities should be combined with the [col-end](#grid-column-end) or [col-span](#grid-column-span) utilities to span a specific number of columns. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + gridColumnStart: { + first: '1', + }, + }, + }, +} +``` + + + +## Grid Column End + +Utilities to make an element end at the nth grid line. These utilities should be combined with the [col-start](#grid-column-start) or [col-span](#grid-column-span) utilities to span a specific number of columns. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + gridColumnEnd: { + last: '20', + }, + }, + }, +} +``` + + + +## Grid Row Start + +Utilities to make an element start at the nth grid line. These utilities should be combined with the [row-end](#grid-row-end) or [row-span](#grid-row-span) utilities to span a specific number of rows. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + gridRowStart: { + first: '1', + }, + }, + }, +} +``` + + + +## Grid Row End + +Utilities to make an element end at the nth grid line. These utilities should be combined with the [row-start](#grid-row-start) or [row-span](#grid-row-span) utilities to span a specific number of rows. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + gridRowEnd: { + last: '20', + }, + }, + }, +} +``` + + + +## Grid Auto Flow + +Utilities for controlling how elements in a grid are auto-placed. + + + +## Grid Auto Columns + +Utilities for controlling the size of implicitly-created grid columns. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + gridAutoColumns: { + '2fr': 'minmax(0, 2fr)', + }, + }, + }, +} +``` + + + +## Grid Auto Rows + +Utilities for controlling the size of implicitly-created grid rows. + + + + + +```js windi.config.js +export default { + theme: { + extend: { + gridAutoRows: { + '2fr': 'minmax(0, 2fr)', + }, + }, + }, +} +``` + + + +## Gap + +Utilities for controlling gutters between grid rows and columns. + + + + + +You can customize the global spacing scale in the theme.spacing or theme.extend.spacing sections of your windi.config.js file: + +```js windi.config.js +export default { + theme: { + extend: { + spacing: { + lg: '18rem', + }, + }, + }, +} +``` + +To customize the gap scale separately, use the gap section of your Tailwind theme config. + +```js windi.config.js +export default { + theme: { + extend: { + gap: { + sm: '2.75rem', + }, + }, + }, +} +``` + + + +## Gap X + +Utilities for controlling gutters between grid columns. + + + +## Gap Y + +Utilities for controlling gutters between grid rows. + + diff --git a/docs-vuepress/unocss/utilities/layout/positioning.md b/docs-vuepress/unocss/utilities/layout/positioning.md new file mode 100644 index 0000000000..2a9f58341f --- /dev/null +++ b/docs-vuepress/unocss/utilities/layout/positioning.md @@ -0,0 +1,490 @@ +# Positioning + +## Order + +Utilities for controlling the order of flex and grid items. + + + + + +```js windi.config.js +export default { + theme: { + order: { + first: '-9999', + last: '9999', + none: '0', + normal: '0', + }, + }, +} +``` + + + +## Justify Content + +Utilities for controlling how flex and grid items are positioned along a container's main axis. + + + +## Justify Items + +Utilities for controlling how grid items are aligned along their inline axis. + + + +## Justify Self + +Utilities for controlling how an individual grid item is aligned along its inline axis. + + + +## Align Content + +Utilities for controlling how rows are positioned in multi-row flex and grid containers. + + + +## Align Items + +Utilities for controlling how flex and grid items are positioned along a container's cross axis. + + + +## Align Self + +Utilities for controlling how an individual flex or grid item is positioned along its container's cross axis. + + + +## Place Content + +Utilities for controlling how content is justified and aligned at the same time. + + + +## Place Items + +Utilities for controlling how items are justified and aligned at the same time. + + + +## Place Self + +Utilities for controlling how an individual item is justified and aligned at the same time. + + + +## Position + +Utilities for controlling how an element is positioned in the DOM. + + + +## Top / Right / Bottom / Left + +Utilities for controlling the placement of positioned elements. + +### Inset + + + + + +```js windi.config.js +export default { + theme: { + inset: { + sm: '1rem', + lg: '4rem', + }, + }, +} +``` + + + +### Inset Y + + + +### Inset X + + + +### Top + + + +### Right + + + +### Bottom + + + +### Left + + + +## Floats + +Utilities for controlling the wrapping of content around an element. + + + +## Clear + +Utilities for controlling the wrapping of content around an element. + + + +## Isolation + +Utilities for controlling whether an element should explicitly create a new stacking context. These utilities are especially helpful when used in conjunction with [mix-blend-mode](/utilities/effects/mix-blend-mode) and [z-index](#z-index). + + + +## Object Fit + +Utilities for controlling how a replaced element's content should be resized. + + + +## Object Position + +Utilities for controlling how a replaced element's content should be positioned within its container. + + + + + +```js windi.config.js +export default { + theme: { + objectPosition: { + 'bottom': 'bottom', + 'center': 'center', + 'left': 'left', + 'left-bottom': 'left bottom', + 'left-top': 'left top', + 'right': 'right', + 'right-bottom': 'right bottom', + 'right-top': 'right top', + 'top': 'top', + 'center-bottom': 'center bottom', + 'center-top': 'center top', + }, + }, +} +``` + + + +## Z-Index + +Utilities for controlling the stack order of an element. + + + + + +```js windi.config.js +export default { + theme: { + zIndex: { + first: 10, + second: 20, + }, + }, +} +``` + + diff --git a/docs-vuepress/unocss/utilities/layout/sizing.md b/docs-vuepress/unocss/utilities/layout/sizing.md new file mode 100644 index 0000000000..4c4d294b1c --- /dev/null +++ b/docs-vuepress/unocss/utilities/layout/sizing.md @@ -0,0 +1,223 @@ +# Sizing + +## Width + +Utilities for setting the width of an element + + + + + +```js windi.config.js +export default { + theme: { + extend: { + width: { + half: '50%', + }, + }, + }, +} +``` + + + +## Min-Width + +Utilities for setting the minimum width of an element + + + + + +```js windi.config.js +export default { + theme: { + minWidth: { + half: '50%', + full: '100%', + }, + }, +} +``` + + + +## Max-Width + +Utilities for setting the maximum width of an element + + + + + +```js windi.config.js +export default { + theme: { + maxWidth: { + '1/4': '25%', + '1/2': '50%', + '3/4': '75%', + }, + }, +} +``` + + + +## Height + +Utilities for setting the height of an element + + + + + +```js windi.config.js +export default { + theme: { + height: { + sm: '8px', + md: '16px', + lg: '24px', + xl: '48px', + }, + }, +} +``` + + + +## Min-Height + +Utilities for setting the minimum height of an element + + + + + +```js windi.config.js +export default { + theme: { + minHeight: { + '0': '0', + '1/4': '25%', + '1/2': '50%', + '3/4': '75%', + 'full': '100%', + }, + }, +} +``` + + + +## Max-Height + +Utilities for setting the maximum height of an element + + + + + +```js windi.config.js +export default { + theme: { + maxHeight: { + '0': '0', + '1/4': '25%', + '1/2': '50%', + '3/4': '75%', + 'full': '100%', + }, + }, +} +``` + + + +## Box Sizing + +Utilities for controlling how the browser should calculate an element's total size. + +- Use `box-border` to tell the browser to **include the element's borders and padding when you give it a height or width**. This means a **100px × 100px** element with a **2px border and 4px of padding** on all sides will be rendered as **100px × 100px**, with an internal content area of 88px × 88px. Windi makes this the default for all elements in our preflight base styles. + +- Use `box-content` to tell the browser to **add borders and padding on top of the element's specified width or height**. This means a 100px × 100px element with a **2px border and 4px of padding** on all sides will actually be rendered as **112px × 112px**, with an internal content area of 100px × 100px. + + diff --git a/docs-vuepress/unocss/utilities/layout/spacing.md b/docs-vuepress/unocss/utilities/layout/spacing.md new file mode 100644 index 0000000000..fbb88b8739 --- /dev/null +++ b/docs-vuepress/unocss/utilities/layout/spacing.md @@ -0,0 +1,365 @@ +# Spacing + +## Padding + +Utilities for controlling an element's padding. + + + + + +```js windi.config.js +export default { + theme: { + padding: { + sm: '8px', + md: '16px', + lg: '24px', + xl: '48px', + }, + }, +} +``` + + + +## Padding Y + +Utilities for controlling an element's vertical padding. + + + +## Padding X + +Utilities for controlling an element's horizontal padding. + + + +## Padding Top + +Utilities for controlling an element's top padding. + + + +## Padding Left + +Utilities for controlling an element's left padding. + + + +## Padding Bottom + +Utilities for controlling an element's bottom padding. + + + +## Padding Right + +Utilities for controlling an element's right padding. + + + +## Margin + +Utilities for controlling an element's margin. + + + + + +```js windi.config.js +export default { + theme: { + margin: { + sm: '8px', + md: '16px', + lg: '24px', + xl: '48px', + }, + }, +} +``` + + + +## Margin Y + +Utilities for controlling an element's vertical margin. + + + +## Margin X + +Utilities for controlling an element's horizontal margin. + + + +## Margin Top + +Utilities for controlling an element's top margin. + + + +## Margin Left + +Utilities for controlling an element's left margin. + + + +## Margin Bottom + +Utilities for controlling an element's bottom margin. + + + +## Margin Right + +Utilities for controlling an element's right margin. + + + +## Space Between Y + +Utilities for controlling the space between vertical align child elements. + + + + + +```js windi.config.js +export default { + theme: { + space: { + sm: '8px', + md: '16px', + lg: '24px', + xl: '48px', + }, + }, +} +``` + + + +## Space Between Y Reverse + +If your elements are in reverse order (using say `flex-col-reverse`), use the `space-y-reverse` utilities to ensure the space is added to the correct side of each element. + + + +## Space Between X + +Utilities for controlling the space between horizontal align child elements. + + + + + +```js windi.config.js +export default { + theme: { + space: { + sm: '8px', + md: '16px', + lg: '24px', + xl: '48px', + }, + }, +} +``` + + + +## Space Between X Reverse + +If your elements are in reverse order (using say `flex-row-reverse`), use the `space-x-reverse` utilities to ensure the space is added to the correct side of each element. + + diff --git a/docs-vuepress/unocss/utilities/layout/tables.md b/docs-vuepress/unocss/utilities/layout/tables.md new file mode 100644 index 0000000000..18819bb524 --- /dev/null +++ b/docs-vuepress/unocss/utilities/layout/tables.md @@ -0,0 +1,571 @@ +# Tables + +## Table + +The `table` utility behaves like HTML `
` element. It defines a block-level box. Table element represents tabular data — that is, information presented in a two-dimensional table comprised of rows and columns of cells containing data. + + + +## Inline Table + +The `inline-table` utility does not have a direct mapping in HTML. It behaves like an HTML `
` element, but as an inline box, rather than a block-level box. Inside the table box is a block-level context. + + + +| inline-table | display: inline-table; | + +## Table Caption + +The `table-caption` utility behaves like `` HTML element. The HTML `` element defines a row of cells in a table. The row's cells can then be established using a mix of `` HTML element. The HTML `` element defines a column within a table and is used for defining common semantics on all common cells. It is generally found within a `` element. + + + +## Table Row Group + +The `table-row-group` utility behaves like `` HTML element. The HTML Table Body element (``) encapsulates a set of table rows (`` elements), indicating that they comprise the body of the table (`
` HTML element. The HTML `` element specifies the caption (or title) of a table. + + + +## Table Cell + +The `table-cell` utility behaves like `
` HTML element. The HTML `` element defines a cell of a table that contains data. It participates in the table model. + + + +## Table Row + +The `table-row` utility behaves like `
` (data cell) and `` (header cell) elements. + + + +## Table Column + +The `table-column` utility behaves like `
`). + + + +## Table Column Group + +The `table-column-group` utility behaves like `` HTML element. The HTML `` element defines a group of columns within a table. + + + +## Table Header Group + +The `table-header-group` utility behaves like `` HTML element. The HTML `` element defines a set of rows defining the head of the columns of the table. + + + +## Table Footer Group + +The `table-footer-group` utility behaves like `` HTML element. The HTML `` element defines a set of rows summarizing the columns of the table. + + + +## Table Layout + +Utilities for controlling the table layout algorithm. + + + +## Table Border Collapse + +Utilities for controlling whether table borders should collapse or be separated. + + + +## Table Caption Side + +The `caption` utility puts the content of a table's `
` on the specified side. The values are relative to the writing-mode of the table. + + + +## Table Empty Cells + +The `empty-cells` utility sets whether borders and backgrounds appear around ``cells that have no visible content. A good use case for empty-cells could be a situation where you may not know whether a table will or will not contain empty data points and you decide to hide them. + + + +## Example Of Table Utilities + +Use above utilities to create elements that behave like their respective table elements. + +### Raw Html Tags + +```html +
+ + + + + + + + + + + + + + + + + + + + + + + +
Council budget
ItemsExpenditure
Donuts3,000
Stationery18,000
Totals21,000
+``` + +### With Windi Utilities + +```html +
+
Council budget
+
+
+
Items
+
Expenditure
+
+
+
+
+
Donuts
+
3,000
+
+
+
Stationery
+
18,000
+
+
+ +
+``` diff --git a/package.json b/package.json index 3239959915..a14ad37cf5 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,13 @@ "@types/jest": "^27.0.1", "@typescript-eslint/eslint-plugin": "^5.2.0", "@typescript-eslint/parser": "^5.2.0", + "@unocss/webpack": "0.58.9", "@vuepress/plugin-back-to-top": "^1.8.2", "@vuepress/plugin-pwa": "^1.8.0", + "@vueuse/core": "^7.7.0", + "@windicss/shared-components": "^0.1.8", + "codemirror": "^5.65.2", + "codemirror-theme-vars": "^0.1.1", "eslint": "^7.32.0", "eslint-config-standard": "^16.0.3", "eslint-plugin-html": "^6.2.0", @@ -34,9 +39,20 @@ "eslint-plugin-promise": "^5.1.1", "identity-obj-proxy": "^3.0.0", "jest": "^27.2.0", + "json5": "^2.2.0", "lerna": "^8.1.8", + "lz-string": "^1.4.4", + "mini-css-extract-plugin": "^1.6.2", + "mitt": "^3.0.0", + "preact": "^10.6.6", + "prism-theme-vars": "^0.2.2", + "prismjs": "^1.27.0", + "splitpanes": "^3.1.1", "typescript": "^4.1.3", - "vuepress": "^1.9.7" + "unocss": "0.58.9", + "vue": "^3.2.31", + "vuepress": "^1.9.7", + "windicss": "^3.5.1" }, "workspaces": [ "packages/*" From 43219d9cba3f879c923bfce15c29895bd9f2270e Mon Sep 17 00:00:00 2001 From: mater Date: Fri, 3 Jan 2025 14:10:47 +0800 Subject: [PATCH 055/128] fix: docs --- docs-vuepress/.vuepress/config.js | 127 +------------------------- docs-vuepress/.vuepress/enhanceApp.js | 5 - package.json | 19 +--- 3 files changed, 4 insertions(+), 147 deletions(-) diff --git a/docs-vuepress/.vuepress/config.js b/docs-vuepress/.vuepress/config.js index c4714e9bf8..796588e020 100644 --- a/docs-vuepress/.vuepress/config.js +++ b/docs-vuepress/.vuepress/config.js @@ -1,107 +1,4 @@ const { headerPlugin } = require('./headerMdPlugin') -const { presetUno } = require('unocss') -const UnoCSS = require('@unocss/webpack').default - -const unocss = { - '/unocss': [ - { - title: 'General', - children: [ - '/unocss/utilities/general/colors', - '/unocss/utilities/general/typography', - '/unocss/utilities/general/svg', - '/unocss/utilities/general/variants', - ], - }, - { - title: 'Accessibility', - children: [ - '/unocss/utilities/accessibility/screen-readers' - ], - }, - { - title: 'Animations', - children: [ - '/unocss/utilities/animations/animation', - '/unocss/utilities/animations/transforms', - '/unocss/utilities/animations/transitions' - ], - }, - { - title: 'Backgrounds', - children: [ - '/unocss/utilities/backgrounds/background', - '/unocss/utilities/backgrounds/gradients', - '/unocss/utilities/backgrounds/background-blend-mode' - ], - }, - { - title: 'Behaviors', - children: [ - '/unocss/utilities/behaviors/box-decoration-break', - '/unocss/utilities/behaviors/image-rendering', - '/unocss/utilities/behaviors/listings', - '/unocss/utilities/behaviors/overflow', - '/unocss/utilities/behaviors/overscroll-behavior', - '/unocss/utilities/behaviors/placeholder', - ], - }, - { - title: 'Borders', - children: [ - '/unocss/utilities/borders/border', - '/unocss/utilities/borders/divider', - '/unocss/utilities/borders/outline', - '/unocss/utilities/borders/ring', - ], - }, - { - title: 'Effects', - children: [ - '/unocss/utilities/effects/box-shadow', - '/unocss/utilities/effects/opacity', - '/unocss/utilities/effects/mix-blend-mode', - ], - }, - { - title: 'Filters', - children: [ - '/unocss/utilities/filters/filter', - '/unocss/utilities/filters/backdrop-filter', - ], - }, - { - title: 'Interactivity', - children: [ - '/unocss/utilities/interactivity/accent-color', - '/unocss/utilities/interactivity/appearance', - '/unocss/utilities/interactivity/cursor', - '/unocss/utilities/interactivity/caret', - '/unocss/utilities/interactivity/pointer-events', - '/unocss/utilities/interactivity/resize', - '/unocss/utilities/interactivity/scroll-behavior', - '/unocss/utilities/interactivity/touch-action', - '/unocss/utilities/interactivity/user-select', - '/unocss/utilities/interactivity/will-change', - ], - }, - { - title: 'Layout', - children: [ - // { title: 'Aspect Ratio', link: '/unocss/utilities/layout/aspect-ratio' }, - '/unocss/utilities/layout/columns', - '/unocss/utilities/layout/container', - '/unocss/utilities/layout/display', - '/unocss/utilities/layout/flexbox', - '/unocss/utilities/layout/grid', - '/unocss/utilities/layout/positioning', - '/unocss/utilities/layout/sizing', - '/unocss/utilities/layout/spacing', - '/unocss/utilities/layout/tables', - ], - }, - ] -} const sidebar = { '/guide/': [ @@ -222,8 +119,7 @@ const sidebar = { { title: '小程序跨端组件库 Mpx-cube-ui 开源啦', path: 'mpx-cube-ui' }, { title: 'Mpx-cli 插件化改造', path: 'mpx-cli-next' }, { title: 'Mpx 小程序单元测试能力建设与实践', path: 'unit-test'} - ], - ...unocss + ] } const nav = [ @@ -282,27 +178,6 @@ module.exports = { chainWebpack: (config, isServer) => { // 添加node_modules避免resolve错误 config.resolve.modules.add('node_modules') - config.module.rule('vue').uses.delete('cache-loader') - config.module.rule('tsx').uses.delete('cache-loader') - config.merge({ - cache: false - }) - config.plugin('extract-css').use(require('mini-css-extract-plugin'), [ - { - filename: '[name].css', - chunkFilename: '[name].[hash:9].css' - } - ]) - }, - configureWebpack: { - plugins: [ - UnoCSS({ - presets: [ - presetUno() - ], - configFile: false - }) - ] }, markdown: { // markdown-it-toc 的选项 diff --git a/docs-vuepress/.vuepress/enhanceApp.js b/docs-vuepress/.vuepress/enhanceApp.js index dc9b21589e..878e2134de 100644 --- a/docs-vuepress/.vuepress/enhanceApp.js +++ b/docs-vuepress/.vuepress/enhanceApp.js @@ -1,8 +1,3 @@ -import a from 'uno.css' - -console.log(a); - - export default ({ router }) => { if (typeof process === 'undefined' || process.env.VUE_ENV !== 'server') { router.onReady(() => { diff --git a/package.json b/package.json index a14ad37cf5..903e0a3dbd 100644 --- a/package.json +++ b/package.json @@ -23,13 +23,8 @@ "@types/jest": "^27.0.1", "@typescript-eslint/eslint-plugin": "^5.2.0", "@typescript-eslint/parser": "^5.2.0", - "@unocss/webpack": "0.58.9", "@vuepress/plugin-back-to-top": "^1.8.2", "@vuepress/plugin-pwa": "^1.8.0", - "@vueuse/core": "^7.7.0", - "@windicss/shared-components": "^0.1.8", - "codemirror": "^5.65.2", - "codemirror-theme-vars": "^0.1.1", "eslint": "^7.32.0", "eslint-config-standard": "^16.0.3", "eslint-plugin-html": "^6.2.0", @@ -37,22 +32,14 @@ "eslint-plugin-jest": "^27.0.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^5.1.1", + "eslint-plugin-react-hooks": "^5.1.0", "identity-obj-proxy": "^3.0.0", "jest": "^27.2.0", - "json5": "^2.2.0", "lerna": "^8.1.8", - "lz-string": "^1.4.4", - "mini-css-extract-plugin": "^1.6.2", - "mitt": "^3.0.0", - "preact": "^10.6.6", - "prism-theme-vars": "^0.2.2", - "prismjs": "^1.27.0", - "splitpanes": "^3.1.1", "typescript": "^4.1.3", - "unocss": "0.58.9", - "vue": "^3.2.31", "vuepress": "^1.9.7", - "windicss": "^3.5.1" + "vue-template-compiler": "^2.7.16", + "webpack": "^4.47.0" }, "workspaces": [ "packages/*" From 109149712d862117047123731c040c5478c39a44 Mon Sep 17 00:00:00 2001 From: mater Date: Fri, 3 Jan 2025 14:12:42 +0800 Subject: [PATCH 056/128] fix: docs --- docs-vuepress/.vuepress/config.js | 105 +++++++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) diff --git a/docs-vuepress/.vuepress/config.js b/docs-vuepress/.vuepress/config.js index 796588e020..b9f42ca0ab 100644 --- a/docs-vuepress/.vuepress/config.js +++ b/docs-vuepress/.vuepress/config.js @@ -1,5 +1,107 @@ const { headerPlugin } = require('./headerMdPlugin') + +const unocss = { + '/unocss': [ + { + title: 'General', + children: [ + '/unocss/utilities/general/colors', + '/unocss/utilities/general/typography', + '/unocss/utilities/general/svg', + '/unocss/utilities/general/variants', + ], + }, + { + title: 'Accessibility', + children: [ + '/unocss/utilities/accessibility/screen-readers' + ], + }, + { + title: 'Animations', + children: [ + '/unocss/utilities/animations/animation', + '/unocss/utilities/animations/transforms', + '/unocss/utilities/animations/transitions' + ], + }, + { + title: 'Backgrounds', + children: [ + '/unocss/utilities/backgrounds/background', + '/unocss/utilities/backgrounds/gradients', + '/unocss/utilities/backgrounds/background-blend-mode' + ], + }, + { + title: 'Behaviors', + children: [ + '/unocss/utilities/behaviors/box-decoration-break', + '/unocss/utilities/behaviors/image-rendering', + '/unocss/utilities/behaviors/listings', + '/unocss/utilities/behaviors/overflow', + '/unocss/utilities/behaviors/overscroll-behavior', + '/unocss/utilities/behaviors/placeholder', + ], + }, + { + title: 'Borders', + children: [ + '/unocss/utilities/borders/border', + '/unocss/utilities/borders/divider', + '/unocss/utilities/borders/outline', + '/unocss/utilities/borders/ring', + ], + }, + { + title: 'Effects', + children: [ + '/unocss/utilities/effects/box-shadow', + '/unocss/utilities/effects/opacity', + '/unocss/utilities/effects/mix-blend-mode', + ], + }, + { + title: 'Filters', + children: [ + '/unocss/utilities/filters/filter', + '/unocss/utilities/filters/backdrop-filter', + ], + }, + { + title: 'Interactivity', + children: [ + '/unocss/utilities/interactivity/accent-color', + '/unocss/utilities/interactivity/appearance', + '/unocss/utilities/interactivity/cursor', + '/unocss/utilities/interactivity/caret', + '/unocss/utilities/interactivity/pointer-events', + '/unocss/utilities/interactivity/resize', + '/unocss/utilities/interactivity/scroll-behavior', + '/unocss/utilities/interactivity/touch-action', + '/unocss/utilities/interactivity/user-select', + '/unocss/utilities/interactivity/will-change', + ], + }, + { + title: 'Layout', + children: [ + // { title: 'Aspect Ratio', link: '/unocss/utilities/layout/aspect-ratio' }, + '/unocss/utilities/layout/columns', + '/unocss/utilities/layout/container', + '/unocss/utilities/layout/display', + '/unocss/utilities/layout/flexbox', + '/unocss/utilities/layout/grid', + '/unocss/utilities/layout/positioning', + '/unocss/utilities/layout/sizing', + '/unocss/utilities/layout/spacing', + '/unocss/utilities/layout/tables', + ], + }, + ] +} + const sidebar = { '/guide/': [ { @@ -119,7 +221,8 @@ const sidebar = { { title: '小程序跨端组件库 Mpx-cube-ui 开源啦', path: 'mpx-cube-ui' }, { title: 'Mpx-cli 插件化改造', path: 'mpx-cli-next' }, { title: 'Mpx 小程序单元测试能力建设与实践', path: 'unit-test'} - ] + ], + ...unocss } const nav = [ From 3fc9efa731945245e9b8a47bc3d7d7de6f5e390c Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Fri, 3 Jan 2025 16:16:19 +0800 Subject: [PATCH 057/128] [fix]formatValue --- packages/webpack-plugin/lib/react/processStyles.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/webpack-plugin/lib/react/processStyles.js b/packages/webpack-plugin/lib/react/processStyles.js index ca6bbeac35..063593c650 100644 --- a/packages/webpack-plugin/lib/react/processStyles.js +++ b/packages/webpack-plugin/lib/react/processStyles.js @@ -63,6 +63,7 @@ module.exports = function (styles, { };\n let __unoClassMap global.__getUnoClassMap = function () { + const formatValue = global.__formatValue if (!__unoClassMap) { __unoClassMap = __unoCssMapPlaceholder__ } From f4132e9f112445a065600e310cfbfff1ad705ace Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Fri, 3 Jan 2025 18:11:43 +0800 Subject: [PATCH 058/128] [feat]support variant check --- packages/unocss-base/preset-rn/index.js | 6 +- .../unocss-base/preset-rn/variants/index.js | 75 +++++++++++++++++++ packages/unocss-plugin/lib/rn-plugin/index.js | 6 ++ .../unocss-plugin/lib/web-plugin/utils.js | 2 +- 4 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 packages/unocss-base/preset-rn/variants/index.js diff --git a/packages/unocss-base/preset-rn/index.js b/packages/unocss-base/preset-rn/index.js index 6636a58e5f..93a09c3cb1 100644 --- a/packages/unocss-base/preset-rn/index.js +++ b/packages/unocss-base/preset-rn/index.js @@ -1,10 +1,14 @@ import rules from './rules/index.js' import theme from './theme.js' +import blocklistVariants from './variants/index.js' export default function presetRnMpx () { return { name: '@mpxjs/unocss-preset-rn', rules, - theme + theme, + blocklist: [ + ...blocklistVariants + ] } } diff --git a/packages/unocss-base/preset-rn/variants/index.js b/packages/unocss-base/preset-rn/variants/index.js new file mode 100644 index 0000000000..dd747cb5ef --- /dev/null +++ b/packages/unocss-base/preset-rn/variants/index.js @@ -0,0 +1,75 @@ +import { + variantAria, + variantTaggedAriaAttributes, + variantChildren, + variantCombinators, + variantContainerQuery, + variantTaggedDataAttributes, + variantLanguageDirections, + variantStartingStyle, + variantSupports, + variantSelector, + variantCssLayer, + variantScope +} from '@unocss/preset-mini/variants' +import { + variantCombinators as windVariantCombinator, + variantContrasts, + variantMotions, + variantSpaceAndDivide, + variantStickyHover, + placeholderModifier +} from '@unocss/preset-wind/variants' + +const wrapVariant = function (variant) { + return function (raw) { + const ctx = { + rawSelector: raw, + theme: this.config, + generator: this + } + const { match } = variant + if (match(raw, ctx)) { + this._mpx2rnUnsuportedRules = this._mpx2rnUnsuportedRules || [] + this._mpx2rnUnsuportedRules.push(raw) + return true + } + } +} + +const transformVariants = function (variantsArr) { + return variantsArr.map(variants => { + if (Array.isArray(variants)) { + return variants.map(variant => wrapVariant(variant)) + } else { + return wrapVariant(variants) + } + }).reduce((preV, curV) => { + if (Array.isArray(curV)) { + return preV.concat(...curV) + } else { + return preV.concat(curV) + } + }, []) +} + +export default transformVariants([ + variantAria, + variantTaggedAriaAttributes, + variantChildren, + variantCombinators, + variantContainerQuery, + variantTaggedDataAttributes, + variantLanguageDirections, + variantStartingStyle, + variantSupports, + variantSelector, + variantCssLayer, + variantScope, + windVariantCombinator, + variantContrasts, + variantMotions, + variantSpaceAndDivide, + variantStickyHover, + placeholderModifier +]) diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index 084b52bb69..12bb6875a2 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -100,6 +100,12 @@ function WebpackPlugin (configOrPath, defaults) { compiler.hooks.beforeCompile.tapPromise(PLUGIN_NAME, async (compilation) => { const ctx = await createContext(configOrPath, defaults) + ctx.uno.config.blocklist = ctx.uno.config.blocklist.map((item) => { + if (typeof item === 'function') { + return item.bind(ctx.uno) + } + return item + }) compiler.__unoCtx = ctx return ctx }) diff --git a/packages/unocss-plugin/lib/web-plugin/utils.js b/packages/unocss-plugin/lib/web-plugin/utils.js index 89d431a636..b3fef9b891 100644 --- a/packages/unocss-plugin/lib/web-plugin/utils.js +++ b/packages/unocss-plugin/lib/web-plugin/utils.js @@ -25,7 +25,7 @@ async function createContext (configOrPath, defaults = {}, extraConfigSources = const result = await config.loadConfig(root, configOrPath, extraConfigSources, defaults) rawConfig = result.config - uno.setConfig(rawConfig) + await uno.setConfig(rawConfig) rollupFilter = pluginutils.createFilter( rawConfig.include || defaultInclude, rawConfig.exclude || defaultExclude From 51238326db9b7f495b57cc49e03eed9b28af4c9a Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Fri, 3 Jan 2025 18:39:54 +0800 Subject: [PATCH 059/128] [fix]some edge case --- packages/unocss-base/preset-rn/variants/index.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/unocss-base/preset-rn/variants/index.js b/packages/unocss-base/preset-rn/variants/index.js index dd747cb5ef..6734bccd6c 100644 --- a/packages/unocss-base/preset-rn/variants/index.js +++ b/packages/unocss-base/preset-rn/variants/index.js @@ -21,14 +21,21 @@ import { placeholderModifier } from '@unocss/preset-wind/variants' -const wrapVariant = function (variant) { +const wrapVariant = function (variant = {}) { return function (raw) { const ctx = { rawSelector: raw, theme: this.config, generator: this } - const { match } = variant + let match + if (typeof variant === 'function') { + match = variant + } else if (variant.match) { + match = variant.match + } else { + return + } if (match(raw, ctx)) { this._mpx2rnUnsuportedRules = this._mpx2rnUnsuportedRules || [] this._mpx2rnUnsuportedRules.push(raw) From 810a235ef7eb89f8d1e57fda58c06432be3b7c55 Mon Sep 17 00:00:00 2001 From: mater Date: Mon, 6 Jan 2025 10:47:41 +0800 Subject: [PATCH 060/128] feat: unocss order --- .../builtInMixins/styleHelperMixin.ios.js | 11 ++++-- .../unocss-base/preset-rn/rules/background.js | 3 ++ packages/unocss-plugin/lib/rn-plugin/index.js | 34 ++++++++++++------- .../webpack-plugin/lib/react/processStyles.js | 8 +++++ 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index 4c8525ba2b..cf4cfaf601 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -139,11 +139,13 @@ export default function styleHelperMixin () { return concat(staticClass, stringifyDynamicClass(dynamicClass)) }, __getStyle (staticClass, dynamicClass, staticStyle, dynamicStyle, hide) { - const result = {} + let result = {} + const unoResult = {} + const unoUtilitiesResult = {} const classMap = this.__getClassMap?.() || {} const unoClassMap = global.__getUnoClassMap?.() || {} + const unoUtilitiesClassMap = global.__getUtilitiesUnoClassMap?.() || {} const appClassMap = global.__getAppClassMap?.() || {} - if (staticClass || dynamicClass) { const classString = concat(staticClass, stringifyDynamicClass(dynamicClass)) classString.split(/\s+/).forEach((className) => { @@ -153,12 +155,15 @@ export default function styleHelperMixin () { // todo 全局样式在每个页面和组件中生效,以支持全局原子类,后续支持样式模块复用后可考虑移除 Object.assign(result, appClassMap[className]) } else if (unoClassMap[className]) { - Object.assign(result, unoClassMap[className]) + Object.assign(unoResult, unoClassMap[className]) + } else if (unoUtilitiesClassMap[className]) { + Object.assign(unoUtilitiesResult, unoUtilitiesClassMap[className]) } else if (isObject(this.__props[className])) { // externalClasses必定以对象形式传递下来 Object.assign(result, this.__props[className]) } }) + result = Object.assign(unoResult, result, unoUtilitiesResult) } if (staticStyle || dynamicStyle) { diff --git a/packages/unocss-base/preset-rn/rules/background.js b/packages/unocss-base/preset-rn/rules/background.js index 25b1faef50..261917e1ef 100644 --- a/packages/unocss-base/preset-rn/rules/background.js +++ b/packages/unocss-base/preset-rn/rules/background.js @@ -1,4 +1,5 @@ import { backgroundStyles } from '@unocss/preset-wind/rules' +import { bgColors } from '@unocss/preset-mini/rules' import { findRawRules, transformEmptyRule } from '../../utils/index.js' // todo background-position 剔除 @@ -18,4 +19,6 @@ const NewBackgroundRules = transformEmptyRule(findRawRules( backgroundStyles )) +bgColors[1][2].layer = 'utilities' + export { NewBackgroundRules as backgroundStyles } diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index 084b52bb69..323a58350f 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -56,19 +56,24 @@ function WebpackPlugin (configOrPath, defaults) { if (uno._mpx2rnUnsuportedRules && uno._mpx2rnUnsuportedRules.length) { compilation.errors.push(`[Mpx Unocss]: all those '${uno._mpx2rnUnsuportedRules.join(', ')}' class utilities is not supported in react native mode`) } - const classMap = getClassMap({ - content: result.css, - filename: 'mpx2rn-unocss', - mode, - srcMode, - warn: msg => { - compilation.warnings.push(msg) - }, - error: msg => { - compilation.errors.push(msg) - }, - formatValueFn: 'formatValue' - }) + const getLayersClassMap = (layers) => { + return getClassMap({ + content: result.getLayers(layers), + filename: 'mpx2rn-unocss', + mode, + srcMode, + warn: msg => { + compilation.warnings.push(msg) + }, + error: msg => { + compilation.errors.push(msg) + }, + formatValueFn: 'formatValue' + }) + } + const classMap = getLayersClassMap(result.layers.filter(v => v !== 'utilities')) + const utilitiesClassMap = getLayersClassMap(['utilities']) + const files = Object.keys(compilation.assets) for (const file of files) { if (file === '*') { return } @@ -79,6 +84,9 @@ function WebpackPlugin (configOrPath, defaults) { replaced = true return shallowStringify(classMap) }) + .replace('__unoCssMapUtilities__', () => { + return shallowStringify(utilitiesClassMap) + }) .replace('__unoCssBreakpointsPlaceholder__', () => { const breakpoints = uno.config.theme.breakpoints || {} const entries = Object.entries(breakpoints) diff --git a/packages/webpack-plugin/lib/react/processStyles.js b/packages/webpack-plugin/lib/react/processStyles.js index 063593c650..1d6602de72 100644 --- a/packages/webpack-plugin/lib/react/processStyles.js +++ b/packages/webpack-plugin/lib/react/processStyles.js @@ -68,6 +68,14 @@ module.exports = function (styles, { __unoClassMap = __unoCssMapPlaceholder__ } return __unoClassMap + };\n + let __unoUtilitiesClassMap + global.__getUtilitiesUnoClassMap = function () { + const formatValue = global.__formatValue + if (!__unoUtilitiesClassMap) { + __unoUtilitiesClassMap = __unoCssMapUtilities__ + } + return __unoUtilitiesClassMap };\n` } output += ` From 0b0b38b45458231caf34ca8414a55989061539d8 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Mon, 6 Jan 2025 11:08:43 +0800 Subject: [PATCH 061/128] [feat]compatiable for legacy color --- packages/unocss-base/lib/index.js | 4 ++++ packages/unocss-base/package.json | 3 ++- packages/unocss-base/preset-rn/variants/index.js | 2 -- packages/unocss-base/utils/index.js | 3 +-- packages/unocss-plugin/lib/rn-plugin/index.js | 5 +++-- packages/webpack-plugin/lib/platform/style/wx/index.js | 10 ---------- 6 files changed, 10 insertions(+), 17 deletions(-) diff --git a/packages/unocss-base/lib/index.js b/packages/unocss-base/lib/index.js index 4e82bf7898..8edaf24de1 100644 --- a/packages/unocss-base/lib/index.js +++ b/packages/unocss-base/lib/index.js @@ -1,4 +1,5 @@ import { presetUno } from '@unocss/preset-uno' +import presetLegacyCompat from '@unocss/preset-legacy-compat' import presetRn from '../preset-rn/index.js' // eslint-disable-next-line @@ -10,6 +11,9 @@ export default function presetMpx (options = {}) { const extraPresets = [] if (isReact) { extraPresets.push(presetRn()) + extraPresets.push(presetLegacyCompat({ + commaStyleColorFunction: true + })) options.dark = 'media' } const uno = presetUno(options) diff --git a/packages/unocss-base/package.json b/packages/unocss-base/package.json index 71816b43d2..938f91e63d 100644 --- a/packages/unocss-base/package.json +++ b/packages/unocss-base/package.json @@ -15,6 +15,7 @@ "access": "public" }, "dependencies": { - "@unocss/preset-uno": "^0.65.1" + "@unocss/preset-uno": "^0.65.1", + "@unocss/preset-legacy-compat": "^0.65.1" } } diff --git a/packages/unocss-base/preset-rn/variants/index.js b/packages/unocss-base/preset-rn/variants/index.js index 6734bccd6c..11c8dd58e8 100644 --- a/packages/unocss-base/preset-rn/variants/index.js +++ b/packages/unocss-base/preset-rn/variants/index.js @@ -37,8 +37,6 @@ const wrapVariant = function (variant = {}) { return } if (match(raw, ctx)) { - this._mpx2rnUnsuportedRules = this._mpx2rnUnsuportedRules || [] - this._mpx2rnUnsuportedRules.push(raw) return true } } diff --git a/packages/unocss-base/utils/index.js b/packages/unocss-base/utils/index.js index 1f932546ae..36f3157d08 100644 --- a/packages/unocss-base/utils/index.js +++ b/packages/unocss-base/utils/index.js @@ -17,8 +17,7 @@ const ruleCallback = ([match], { generator }) => { } const ruleFallback = (match, generator) => { - generator._mpx2rnUnsuportedRules = generator._mpx2rnUnsuportedRules || [] - generator._mpx2rnUnsuportedRules.push(match) + generator._mpx2rnUnsuportedRules.add(match) return EMPTY } diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index 12bb6875a2..bf94577c00 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -53,8 +53,8 @@ function WebpackPlugin (configOrPath, defaults) { } } const result = await uno.generate(tokens, { minify: true }) - if (uno._mpx2rnUnsuportedRules && uno._mpx2rnUnsuportedRules.length) { - compilation.errors.push(`[Mpx Unocss]: all those '${uno._mpx2rnUnsuportedRules.join(', ')}' class utilities is not supported in react native mode`) + if (uno._mpx2rnUnsuportedRules.size || uno.blocked.size) { + compilation.errors.push(`[Mpx Unocss]: all those '${[...uno._mpx2rnUnsuportedRules, ...uno.blocked].join(', ')}' class utilities is not supported in react native mode`) } const classMap = getClassMap({ content: result.css, @@ -100,6 +100,7 @@ function WebpackPlugin (configOrPath, defaults) { compiler.hooks.beforeCompile.tapPromise(PLUGIN_NAME, async (compilation) => { const ctx = await createContext(configOrPath, defaults) + ctx.uno._mpx2rnUnsuportedRules = new Set() ctx.uno.config.blocklist = ctx.uno.config.blocklist.map((item) => { if (typeof item === 'function') { return item.bind(ctx.uno) diff --git a/packages/webpack-plugin/lib/platform/style/wx/index.js b/packages/webpack-plugin/lib/platform/style/wx/index.js index d6e15cddb9..cf51bc33fb 100644 --- a/packages/webpack-plugin/lib/platform/style/wx/index.js +++ b/packages/webpack-plugin/lib/platform/style/wx/index.js @@ -164,18 +164,8 @@ module.exports = function getSpec ({ warn, error }) { return true } - // 兼容现代的 rgb(1 1 1 / 0.2)/hsl(360 100% 100% / 1.0) 的写法 - const formatColor = (value) => { - const reg = /(rgb|hsl)(\(\s*(\d+\s+\d+\s+\d+(\s*\/\s*[^)]+))\s*\))/ - value = value.replace(reg, function (match, $1, $2) { - return $1 + 'a' + $2 - }) - return value - } - // prop & value 校验:过滤的不合法的属性和属性值 const verification = ({ prop, value, selector }, { mode }) => { - value = formatColor(value) return verifyProps({ prop, value, selector }, { mode }) && verifyValues({ prop, value, selector }) && ({ prop, value }) } From 4bea9bbeaf5c4e8991bd86eb34e04056b4106f95 Mon Sep 17 00:00:00 2001 From: mater Date: Mon, 6 Jan 2025 14:59:11 +0800 Subject: [PATCH 062/128] fix: preflights --- .../builtInMixins/styleHelperMixin.ios.js | 4 +++- packages/unocss-base/preset-rn/index.js | 22 ++++++++++++++++++- .../unocss-base/preset-rn/rules/transforms.js | 18 +++++++++------ packages/unocss-plugin/lib/rn-plugin/index.js | 4 ++++ .../webpack-plugin/lib/react/processStyles.js | 8 +++++++ 5 files changed, 47 insertions(+), 9 deletions(-) diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index cf4cfaf601..3c59087046 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -145,6 +145,7 @@ export default function styleHelperMixin () { const classMap = this.__getClassMap?.() || {} const unoClassMap = global.__getUnoClassMap?.() || {} const unoUtilitiesClassMap = global.__getUtilitiesUnoClassMap?.() || {} + const unoPreflightsClassMap = global.__getPreflightsUnoClassMap?.() || {} const appClassMap = global.__getAppClassMap?.() || {} if (staticClass || dynamicClass) { const classString = concat(staticClass, stringifyDynamicClass(dynamicClass)) @@ -163,7 +164,8 @@ export default function styleHelperMixin () { Object.assign(result, this.__props[className]) } }) - result = Object.assign(unoResult, result, unoUtilitiesResult) + result = Object.assign({}, unoPreflightsClassMap, unoResult, result, unoUtilitiesResult) + console.log(result) } if (staticStyle || dynamicStyle) { diff --git a/packages/unocss-base/preset-rn/index.js b/packages/unocss-base/preset-rn/index.js index 6636a58e5f..7763bf05c8 100644 --- a/packages/unocss-base/preset-rn/index.js +++ b/packages/unocss-base/preset-rn/index.js @@ -1,10 +1,30 @@ import rules from './rules/index.js' +import { normalizeTransfromVar } from './rules/transforms.js' import theme from './theme.js' +function normalizePreflightBase (preflightBase) { + normalizeTransfromVar(preflightBase) + return preflightBase +} + +function preflights () { + return [ + { + layer: 'preflights', + getCSS ({ theme, generator }) { + if (theme.preflightBase) { + generator._mpx2rnUnoPreflightBase = normalizePreflightBase(theme.preflightBase) + } + } + } + ] +} + export default function presetRnMpx () { return { name: '@mpxjs/unocss-preset-rn', rules, - theme + theme, + preflights: preflights() } } diff --git a/packages/unocss-base/preset-rn/rules/transforms.js b/packages/unocss-base/preset-rn/rules/transforms.js index bc18df1070..5036e7e31f 100644 --- a/packages/unocss-base/preset-rn/rules/transforms.js +++ b/packages/unocss-base/preset-rn/rules/transforms.js @@ -24,6 +24,15 @@ const checkVars = [ '--un-skew-y' ] +function normalizeTransfromVar (res) { + checkVars.forEach(key => { + if (res[key] !== undefined && res[key] === 0) { + res[key] = '0deg' + } + }) + return res +} + function getPreflight (preflightKeys) { return Object.fromEntries(preflightKeys.map(key => [key, transformBase[key]])) } @@ -41,12 +50,7 @@ const transformRules = transforms.map(v => { if (Array.isArray(res)) { res = Object.fromEntries(res) } - checkVars.forEach(key => { - if (res[key] !== undefined && res[key] === 0) { - res[key] = '0deg' - } - }) - delete res.transform + normalizeTransfromVar(res) } return res }, @@ -61,4 +65,4 @@ const transformRules = transforms.map(v => { return v }) -export { transformRules as transforms } +export { transformRules as transforms, normalizeTransfromVar } diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index 323a58350f..9b55b80551 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -73,6 +73,7 @@ function WebpackPlugin (configOrPath, defaults) { } const classMap = getLayersClassMap(result.layers.filter(v => v !== 'utilities')) const utilitiesClassMap = getLayersClassMap(['utilities']) + const preflightsClassMap = uno._mpx2rnUnoPreflightBase const files = Object.keys(compilation.assets) for (const file of files) { @@ -87,6 +88,9 @@ function WebpackPlugin (configOrPath, defaults) { .replace('__unoCssMapUtilities__', () => { return shallowStringify(utilitiesClassMap) }) + .replace('__unoCssMapPreflights__', () => { + return JSON.stringify(preflightsClassMap) + }) .replace('__unoCssBreakpointsPlaceholder__', () => { const breakpoints = uno.config.theme.breakpoints || {} const entries = Object.entries(breakpoints) diff --git a/packages/webpack-plugin/lib/react/processStyles.js b/packages/webpack-plugin/lib/react/processStyles.js index 1d6602de72..0e224157c0 100644 --- a/packages/webpack-plugin/lib/react/processStyles.js +++ b/packages/webpack-plugin/lib/react/processStyles.js @@ -76,6 +76,14 @@ module.exports = function (styles, { __unoUtilitiesClassMap = __unoCssMapUtilities__ } return __unoUtilitiesClassMap + };\n + let __unoPreflightsClassMap + global.__getPreflightsUnoClassMap = function () { + const formatValue = global.__formatValue + if (!__unoPreflightsClassMap) { + __unoPreflightsClassMap = __unoCssMapPreflights__ + } + return __unoPreflightsClassMap };\n` } output += ` From 7abaa37fa2b29e131c9492d854f3662ca8b33c9f Mon Sep 17 00:00:00 2001 From: mater Date: Mon, 6 Jan 2025 15:05:02 +0800 Subject: [PATCH 063/128] fix: remove console --- packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index 3c59087046..bdf434fce1 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -165,7 +165,6 @@ export default function styleHelperMixin () { } }) result = Object.assign({}, unoPreflightsClassMap, unoResult, result, unoUtilitiesResult) - console.log(result) } if (staticStyle || dynamicStyle) { From c9c48abc83de5096f08d406806c246cbe1eb9680 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Mon, 6 Jan 2025 16:14:58 +0800 Subject: [PATCH 064/128] [feat]using blocklist for rules --- packages/unocss-base/preset-rn/index.js | 3 +- packages/unocss-base/preset-rn/rules/align.js | 33 ++--- .../unocss-base/preset-rn/rules/animation.js | 7 +- .../unocss-base/preset-rn/rules/background.js | 42 ++++--- .../unocss-base/preset-rn/rules/behaviors.js | 20 ++- .../unocss-base/preset-rn/rules/border.js | 28 +++-- packages/unocss-base/preset-rn/rules/color.js | 7 +- .../unocss-base/preset-rn/rules/columns.js | 7 +- .../unocss-base/preset-rn/rules/container.js | 8 +- .../unocss-base/preset-rn/rules/divide.js | 7 +- packages/unocss-base/preset-rn/rules/flex.js | 9 +- packages/unocss-base/preset-rn/rules/gap.js | 17 +-- .../unocss-base/preset-rn/rules/global.js | 9 +- packages/unocss-base/preset-rn/rules/grid.js | 10 +- packages/unocss-base/preset-rn/rules/index.js | 119 ++++++------------ .../unocss-base/preset-rn/rules/layout.js | 21 ++-- .../unocss-base/preset-rn/rules/line-clamp.js | 9 +- .../preset-rn/rules/placeholder.js | 7 +- .../unocss-base/preset-rn/rules/positions.js | 93 +++++--------- packages/unocss-base/preset-rn/rules/ring.js | 5 +- .../unocss-base/preset-rn/rules/scrolls.js | 9 +- .../unocss-base/preset-rn/rules/spacing.js | 37 ++---- .../unocss-base/preset-rn/rules/static.js | 108 ++++++---------- packages/unocss-base/preset-rn/rules/svg.js | 7 +- packages/unocss-base/preset-rn/rules/table.js | 7 +- .../preset-rn/rules/touch-actions.js | 7 +- .../unocss-base/preset-rn/rules/transition.js | 7 +- .../unocss-base/preset-rn/rules/typography.js | 27 ++-- .../preset-rn/rules/view-transition.js | 9 +- 29 files changed, 215 insertions(+), 464 deletions(-) diff --git a/packages/unocss-base/preset-rn/index.js b/packages/unocss-base/preset-rn/index.js index 93a09c3cb1..2840f13eba 100644 --- a/packages/unocss-base/preset-rn/index.js +++ b/packages/unocss-base/preset-rn/index.js @@ -1,4 +1,4 @@ -import rules from './rules/index.js' +import rules, { blocklistRules } from './rules/index.js' import theme from './theme.js' import blocklistVariants from './variants/index.js' @@ -8,6 +8,7 @@ export default function presetRnMpx () { rules, theme, blocklist: [ + ...blocklistRules, ...blocklistVariants ] } diff --git a/packages/unocss-base/preset-rn/rules/align.js b/packages/unocss-base/preset-rn/rules/align.js index 4a4f811a5f..8a91f7880f 100644 --- a/packages/unocss-base/preset-rn/rules/align.js +++ b/packages/unocss-base/preset-rn/rules/align.js @@ -1,5 +1,4 @@ -import { textAligns, verticalAligns } from '@unocss/preset-mini/rules' -import { findRawRules, ruleCallback, transformEmptyRule } from '../../utils/index.js' +import { verticalAligns } from '@unocss/preset-mini/rules' const support = [ 'mid', @@ -12,27 +11,21 @@ const support = [ 'middle' ] -const verticalAlignsRules = verticalAligns.map(v => { - const [regex, matcher, ...another] = v - return [ - regex, - (...args) => { - const [[, v]] = args - if (support.includes(v)) return matcher(...args) - return ruleCallback(...args) - }, - ...another - ] +const verticalAlignsRules = verticalAligns.map(([rule]) => (raw) => { + const result = raw.match(rule) + if (result && !support.includes(result[1])) { + return true + } }) -const textAlignValuesRules = transformEmptyRule( - findRawRules( - ['text-start', 'text-end', 'text-align-start', 'text-align-end'], - textAligns - ) -) +const textAligns = [ + 'text-start', + 'text-end', + 'text-align-start', + 'text-align-end' +] export { verticalAlignsRules as verticalAligns, - textAlignValuesRules as textAligns + textAligns } diff --git a/packages/unocss-base/preset-rn/rules/animation.js b/packages/unocss-base/preset-rn/rules/animation.js index 18dfb73ade..21f4d829ce 100644 --- a/packages/unocss-base/preset-rn/rules/animation.js +++ b/packages/unocss-base/preset-rn/rules/animation.js @@ -1,6 +1 @@ -import { animations } from '@unocss/preset-wind/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const animationsRules = transformEmptyRule(animations) - -export { animationsRules as animations } +export { animations } from '@unocss/preset-wind/rules' diff --git a/packages/unocss-base/preset-rn/rules/background.js b/packages/unocss-base/preset-rn/rules/background.js index 25b1faef50..68d68b1a8d 100644 --- a/packages/unocss-base/preset-rn/rules/background.js +++ b/packages/unocss-base/preset-rn/rules/background.js @@ -1,21 +1,23 @@ -import { backgroundStyles } from '@unocss/preset-wind/rules' -import { findRawRules, transformEmptyRule } from '../../utils/index.js' +const backgroundStyles = [ + // attachments + 'bg-fixed', + 'bg-locale', + 'bg-scroll', + // repeat + 'bg-repeat', + 'bg-repeat-x', + 'bg-repeat-y', + 'bg-repeat-round', + 'bg-repeat-space', + // origins + 'bg-origin-border', + 'bg-origin-padding', + 'bg-origin-content', + // clips + 'bg-clip-border', + 'bg-clip-content', + 'bg-clip-padding', + 'bg-clip-text' +] -// todo background-position 剔除 -const NewBackgroundRules = transformEmptyRule(findRawRules( - [ - // attachments - 'bg-fixed', - 'bg-locale', - 'bg-scroll', - // repeat - /^bg-repeat-?.*/, - // origins - /^bg-origin-.*/, - // clips - /^bg-clip-.*/ - ], - backgroundStyles -)) - -export { NewBackgroundRules as backgroundStyles } +export { backgroundStyles } diff --git a/packages/unocss-base/preset-rn/rules/behaviors.js b/packages/unocss-base/preset-rn/rules/behaviors.js index 659a9175d8..7350e2bebe 100644 --- a/packages/unocss-base/preset-rn/rules/behaviors.js +++ b/packages/unocss-base/preset-rn/rules/behaviors.js @@ -1,17 +1,13 @@ import { imageRenderings, overscrolls, listStyle, accents, carets } from '@unocss/preset-wind/rules' import { appearance, outline, willChange } from '@unocss/preset-mini/rules' -import { transformEmptyRule } from '../../utils/index.js' export default [ - ...transformEmptyRule( - overscrolls, - imageRenderings, - listStyle, - outline, - willChange, - appearance, - accents, - carets, - willChange - ) + ...overscrolls, + ...imageRenderings, + ...listStyle, + ...outline, + ...willChange, + ...appearance, + ...accents, + ...carets ] diff --git a/packages/unocss-base/preset-rn/rules/border.js b/packages/unocss-base/preset-rn/rules/border.js index f4f5c4ee23..d408e00a9b 100644 --- a/packages/unocss-base/preset-rn/rules/border.js +++ b/packages/unocss-base/preset-rn/rules/border.js @@ -1,17 +1,21 @@ import { borders } from '@unocss/preset-mini/rules' -import { ruleCallback } from '../../utils/index.js' -const bordersRules = borders.map(v => { - const [regex, matcher, ...another] = v - return [ - regex, - (...args) => { - const [[, a]] = args - if (['block', 'inline'].includes(a)) return ruleCallback(...args) - return matcher(...args) - }, - ...another - ] +const unSupport = [ + 's', + 'e', + 'bs', + 'be', + 'is', + 'ie', + 'block', + 'inline' +] + +const bordersRules = borders.map(([rule]) => (raw) => { + const result = raw.match(rule) + if (result && unSupport.includes(result[1])) { + return true + } }) export default bordersRules diff --git a/packages/unocss-base/preset-rn/rules/color.js b/packages/unocss-base/preset-rn/rules/color.js index a8201e4408..57935e1320 100644 --- a/packages/unocss-base/preset-rn/rules/color.js +++ b/packages/unocss-base/preset-rn/rules/color.js @@ -1,6 +1 @@ -import { colorScheme } from '@unocss/preset-mini/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const colorSchemeRules = transformEmptyRule(colorScheme) - -export { colorSchemeRules as colorScheme } +export { colorScheme } from '@unocss/preset-mini/rules' diff --git a/packages/unocss-base/preset-rn/rules/columns.js b/packages/unocss-base/preset-rn/rules/columns.js index 510a083d43..d5f256d253 100644 --- a/packages/unocss-base/preset-rn/rules/columns.js +++ b/packages/unocss-base/preset-rn/rules/columns.js @@ -1,6 +1 @@ -import { columns } from '@unocss/preset-wind/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const columnsRules = transformEmptyRule(columns) - -export { columnsRules as columns } +export { columns } from '@unocss/preset-wind/rules' diff --git a/packages/unocss-base/preset-rn/rules/container.js b/packages/unocss-base/preset-rn/rules/container.js index 2d1653f420..8e79d4f6fb 100644 --- a/packages/unocss-base/preset-rn/rules/container.js +++ b/packages/unocss-base/preset-rn/rules/container.js @@ -1,11 +1,7 @@ import { containerParent } from '@unocss/preset-mini/rules' import { container } from '@unocss/preset-wind/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const containerParentRules = transformEmptyRule(containerParent) -const containerRules = transformEmptyRule(container) export { - containerParentRules as containerParent, - containerRules as container + containerParent, + container } diff --git a/packages/unocss-base/preset-rn/rules/divide.js b/packages/unocss-base/preset-rn/rules/divide.js index bb490d0988..8df08ef47a 100644 --- a/packages/unocss-base/preset-rn/rules/divide.js +++ b/packages/unocss-base/preset-rn/rules/divide.js @@ -1,6 +1 @@ -import { divides } from '@unocss/preset-wind/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const divideRules = transformEmptyRule(divides) - -export { divideRules as divides } +export { divides } from '@unocss/preset-wind/rules' diff --git a/packages/unocss-base/preset-rn/rules/flex.js b/packages/unocss-base/preset-rn/rules/flex.js index 36d1b4eab4..469f60ef69 100644 --- a/packages/unocss-base/preset-rn/rules/flex.js +++ b/packages/unocss-base/preset-rn/rules/flex.js @@ -1,12 +1,9 @@ -import { flex } from '@unocss/preset-mini/rules' -import { findRawRules, transformEmptyRule } from '../../utils/index.js' -// flex 不支持的属性抽离并覆盖 -const flexRules = transformEmptyRule(findRawRules([ +const flex = [ 'flex-inline', 'inline-flex' -], flex)) +] export { - flexRules as flex + flex } diff --git a/packages/unocss-base/preset-rn/rules/gap.js b/packages/unocss-base/preset-rn/rules/gap.js index 94db3261aa..c1107ab695 100644 --- a/packages/unocss-base/preset-rn/rules/gap.js +++ b/packages/unocss-base/preset-rn/rules/gap.js @@ -1,17 +1,10 @@ import { gaps } from '@unocss/preset-mini/rules' -import { ruleCallback } from '../../utils/index.js' -const gapsRules = gaps.map(v => { - const [regex, matcher, ...another] = v - return [ - regex, - (...args) => { - const [[a]] = args - if (a.startsWith('grid')) return ruleCallback(...args) - return matcher(...args) - }, - ...another - ] +const gapsRules = gaps.map(([rule]) => (raw) => { + const result = raw.match(rule) + if (result && result[0].startsWith('grid')) { + return true + } }) export { diff --git a/packages/unocss-base/preset-rn/rules/global.js b/packages/unocss-base/preset-rn/rules/global.js index 8513fb2bed..4c5cd1f096 100644 --- a/packages/unocss-base/preset-rn/rules/global.js +++ b/packages/unocss-base/preset-rn/rules/global.js @@ -1,8 +1,3 @@ -import { - globalKeywords, - transformEmptyRule -} from '../../utils/index.js' +import { globalKeywords } from '../../utils/index.js' -export const globalRules = transformEmptyRule( - globalKeywords.map(v => [new RegExp(`.*-${v}$`)]) -) +export const globalRules = globalKeywords.map((v) => [new RegExp(`.*-${v}$`)]) diff --git a/packages/unocss-base/preset-rn/rules/grid.js b/packages/unocss-base/preset-rn/rules/grid.js index ba9b837def..769b179b05 100644 --- a/packages/unocss-base/preset-rn/rules/grid.js +++ b/packages/unocss-base/preset-rn/rules/grid.js @@ -1,9 +1 @@ -import { grids } from '@unocss/preset-mini/rules' -import { transformEmptyRule } from '../../utils/index.js' - -// flex 不支持的属性抽离并覆盖 -const gridsRules = transformEmptyRule(grids) - -export { - gridsRules as grids -} +export { grids } from '@unocss/preset-mini/rules' diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index d9830f2368..0fbb9a320f 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -1,31 +1,12 @@ import { colorScheme } from './color.js' import { backgroundStyles } from './background.js' -import { margins, paddings, spaces } from './spacing.js' +import { paddingAndMargins, spaces } from './spacing.js' import typography from './typography.js' import shadow from './shadow.js' import behaviors from './behaviors.js' import { overflows } from './layout.js' import filters from './filters.js' -import { - appearances, - backgroundBlendModes, - contains, - cursors, - displays, - resizes, - whitespaces, - contentVisibility, - contents, - breaks, - textWraps, - textOverflows, - fontStyles, - fontSmoothings, - hyphens, - objectPositions, - isolations, - mixBlendModes -} from './static.js' +import staticRules from './static.js' import { flexGridJustifiesAlignments, justifies, @@ -50,86 +31,58 @@ import { viewTransition } from './view-transition.js' import { gaps } from './gap.js' import { transitions } from './transition.js' import { svgUtilities } from './svg.js' -import ring from './ring.js' +import { rings } from './ring.js' import border from './border.js' import { transforms } from './transforms.js' import { textDecorations } from './decoration.js' +import { lineClamps } from './line-clamp.js' +import { grids } from './grid.js' -export default [ - ...typography, - ...textDecorations, - ...shadow, - ...behaviors, - ...filters, - ...ring, - ...border, - // align - ...verticalAligns, - ...textAligns, - // color - ...colorScheme, +export const blocklistRules = [ ...backgroundStyles, - // container - ...containerParent, - ...container, - // layout + ...border, ...overflows, - // positions - ...floats, - ...flex, + // space + ...paddingAndMargins, + ...spaces, + // position ...positions, + ...flexGridJustifiesAlignments, ...justifies, ...orders, ...placements, - ...flexGridJustifiesAlignments, + ...floats, ...boxSizing, // static - ...displays, - ...backgroundBlendModes, - ...appearances, - ...cursors, - ...contains, - ...resizes, - ...whitespaces, - ...contentVisibility, - ...contents, - ...breaks, - ...textWraps, - ...textOverflows, - ...fontStyles, - ...fontSmoothings, - ...hyphens, - ...objectPositions, - ...isolations, - ...mixBlendModes, - // spaceing - ...paddings, - ...margins, - ...spaces, - // animations, - ...animations, - // columns + ...staticRules, + ...verticalAligns, + ...textAligns, + ...flex, + ...gaps, + ...typography, + ...behaviors, + ...containerParent, + ...container, + ...colorScheme, ...columns, - // divide - ...divides, - // placeholder + ...grids, ...placeholders, - // scrolls - ...scrolls, - // tables ...tables, - // touchActions + ...scrolls, + ...divides, ...touchActions, - // view-transition + ...rings, + ...lineClamps, + ...svgUtilities, ...viewTransition, - // gap - ...gaps, - // transition ...transitions, - // svg - ...svgUtilities, - // transforms ...transforms, - // global + ...animations, ...globalRules ] + +export default [ + ...textDecorations, + ...shadow, + ...filters +] diff --git a/packages/unocss-base/preset-rn/rules/layout.js b/packages/unocss-base/preset-rn/rules/layout.js index e732192f18..325df879e7 100644 --- a/packages/unocss-base/preset-rn/rules/layout.js +++ b/packages/unocss-base/preset-rn/rules/layout.js @@ -1,19 +1,12 @@ -import { ruleCallback, ruleFallback } from '../../utils/index.js' - const overflows = [ - [ - /^(?:overflow|of)-(.+)$/, - ([match, v], { generator }) => { - if (['hidden', 'visiable', 'scroll'].includes(v)) { - return { - overflow: v - } - } else { - return ruleFallback(match, generator) - } + (raw) => { + const reg = /^(?:overflow|of)-(.+)$/ + const match = raw.match(reg) + if (match && !['hidden', 'visible', 'scroll'].includes(match[1])) { + return true } - ], - [/^(?:overflow|of)-([xy])-(.+)$/, ruleCallback] + }, + /^(?:overflow|of)-([xy])-(.+)$/ ] export { overflows } diff --git a/packages/unocss-base/preset-rn/rules/line-clamp.js b/packages/unocss-base/preset-rn/rules/line-clamp.js index 07740b2795..1d0e02241a 100644 --- a/packages/unocss-base/preset-rn/rules/line-clamp.js +++ b/packages/unocss-base/preset-rn/rules/line-clamp.js @@ -1,8 +1 @@ -import { lineClamps } from '@unocss/preset-wind/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const lineClampsRules = transformEmptyRule(lineClamps) - -export { - lineClampsRules as lineClamps -} +export { lineClamps } from '@unocss/preset-wind/rules' diff --git a/packages/unocss-base/preset-rn/rules/placeholder.js b/packages/unocss-base/preset-rn/rules/placeholder.js index 6495f82645..52442f7c89 100644 --- a/packages/unocss-base/preset-rn/rules/placeholder.js +++ b/packages/unocss-base/preset-rn/rules/placeholder.js @@ -1,6 +1 @@ -import { placeholders } from '@unocss/preset-wind/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const placeholdersRules = transformEmptyRule(placeholders) - -export { placeholdersRules as placeholders } +export { placeholders } from '@unocss/preset-wind/rules' diff --git a/packages/unocss-base/preset-rn/rules/positions.js b/packages/unocss-base/preset-rn/rules/positions.js index ddb2061ada..992463c113 100644 --- a/packages/unocss-base/preset-rn/rules/positions.js +++ b/packages/unocss-base/preset-rn/rules/positions.js @@ -4,82 +4,51 @@ import { orders, alignments, placements, - floats, - boxSizing + floats } from '@unocss/preset-mini/rules' -import { - findRawRules, - ruleCallback, - transformEmptyRule -} from '../../utils/index.js' const unSupport = ['sticky', 'fixed'] -// position 不支持的属性抽离并覆盖 -const positionsRules = positions.map(v => { - const [regex, matcher, ...another] = v - return [ - regex, - (...args) => { - const [[, v]] = args - if (unSupport.includes(v)) return ruleCallback(...args) - return matcher(...args) - }, - ...another - ] + +const positionsRules = positions.map(([rule]) => (raw) => { + const result = raw.match(rule) + if (result && unSupport.includes(result[1])) { + return true + } }) // 不支持的规则过滤覆盖 const justifiesRules = [ - ...transformEmptyRule( - findRawRules( - [ - 'justify-left', - 'justify-right', - 'justify-stretch', - 'justify-items-center', - 'justify-items-end', - 'justify-items-start', - 'justify-items-stretch', - 'justify-self-auto', - 'justify-self-center', - 'justify-self-end', - 'justify-self-stretch', - 'justify-self-start' - ], - justifies - ) - ) + 'justify-left', + 'justify-right', + 'justify-stretch', + 'justify-items-center', + 'justify-items-end', + 'justify-items-start', + 'justify-items-stretch', + 'justify-self-auto', + 'justify-self-center', + 'justify-self-end', + 'justify-self-stretch', + 'justify-self-start' ] -const ordersRules = transformEmptyRule(orders) - -const placementsRules = transformEmptyRule(placements) - -const flexGridJustifiesAlignmentsRules = transformEmptyRule([ +const flexGridJustifiesAlignments = [ // flex部分不支持 - ...[...justifiesRules, ...placementsRules].map( - ([k, v]) => [`flex-${k}`, v] - ), + ...[...justifiesRules, ...placements].map((k) => `flex-${k}`), // grid全部不支持 - ...[...justifies, ...alignments, ...placements].map(([k, v]) => [ - `grid-${k}`, - v - ]) -]) - -// floats 不支持的属性抽离并覆盖 -const floatsRules = transformEmptyRule(floats) + ...[...justifies, ...alignments, ...placements].map((k) => `grid-${k}`) +] -const boxSizingRules = transformEmptyRule( - findRawRules(['box-content'], boxSizing) -) +const boxSizing = [ + 'box-content' +] export { positionsRules as positions, justifiesRules as justifies, - ordersRules as orders, - placementsRules as placements, - flexGridJustifiesAlignmentsRules as flexGridJustifiesAlignments, - floatsRules as floats, - boxSizingRules as boxSizing + orders, + placements, + flexGridJustifiesAlignments, + floats, + boxSizing } diff --git a/packages/unocss-base/preset-rn/rules/ring.js b/packages/unocss-base/preset-rn/rules/ring.js index edc99c5eab..ba307e3f8d 100644 --- a/packages/unocss-base/preset-rn/rules/ring.js +++ b/packages/unocss-base/preset-rn/rules/ring.js @@ -1,4 +1 @@ -import { rings } from '@unocss/preset-mini/rules' -import { transformEmptyRule } from '../../utils/index.js' - -export default transformEmptyRule(rings) +export { rings } from '@unocss/preset-mini/rules' diff --git a/packages/unocss-base/preset-rn/rules/scrolls.js b/packages/unocss-base/preset-rn/rules/scrolls.js index 89f8b3774a..14d4120081 100644 --- a/packages/unocss-base/preset-rn/rules/scrolls.js +++ b/packages/unocss-base/preset-rn/rules/scrolls.js @@ -1,8 +1 @@ -import { scrolls } from '@unocss/preset-wind/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const scrollsRules = transformEmptyRule(scrolls) - -export { - scrollsRules as scrolls -} +export { scrolls } from '@unocss/preset-wind/rules' diff --git a/packages/unocss-base/preset-rn/rules/spacing.js b/packages/unocss-base/preset-rn/rules/spacing.js index 5aea724497..57911d0646 100644 --- a/packages/unocss-base/preset-rn/rules/spacing.js +++ b/packages/unocss-base/preset-rn/rules/spacing.js @@ -1,6 +1,5 @@ import { margins, paddings } from '@unocss/preset-mini/rules' import { spaces } from '@unocss/preset-wind/rules' -import { ruleCallback, transformEmptyRule } from '../../utils/index.js' const unSupport = [ 's', @@ -13,36 +12,14 @@ const unSupport = [ 'inline' ] -const paddingsRules = paddings.map(v => { - const [regex, matcher, ...another] = v - return [ - regex, - (...args) => { - const [[, direction]] = args - if (unSupport.includes(direction)) return ruleCallback(...args) - return matcher(...args) - }, - ...another - ] +const paddingAndMargins = [...paddings, ...margins].map(([rule]) => (raw) => { + const result = raw.match(rule) + if (result && unSupport.includes(result[1])) { + return true + } }) -const marginsRules = margins.map(v => { - const [regex, matcher, ...another] = v - return [ - regex, - (...args) => { - const [[, direction]] = args - if (unSupport.includes(direction)) return ruleCallback(...args) - return matcher(...args) - }, - ...another - ] -}) - -const spacesRules = transformEmptyRule(spaces) - export { - paddingsRules as paddings, - marginsRules as margins, - spacesRules as spaces + paddingAndMargins, + spaces } diff --git a/packages/unocss-base/preset-rn/rules/static.js b/packages/unocss-base/preset-rn/rules/static.js index 26cb1b6e88..e37d8d1684 100644 --- a/packages/unocss-base/preset-rn/rules/static.js +++ b/packages/unocss-base/preset-rn/rules/static.js @@ -1,86 +1,48 @@ import { - appearances, breaks, contains, contents, contentVisibility, cursors, - displays, fontSmoothings, - fontStyles, resizes, - textOverflows, textWraps, whitespaces } from '@unocss/preset-mini/rules' import { backgroundBlendModes, mixBlendModes, hyphens, isolations, objectPositions } from '@unocss/preset-wind/rules' -import { findRawRules, transformEmptyRule } from '../../utils/index.js' -// display不支持的属性抽离并覆盖 -const displaysRules = transformEmptyRule( - findRawRules( - ['inline', 'block', 'inline-block', 'contents', 'flow-root', 'list-item'], - displays - ) -) - -const backgroundBlendModesRules = transformEmptyRule(backgroundBlendModes) - -const appearancesRules = transformEmptyRule( - findRawRules(['visible', 'invisible'], appearances) -) - -const cursorsRules = transformEmptyRule(cursors) - -const containsRules = transformEmptyRule(contains) - -const resizesRules = transformEmptyRule(resizes) - -const whitespacesRules = transformEmptyRule(whitespaces) - -const contentVisibilityRules = transformEmptyRule(contentVisibility) - -const contentsRules = transformEmptyRule(contents) - -const breaksRules = transformEmptyRule(breaks) - -const textWrapsRules = transformEmptyRule(textWraps) - -const textOverflowsRules = transformEmptyRule( - findRawRules(['text-ellipsis', 'text-clip'], textOverflows) -) - -const fontStylesRules = transformEmptyRule( - findRawRules(['oblique', 'font-oblique'], fontStyles) -) - -const fontSmoothingsRules = transformEmptyRule(fontSmoothings) - -const hyphensRules = transformEmptyRule(hyphens) - -const objectPositionsRules = transformEmptyRule(objectPositions) - -const isolationsRules = transformEmptyRule(isolations) - -const mixBlendModesRules = transformEmptyRule(mixBlendModes) - -export { - backgroundBlendModesRules as backgroundBlendModes, - displaysRules as displays, - appearancesRules as appearances, - cursorsRules as cursors, - containsRules as contains, - resizesRules as resizes, - whitespacesRules as whitespaces, - contentVisibilityRules as contentVisibility, - contentsRules as contents, - breaksRules as breaks, - textWrapsRules as textWraps, - textOverflowsRules as textOverflows, - fontStylesRules as fontStyles, - fontSmoothingsRules as fontSmoothings, - hyphensRules as hyphens, - objectPositionsRules as objectPositions, - isolationsRules as isolations, - mixBlendModesRules as mixBlendModes -} +const displays = [ + 'inline', + 'block', + 'inline-block', + 'contents', + 'flow-root', + 'list-item' +] + +const appearances = ['visible', 'invisible'] + +const textOverflows = ['text-ellipsis', 'text-clip'] + +const fontStyles = ['oblique', 'font-oblique'] + +export default [ + ...appearances, + ...breaks, + ...contains, + ...contents, + ...contentVisibility, + ...cursors, + ...displays, + ...fontSmoothings, + ...fontStyles, + ...resizes, + ...textOverflows, + ...textWraps, + ...whitespaces, + ...backgroundBlendModes, + ...mixBlendModes, + ...hyphens, + ...isolations, + ...objectPositions +] diff --git a/packages/unocss-base/preset-rn/rules/svg.js b/packages/unocss-base/preset-rn/rules/svg.js index 6a9bd3c010..50bc327131 100644 --- a/packages/unocss-base/preset-rn/rules/svg.js +++ b/packages/unocss-base/preset-rn/rules/svg.js @@ -1,6 +1 @@ -import { svgUtilities } from '@unocss/preset-mini/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const svgUtilitiesRules = transformEmptyRule(svgUtilities) - -export { svgUtilitiesRules as svgUtilities } +export { svgUtilities } from '@unocss/preset-mini/rules' diff --git a/packages/unocss-base/preset-rn/rules/table.js b/packages/unocss-base/preset-rn/rules/table.js index 7ae503ebf5..58568834e4 100644 --- a/packages/unocss-base/preset-rn/rules/table.js +++ b/packages/unocss-base/preset-rn/rules/table.js @@ -1,6 +1 @@ -import { tables } from '@unocss/preset-wind/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const tablesRules = transformEmptyRule(tables) - -export { tablesRules as tables } +export { tables } from '@unocss/preset-wind/rules' diff --git a/packages/unocss-base/preset-rn/rules/touch-actions.js b/packages/unocss-base/preset-rn/rules/touch-actions.js index 8b5ea712ac..737e28420e 100644 --- a/packages/unocss-base/preset-rn/rules/touch-actions.js +++ b/packages/unocss-base/preset-rn/rules/touch-actions.js @@ -1,6 +1 @@ -import { touchActions } from '@unocss/preset-wind/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const touchActionsRules = transformEmptyRule(touchActions) - -export { touchActionsRules as touchActions } +export { touchActions } from '@unocss/preset-wind/rules' diff --git a/packages/unocss-base/preset-rn/rules/transition.js b/packages/unocss-base/preset-rn/rules/transition.js index 80f077f94e..7a052475f9 100644 --- a/packages/unocss-base/preset-rn/rules/transition.js +++ b/packages/unocss-base/preset-rn/rules/transition.js @@ -1,6 +1 @@ -import { transitions } from '@unocss/preset-mini/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const transitionsRules = transformEmptyRule(transitions) - -export { transitionsRules as transitions } +export { transitions } from '@unocss/preset-mini/rules' diff --git a/packages/unocss-base/preset-rn/rules/typography.js b/packages/unocss-base/preset-rn/rules/typography.js index 069054a998..fbc8c24a85 100644 --- a/packages/unocss-base/preset-rn/rules/typography.js +++ b/packages/unocss-base/preset-rn/rules/typography.js @@ -1,4 +1,3 @@ -import { transformEmptyRule } from '../../utils/index.js' import { writingModes, writingOrientations, @@ -17,18 +16,16 @@ import { } from '@unocss/preset-mini/rules' export default [ - ...transformEmptyRule( - textIndents, - textStrokes, - tabSizes, - whitespaces, - breaks, - textOverflows, - hyphens, - writingModes, - writingOrientations, - textWraps, - fontSmoothings, - fontVariantNumeric - ) + ...textIndents, + ...textStrokes, + ...tabSizes, + ...whitespaces, + ...breaks, + ...textOverflows, + ...hyphens, + ...writingModes, + ...writingOrientations, + ...textWraps, + ...fontSmoothings, + ...fontVariantNumeric ] diff --git a/packages/unocss-base/preset-rn/rules/view-transition.js b/packages/unocss-base/preset-rn/rules/view-transition.js index 86030db380..d2b49ec498 100644 --- a/packages/unocss-base/preset-rn/rules/view-transition.js +++ b/packages/unocss-base/preset-rn/rules/view-transition.js @@ -1,8 +1 @@ -import { viewTransition } from '@unocss/preset-wind/rules' -import { transformEmptyRule } from '../../utils/index.js' - -const viewTransitionRules = transformEmptyRule(viewTransition) - -export { - viewTransitionRules as viewTransition -} +export { viewTransition } from '@unocss/preset-wind/rules' From 35ac85b0fb28e467dee6fe97aa77217fb2e6a4ec Mon Sep 17 00:00:00 2001 From: mater Date: Mon, 6 Jan 2025 16:41:02 +0800 Subject: [PATCH 065/128] fix: rules --- packages/unocss-base/preset-rn/rules/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index 0fbb9a320f..1fd3e7d75a 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -76,7 +76,6 @@ export const blocklistRules = [ ...svgUtilities, ...viewTransition, ...transitions, - ...transforms, ...animations, ...globalRules ] @@ -84,5 +83,6 @@ export const blocklistRules = [ export default [ ...textDecorations, ...shadow, - ...filters + ...filters, + ...transforms ] From 962b83bdb1d71c8d56548125a453f7807f4567ea Mon Sep 17 00:00:00 2001 From: mater Date: Mon, 6 Jan 2025 17:04:50 +0800 Subject: [PATCH 066/128] fix: var --- packages/unocss-base/preset-rn/index.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/unocss-base/preset-rn/index.js b/packages/unocss-base/preset-rn/index.js index 6f641f0575..b281351472 100644 --- a/packages/unocss-base/preset-rn/index.js +++ b/packages/unocss-base/preset-rn/index.js @@ -21,12 +21,23 @@ function preflights () { ] } +function postprocess (utilsObject) { + const everyIsVar = utilsObject.entries.every(v => { + return v[0].startsWith('--') + }) + if (everyIsVar) { + utilsObject.layer = 'utilities' + } + return utilsObject +} + export default function presetRnMpx () { return { name: '@mpxjs/unocss-preset-rn', rules, theme, preflights: preflights(), + postprocess: [postprocess], blocklist: [ ...blocklistRules, ...blocklistVariants From 976fc025c3f0c1fa6e6dcb46c8f184bab3bf2ab0 Mon Sep 17 00:00:00 2001 From: mater Date: Mon, 6 Jan 2025 19:00:28 +0800 Subject: [PATCH 067/128] fix: uno --- .../builtInMixins/styleHelperMixin.ios.js | 2 +- packages/unocss-base/preset-rn/index.js | 14 +++++++++----- .../unocss-base/preset-rn/rules/filters.js | 18 +----------------- packages/unocss-plugin/lib/rn-plugin/index.js | 4 ++-- 4 files changed, 13 insertions(+), 25 deletions(-) diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index bdf434fce1..6e837a045e 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -164,7 +164,7 @@ export default function styleHelperMixin () { Object.assign(result, this.__props[className]) } }) - result = Object.assign({}, unoPreflightsClassMap, unoResult, result, unoUtilitiesResult) + result = Object.assign({}, unoPreflightsClassMap, unoResult, unoUtilitiesResult, result) } if (staticStyle || dynamicStyle) { diff --git a/packages/unocss-base/preset-rn/index.js b/packages/unocss-base/preset-rn/index.js index b281351472..5721649005 100644 --- a/packages/unocss-base/preset-rn/index.js +++ b/packages/unocss-base/preset-rn/index.js @@ -2,6 +2,8 @@ import rules, { blocklistRules } from './rules/index.js' import { normalizeTransfromVar } from './rules/transforms.js' import theme from './theme.js' import blocklistVariants from './variants/index.js' +import { boxShadowsBase, transformBase } from '@unocss/preset-mini/rules' +import { filterBase } from '@unocss/preset-wind/rules' function normalizePreflightBase (preflightBase) { normalizeTransfromVar(preflightBase) @@ -13,9 +15,11 @@ function preflights () { { layer: 'preflights', getCSS ({ theme, generator }) { - if (theme.preflightBase) { - generator._mpx2rnUnoPreflightBase = normalizePreflightBase(theme.preflightBase) - } + generator._mpx2rnUnoPreflightBase = [ + ...normalizePreflightBase(transformBase), + ...boxShadowsBase, + ...filterBase + ] } } ] @@ -23,10 +27,10 @@ function preflights () { function postprocess (utilsObject) { const everyIsVar = utilsObject.entries.every(v => { - return v[0].startsWith('--') + return v[0].startsWith('--un') }) if (everyIsVar) { - utilsObject.layer = 'utilities' + utilsObject.layer = 'varUtilities' } return utilsObject } diff --git a/packages/unocss-base/preset-rn/rules/filters.js b/packages/unocss-base/preset-rn/rules/filters.js index 875535ded9..b30cfecdba 100644 --- a/packages/unocss-base/preset-rn/rules/filters.js +++ b/packages/unocss-base/preset-rn/rules/filters.js @@ -1,17 +1,6 @@ import { filters, filterBase } from '@unocss/preset-wind/rules' import { transformEmptyRule, findRawRules, ruleCallback } from '../../utils/index.js' -const filterValue = [ - 'blur', - 'brightness', - 'contrast', - 'grayscale', - 'hue-rotate', - 'invert', - 'saturate', - 'sepia' -] - const newFilters = filters.map(v => { const [regex, matcher, ...another] = v if (typeof matcher === 'function') { @@ -20,12 +9,7 @@ const newFilters = filters.map(v => { (...args) => { const [[r]] = args if (/^backdrop/.test(r)) return ruleCallback(...args) - const res = matcher(...args) - // 统一作为工具类使用 - if (filterValue.some(i => r.includes(i))) { - delete res.filter - } - return res + return matcher(...args) }, ...another ] diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index 8f0316708d..a17f4fc768 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -71,8 +71,8 @@ function WebpackPlugin (configOrPath, defaults) { formatValueFn: 'formatValue' }) } - const classMap = getLayersClassMap(result.layers.filter(v => v !== 'utilities')) - const utilitiesClassMap = getLayersClassMap(['utilities']) + const classMap = getLayersClassMap(result.layers.filter(v => v !== 'varUtilities')) + const utilitiesClassMap = getLayersClassMap(['varUtilities']) const preflightsClassMap = uno._mpx2rnUnoPreflightBase const files = Object.keys(compilation.assets) From d54aaed5d617726761adbff1763e6d740e0dec5d Mon Sep 17 00:00:00 2001 From: mater Date: Mon, 6 Jan 2025 19:22:17 +0800 Subject: [PATCH 068/128] fix: remove boxshadow --- packages/unocss-base/preset-rn/index.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/unocss-base/preset-rn/index.js b/packages/unocss-base/preset-rn/index.js index 5721649005..5448f6ddd2 100644 --- a/packages/unocss-base/preset-rn/index.js +++ b/packages/unocss-base/preset-rn/index.js @@ -2,7 +2,7 @@ import rules, { blocklistRules } from './rules/index.js' import { normalizeTransfromVar } from './rules/transforms.js' import theme from './theme.js' import blocklistVariants from './variants/index.js' -import { boxShadowsBase, transformBase } from '@unocss/preset-mini/rules' +import { transformBase } from '@unocss/preset-mini/rules' import { filterBase } from '@unocss/preset-wind/rules' function normalizePreflightBase (preflightBase) { @@ -17,7 +17,6 @@ function preflights () { getCSS ({ theme, generator }) { generator._mpx2rnUnoPreflightBase = [ ...normalizePreflightBase(transformBase), - ...boxShadowsBase, ...filterBase ] } From f99d3667e2f1dd1677217da448c44b94e83d6958 Mon Sep 17 00:00:00 2001 From: mater Date: Mon, 6 Jan 2025 19:53:44 +0800 Subject: [PATCH 069/128] fix: build --- packages/unocss-base/preset-rn/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/unocss-base/preset-rn/index.js b/packages/unocss-base/preset-rn/index.js index 5448f6ddd2..5cfdda7ccc 100644 --- a/packages/unocss-base/preset-rn/index.js +++ b/packages/unocss-base/preset-rn/index.js @@ -15,10 +15,10 @@ function preflights () { { layer: 'preflights', getCSS ({ theme, generator }) { - generator._mpx2rnUnoPreflightBase = [ + generator._mpx2rnUnoPreflightBase = { ...normalizePreflightBase(transformBase), ...filterBase - ] + } } } ] From 8c50fdc1070c228bde6910c8e354781f31d43303 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Mon, 6 Jan 2025 19:54:54 +0800 Subject: [PATCH 070/128] [fix]some utils --- packages/unocss-base/preset-rn/rules/filters.js | 16 +++++++++++++++- packages/unocss-base/utils/index.js | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/unocss-base/preset-rn/rules/filters.js b/packages/unocss-base/preset-rn/rules/filters.js index b30cfecdba..8120caa856 100644 --- a/packages/unocss-base/preset-rn/rules/filters.js +++ b/packages/unocss-base/preset-rn/rules/filters.js @@ -1,5 +1,5 @@ import { filters, filterBase } from '@unocss/preset-wind/rules' -import { transformEmptyRule, findRawRules, ruleCallback } from '../../utils/index.js' +import { transformEmptyRule, findRawRules, ruleCallback, isReg, isString } from '../../utils/index.js' const newFilters = filters.map(v => { const [regex, matcher, ...another] = v @@ -29,6 +29,20 @@ const filterBaseRule = [ }] ] +const filterRules = filters.map(([rule]) => (raw) => { + const reg = /^backdrop-/ + let result = '' + if (isString(rule)) { + result = rule + } else if (isReg(rule)) { + const matcher = raw.match(rule) + if (matcher) { + result = matcher[0] + } + } + return reg.test(result) +}) + newFilters.push(...backDropFilter, ...filterBaseRule) export default newFilters diff --git a/packages/unocss-base/utils/index.js b/packages/unocss-base/utils/index.js index 36f3157d08..db9537c158 100644 --- a/packages/unocss-base/utils/index.js +++ b/packages/unocss-base/utils/index.js @@ -85,5 +85,7 @@ export { findRawRules, ruleFallback, isFunction, + isReg, + isString, ruleCallback } From d641c3d77954e25a6ee35c1b9642a1ab90f1f6c1 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Mon, 6 Jan 2025 20:22:20 +0800 Subject: [PATCH 071/128] [optimize]filer rule --- .../unocss-base/preset-rn/rules/filters.js | 43 ++++--------------- packages/unocss-base/preset-rn/rules/index.js | 2 +- 2 files changed, 10 insertions(+), 35 deletions(-) diff --git a/packages/unocss-base/preset-rn/rules/filters.js b/packages/unocss-base/preset-rn/rules/filters.js index 8120caa856..70b95b2d6d 100644 --- a/packages/unocss-base/preset-rn/rules/filters.js +++ b/packages/unocss-base/preset-rn/rules/filters.js @@ -1,48 +1,23 @@ -import { filters, filterBase } from '@unocss/preset-wind/rules' -import { transformEmptyRule, findRawRules, ruleCallback, isReg, isString } from '../../utils/index.js' +import { filters } from '@unocss/preset-wind/rules' +import { isReg, isString } from '../../utils/index.js' -const newFilters = filters.map(v => { - const [regex, matcher, ...another] = v - if (typeof matcher === 'function') { - return [ - regex, - (...args) => { - const [[r]] = args - if (/^backdrop/.test(r)) return ruleCallback(...args) - return matcher(...args) - }, - ...another - ] - } - return v -}) - -const backDropFilter = transformEmptyRule( - findRawRules(['backdrop-filter', 'backdrop-filter-none'], filters) -) - -const filterBaseRule = [ - ['filter', null], - ['filter', { - ...filterBase, - filter: 'var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)' - }] +const unSupport = [ + 'backdrop-filter', + 'backdrop-filter-none' ] const filterRules = filters.map(([rule]) => (raw) => { const reg = /^backdrop-/ let result = '' - if (isString(rule)) { - result = rule + if (isString(rule) && unSupport.includes(raw)) { + return true } else if (isReg(rule)) { const matcher = raw.match(rule) if (matcher) { result = matcher[0] + return reg.test(result) } } - return reg.test(result) }) -newFilters.push(...backDropFilter, ...filterBaseRule) - -export default newFilters +export default filterRules diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index 1fd3e7d75a..98655d9751 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -77,12 +77,12 @@ export const blocklistRules = [ ...viewTransition, ...transitions, ...animations, + ...filters, ...globalRules ] export default [ ...textDecorations, ...shadow, - ...filters, ...transforms ] From bf3df9960f548125bbaccc47e87b13da0989c596 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Mon, 6 Jan 2025 20:38:13 +0800 Subject: [PATCH 072/128] [optimize]text-decoration & blocklist --- .../unocss-base/preset-rn/rules/decoration.js | 46 ++++++++----------- packages/unocss-base/preset-rn/rules/index.js | 4 +- packages/unocss-base/utils/index.js | 2 +- packages/unocss-plugin/lib/rn-plugin/index.js | 5 +- 4 files changed, 25 insertions(+), 32 deletions(-) diff --git a/packages/unocss-base/preset-rn/rules/decoration.js b/packages/unocss-base/preset-rn/rules/decoration.js index 844ea95075..cf22dd1652 100644 --- a/packages/unocss-base/preset-rn/rules/decoration.js +++ b/packages/unocss-base/preset-rn/rules/decoration.js @@ -1,5 +1,5 @@ import { textDecorations } from '@unocss/preset-mini/rules' -import { transformEmptyRule, ruleCallback, findRawRules } from '../../utils/index.js' +import { isReg } from '../../utils/index.js' const unSupport = [ 'auto', @@ -7,32 +7,26 @@ const unSupport = [ 'overline' ] -const textDecorationsRules = textDecorations.map(v => { - const [regex, matcher, ...another] = v - if (typeof matcher === 'function') { - return [ - regex, - (...args) => { - const [[, v]] = args - if (unSupport.includes(v)) return ruleCallback(...args) - const res = matcher(...args) - if (res['text-decoration-thickness'] || res['text-underline-offset']) { - return ruleCallback(...args) - } - return res - }, - ...another - ] +const textDecorationsRules = textDecorations.map(([rule]) => (raw) => { + if (isReg(rule)) { + const result = raw.match(rule) + if (result && unSupport.includes(result[1])) { + return true + } } - return v }) -const textDecorationsWavyStyle = transformEmptyRule( - findRawRules(['underline-wavy', 'decoration-wavy'], textDecorationsRules) -) - -textDecorationsRules.push(...textDecorationsWavyStyle) +const rules = [ + // size + /^(?:underline|decoration)-(auto|from-font)$/, + // offset + /^(?:underline|decoration)-offset-(.+)$/, + // wavy style + 'underline-wavy', + 'decoration-wavy' +] -export { - textDecorationsRules as textDecorations -} +export default [ + ...textDecorationsRules, + ...rules +] diff --git a/packages/unocss-base/preset-rn/rules/index.js b/packages/unocss-base/preset-rn/rules/index.js index 98655d9751..61c9d1e2dd 100644 --- a/packages/unocss-base/preset-rn/rules/index.js +++ b/packages/unocss-base/preset-rn/rules/index.js @@ -34,11 +34,12 @@ import { svgUtilities } from './svg.js' import { rings } from './ring.js' import border from './border.js' import { transforms } from './transforms.js' -import { textDecorations } from './decoration.js' import { lineClamps } from './line-clamp.js' import { grids } from './grid.js' +import textDecorations from './decoration.js' export const blocklistRules = [ + ...textDecorations, ...backgroundStyles, ...border, ...overflows, @@ -82,7 +83,6 @@ export const blocklistRules = [ ] export default [ - ...textDecorations, ...shadow, ...transforms ] diff --git a/packages/unocss-base/utils/index.js b/packages/unocss-base/utils/index.js index db9537c158..73b9cd7ccc 100644 --- a/packages/unocss-base/utils/index.js +++ b/packages/unocss-base/utils/index.js @@ -17,7 +17,7 @@ const ruleCallback = ([match], { generator }) => { } const ruleFallback = (match, generator) => { - generator._mpx2rnUnsuportedRules.add(match) + generator.blocked.add(match) return EMPTY } diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index a17f4fc768..8c25047e1b 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -53,8 +53,8 @@ function WebpackPlugin (configOrPath, defaults) { } } const result = await uno.generate(tokens, { minify: true }) - if (uno._mpx2rnUnsuportedRules.size || uno.blocked.size) { - compilation.errors.push(`[Mpx Unocss]: all those '${[...uno._mpx2rnUnsuportedRules, ...uno.blocked].join(', ')}' class utilities is not supported in react native mode`) + if (uno.blocked.size) { + compilation.errors.push(`[Mpx Unocss]: all those '${[...uno.blocked].join(', ')}' class utilities is not supported in react native mode`) } const getLayersClassMap = (layers) => { return getClassMap({ @@ -112,7 +112,6 @@ function WebpackPlugin (configOrPath, defaults) { compiler.hooks.beforeCompile.tapPromise(PLUGIN_NAME, async (compilation) => { const ctx = await createContext(configOrPath, defaults) - ctx.uno._mpx2rnUnsuportedRules = new Set() ctx.uno.config.blocklist = ctx.uno.config.blocklist.map((item) => { if (typeof item === 'function') { return item.bind(ctx.uno) From 3a00f88732b6698c3481aa94844985e4defcb614 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 7 Jan 2025 10:44:11 +0800 Subject: [PATCH 073/128] [update]add docs --- docs-vuepress/guide/platform/rn-unocss.md | 77 +++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 docs-vuepress/guide/platform/rn-unocss.md diff --git a/docs-vuepress/guide/platform/rn-unocss.md b/docs-vuepress/guide/platform/rn-unocss.md new file mode 100644 index 0000000000..d06743a2d7 --- /dev/null +++ b/docs-vuepress/guide/platform/rn-unocss.md @@ -0,0 +1,77 @@ +## 使用原子类 + +Mpx 使用 unocss 作为原子类引擎,使得在使用 mpx 开发跨端项目也可以使用原子类。如果要在你的项目当中集成原子类的能力,具体操作请参照接入文档。 + +受限于 RN 平台的样式规则能力限制,绝大部分的 unocss 提供的原子类并不能在跨 RN 项目当中使用,以下是目前所支持的原子类: + +> 对于不支持的原子类,在编译阶段会有 error 提示,且最终的编译产物当中不会产出对应的原子类结果 + +#### [Typography](https://windicss.org/utilities/general/typography.html#typography) + +| 规则 | 是否支持 | 备注 | +| :------------- | :------: | :---: | +| Font family | 是 | | +| Font size | 是 | | +| Font style | 是 | | +| Font weight | 是 | | +| Font Variant Numberic | 否 | | +| Hyphens | 否 | | +| Letter spacing | 是 | | +| Line height | 是 | | +| Tab size | 否 | | +| Text alignment | 是 | | +| Text color | 是 | | +| Text decoration | 是 | | +| Text decoration style | 是 | ios支持,安卓不支持 | +| Text decoration thickness | 否 | | +| Text underline offset | 否 | | +| Text decoration opacity | 是 | | +| Text indent | 否 | | +| Text opacity | 是 | | +| Text shadow | 是 | | +| Text stroke | 否 | | +| Text stroke color | 否 | | +| Text transform | 是 | | +| Vertical alignment | 是 | 安卓支持,ios不支持,且只支持 auto/top/bottom/center | +| White space | 否 | | +| Word break | 否 | | +| Write mode | 否 | | +| Writing orientation | 否 | | + +#### Svg + +不支持 + +#### Variants + +#### Screen Readers + +不支持 + +#### [Background](https://windicss.org/utilities/backgrounds/background.html) + +| 规则 | 是否支持 | 备注 | +| :------------- | :------: | :---: | +| Background attachment | 否 | | +| Background clip | 否 | | +| Background color | 是 | | +| Background opacity | 是 | | +| Background position | 是 | 支持 left/right/top/bottom/center/数值 | +| Background repeat | 是 | 仅支持 no-repeat | +| Background size | 是 | | +| Background origin | 否 | | + +#### Gradients + +| 规则 | 是否支持 | 备注 | +| :------------- | :------: | :---: | +| Gradient Direction | 是 | | +| Gradient From | 是 | | +| Gradient Via | 是 | | +| Gradient To | 是 | | + +#### Background Blend Mode + +不支持 + +#### Box Decoration Break \ No newline at end of file From 6c8fbedebc0455aa4b6d51a31c56a34389d4cd86 Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 7 Jan 2025 10:51:53 +0800 Subject: [PATCH 074/128] fix: remove docs uno --- docs-vuepress/.vuepress/config.js | 103 --- docs-vuepress/unocss/introduce.md | 1 - docs-vuepress/unocss/utilities.md | 80 -- .../utilities/accessibility/screen-readers.md | 38 - .../unocss/utilities/animations/animation.md | 48 -- .../unocss/utilities/animations/transforms.md | 431 ---------- .../utilities/animations/transitions.md | 133 ---- .../backgrounds/background-blend-mode.md | 14 - .../utilities/backgrounds/background.md | 209 ----- .../unocss/utilities/backgrounds/gradients.md | 68 -- .../behaviors/box-decoration-break.md | 16 - .../utilities/behaviors/image-rendering.md | 15 - .../unocss/utilities/behaviors/listings.md | 54 -- .../unocss/utilities/behaviors/overflow.md | 18 - .../behaviors/overscroll-behavior.md | 25 - .../unocss/utilities/behaviors/placeholder.md | 61 -- .../unocss/utilities/borders/border.md | 129 --- .../unocss/utilities/borders/divider.md | 166 ---- .../unocss/utilities/borders/outline.md | 73 -- .../unocss/utilities/borders/ring.md | 170 ---- .../unocss/utilities/effects/box-shadow.md | 63 -- .../utilities/effects/mix-blend-mode.md | 17 - .../unocss/utilities/effects/opacity.md | 29 - .../utilities/filters/backdrop-filter.md | 312 -------- .../unocss/utilities/filters/filter.md | 261 ------ .../unocss/utilities/general/colors.md | 33 - docs-vuepress/unocss/utilities/general/svg.md | 159 ---- .../unocss/utilities/general/typography.md | 742 ------------------ .../unocss/utilities/general/variables.md | 3 - .../unocss/utilities/general/variants.md | 206 ----- .../utilities/interactivity/accent-color.md | 14 - .../utilities/interactivity/appearance.md | 21 - .../unocss/utilities/interactivity/caret.md | 61 -- .../unocss/utilities/interactivity/cursor.md | 37 - .../utilities/interactivity/pointer-events.md | 15 - .../unocss/utilities/interactivity/resize.md | 13 - .../interactivity/scroll-behavior.md | 18 - .../utilities/interactivity/scroll-snap.md | 43 - .../utilities/interactivity/touch-action.md | 36 - .../utilities/interactivity/user-select.md | 11 - .../utilities/interactivity/will-change.md | 10 - .../unocss/utilities/layout/aspect-ratio.md | 48 -- .../unocss/utilities/layout/columns.md | 62 -- .../unocss/utilities/layout/container.md | 87 -- .../unocss/utilities/layout/display.md | 176 ----- .../unocss/utilities/layout/flexbox.md | 205 ----- docs-vuepress/unocss/utilities/layout/grid.md | 613 --------------- .../unocss/utilities/layout/positioning.md | 490 ------------ .../unocss/utilities/layout/sizing.md | 223 ------ .../unocss/utilities/layout/spacing.md | 365 --------- .../unocss/utilities/layout/tables.md | 571 -------------- 51 files changed, 6796 deletions(-) delete mode 100644 docs-vuepress/unocss/introduce.md delete mode 100644 docs-vuepress/unocss/utilities.md delete mode 100644 docs-vuepress/unocss/utilities/accessibility/screen-readers.md delete mode 100644 docs-vuepress/unocss/utilities/animations/animation.md delete mode 100644 docs-vuepress/unocss/utilities/animations/transforms.md delete mode 100644 docs-vuepress/unocss/utilities/animations/transitions.md delete mode 100644 docs-vuepress/unocss/utilities/backgrounds/background-blend-mode.md delete mode 100644 docs-vuepress/unocss/utilities/backgrounds/background.md delete mode 100644 docs-vuepress/unocss/utilities/backgrounds/gradients.md delete mode 100644 docs-vuepress/unocss/utilities/behaviors/box-decoration-break.md delete mode 100644 docs-vuepress/unocss/utilities/behaviors/image-rendering.md delete mode 100644 docs-vuepress/unocss/utilities/behaviors/listings.md delete mode 100644 docs-vuepress/unocss/utilities/behaviors/overflow.md delete mode 100644 docs-vuepress/unocss/utilities/behaviors/overscroll-behavior.md delete mode 100644 docs-vuepress/unocss/utilities/behaviors/placeholder.md delete mode 100644 docs-vuepress/unocss/utilities/borders/border.md delete mode 100644 docs-vuepress/unocss/utilities/borders/divider.md delete mode 100644 docs-vuepress/unocss/utilities/borders/outline.md delete mode 100644 docs-vuepress/unocss/utilities/borders/ring.md delete mode 100644 docs-vuepress/unocss/utilities/effects/box-shadow.md delete mode 100644 docs-vuepress/unocss/utilities/effects/mix-blend-mode.md delete mode 100644 docs-vuepress/unocss/utilities/effects/opacity.md delete mode 100644 docs-vuepress/unocss/utilities/filters/backdrop-filter.md delete mode 100644 docs-vuepress/unocss/utilities/filters/filter.md delete mode 100644 docs-vuepress/unocss/utilities/general/colors.md delete mode 100644 docs-vuepress/unocss/utilities/general/svg.md delete mode 100644 docs-vuepress/unocss/utilities/general/typography.md delete mode 100644 docs-vuepress/unocss/utilities/general/variables.md delete mode 100644 docs-vuepress/unocss/utilities/general/variants.md delete mode 100644 docs-vuepress/unocss/utilities/interactivity/accent-color.md delete mode 100644 docs-vuepress/unocss/utilities/interactivity/appearance.md delete mode 100644 docs-vuepress/unocss/utilities/interactivity/caret.md delete mode 100644 docs-vuepress/unocss/utilities/interactivity/cursor.md delete mode 100644 docs-vuepress/unocss/utilities/interactivity/pointer-events.md delete mode 100644 docs-vuepress/unocss/utilities/interactivity/resize.md delete mode 100644 docs-vuepress/unocss/utilities/interactivity/scroll-behavior.md delete mode 100644 docs-vuepress/unocss/utilities/interactivity/scroll-snap.md delete mode 100644 docs-vuepress/unocss/utilities/interactivity/touch-action.md delete mode 100644 docs-vuepress/unocss/utilities/interactivity/user-select.md delete mode 100644 docs-vuepress/unocss/utilities/interactivity/will-change.md delete mode 100644 docs-vuepress/unocss/utilities/layout/aspect-ratio.md delete mode 100644 docs-vuepress/unocss/utilities/layout/columns.md delete mode 100644 docs-vuepress/unocss/utilities/layout/container.md delete mode 100644 docs-vuepress/unocss/utilities/layout/display.md delete mode 100644 docs-vuepress/unocss/utilities/layout/flexbox.md delete mode 100644 docs-vuepress/unocss/utilities/layout/grid.md delete mode 100644 docs-vuepress/unocss/utilities/layout/positioning.md delete mode 100644 docs-vuepress/unocss/utilities/layout/sizing.md delete mode 100644 docs-vuepress/unocss/utilities/layout/spacing.md delete mode 100644 docs-vuepress/unocss/utilities/layout/tables.md diff --git a/docs-vuepress/.vuepress/config.js b/docs-vuepress/.vuepress/config.js index b9f42ca0ab..485456387d 100644 --- a/docs-vuepress/.vuepress/config.js +++ b/docs-vuepress/.vuepress/config.js @@ -1,107 +1,5 @@ const { headerPlugin } = require('./headerMdPlugin') - -const unocss = { - '/unocss': [ - { - title: 'General', - children: [ - '/unocss/utilities/general/colors', - '/unocss/utilities/general/typography', - '/unocss/utilities/general/svg', - '/unocss/utilities/general/variants', - ], - }, - { - title: 'Accessibility', - children: [ - '/unocss/utilities/accessibility/screen-readers' - ], - }, - { - title: 'Animations', - children: [ - '/unocss/utilities/animations/animation', - '/unocss/utilities/animations/transforms', - '/unocss/utilities/animations/transitions' - ], - }, - { - title: 'Backgrounds', - children: [ - '/unocss/utilities/backgrounds/background', - '/unocss/utilities/backgrounds/gradients', - '/unocss/utilities/backgrounds/background-blend-mode' - ], - }, - { - title: 'Behaviors', - children: [ - '/unocss/utilities/behaviors/box-decoration-break', - '/unocss/utilities/behaviors/image-rendering', - '/unocss/utilities/behaviors/listings', - '/unocss/utilities/behaviors/overflow', - '/unocss/utilities/behaviors/overscroll-behavior', - '/unocss/utilities/behaviors/placeholder', - ], - }, - { - title: 'Borders', - children: [ - '/unocss/utilities/borders/border', - '/unocss/utilities/borders/divider', - '/unocss/utilities/borders/outline', - '/unocss/utilities/borders/ring', - ], - }, - { - title: 'Effects', - children: [ - '/unocss/utilities/effects/box-shadow', - '/unocss/utilities/effects/opacity', - '/unocss/utilities/effects/mix-blend-mode', - ], - }, - { - title: 'Filters', - children: [ - '/unocss/utilities/filters/filter', - '/unocss/utilities/filters/backdrop-filter', - ], - }, - { - title: 'Interactivity', - children: [ - '/unocss/utilities/interactivity/accent-color', - '/unocss/utilities/interactivity/appearance', - '/unocss/utilities/interactivity/cursor', - '/unocss/utilities/interactivity/caret', - '/unocss/utilities/interactivity/pointer-events', - '/unocss/utilities/interactivity/resize', - '/unocss/utilities/interactivity/scroll-behavior', - '/unocss/utilities/interactivity/touch-action', - '/unocss/utilities/interactivity/user-select', - '/unocss/utilities/interactivity/will-change', - ], - }, - { - title: 'Layout', - children: [ - // { title: 'Aspect Ratio', link: '/unocss/utilities/layout/aspect-ratio' }, - '/unocss/utilities/layout/columns', - '/unocss/utilities/layout/container', - '/unocss/utilities/layout/display', - '/unocss/utilities/layout/flexbox', - '/unocss/utilities/layout/grid', - '/unocss/utilities/layout/positioning', - '/unocss/utilities/layout/sizing', - '/unocss/utilities/layout/spacing', - '/unocss/utilities/layout/tables', - ], - }, - ] -} - const sidebar = { '/guide/': [ { @@ -222,7 +120,6 @@ const sidebar = { { title: 'Mpx-cli 插件化改造', path: 'mpx-cli-next' }, { title: 'Mpx 小程序单元测试能力建设与实践', path: 'unit-test'} ], - ...unocss } const nav = [ diff --git a/docs-vuepress/unocss/introduce.md b/docs-vuepress/unocss/introduce.md deleted file mode 100644 index bfd470dddb..0000000000 --- a/docs-vuepress/unocss/introduce.md +++ /dev/null @@ -1 +0,0 @@ -# 介绍 diff --git a/docs-vuepress/unocss/utilities.md b/docs-vuepress/unocss/utilities.md deleted file mode 100644 index f310f10e90..0000000000 --- a/docs-vuepress/unocss/utilities.md +++ /dev/null @@ -1,80 +0,0 @@ -# Utilities - -## General - -- [Colors](/unocss/utilities/general/colors) -- [Typography](/unocss/utilities/general/typography) -- [SVG](/unocss/utilities/general/svg) -- [Variants](/unocss/utilities/general/variants) - -## Accessibility - -- [Screen Readers](/unocss/utilities/accessibility/screen-readers) - -## Animations - -- [Animation](/unocss/utilities/animations/animation) -- [Transforms](/unocss/utilities/animations/transforms) -- [Transitions](/unocss/utilities/animations/transitions) - -## Backgrounds - -- [Background](/unocss/utilities/backgrounds/background) -- [Gradients](/unocss/utilities/backgrounds/gradients) -- [Background Blend Mode](/unocss/utilities/backgrounds/background-blend-mode) - -## Behaviors - -- [Box Decoration Break](/unocss/utilities/behaviors/box-decoration-break) -- [Image Rendering](/unocss/utilities/behaviors/image-rendering) -- [Listings](/unocss/utilities/behaviors/listings) -- [Overflow](/unocss/utilities/behaviors/overflow) -- [Overscroll Behavior](/unocss/utilities/behaviors/overscroll-behavior) -- [Placeholder](/unocss/utilities/behaviors/placeholder) - -## Borders - -- [Border](/unocss/utilities/borders/border) -- [Divider](/unocss/utilities/borders/divider) -- [Outline](/unocss/utilities/borders/outline) -- [Ring](/unocss/utilities/borders/ring) - -## Effects - -- [Box Shadow](/unocss/utilities/effects/box-shadow) -- [Opacity](/unocss/utilities/effects/opacity) -- [Mix Blend Mode](/unocss/utilities/effects/mix-blend-mode) - -## Filters - -- [Filter](/unocss/utilities/filters/filter) -- [Backdrop Filter](/unocss/utilities/filters/backdrop-filter) - -## Interactivity - -- [Accent Color](/unocss/utilities/interactivity/accent-color) -- [Appearance](/unocss/utilities/interactivity/appearance) -- [Cursor](/unocss/utilities/interactivity/cursor) -- [Caret](/unocss/utilities/interactivity/caret) -- [Pointer Events](/unocss/utilities/interactivity/pointer-events) -- [Resize](/unocss/utilities/interactivity/resize) -- [Scroll Behavior](/unocss/utilities/interactivity/scroll-behavior) -- [Touch Action](/unocss/utilities/interactivity/touch-action) -- [User Select](/unocss/utilities/interactivity/user-select) -- [Will Change](/unocss/utilities/interactivity/will-change) - -## Layout - -- [Columns](/unocss/utilities/layout/columns) -- [Container](/unocss/utilities/layout/container) -- [Display](/unocss/utilities/layout/display) -- [Flexbox](/unocss/utilities/layout/flexbox) -- [Grid](/unocss/utilities/layout/grid) -- [Positioning](/unocss/utilities/layout/positioning) -- [Sizing](/unocss/utilities/layout/sizing) -- [Spacing](/unocss/utilities/layout/spacing) -- [Tables](/unocss/utilities/layout/tables) - -::: tip -Use the search bar to quickly find the utilities you need. -::: diff --git a/docs-vuepress/unocss/utilities/accessibility/screen-readers.md b/docs-vuepress/unocss/utilities/accessibility/screen-readers.md deleted file mode 100644 index 7b47a6d6a4..0000000000 --- a/docs-vuepress/unocss/utilities/accessibility/screen-readers.md +++ /dev/null @@ -1,38 +0,0 @@ -# Screen Readers - -Utilities for improving accessibility with screen readers. - -| Class | Properties | -| :---------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| sr-only | position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0; | -| not-sr-only | position: static;
width: auto;
height: auto;
padding: 0;
margin: 0;
overflow: visible;
clip: auto;
white-space: normal; | - -## Usage - -Use sr-only to hide an element visually without hiding it from screen readers: - -```html - - - Settings - -``` - -Use not-sr-only to undo sr-only, making an element visible to sighted users as well as screen readers. This can be -useful when you want to visually hide something on small screens but show it on larger screens for example: - -```html - - - Settings - -``` - -By default, responsive and focus variants are generated for these utilities. You can use focus:not-sr-only to make an -element visually hidden by default but visible when the user tabs to it — useful for "skip to content" links: - -```html - - Skip to content - -``` \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/animations/animation.md b/docs-vuepress/unocss/utilities/animations/animation.md deleted file mode 100644 index 798f9ccf6d..0000000000 --- a/docs-vuepress/unocss/utilities/animations/animation.md +++ /dev/null @@ -1,48 +0,0 @@ -# Animation - -Utilities for animating elements with CSS animations. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - animation: { - 'spin-slow': 'spin 3s linear infinite', - }, - }, - }, -} -``` - -To add new animation @keyframes, use the keyframes section of your theme configuration: - -```js windi.config.js -export default { - theme: { - extend: { - keyframes: { - wiggle: { - '0%, 100%': { transform: 'rotate(-3deg)' }, - '50%': { transform: 'rotate(3deg)' }, - }, - }, - }, - }, -} -``` - - \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/animations/transforms.md b/docs-vuepress/unocss/utilities/animations/transforms.md deleted file mode 100644 index 05076f2dd1..0000000000 --- a/docs-vuepress/unocss/utilities/animations/transforms.md +++ /dev/null @@ -1,431 +0,0 @@ -# Transforms - -## Transform Type - -Utilities for controlling transform behavior. - - - -## Transform Style - -The transform-style utility sets whether children of an element are positioned in the 3D space or are flattened in the plane of the element. - - - -## Transform Origin - -Utilities for specifying the origin for an element's transformations. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - transformOrigin: { - 24: '6rem', - full: '100%', - }, - }, - }, -} -``` - - - -## Transform Rotate - -Utilities for rotating elements with transform. - - - - - -```js windi.config.js -export default { - theme: { - rotate: { - sq: '90deg', - }, - }, -} -``` - - - -### Rotate X - - - -### Rotate Y - - - -### Rotate Z - - - -## Transform Scale - -Utilities for scaling elements with transform. - - - -### Scale X - - - -### Scale Y - - - -### Scale Z - - - - - -```js windi.config.js -export default { - theme: { - scale: { - half: '.5', - full: '1', - }, - }, -} -``` - - - -## Transform Skew - -Utilities for skewing elements with transform. - -### Skew X - - - -### Skew Y - - - - - -```js windi.config.js -export default { - theme: { - extend: { - skew: { - sq: '90deg', - }, - }, - }, -} -``` - - - -## Transform Translate - -Utilities for translating elements with transform. - -### Translate X - - - -### Translate Y - - - -### Translate Z - - - - - -You can customize the global spacing scale in the theme.spacing or theme.extend.spacing sections of your windi.config.js file: - -```js windi.config.js -export default { - theme: { - extend: { - spacing: { - 72: '18rem', - 84: '21rem', - 96: '24rem', - }, - }, - }, -} -``` - -To customize the translate scale separately, use the theme.translate section of your windi.config.js file. - -```js windi.config.js -export default { - theme: { - extend: { - translate: { - '1/7': '14.2857143%', - '2/7': '28.5714286%', - '3/7': '42.8571429%', - '4/7': '57.1428571%', - '5/7': '71.4285714%', - '6/7': '85.7142857%', - }, - }, - }, -} -``` - - - -## Perspective - -The `perspect` utility determines the distance between the z=0 plane and the user in order to give a 3D-positioned element some perspective. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - perspective: { - '8xl': '96rem', - '9xl': '128rem', - }, - }, - }, -} -``` - - - - -## Perspective Origin - -The `perspect-origin` utility determines the position at which the viewer is looking. It is used as the vanishing point by the [perspect](#perspective) utility. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - perspectiveOrigin: { - tb150: '150% 150%', - tb200: '200% 200%', - }, - }, - }, -} -``` - - \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/animations/transitions.md b/docs-vuepress/unocss/utilities/animations/transitions.md deleted file mode 100644 index ed3e2d5f6f..0000000000 --- a/docs-vuepress/unocss/utilities/animations/transitions.md +++ /dev/null @@ -1,133 +0,0 @@ -# Transitions - -## Transition Property - -Utilities for controlling which CSS properties transition. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - transitionProperty: { - height: 'height', - spacing: 'margin, padding', - }, - }, - }, -} -``` - - - -## Transition Duration - -Utilities for controlling the duration of CSS transitions. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - transitionDuration: { - zero: '0ms', - long: '2000ms', - }, - }, - }, -} -``` - - - -## Transition Timing Function - -Utilities for controlling the easing of CSS transitions. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - transitionTimingFunction: { - 'in-expo': 'cubic-bezier(0.95, 0.05, 0.795, 0.035)', - 'out-expo': 'cubic-bezier(0.19, 1, 0.22, 1)', - }, - }, - }, -} -``` - - - -## Transition Delay - -Utilities for controlling the delay of CSS transitions. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - transitionDelay: { - zero: '0ms', - long: '2000ms', - }, - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/backgrounds/background-blend-mode.md b/docs-vuepress/unocss/utilities/backgrounds/background-blend-mode.md deleted file mode 100644 index 5c75e527a1..0000000000 --- a/docs-vuepress/unocss/utilities/backgrounds/background-blend-mode.md +++ /dev/null @@ -1,14 +0,0 @@ -# Background Blend Mode - -Utilities for controlling how an element's background image should blend with its background color. - - diff --git a/docs-vuepress/unocss/utilities/backgrounds/background.md b/docs-vuepress/unocss/utilities/backgrounds/background.md deleted file mode 100644 index cf4a870c60..0000000000 --- a/docs-vuepress/unocss/utilities/backgrounds/background.md +++ /dev/null @@ -1,209 +0,0 @@ -# Background - -## Background Attachment - -Utilities for controlling how a background image behaves when scrolling. - - - -## Background Clip - -Utilities for controlling the bounding box of an element's background. - - - - - -## Background Color - -Utilities for controlling an element's background color. - - - - - -```js windi.config.js -export default { - theme: { - backgroundColor: theme => ({ - ...theme('colors'), - primary: '#3490dc', - secondary: '#ffed4a', - danger: '#e3342f', - }), - }, -} -``` - - - -## Background Opacity - -Utilities for controlling the opacity of an element's background color. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - opacity: { - light: '0.15', - }, - }, - }, -} -``` - - - -## Background Position - -Utilities for controlling the position of an element's background image. - - - - - -```js windi.config.js -export default { - theme: { - backgroundPosition: { - 'bottom': 'bottom', - 'bottom-4': 'center bottom 1rem', - 'center': 'center', - 'left': 'left', - 'left-bottom': 'left bottom', - 'left-top': 'left top', - 'right': 'right', - 'right-bottom': 'right bottom', - 'right-top': 'right top', - 'top': 'top', - 'top-4': 'center top 1rem', - }, - }, -} -``` - - - -## Background Repeat - -Utilities for controlling the repetition of an element's background image. - - - -## Background Size - -Utilities for controlling the background size of an element's background image. - - - - - -```js -export default { - theme: { - backgroundSize: { - 'auto': 'auto', - 'cover': 'cover', - 'contain': 'contain', - '50%': '50%', - '16': '4rem', - }, - }, -} -``` - - - -## Background Origin - -Utilities for controlling the background origin of an element's background image. - - diff --git a/docs-vuepress/unocss/utilities/backgrounds/gradients.md b/docs-vuepress/unocss/utilities/backgrounds/gradients.md deleted file mode 100644 index 4993730fbb..0000000000 --- a/docs-vuepress/unocss/utilities/backgrounds/gradients.md +++ /dev/null @@ -1,68 +0,0 @@ -# Gradients - -Utilities for controlling background gradients. - -## Gradient Direction - - - - - -```js windi.config.js -export default { - theme: { - extend: { - backgroundImage: theme => ({ - 'hero-pattern': 'url(\'/img/hero-pattern.svg\')', - 'footer-texture': 'url(\'/img/footer-texture.png\')', - }), - }, - }, -} -``` - - - -## Gradient From - - - -## Gradient Via - - - -## Gradient To - - diff --git a/docs-vuepress/unocss/utilities/behaviors/box-decoration-break.md b/docs-vuepress/unocss/utilities/behaviors/box-decoration-break.md deleted file mode 100644 index 69233a7b2b..0000000000 --- a/docs-vuepress/unocss/utilities/behaviors/box-decoration-break.md +++ /dev/null @@ -1,16 +0,0 @@ -# Box Decoration Break - -Utilities for controlling how element fragments should be rendered across multiple lines, columns, or pages. - - diff --git a/docs-vuepress/unocss/utilities/behaviors/image-rendering.md b/docs-vuepress/unocss/utilities/behaviors/image-rendering.md deleted file mode 100644 index 1fd210a88e..0000000000 --- a/docs-vuepress/unocss/utilities/behaviors/image-rendering.md +++ /dev/null @@ -1,15 +0,0 @@ -# Image Rendering - -The `image-render` utility defines how the browser should render an image if it is scaled up or down from its original -dimensions. By default, each browser will attempt to apply aliasing to this scaled image in order to prevent distortion, -but this can sometimes be a problem if we want the image to preserve its original pixelated form. - - diff --git a/docs-vuepress/unocss/utilities/behaviors/listings.md b/docs-vuepress/unocss/utilities/behaviors/listings.md deleted file mode 100644 index b6c5f2de8e..0000000000 --- a/docs-vuepress/unocss/utilities/behaviors/listings.md +++ /dev/null @@ -1,54 +0,0 @@ -# Listings - -## List Style Type - -Utilities for controlling the bullet/number style of a list. - - - - - -```js windi.config.js -export default { - theme: { - listStyleType: { - none: 'none', - disc: 'disc', - decimal: 'decimal', - square: 'square', - roman: 'upper-roman', - }, - }, -} -``` - - - -## List Style Position - -Utilities for controlling the position of bullets/numbers in lists. - - \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/behaviors/overflow.md b/docs-vuepress/unocss/utilities/behaviors/overflow.md deleted file mode 100644 index 8e3a7d3617..0000000000 --- a/docs-vuepress/unocss/utilities/behaviors/overflow.md +++ /dev/null @@ -1,18 +0,0 @@ -# Overflow - -Utilities for controlling how an element handles content that is too large for the container. - - diff --git a/docs-vuepress/unocss/utilities/behaviors/overscroll-behavior.md b/docs-vuepress/unocss/utilities/behaviors/overscroll-behavior.md deleted file mode 100644 index 4c098b6849..0000000000 --- a/docs-vuepress/unocss/utilities/behaviors/overscroll-behavior.md +++ /dev/null @@ -1,25 +0,0 @@ -# Overscroll Behavior - -Utilities for controlling how the browser behaves when reaching the boundary of a scrolling area. - -- Use `auto` to make it possible for the user to continue scrolling a parent scroll area when they reach the boundary of - the primary scroll area. -- Use `none` to prevent scrolling in the target area from triggering scrolling in the parent element, and also prevent - "bounce" effects when scrolling past the end of the container. -- Use `contain` to prevent scrolling in the target area from triggering scrolling in the parent element, but preserve - "bounce" effects when scrolling past the end of the container in operating systems that support it. - - \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/behaviors/placeholder.md b/docs-vuepress/unocss/utilities/behaviors/placeholder.md deleted file mode 100644 index f0ad7f958e..0000000000 --- a/docs-vuepress/unocss/utilities/behaviors/placeholder.md +++ /dev/null @@ -1,61 +0,0 @@ -# Placeholder - -## Placeholder Color - -Utilities for controlling the color of placeholder text. - - - - - -```js windi.config.js -export default { - theme: { - placeholderColor: { - primary: '#3490dc', - secondary: '#ffed4a', - danger: '#e3342f', - }, - }, -} -``` - - - -## Placeholder Opacity - -Utilities for controlling the opacity of an element's placeholder color. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - placeholderOpacity: { - light: '0.1', - }, - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/borders/border.md b/docs-vuepress/unocss/utilities/borders/border.md deleted file mode 100644 index 37ff0ce167..0000000000 --- a/docs-vuepress/unocss/utilities/borders/border.md +++ /dev/null @@ -1,129 +0,0 @@ -# Border - -## Border Radius - -Utilities for controlling the border radius of an element. - - - - - -```js windi.config.js -export default { - theme: { - borderRadius: { - none: '0', - sm: '0.125rem', - DEFAULT: '4px', - md: '0.375rem', - lg: '0.5rem', - full: '9999px', - large: '12px', - }, - }, -} -``` - - - -## Border Width - -Utilities for controlling the width of an element's borders. - - - - - -```js windi.config.js -export default { - theme: { - borderWidth: { - DEFAULT: '1px', - none: '0', - sm: '2px', - }, - }, -} -``` - - - -## Border Color - -Utilities for controlling the color of an element's borders. - - - - - -You can customize your color palette by editing the `theme.colors` section of your `windi.config.js` file, or customize just your border colors using the theme.borderColor section. - -```js windi.config.js -export default { - theme: { - borderColor: theme => ({ - ...theme('colors'), - DEFAULT: theme('colors.gray.300', 'currentColor'), - primary: '#3490dc', - secondary: '#ffed4a', - danger: '#e3342f', - }), - }, -} -``` - - - -## Border Opacity - -Utilities for controlling the opacity of an element's border color. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - borderOpacity: { - light: '0.1', - }, - }, - }, -} -``` - - - -## Border Style - -Utilities for controlling the style of an element's borders. - - diff --git a/docs-vuepress/unocss/utilities/borders/divider.md b/docs-vuepress/unocss/utilities/borders/divider.md deleted file mode 100644 index 061bc69b2d..0000000000 --- a/docs-vuepress/unocss/utilities/borders/divider.md +++ /dev/null @@ -1,166 +0,0 @@ -# Divider - -## Divider Width - -Utilities for controlling the border width between elements. - -#### Divide Y - - - -#### Divide X - - - - - -The divide width scale inherits its values from the `borderWidth` scale by default, so if you'd like to customize your values for both border width and divide width together, use the `theme.borderWidth` section of your `windi.config.js` file. - -```js windi.config.js -export default { - theme: { - borderWidth: { - DEFAULT: '1px', - 0: '0', - 2: '2px', - 3: '3px', - 4: '4px', - 6: '6px', - 8: '8px', - }, - }, -} -``` - -To customize only the divide width values, use the theme.divideWidth section of your windi.config.js file. - -```js windi.config.js -export default { - theme: { - divideWidth: { - DEFAULT: '1px', - 0: '0', - 2: '2px', - 3: '3px', - 4: '4px', - 6: '6px', - 8: '8px', - }, - }, -} -``` - - - -## Divider Color - -Utilities for controlling the border color between elements. - - - - - -```js windi.config.js -export default { - theme: { - divideColor: theme => ({ - ...theme('borderColors'), - primary: '#3490dc', - secondary: '#ffed4a', - danger: '#e3342f', - }), - }, -} -``` - - - -## Divider Opacity - -Utilities for controlling the opacity borders between elements. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - divideOpacity: { - 10: '0.1', - 20: '0.2', - 95: '0.95', - }, - }, - }, -} -``` - - - -## Divider Style - -Utilities for controlling the border style between elements. - - diff --git a/docs-vuepress/unocss/utilities/borders/outline.md b/docs-vuepress/unocss/utilities/borders/outline.md deleted file mode 100644 index 4718f866ee..0000000000 --- a/docs-vuepress/unocss/utilities/borders/outline.md +++ /dev/null @@ -1,73 +0,0 @@ -# Outline - -Utilities for controlling an element's outline. - - - -## Outline Solid - - - -## Outline Dotted - - - - - -```js windi.config.js -export default { - theme: { - extend: { - outline: { - blue: '2px solid #0000ff', - }, - }, - }, -} -``` - -You can also provide an outline-offset value for any custom outline utilities using a tuple of the form [outline, outlineOffset]: - -```js windi.config.js -export default { - theme: { - extend: { - outline: { - blue: ['2px solid #0000ff', '1px'], - }, - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/borders/ring.md b/docs-vuepress/unocss/utilities/borders/ring.md deleted file mode 100644 index cfc30d24cf..0000000000 --- a/docs-vuepress/unocss/utilities/borders/ring.md +++ /dev/null @@ -1,170 +0,0 @@ -# Ring - -## Ring Width - -Utilities for creating outline rings with box-shadows. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - ringWidth: { - DEFAULT: '2px', - 6: '6px', - 10: '10px', - }, - }, - }, -} -``` - - - -## Ring Color - -Utilities for setting the color of outline rings. - - - - - -```js windi.config.js -const colors = require('windicss/colors') - -export default { - theme: { - ringColor: { - white: colors.white, - pink: colors.fuchsia, - }, - }, -} -``` - - - -## Ring Opacity - -Utilities for setting the opacity of outline rings. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - ringOpacity: { - 15: '0.15', - 35: '0.35', - 65: '0.65', - }, - }, - }, -} -``` - - - -## Ring Offset Width - -Utilities for simulating an offset when adding outline rings. - - - - - - -```js windi.config.js -export default { - theme: { - extend: { - ringOffsetWidth: { - 3: '3px', - 6: '6px', - 10: '10px', - }, - }, - }, -} -``` - - - -## Ring Offset Color - -Utilities for setting the color of outline ring offsets. - - - - - -```js windi.config.js -const colors = require('windicss/colors') - -export default { - theme: { - ringOffsetColor: { - white: colors.white, - pink: colors.fuchsia, - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/effects/box-shadow.md b/docs-vuepress/unocss/utilities/effects/box-shadow.md deleted file mode 100644 index c8aa3d7755..0000000000 --- a/docs-vuepress/unocss/utilities/effects/box-shadow.md +++ /dev/null @@ -1,63 +0,0 @@ -# Box Shadow - -## Box Shadow Size - -Utilities for controlling the box shadow of an element. - - - - - -```js windi.config.js -export default { - theme: { - boxShadow: { - 'sm': '0 1px 2px 0 rgba(0, 0, 0, 0.05)', - 'DEFAULT': '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)', // If a DEFAULT shadow is provided, it will be used for the non-suffixed shadow utility. - 'md': '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)', - 'lg': '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)', - 'xl': '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)', - '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)', - '3xl': '0 35px 60px -15px rgba(0, 0, 0, 0.3)', - 'inner': 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)', - 'none': 'none', - }, - }, -} -``` - - - -## Box Shadow Color - - - - - -```js windi.config.js -export default { - theme: { - boxShadowColor: { - gray: '#1c1c1e', - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/effects/mix-blend-mode.md b/docs-vuepress/unocss/utilities/effects/mix-blend-mode.md deleted file mode 100644 index 0dd7b83f7b..0000000000 --- a/docs-vuepress/unocss/utilities/effects/mix-blend-mode.md +++ /dev/null @@ -1,17 +0,0 @@ -# Mix Blend Mode - -Utilities for controlling how an element should blend with the background. - - diff --git a/docs-vuepress/unocss/utilities/effects/opacity.md b/docs-vuepress/unocss/utilities/effects/opacity.md deleted file mode 100644 index b6aa2a20f3..0000000000 --- a/docs-vuepress/unocss/utilities/effects/opacity.md +++ /dev/null @@ -1,29 +0,0 @@ -# Opacity - -Utilities for controlling the opacity of an element. - - - - - - -```js windi.config.js -export default { - theme: { - opacity: { - light: '0.25', - full: '1', - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/filters/backdrop-filter.md b/docs-vuepress/unocss/utilities/filters/backdrop-filter.md deleted file mode 100644 index 198ce3a704..0000000000 --- a/docs-vuepress/unocss/utilities/filters/backdrop-filter.md +++ /dev/null @@ -1,312 +0,0 @@ -# Backdrop Filter - -Utilities for enabling and disabling backdrop filters on an element. - - - -## Backdrop Blur - - - - - -```js windi.config.js -export default { - theme: { - backdropBlur: { - '4xl': '72px', - '5xl': '96px', - '6xl': '128px', - }, - }, -} -``` - - - -## Backdrop Brightness - - - - - -```js windi.config.js -export default { - theme: { - backdropBrightness: { - sm: '50', - md: '100', - lg: '150', - }, - }, -} -``` - - - -## Backdrop Contrast - - - - - -```js windi.config.js -export default { - theme: { - backdropContrast: { - sm: '50', - md: '100', - lg: '150', - }, - }, -} -``` - - - -## Backdrop Grayscale - - - - - -```js windi.config.js -export default { - theme: { - backdropGrayscale: { - 50: '0.5', - 80: '0.8', - }, - }, -} -``` - - - -## Backdrop Hue Rotate - - - - - -```js windi.config.js -export default { - theme: { - backdropHueRotate: { - sm: '60', - lg: '90', - xl: '180', - }, - }, -} -``` - - - -## Backdrop Invert - - - - - -```js windi.config.js -export default { - theme: { - backdropInvert: { - sm: '0.5', - lg: '0.8', - }, - }, -} -``` - - - -## Backdrop Opacity - - - - - - -```js windi.config.js -export default { - theme: { - backdropOpacity: { - sm: '0.5', - lg: '0.8', - }, - }, -} -``` - - - -## Backdrop Saturate - - - - - -```js windi.config.js -export default { - theme: { - backdropSaturate: { - sm: '0.5', - md: '1', - lg: '1.5', - }, - }, -} -``` - - - -## Backdrop Sepia - - - - - -```js windi.config.js -export default { - theme: { - backdropSepia: { - sm: '0.5', - md: '0.8', - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/filters/filter.md b/docs-vuepress/unocss/utilities/filters/filter.md deleted file mode 100644 index a8c6ff1144..0000000000 --- a/docs-vuepress/unocss/utilities/filters/filter.md +++ /dev/null @@ -1,261 +0,0 @@ -# Filter - -Utilities for enabling and disabling filters on an element. - - - -## Filter Blur - - - - - -```js windi.config.js -export default { - theme: { - blur: { - '4xl': '72px', - '5xl': '96px', - '6xl': '128px', - }, - }, -} -``` - - - -## Filter Brightness - - - - - -```js windi.config.js -export default { - theme: { - brightness: { - sm: '50', - md: '100', - lg: '150', - }, - }, -} -``` - - - -## Filter Contrast - - - - - -```js windi.config.js -export default { - theme: { - contrast: { - sm: '50', - md: '100', - lg: '150', - }, - }, -} -``` - - - -## Filter Drop Shadow - - - - - -```js windi.config.js -export default { - theme: { - dropShadow: { - '3xl': 'drop-shadow(0 30px 30px rgba(0, 0, 0, 0.2))', - '4xl': 'drop-shadow(0 40px 40px rgba(0, 0, 0, 0.3))', - }, - }, -} -``` - - - -## Filter Grayscale - - - - - -```js windi.config.js -export default { - theme: { - grayscale: { - 50: '0.5', - 80: '0.8', - }, - }, -} -``` - - - -## Filter Hue Rotate - - - - - -```js windi.config.js -export default { - theme: { - hueRotate: { - sm: '60', - lg: '90', - xl: '180', - }, - }, -} -``` - - - -## Filter Invert - - - - - -```js windi.config.js -export default { - theme: { - invert: { - sm: '0.5', - lg: '0.8', - }, - }, -} -``` - - - -## Filter Saturate - - - - - -```js windi.config.js -export default { - theme: { - saturate: { - sm: '0.5', - md: '1', - lg: '1.5', - }, - }, -} -``` - - - -## Filter Sepia - - - - - -```js windi.config.js -export default { - theme: { - sepia: { - sm: '0.5', - md: '0.8', - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/general/colors.md b/docs-vuepress/unocss/utilities/general/colors.md deleted file mode 100644 index fdd0fcecd2..0000000000 --- a/docs-vuepress/unocss/utilities/general/colors.md +++ /dev/null @@ -1,33 +0,0 @@ -# Colors - - - -## Customization - -```ts windi.config.js -export default { - theme: { - colors: { - // Configure your color palette here - }, - }, -} -``` - -### Reuse Colors - -All the colors from the palette are enabled by default. If you want to set alias or reuse some colors from the palette, you can import them from `windicss/colors` module. - -```ts windi.config.js -import colors from 'windicss/colors' - -export default { - theme: { - extend: { - colors: { - grey: colors.gray, - }, - }, - }, -} -``` diff --git a/docs-vuepress/unocss/utilities/general/svg.md b/docs-vuepress/unocss/utilities/general/svg.md deleted file mode 100644 index 093987810f..0000000000 --- a/docs-vuepress/unocss/utilities/general/svg.md +++ /dev/null @@ -1,159 +0,0 @@ -# SVG - -## Fill Color - -Utilities for styling the fill of SVG elements. - - - - - -```js windi.config.js -export default { - theme: { - fill: theme => ({ - red: theme('colors.red.500'), - green: theme('colors.green.500'), - blue: theme('colors.blue.500'), - }), - }, -} -``` - - - -## Stroke Color - -Utilities for styling the stroke of SVG elements. - - - - - -```js windi.config.js -export default { - theme: { - stroke: theme => ({ - red: theme('colors.red.500'), - green: theme('colors.green.500'), - blue: theme('colors.blue.500'), - }), - }, -} -``` - - - -## Stroke DashArray - -The `stroke-dash` utility is a presentation utility defining the pattern of dashes and gaps used to paint the outline of the shape; - - - -## Stroke DashOffset - -The `stroke-offset` utility is a presentation utility defining an offset on the rendering of the associated dash array. - - - -## Stroke LineCap - -The `stroke-cap` utility is a presentation utility defining the shape to be used at the end of open subpaths when they are stroked. - - - -## Stroke LineJoin - -The `stroke-join` utility is a presentation utility defining the shape to be used at the corners of paths when they are stroked. - - - -## Stroke Width - -Utilities for styling the stroke width of SVG elements. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - strokeWidth: { - sm: '4', - lg: '8', - }, - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/general/typography.md b/docs-vuepress/unocss/utilities/general/typography.md deleted file mode 100644 index 1ad18e277f..0000000000 --- a/docs-vuepress/unocss/utilities/general/typography.md +++ /dev/null @@ -1,742 +0,0 @@ -# Typography - -## Font Family - -Utilities for controlling the font family of an element. - - - - - -```js -export default { - theme: { - extend: { - fontFamily: { - sans: ['ui-sans-serif', 'system-ui'], - serif: ['ui-serif', 'Georgia'], - mono: ['ui-monospace', 'SFMono-Regular'], - display: ['Oswald'], - body: ['Open Sans'], - }, - }, - }, -} -``` - -Font families can be specified as an array or as a simple comma-delimited string: - -```json5 -{ - // Array format: - "sans": ["Helvetica", "Arial", "sans-serif"], - // Comma-delimited format: - "sans": "Helvetica, Arial, sans-serif", -} -``` - -Note that Windi CSS does not automatically escape font names for you. If you're using a font that contains an invalid identifier, wrap it in quotes or escape the invalid characters. - -```json5 -{ - // Won't work: - "sans": ["Exo 2", /* ... */], - // Add quotes: - "sans": ["\"Exo 2\"", /* ... */], -} -``` - - - -## Font Size - -Utilities for controlling the font size of an element. - - - - - -```js windi.config.js -export default { - theme: { - fontSize: { - 'xs': '.75rem', - 'sm': '.875rem', - 'tiny': '.875rem', - 'base': '1rem', - 'lg': '1.125rem', - 'xl': '1.25rem', - '2xl': '1.5rem', - '3xl': '1.875rem', - '4xl': '2.25rem', - '5xl': '3rem', - '6xl': '4rem', - '7xl': '5rem', - }, - }, -} -``` - -You can provide a default line-height for each of your font-sizes using a tuple of the form [fontSize, lineHeight] in your windi.config.js file. - -```js windi.config.js -export default { - theme: { - fontSize: { - sm: ['14px', '20px'], - base: ['16px', '24px'], - lg: ['20px', '28px'], - xl: ['24px', '32px'], - }, - }, -} -``` - -If you also want to provide a default letter-spacing value for a font size, you can do so using a tuple of the form `[fontSize, { letterSpacing, lineHeight }]` in your windi.config.js file. - -```js windi.config.js -export default { - theme: { - fontSize: { - '2xl': ['24px', { - letterSpacing: '-0.01em', - }], - // Or with a default line-height as well - '3xl': ['32px', { - letterSpacing: '-0.02em', - lineHeight: '40px', - }], - }, - }, -} -``` - - - -## Font Smoothing - -Utilities for controlling the font smoothing of an element. - - - -## Font Style - -Utilities for controlling the style of text. - - - -## Font Weight - -Utilities for controlling the font weight of an element. - - - - - -```js windi.config.js -export default { - theme: { - fontWeight: { - 'hairline': 100, - 'extra-light': 100, - 'thin': 200, - 'light': 300, - 'normal': 400, - 'medium': 500, - 'semibold': 600, - 'bold': 700, - 'extrabold': 800, - 'extra-bold': 800, - 'black': 900, - }, - }, -} -``` - - - -## Font Variant Numeric - -Utilities for controlling the variant of numbers. - - - -## Hyphens - -The hyphens utilities specifies how words should be hyphenated when text wraps across multiple lines. It can prevent hyphenation entirely, hyphenate at manually-specified points within the text, or let the browser automatically insert hyphens where appropriate. - - - -## Letter Spacing - -Utilities for controlling the tracking (letter spacing) of an element. - - - - - -```js windi.config.js -export default { - theme: { - letterSpacing: { - tightest: '-.075em', - tighter: '-.05em', - tight: '-.025em', - normal: '0', - wide: '.025em', - wider: '.05em', - widest: '.25em', - }, - }, -} -``` - - - -## Line Height - -Utilities for controlling the leading (line height) of an element. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - lineHeight: { - 'extra-loose': '2.5', - }, - }, - }, -} -``` - - - -## Tab Size - -The tab-size utilities are used to customize the width of tab characters (U+0009). - - - - - -```js windi.config.js -export default { - theme: { - tabSize: { - sm: '2', - md: '4', - lg: '8', - }, - }, -} -``` - - - -## Text Alignment - -Utilities for controlling the alignment of text. - - - -## Text Color - -Utilities for controlling the text color of an element. - - - - - -```js windi.config.js -export default { - theme: { - textColor: { - primary: '#3490dc', - secondary: '#ffed4a', - danger: '#e3342f', - }, - }, -} -``` - - - -## Text Decoration - -Utilities for controlling the decoration of text. - -### Text Decoration Type - -Utilities for controlling the type of text decoration. - - - -### Text Decoration Color - -Utilities for controlling the color of text decoration. - - - - - -```js windi.config.js -export default { - theme: { - textDecorationColor: { - primary: '#3490dc', - secondary: '#ffed4a', - danger: '#e3342f', - }, - }, -} -``` - - - -### Text Decoration Style - -Utilities for controlling the style of text decoration. - - - -### Text Decoration Thickness - -Utilities for controlling the thickness of text decorations. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - textDecorationLength: { - sm: '1px', - md: '2px', - lg: '4px', - }, - }, - }, -} -``` - - - -### Text Decoration Offset - -Utilities for controlling the offset of text decoration. - - - - - -```js windi.config.js -export default { - theme: { - textDecorationOffset: { - sm: '1px', - md: '2px', - lg: '4px', - }, - }, -} -``` - - - -### Text Decoration Opacity - -Utilities for controlling the opacity of an element's decoration color. This is a fallback of -[Text Decoration Color](#text-decoration-color) beginning with WindiCSS v3.4.0. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - textDecorationOpacity: { - 10: '0.1', - 20: '0.2', - 95: '0.95', - }, - }, - }, -} -``` - - - -## Text Indent - -Utilities for controlling the indentation of text. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - textIndent: { - '4xl': '5rem', - '5xl': '6rem', - }, - }, - }, -} -``` - - - -## Text Opacity - -Utilities for controlling the opacity of an element's text color. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - textOpacity: { - 10: '0.1', - 20: '0.2', - 95: '0.95', - }, - }, - }, -} -``` - - - -## Text Shadow - -Utilities for controlling the shadow of a text element. - - - - - -```js windi.config.js -export default { - theme: { - textShadow: { - 'DEFAULT': '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)', // If a DEFAULT shadow is provided, it will be used for the non-suffixed shadow utility. - '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)', - '3xl': '0 35px 60px -15px rgba(0, 0, 0, 0.3)', - }, - }, -} -``` - - - -## Text Stroke - -Utilities for controlling the stroke of a text element. - -### Text Stroke Width - -Utilities for controlling the width of text stroke. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - textStrokeWidth: { - 'xl': '6', - '2xl': '8', - }, - }, - }, -} -``` - - - -### Text Stroke Color - -Utilities for controlling the color of text stroke. - - - - - -```js windi.config.js -export default { - theme: { - textStrokeColor: { - primary: '#3490dc', - secondary: '#ffed4a', - danger: '#e3342f', - }, - }, -} -``` - - - -## Text Transform - -Utilities for controlling the transformation of text. - - - -## Text Overflow - -Utilities for controlling text overflow in an element. - - - -## Vertical Alignment - -Utilities for controlling the vertical alignment of an inline or table-cell box. - - - -## Whitespace - -Utilities for controlling an element's white-space property. - - - -## Word Break - -Utilities for controlling word breaks in an element. - - - -## Writing Mode - -The `writing-mode` utility sets whether lines of text are laid out horizontally or vertically, as well as the direction in which blocks progress. When set for an entire document, it should be set on the root element (html element for HTML documents). - - - -## Writing Orientation - -The `writing-orientation` utility sets the orientation of the text characters in a line. It only affects text in vertical mode (when `writing-mode` is not `horizontal-tb`). It is useful for controlling the display of languages that use vertical script, and also for making vertical table headers. - - diff --git a/docs-vuepress/unocss/utilities/general/variables.md b/docs-vuepress/unocss/utilities/general/variables.md deleted file mode 100644 index a452526573..0000000000 --- a/docs-vuepress/unocss/utilities/general/variables.md +++ /dev/null @@ -1,3 +0,0 @@ -# Variables - -> TODO: diff --git a/docs-vuepress/unocss/utilities/general/variants.md b/docs-vuepress/unocss/utilities/general/variants.md deleted file mode 100644 index 34bd56086b..0000000000 --- a/docs-vuepress/unocss/utilities/general/variants.md +++ /dev/null @@ -1,206 +0,0 @@ -[pseudo-selector]: https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes - -# Variants - -Variants allow you to specify under what circumstances your utilities will be activated. - -You may use the screen size, system theme, or any [pseudo-selector], such as `:hover`. - -You specify a variant by using the `:` separator, and you can combine them arbitrarily as in: - -``` -sm:bg-red-500 sm:hover:bg-green-300 dark:bg-white -``` - -## Screen Variants - -### Mobile First - -| Variant | Rule | Description | -| :------ | :--- | :---------- | -| sm | @media (min-width: 640px) { ... } | Enable utility when the screen width is greater than 640px | -| md | @media (min-width: 768px) { ... } | Enable utility when the screen width is greater than 768px | -| lg | @media (min-width: 1024px) { ... } | Enable utility when the screen width is greater than 1024px | -| xl | @media (min-width: 1280px) { ... } | Enable utility when the screen width is greater than 1280px | -| 2xl | @media (min-width: 1536px) { ... } | Enable utility when the screen width is greater than 1536px | - -### Desktop First - -| Variant | Rule | Description | -| :------ | :--- | :---------- | -| - -### Parent Selectors - -| Variant | Rule | Description | -| :------ | :--- | :---------- | -| group-hover | `.group:hover .${utility} { ... }` | Targets an element when a marked parent matches the hover pseudo-class. | -| group-focus | `.group:focus .${utility} { ... }` | Targets an element when a marked parent matches the focus pseudo-class. | -| group-active | `.group:active .${utility} { ... }` | Targets an element when a marked parent matches the active pseudo-class. | -| group-visited | `.group:visited .${utility} { ... }` | Targets an element when a marked parent matches the visited pseudo-class. | - - -### Child Selectors - -| Variant | Rule | Description | -| :------ | :--- | :---------- | -| svg | `.${utility} svg { ... }` | Targets svg nodes. | -| all | `.${utility} * { ... }` | Targets all nodes. | -| children | `.${utility} > * { ... }` | Targets children nodes. | -| siblings | `.${utility} ~ * { ... }` | Targets siblings nodes . | -| sibling | `.${utility} + * { ... }` | Targets first sibling node. | - - -### Media Query - -| Variant | Rule | Description | -| :------ | :--- | :---------- | -| motion-safe | `@media (prefers-reduced-motion: no-preference) { ... }` | Targets the prefers-reduced-motion: no-preference media query. -| motion-reduce | `@media (prefers-reduced-motion: reduce) { ... }` | Targets the prefers-reduced-motion: reduce media query. - -## Theme Variants - -### Default - -| Variant | Rule | Description | -| :------ | :--- | :---------- | -| dark | `@media (prefers-color-scheme: dark) { ... }` or `.dark .{utility} { ... }` | Enable utility base on user configuration | -| light | `@media (prefers-color-scheme: light) { ... }` or `.light .{utility} { ... }` | Enable utility base on user configuration | - -### Following System - -| Variant | Rule | Description | -| :------ | :--- | :---------- | -| @dark | `@media (prefers-color-scheme: dark) { ... }` | Enable utility when the system turns on dark mode | -| @light | `@media (prefers-color-scheme: light) { ... }` | Enable utility when the system turns on light mode | - -### Following Application - -| Variant | Rule | Description | -| :------ | :--- | :---------- | -| .dark | `.dark .{utility} { ... }` | Enable utility base on application dark mode | -| .light | `.light .{utility} { ... }` | Enable utility base on application light mode | - -## Orientation Variants - -| Variant | Rule | Description | -| :-------- | :---------------------------------------- | :--------------------------------------------------------- | -| portrait | `@media (orientation: portrait) { ... }` | Enable utility when the device is in portrait orientation | -| landscape | `@media (orientation: landscape) { ... }` | Enable utility when the device is in landscape orientation | diff --git a/docs-vuepress/unocss/utilities/interactivity/accent-color.md b/docs-vuepress/unocss/utilities/interactivity/accent-color.md deleted file mode 100644 index 7d77f96ea4..0000000000 --- a/docs-vuepress/unocss/utilities/interactivity/accent-color.md +++ /dev/null @@ -1,14 +0,0 @@ -# Accent Color - -Utilities for controlling the accented color of a form control. - - diff --git a/docs-vuepress/unocss/utilities/interactivity/appearance.md b/docs-vuepress/unocss/utilities/interactivity/appearance.md deleted file mode 100644 index 5ce662c6ec..0000000000 --- a/docs-vuepress/unocss/utilities/interactivity/appearance.md +++ /dev/null @@ -1,21 +0,0 @@ -# Appearance - -Utilities for suppressing native form control styling. - - diff --git a/docs-vuepress/unocss/utilities/interactivity/caret.md b/docs-vuepress/unocss/utilities/interactivity/caret.md deleted file mode 100644 index 80a82329c0..0000000000 --- a/docs-vuepress/unocss/utilities/interactivity/caret.md +++ /dev/null @@ -1,61 +0,0 @@ -# Caret - -## Caret Color - -Utilities for controlling the color of insertion text. - - - - - -```js windi.config.js -export default { - theme: { - caretColor: { - primary: '#3490dc', - secondary: '#ffed4a', - danger: '#e3342f', - }, - }, -} -``` - - - -## Caret Opacity - -Utilities for controlling the opacity of an element's caret color. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - caretOpacity: { - light: '0.1', - }, - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/interactivity/cursor.md b/docs-vuepress/unocss/utilities/interactivity/cursor.md deleted file mode 100644 index db7af303e3..0000000000 --- a/docs-vuepress/unocss/utilities/interactivity/cursor.md +++ /dev/null @@ -1,37 +0,0 @@ -# Cursor - -Utilities for controlling the cursor style when hovering over an element. - - - - - -```js windi.config.js -export default { - theme: { - cursor: { - 'auto': 'auto', - 'default': 'default', - 'pointer': 'pointer', - 'wait': 'wait', - 'text': 'text', - 'move': 'move', - 'not-allowed': 'not-allowed', - 'crosshair': 'crosshair', - 'zoom-in': 'zoom-in', - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/interactivity/pointer-events.md b/docs-vuepress/unocss/utilities/interactivity/pointer-events.md deleted file mode 100644 index 1012759bff..0000000000 --- a/docs-vuepress/unocss/utilities/interactivity/pointer-events.md +++ /dev/null @@ -1,15 +0,0 @@ -# Pointer Events - -Utilities for controlling whether an element responds to pointer events. - - diff --git a/docs-vuepress/unocss/utilities/interactivity/resize.md b/docs-vuepress/unocss/utilities/interactivity/resize.md deleted file mode 100644 index 010efba148..0000000000 --- a/docs-vuepress/unocss/utilities/interactivity/resize.md +++ /dev/null @@ -1,13 +0,0 @@ -# Resize - -Utilities for controlling how an element can be resized. - - \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/interactivity/scroll-behavior.md b/docs-vuepress/unocss/utilities/interactivity/scroll-behavior.md deleted file mode 100644 index 338856f814..0000000000 --- a/docs-vuepress/unocss/utilities/interactivity/scroll-behavior.md +++ /dev/null @@ -1,18 +0,0 @@ -# Scroll Behavior - -Utilities for controlling the scroll behavior of an element. - -| Class | Properties | -| :------------ | :----------------------- | -| scroll-auto | scroll-behavior: auto; | -| scroll-smooth | scroll-behavior: smooth; | - -## Usage - -Use the `scroll-smooth` utilities to enable smooth scrolling within an element. - -```html - - - -``` diff --git a/docs-vuepress/unocss/utilities/interactivity/scroll-snap.md b/docs-vuepress/unocss/utilities/interactivity/scroll-snap.md deleted file mode 100644 index 8bf8599abb..0000000000 --- a/docs-vuepress/unocss/utilities/interactivity/scroll-snap.md +++ /dev/null @@ -1,43 +0,0 @@ -# Scroll Snap - -## Scroll Snap Align - -| Class | Properties | Description | -| :---------------------------- | :------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | -| `snap-start` | scroll-snap-align: start | | -| `snap-end` | scroll-snap-align: end | | -| `snap-center` | scroll-snap-align: center | | - -## Scroll Snap Stop - -| Class | Properties | Description | -| :---------------------------- | :------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | -| `snap-normal` | scroll-snap-stop: normal | | -| `snap-always` | scroll-snap-stop: always | | - -## Scroll Snap Type - -| Class | Properties | Description | -| :---------------------------- | :------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | -| `snap` | scroll-snap-type:
var(--scroll-snap-axis, both)
var(--scroll-snap-strictness, mandatory) | main snap class | -| __Strictness__ | | | -| `snap-none` | --scroll-snap-strictness: none | | -| `snap-mandatory` | --scroll-snap-strictness: mandatory | | -| `snap-proximity` | --scroll-snap-strictness: proximity | | -| __Axis__ | | | -| `snap-x` | --scroll-snap-axis: x | | -| `snap-y` | --scroll-snap-axis: y | | -| `snap-block` | --scroll-snap-axis: block | | -| `snap-inline` | --scroll-snap-axis: inline | | -| `snap-both` | --scroll-snap-axis: both | | - -## Margin, Padding and Other - -| Class | Properties | Description | -| :---------------------------- | :------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | -| __Margin__ | | | -| `snap-m${direction}-${value}` | scroll-snap-margin`${direction}`: `${value}` | same [Margin Utilities](/utilities/layout/spacing#margin) | -| __Padding__ | | | -| `snap-p${direction}-${value}` | scroll-snap-padding`${direction}`: `${value}` | same [Padding Utilities](/utilities/layout/spacing#padding) | -| __Other__ | | | -| `scrollbar-hide` | scrollbar-width: none
::-webkit-scrollbar: {
  display: none
} | visual hide scrollbar | \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/interactivity/touch-action.md b/docs-vuepress/unocss/utilities/interactivity/touch-action.md deleted file mode 100644 index caa23d54a8..0000000000 --- a/docs-vuepress/unocss/utilities/interactivity/touch-action.md +++ /dev/null @@ -1,36 +0,0 @@ -# Touch Action - -Utilities for controlling how an element can be scrolled and zoomed on touchscreens. - -| Class | Properties | -| :---------------- | :-------------------------- | -| touch-auto | touch-action: auto; | -| touch-none | touch-action: none; | -| touch-pan-x | touch-action: pan-x; | -| touch-pan-left | touch-action: pan-left; | -| touch-pan-right | touch-action: pan-right; | -| touch-pan-y | touch-action: pan-y; | -| touch-pan-up | touch-action: pan-up; | -| touch-pan-down | touch-action: pan-down; | -| touch-pinch-zoom | touch-action: pinch-zoom; | -| touch-manipulation| touch-action: manipulation; | - -## Usage - -Use the `touch-{action}` utilities to control how an element can be scrolled (panned) and zoomed (pinched) on ` -touchscreens. - -```html -
- -
-
- -
-
- -
-
- -
-``` diff --git a/docs-vuepress/unocss/utilities/interactivity/user-select.md b/docs-vuepress/unocss/utilities/interactivity/user-select.md deleted file mode 100644 index bf6383c08f..0000000000 --- a/docs-vuepress/unocss/utilities/interactivity/user-select.md +++ /dev/null @@ -1,11 +0,0 @@ -# User Select - -Utilities for controlling whether the user can select text in an element. - - diff --git a/docs-vuepress/unocss/utilities/interactivity/will-change.md b/docs-vuepress/unocss/utilities/interactivity/will-change.md deleted file mode 100644 index 834eb1f5fb..0000000000 --- a/docs-vuepress/unocss/utilities/interactivity/will-change.md +++ /dev/null @@ -1,10 +0,0 @@ -# Will Change - -Utilities for optimizing upcoming animations of elements that are expected to change. - -| Class | Properties | -| :-------------------- | :---------------------------- | -| will-change-auto | will-change: auto; | -| will-change-scroll | will-change: scroll-position; | -| will-change-contents | will-change: contents; | -| will-change-transform | will-change: transform; | diff --git a/docs-vuepress/unocss/utilities/layout/aspect-ratio.md b/docs-vuepress/unocss/utilities/layout/aspect-ratio.md deleted file mode 100644 index ffecc2362c..0000000000 --- a/docs-vuepress/unocss/utilities/layout/aspect-ratio.md +++ /dev/null @@ -1,48 +0,0 @@ -# Aspect Ratio - -## Utilities - -| Class | Properties | -| :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `aspect-auto` | aspect-ratio: auto; | -| `aspect-square` | aspect-ratio: 1 / 1; | -| `aspect-video` | aspect-ratio: 16 / 9; | -| `aspect-none` | position: 'static';
paddingBottom: '0';
'> *': {
 position: 'static';
 height: 'auto';
 width: 'auto';
 top: 'auto';
 right: 'auto';
 bottom: 'auto';
 left: 'auto';
} | -| `aspect-w-${float}` | --tw-aspect-w: `${float};` | -| `aspect-h-${float}` | --tw-aspect-h: `${float};` | -| `aspect-${fraction}` | position: 'relative';
paddingBottom: `${percent};`
'> *': {
 position: 'absolute';
 height: '100%';
 width: '100%';
 top: '0';
 right: '0';
 bottom: '0';
 left: '0';
} | - -*** - -`aspect-w-${float}` will add the following base styles: - -```css -.aspect-w-${float} { - position: 'relative'; - padding-bottom: 'calc(var(--tw-aspect-h) / var(--tw-aspect-w) * 100%)'; -} - -.aspect-w-${float} > * { - position: 'absolute'; - height: '100%'; - width: '100%'; - top: '0'; - right: '0'; - bottom: '0'; - left: '0'; -} -``` - -## Usage - -```js windi.config.js -export default { - theme: { - // ... - }, - plugins: [ - require('windicss/plugin/aspect-ratio'), - // ... - ], -} -``` diff --git a/docs-vuepress/unocss/utilities/layout/columns.md b/docs-vuepress/unocss/utilities/layout/columns.md deleted file mode 100644 index 1780e7a546..0000000000 --- a/docs-vuepress/unocss/utilities/layout/columns.md +++ /dev/null @@ -1,62 +0,0 @@ -# Columns - -## Columns - -Utilities for controlling the number of columns within an element. - - - -## Break After - -Utilities for controlling how a column or page should break after an element. - -| Class | Properties | -| :--------------------- | :----------------------- | -| break-after-auto | break-after: auto; | -| break-after-avoid | break-after: avoid; | -| break-after-all | break-after: all; | -| break-after-avoid-page | break-after: avoid-page; | -| break-after-page | break-after: page; | -| break-after-left | break-after: left; | -| break-after-right | break-after: right; | -| break-after-column | break-after: column; | - -## Break Before - -Utilities for controlling how a column or page should break before an element. - -| Class | Properties | -| :---------------------- | :------------------------ | -| break-before-auto | break-before: auto; | -| break-before-avoid | break-before: avoid; | -| break-before-all | break-before: all; | -| break-before-avoid-page | break-before: avoid-page; | -| break-before-page | break-before: page; | -| break-before-left | break-before: left; | -| break-before-right | break-before: right; | -| break-before-column | break-before: column; | - -## Break Inside - -Utilities for controlling how a column or page should break within an element. - -| Class | Properties | -| :------------------------ | :-------------------------- | -| break-inside-auto | break-inside: auto; | -| break-inside-avoid | break-inside: avoid; | -| break-inside-avoid-page | break-inside: avoid-page; | -| break-inside-avoid-column | break-inside: avoid-column; | diff --git a/docs-vuepress/unocss/utilities/layout/container.md b/docs-vuepress/unocss/utilities/layout/container.md deleted file mode 100644 index ba7c7da579..0000000000 --- a/docs-vuepress/unocss/utilities/layout/container.md +++ /dev/null @@ -1,87 +0,0 @@ -# Container - -## Container - -A component for fixing an element's width to the current breakpoint. - -| Class | Breakpoint | Properties | -| :-------- | :------------- | :----------------- | -| container | *None* | width: 100%; | -| | sm *(640px)* | max-width: 640px; | -| | md *(768px)* | max-width: 768px; | -| | lg *(1024px)* | max-width: 1024px; | -| | xl *(1280px)* | max-width: 1280px; | -| | 2xl *(1536px)* | max-width: 1536px; | - -### Usage - -To center a container, use the mx-auto utility: - -```html -
- -
-``` - -To add horizontal padding, use the `px-{size}` utilities: - -```html -
- -
-``` - -To use a container at only a certain breakpoint and up: - -```html - -
- -
-``` - - - -#### Centering by default - -```js windi.config.js -export default { - theme: { - container: { - center: true, - }, - }, -} -``` - -#### Horizontal padding - -```js windi.config.js -export default { - theme: { - container: { - padding: '2rem', - }, - }, -} -``` - -Specify a different padding amount for each breakpoint - -```js windi.config.js -export default { - theme: { - container: { - padding: { - 'DEFAULT': '1rem', - 'sm': '2rem', - 'lg': '4rem', - 'xl': '5rem', - '2xl': '6rem', - }, - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/layout/display.md b/docs-vuepress/unocss/utilities/layout/display.md deleted file mode 100644 index e5b0fec0d9..0000000000 --- a/docs-vuepress/unocss/utilities/layout/display.md +++ /dev/null @@ -1,176 +0,0 @@ -# Display - -## Block - -The `block` utility generates a block element box, generating line breaks both before and after the element when in the -normal flow. - - - -## Inline Block - -The `inline-block` utility generates a block element box that will be flowed with surrounding content as if it were a -single inline box (behaving much like a replaced element would). - - - -## Inline - -The `inline` utility generates one or more inline element boxes that do not generate line breaks before or after -themselves. In normal flow, the next element will be on the same line if there is space. - - - -## Flow Root - -The `flow-root` utility generates a block element box that establishes a new -[block formatting context](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_formatting_context), defining -where the formatting root lies. - -| Class | Properties | -| :-------- | :------------------ | -| flow-root | display: flow-root; | - - - -## Contents - -The `contents` utilities don't produce a specific box by themselves. They are replaced by their pseudo-box and their -child boxes. - - - -## Hidden - -Turns off the `display` of an element so that it has no effect on layout (the document is rendered as though the element -did not exist). All descendant elements also have their display turned off. To have an element take up the space that it -would normally take, but without actually rendering anything, use the [visibility](#visibility) property instead. - - - -## Visibility - -Utilities for controlling the visibility of an element. The `visibility` CSS property shows or hides an element without -changing the layout of a document. The property can also hide rows or columns in a ``. - - - -## Backface Visibility - -The `backface` utility sets whether the back face of an element is visible when turned towards the user. - - - -## List Item - -The `list-item` utility generates a `::marker` pseudo-element with the content specified by its -[list-style](/utilities/general/typography#list-style-type) properties (for example a bullet point) together with a -principal box of the specified type for its own contents. - - \ No newline at end of file diff --git a/docs-vuepress/unocss/utilities/layout/flexbox.md b/docs-vuepress/unocss/utilities/layout/flexbox.md deleted file mode 100644 index 0cda8b7fcd..0000000000 --- a/docs-vuepress/unocss/utilities/layout/flexbox.md +++ /dev/null @@ -1,205 +0,0 @@ -# Flexbox - -## Flex - -Use `flex` to create a block-level flex container. - - - -## Flex Basis - -Utilities for controlling the initial size of flex items. - - - -## Inline Flex - -Use `inline-flex` to create an inline flex container. - - - -## Flex Direction - -Utilities for controlling the direction of flex items. - - - -## Flex Wrap - -Utilities for controlling how flex items wrap. - - - -## Flex Stretch - -Utilities for controlling how flex items both grow and shrink. - - - - - -```js windi.config.js -export default { - theme: { - flex: { - 1: '1 1 0%', - auto: '1 1 auto', - initial: '0 1 auto', - inherit: 'inherit', - none: 'none', - 2: '2 2 0%', - }, - }, -} -``` - - - -## Flex Grow - -Utilities for controlling how flex items grow. - - - - - -```js windi.config.js -export default { - theme: { - flexGrow: { - 0: 0, - DEFAULT: 2, - 1: 1, - }, - }, -} -``` - - - -## Flex Shrink - -Utilities for controlling how flex items shrink. - - - - - -```js windi.config.js -export default { - theme: { - flexShrink: { - 0: 0, - DEFAULT: 2, - 1: 1, - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/layout/grid.md b/docs-vuepress/unocss/utilities/layout/grid.md deleted file mode 100644 index d3b132c38a..0000000000 --- a/docs-vuepress/unocss/utilities/layout/grid.md +++ /dev/null @@ -1,613 +0,0 @@ -# Grid - -## Grid - -Use `grid` to create a grid container. - - - -## Inline Grid - -Use `inline-grid` to create an inline grid container. - - - -## Grid Template Columns - -Utilities for specifying the columns in a grid layout. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - gridTemplateColumns: { - nt: 'repeat(16, minmax(0, 1fr))', - footer: '200px minmax(900px, 1fr) 100px', - }, - }, - }, -} -``` - - - -## Grid Template Rows - -Utilities for specifying the rows in a grid layout. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - gridTemplateRows: { - layout: '200px minmax(900px, 1fr) 100px', - }, - }, - }, -} -``` - - - -## Grid Column Span - -Utilities for specifying the column size of an element in a grid layout. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - gridColumn: { - 'span-16': 'span 16 / span 16', - }, - }, - }, -} -``` - - - -## Grid Row Span - -Utilities for specifying the row size of an element in a grid layout. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - gridRow: { - 'span-16': 'span 16 / span 16', - }, - }, - }, -} -``` - - - -## Grid Column Start - -Utilities to make an element start at the nth grid line. These utilities should be combined with the [col-end](#grid-column-end) or [col-span](#grid-column-span) utilities to span a specific number of columns. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - gridColumnStart: { - first: '1', - }, - }, - }, -} -``` - - - -## Grid Column End - -Utilities to make an element end at the nth grid line. These utilities should be combined with the [col-start](#grid-column-start) or [col-span](#grid-column-span) utilities to span a specific number of columns. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - gridColumnEnd: { - last: '20', - }, - }, - }, -} -``` - - - -## Grid Row Start - -Utilities to make an element start at the nth grid line. These utilities should be combined with the [row-end](#grid-row-end) or [row-span](#grid-row-span) utilities to span a specific number of rows. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - gridRowStart: { - first: '1', - }, - }, - }, -} -``` - - - -## Grid Row End - -Utilities to make an element end at the nth grid line. These utilities should be combined with the [row-start](#grid-row-start) or [row-span](#grid-row-span) utilities to span a specific number of rows. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - gridRowEnd: { - last: '20', - }, - }, - }, -} -``` - - - -## Grid Auto Flow - -Utilities for controlling how elements in a grid are auto-placed. - - - -## Grid Auto Columns - -Utilities for controlling the size of implicitly-created grid columns. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - gridAutoColumns: { - '2fr': 'minmax(0, 2fr)', - }, - }, - }, -} -``` - - - -## Grid Auto Rows - -Utilities for controlling the size of implicitly-created grid rows. - - - - - -```js windi.config.js -export default { - theme: { - extend: { - gridAutoRows: { - '2fr': 'minmax(0, 2fr)', - }, - }, - }, -} -``` - - - -## Gap - -Utilities for controlling gutters between grid rows and columns. - - - - - -You can customize the global spacing scale in the theme.spacing or theme.extend.spacing sections of your windi.config.js file: - -```js windi.config.js -export default { - theme: { - extend: { - spacing: { - lg: '18rem', - }, - }, - }, -} -``` - -To customize the gap scale separately, use the gap section of your Tailwind theme config. - -```js windi.config.js -export default { - theme: { - extend: { - gap: { - sm: '2.75rem', - }, - }, - }, -} -``` - - - -## Gap X - -Utilities for controlling gutters between grid columns. - - - -## Gap Y - -Utilities for controlling gutters between grid rows. - - diff --git a/docs-vuepress/unocss/utilities/layout/positioning.md b/docs-vuepress/unocss/utilities/layout/positioning.md deleted file mode 100644 index 2a9f58341f..0000000000 --- a/docs-vuepress/unocss/utilities/layout/positioning.md +++ /dev/null @@ -1,490 +0,0 @@ -# Positioning - -## Order - -Utilities for controlling the order of flex and grid items. - - - - - -```js windi.config.js -export default { - theme: { - order: { - first: '-9999', - last: '9999', - none: '0', - normal: '0', - }, - }, -} -``` - - - -## Justify Content - -Utilities for controlling how flex and grid items are positioned along a container's main axis. - - - -## Justify Items - -Utilities for controlling how grid items are aligned along their inline axis. - - - -## Justify Self - -Utilities for controlling how an individual grid item is aligned along its inline axis. - - - -## Align Content - -Utilities for controlling how rows are positioned in multi-row flex and grid containers. - - - -## Align Items - -Utilities for controlling how flex and grid items are positioned along a container's cross axis. - - - -## Align Self - -Utilities for controlling how an individual flex or grid item is positioned along its container's cross axis. - - - -## Place Content - -Utilities for controlling how content is justified and aligned at the same time. - - - -## Place Items - -Utilities for controlling how items are justified and aligned at the same time. - - - -## Place Self - -Utilities for controlling how an individual item is justified and aligned at the same time. - - - -## Position - -Utilities for controlling how an element is positioned in the DOM. - - - -## Top / Right / Bottom / Left - -Utilities for controlling the placement of positioned elements. - -### Inset - - - - - -```js windi.config.js -export default { - theme: { - inset: { - sm: '1rem', - lg: '4rem', - }, - }, -} -``` - - - -### Inset Y - - - -### Inset X - - - -### Top - - - -### Right - - - -### Bottom - - - -### Left - - - -## Floats - -Utilities for controlling the wrapping of content around an element. - - - -## Clear - -Utilities for controlling the wrapping of content around an element. - - - -## Isolation - -Utilities for controlling whether an element should explicitly create a new stacking context. These utilities are especially helpful when used in conjunction with [mix-blend-mode](/utilities/effects/mix-blend-mode) and [z-index](#z-index). - - - -## Object Fit - -Utilities for controlling how a replaced element's content should be resized. - - - -## Object Position - -Utilities for controlling how a replaced element's content should be positioned within its container. - - - - - -```js windi.config.js -export default { - theme: { - objectPosition: { - 'bottom': 'bottom', - 'center': 'center', - 'left': 'left', - 'left-bottom': 'left bottom', - 'left-top': 'left top', - 'right': 'right', - 'right-bottom': 'right bottom', - 'right-top': 'right top', - 'top': 'top', - 'center-bottom': 'center bottom', - 'center-top': 'center top', - }, - }, -} -``` - - - -## Z-Index - -Utilities for controlling the stack order of an element. - - - - - -```js windi.config.js -export default { - theme: { - zIndex: { - first: 10, - second: 20, - }, - }, -} -``` - - diff --git a/docs-vuepress/unocss/utilities/layout/sizing.md b/docs-vuepress/unocss/utilities/layout/sizing.md deleted file mode 100644 index 4c4d294b1c..0000000000 --- a/docs-vuepress/unocss/utilities/layout/sizing.md +++ /dev/null @@ -1,223 +0,0 @@ -# Sizing - -## Width - -Utilities for setting the width of an element - - - - - -```js windi.config.js -export default { - theme: { - extend: { - width: { - half: '50%', - }, - }, - }, -} -``` - - - -## Min-Width - -Utilities for setting the minimum width of an element - - - - - -```js windi.config.js -export default { - theme: { - minWidth: { - half: '50%', - full: '100%', - }, - }, -} -``` - - - -## Max-Width - -Utilities for setting the maximum width of an element - - - - - -```js windi.config.js -export default { - theme: { - maxWidth: { - '1/4': '25%', - '1/2': '50%', - '3/4': '75%', - }, - }, -} -``` - - - -## Height - -Utilities for setting the height of an element - - - - - -```js windi.config.js -export default { - theme: { - height: { - sm: '8px', - md: '16px', - lg: '24px', - xl: '48px', - }, - }, -} -``` - - - -## Min-Height - -Utilities for setting the minimum height of an element - - - - - -```js windi.config.js -export default { - theme: { - minHeight: { - '0': '0', - '1/4': '25%', - '1/2': '50%', - '3/4': '75%', - 'full': '100%', - }, - }, -} -``` - - - -## Max-Height - -Utilities for setting the maximum height of an element - - - - - -```js windi.config.js -export default { - theme: { - maxHeight: { - '0': '0', - '1/4': '25%', - '1/2': '50%', - '3/4': '75%', - 'full': '100%', - }, - }, -} -``` - - - -## Box Sizing - -Utilities for controlling how the browser should calculate an element's total size. - -- Use `box-border` to tell the browser to **include the element's borders and padding when you give it a height or width**. This means a **100px × 100px** element with a **2px border and 4px of padding** on all sides will be rendered as **100px × 100px**, with an internal content area of 88px × 88px. Windi makes this the default for all elements in our preflight base styles. - -- Use `box-content` to tell the browser to **add borders and padding on top of the element's specified width or height**. This means a 100px × 100px element with a **2px border and 4px of padding** on all sides will actually be rendered as **112px × 112px**, with an internal content area of 100px × 100px. - - diff --git a/docs-vuepress/unocss/utilities/layout/spacing.md b/docs-vuepress/unocss/utilities/layout/spacing.md deleted file mode 100644 index fbb88b8739..0000000000 --- a/docs-vuepress/unocss/utilities/layout/spacing.md +++ /dev/null @@ -1,365 +0,0 @@ -# Spacing - -## Padding - -Utilities for controlling an element's padding. - - - - - -```js windi.config.js -export default { - theme: { - padding: { - sm: '8px', - md: '16px', - lg: '24px', - xl: '48px', - }, - }, -} -``` - - - -## Padding Y - -Utilities for controlling an element's vertical padding. - - - -## Padding X - -Utilities for controlling an element's horizontal padding. - - - -## Padding Top - -Utilities for controlling an element's top padding. - - - -## Padding Left - -Utilities for controlling an element's left padding. - - - -## Padding Bottom - -Utilities for controlling an element's bottom padding. - - - -## Padding Right - -Utilities for controlling an element's right padding. - - - -## Margin - -Utilities for controlling an element's margin. - - - - - -```js windi.config.js -export default { - theme: { - margin: { - sm: '8px', - md: '16px', - lg: '24px', - xl: '48px', - }, - }, -} -``` - - - -## Margin Y - -Utilities for controlling an element's vertical margin. - - - -## Margin X - -Utilities for controlling an element's horizontal margin. - - - -## Margin Top - -Utilities for controlling an element's top margin. - - - -## Margin Left - -Utilities for controlling an element's left margin. - - - -## Margin Bottom - -Utilities for controlling an element's bottom margin. - - - -## Margin Right - -Utilities for controlling an element's right margin. - - - -## Space Between Y - -Utilities for controlling the space between vertical align child elements. - - - - - -```js windi.config.js -export default { - theme: { - space: { - sm: '8px', - md: '16px', - lg: '24px', - xl: '48px', - }, - }, -} -``` - - - -## Space Between Y Reverse - -If your elements are in reverse order (using say `flex-col-reverse`), use the `space-y-reverse` utilities to ensure the space is added to the correct side of each element. - - - -## Space Between X - -Utilities for controlling the space between horizontal align child elements. - - - - - -```js windi.config.js -export default { - theme: { - space: { - sm: '8px', - md: '16px', - lg: '24px', - xl: '48px', - }, - }, -} -``` - - - -## Space Between X Reverse - -If your elements are in reverse order (using say `flex-row-reverse`), use the `space-x-reverse` utilities to ensure the space is added to the correct side of each element. - - diff --git a/docs-vuepress/unocss/utilities/layout/tables.md b/docs-vuepress/unocss/utilities/layout/tables.md deleted file mode 100644 index 18819bb524..0000000000 --- a/docs-vuepress/unocss/utilities/layout/tables.md +++ /dev/null @@ -1,571 +0,0 @@ -# Tables - -## Table - -The `table` utility behaves like HTML `
` element. It defines a block-level box. Table element represents tabular data — that is, information presented in a two-dimensional table comprised of rows and columns of cells containing data. - - - -## Inline Table - -The `inline-table` utility does not have a direct mapping in HTML. It behaves like an HTML `
` element, but as an inline box, rather than a block-level box. Inside the table box is a block-level context. - - - -| inline-table | display: inline-table; | - -## Table Caption - -The `table-caption` utility behaves like `` HTML element. The HTML `` element defines a row of cells in a table. The row's cells can then be established using a mix of `` HTML element. The HTML `` element defines a column within a table and is used for defining common semantics on all common cells. It is generally found within a `` element. - - - -## Table Row Group - -The `table-row-group` utility behaves like `` HTML element. The HTML Table Body element (``) encapsulates a set of table rows (`` elements), indicating that they comprise the body of the table (`
` HTML element. The HTML `` element specifies the caption (or title) of a table. - - - -## Table Cell - -The `table-cell` utility behaves like `
` HTML element. The HTML `` element defines a cell of a table that contains data. It participates in the table model. - - - -## Table Row - -The `table-row` utility behaves like `
` (data cell) and `` (header cell) elements. - - - -## Table Column - -The `table-column` utility behaves like `
`). - - - -## Table Column Group - -The `table-column-group` utility behaves like `` HTML element. The HTML `` element defines a group of columns within a table. - - - -## Table Header Group - -The `table-header-group` utility behaves like `` HTML element. The HTML `` element defines a set of rows defining the head of the columns of the table. - - - -## Table Footer Group - -The `table-footer-group` utility behaves like `` HTML element. The HTML `` element defines a set of rows summarizing the columns of the table. - - - -## Table Layout - -Utilities for controlling the table layout algorithm. - - - -## Table Border Collapse - -Utilities for controlling whether table borders should collapse or be separated. - - - -## Table Caption Side - -The `caption` utility puts the content of a table's `
` on the specified side. The values are relative to the writing-mode of the table. - - - -## Table Empty Cells - -The `empty-cells` utility sets whether borders and backgrounds appear around ``cells that have no visible content. A good use case for empty-cells could be a situation where you may not know whether a table will or will not contain empty data points and you decide to hide them. - - - -## Example Of Table Utilities - -Use above utilities to create elements that behave like their respective table elements. - -### Raw Html Tags - -```html -
- - - - - - - - - - - - - - - - - - - - - - - -
Council budget
ItemsExpenditure
Donuts3,000
Stationery18,000
Totals21,000
-``` - -### With Windi Utilities - -```html -
-
Council budget
-
-
-
Items
-
Expenditure
-
-
-
-
-
Donuts
-
3,000
-
-
-
Stationery
-
18,000
-
-
- -
-``` From c9ea2e3060446ca811ea04093ee95f2b3104608d Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 7 Jan 2025 14:25:08 +0800 Subject: [PATCH 075/128] fix: docs --- docs-vuepress/guide/platform/rn-unocss.md | 278 ++++++++++++++++++---- 1 file changed, 232 insertions(+), 46 deletions(-) diff --git a/docs-vuepress/guide/platform/rn-unocss.md b/docs-vuepress/guide/platform/rn-unocss.md index d06743a2d7..4a9f795463 100644 --- a/docs-vuepress/guide/platform/rn-unocss.md +++ b/docs-vuepress/guide/platform/rn-unocss.md @@ -8,35 +8,35 @@ Mpx 使用 unocss 作为原子类引擎,使得在使用 mpx 开发跨端项目 #### [Typography](https://windicss.org/utilities/general/typography.html#typography) -| 规则 | 是否支持 | 备注 | -| :------------- | :------: | :---: | -| Font family | 是 | | -| Font size | 是 | | -| Font style | 是 | | -| Font weight | 是 | | -| Font Variant Numberic | 否 | | -| Hyphens | 否 | | -| Letter spacing | 是 | | -| Line height | 是 | | -| Tab size | 否 | | -| Text alignment | 是 | | -| Text color | 是 | | -| Text decoration | 是 | | -| Text decoration style | 是 | ios支持,安卓不支持 | -| Text decoration thickness | 否 | | -| Text underline offset | 否 | | -| Text decoration opacity | 是 | | -| Text indent | 否 | | -| Text opacity | 是 | | -| Text shadow | 是 | | -| Text stroke | 否 | | -| Text stroke color | 否 | | -| Text transform | 是 | | -| Vertical alignment | 是 | 安卓支持,ios不支持,且只支持 auto/top/bottom/center | -| White space | 否 | | -| Word break | 否 | | -| Write mode | 否 | | -| Writing orientation | 否 | | +| 规则 | 是否支持 | 备注 | +| :------------------------ | :------: | :---------------------------------------------------: | +| Font family | 是 | | +| Font size | 是 | | +| Font style | 是 | | +| Font weight | 是 | | +| Font Variant Numberic | 否 | | +| Hyphens | 否 | | +| Letter spacing | 是 | | +| Line height | 是 | | +| Tab size | 否 | | +| Text alignment | 是 | | +| Text color | 是 | | +| Text decoration | 是 | | +| Text decoration style | 是 | ios 支持,安卓不支持 | +| Text decoration thickness | 否 | | +| Text underline offset | 否 | | +| Text decoration opacity | 是 | | +| Text indent | 否 | | +| Text opacity | 是 | | +| Text shadow | 是 | | +| Text stroke | 否 | | +| Text stroke color | 否 | | +| Text transform | 是 | | +| Vertical alignment | 是 | 安卓支持,ios 不支持,且只支持 auto/top/bottom/center | +| White space | 否 | | +| Word break | 否 | | +| Write mode | 否 | | +| Writing orientation | 否 | | #### Svg @@ -48,30 +48,216 @@ Mpx 使用 unocss 作为原子类引擎,使得在使用 mpx 开发跨端项目 不支持 +#### Animation + +不支持 + +#### Transforms + +| 规则 | 是否支持 | 备注 | +| :------------------ | :------: | :--: | +| Transform Type | 是 | | +| Transform Origin | 是 | | +| Transform Rotate | 是 | | +| Transform Scale | 是 | | +| Transform Skew | 是 | | +| Transform Translate | 是 | | +| Perspective | 是 | | +| Perspective Origin | 是 | | + +#### Transitions + +不支持 + #### [Background](https://windicss.org/utilities/backgrounds/background.html) -| 规则 | 是否支持 | 备注 | -| :------------- | :------: | :---: | -| Background attachment | 否 | | -| Background clip | 否 | | -| Background color | 是 | | -| Background opacity | 是 | | -| Background position | 是 | 支持 left/right/top/bottom/center/数值 | -| Background repeat | 是 | 仅支持 no-repeat | -| Background size | 是 | | -| Background origin | 否 | | +| 规则 | 是否支持 | 备注 | +| :-------------------- | :------: | :------------------------------------: | +| Background attachment | 否 | | +| Background clip | 否 | | +| Background color | 是 | | +| Background opacity | 是 | | +| Background position | 是 | 支持 left/right/top/bottom/center/数值 | +| Background repeat | 是 | 仅支持 no-repeat | +| Background size | 是 | | +| Background origin | 否 | | #### Gradients -| 规则 | 是否支持 | 备注 | -| :------------- | :------: | :---: | -| Gradient Direction | 是 | | -| Gradient From | 是 | | -| Gradient Via | 是 | | -| Gradient To | 是 | | +| 规则 | 是否支持 | 备注 | +| :----------------- | :------: | :--: | +| Gradient Direction | 是 | | +| Gradient From | 是 | | +| Gradient Via | 是 | | +| Gradient To | 是 | | #### Background Blend Mode 不支持 -#### Box Decoration Break \ No newline at end of file +#### Box Decoration Break + +不支持 + +#### Image Rendering + +不支持 + +#### Listings + +| 规则 | 是否支持 | 备注 | +| :------------------ | :------: | :--: | +| List Style Type | 否 | | +| List Style Position | 否 | | + +#### Overflow + +部分属性支持(overflow:hidden/scroll/visible) + +#### Overscroll Behavior + +不支持 + +#### Placeholder + +不支持 + +#### Border + +| 规则 | 是否支持 | 备注 | +| :------------- | :------: | :-----------------------------: | +| Border Radius | 是 | block/inline 不支持 | +| Border Width | 是 | | +| Border Color | 是 | transparent/currentColor 不支持 | +| Border Opacity | 是 | | +| Border Style | 是 | double 不支持 | + +#### Divider + +不支持 + +#### Outline + +不支持 + +#### Ring + +不支持 + +#### Box Shadow + +| 规则 | 是否支持 | 备注 | +| :--------------- | :------: | :--: | +| Box Shadow Size | 是 | | +| Box Shadow Color | 是 | | + +#### Opacity + +支持 + +#### Mix Blend Mode + +不支持 + +#### Filter + +| 规则 | 是否支持 | 备注 | +| :----------------- | :------: | :-----------------------------------------: | +| Filter Blur | 是 | 0.76 版本支持部分属性,且有机型的兼容性问题 | +| Filter Brightness | 是 | | +| Filter Contrast | 是 | | +| Filter Drop Shadow | 是 | | +| Filter Grayscale | 是 | | +| Filter Hue Rotate | 是 | | +| Filter Invert | 是 | | +| Filter Saturate | 是 | | +| Filter Sepia | 是 | | + +#### Backdrop Filter + +不支持 + +#### Accent Color + +不支持 + +#### Appearance + +部分支持(backface-visible,backface-hidden) + +#### Cursor + +不支持,TextInput 有属性控制 + +#### Caret + +| 规则 | 是否支持 | 备注 | +| :------------ | :------: | :--: | +| Caret Color | 否 | | +| Caret Opacity | 否 | | + +#### Pointer Events + +部分支持(auto,none) + +#### Resize + +不支持 + +#### Scroll Behavior + +不支持 + +#### Touch Action + +不支持 + +#### User Select + +支持(none,auto,all,text) + +#### Will Change + +不支持 + +#### Columns + +不支持 + +#### Container + +不支持 + +#### Display + +| 规则 | 是否支持 | 备注 | +| :------------------ | :------: | :--: | +| Block | 否 | | +| Inline Block | 否 | | +| Inline | 否 | | +| Flow Root | 否 | | +| Contents | 否 | | +| Hidden | 是 | | +| Visibility | 否 | | +| Visibility | 否 | | +| Backface Visibility | 否 | | +| List Item | 否 | | + +#### Flexbox + +| Flex | 是 | | +| Flex Basis | 是 | | +| Inline Flex | 是 | | +| Flex Direction | 是 | | +| Flex Wrap | 是 | | +| Flex Stretch | 是 | | +| Flex Grow | 是 | | +| Flex Shrink | 是 | | + +#### Grid + +不支持 + +#### Positioning + +#### Sizing From 7cceee923d704b2695cadffe2f69d1b9fe11cff9 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 7 Jan 2025 14:52:05 +0800 Subject: [PATCH 076/128] [optimize]getUnoClassMap --- .../builtInMixins/styleHelperMixin.ios.js | 15 ++++---- packages/unocss-plugin/lib/rn-plugin/index.js | 2 +- .../webpack-plugin/lib/react/processStyles.js | 35 ++++++------------- 3 files changed, 19 insertions(+), 33 deletions(-) diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index 6e837a045e..6d45d8b62e 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -141,11 +141,9 @@ export default function styleHelperMixin () { __getStyle (staticClass, dynamicClass, staticStyle, dynamicStyle, hide) { let result = {} const unoResult = {} - const unoUtilitiesResult = {} + const unoVarResult = {} const classMap = this.__getClassMap?.() || {} - const unoClassMap = global.__getUnoClassMap?.() || {} - const unoUtilitiesClassMap = global.__getUtilitiesUnoClassMap?.() || {} - const unoPreflightsClassMap = global.__getPreflightsUnoClassMap?.() || {} + const { unoClassMap = {}, unoVarClassMap = {}, unoPreflightsClassMap = {} } = global.__getUnoClass?.() || {} const appClassMap = global.__getAppClassMap?.() || {} if (staticClass || dynamicClass) { const classString = concat(staticClass, stringifyDynamicClass(dynamicClass)) @@ -157,14 +155,14 @@ export default function styleHelperMixin () { Object.assign(result, appClassMap[className]) } else if (unoClassMap[className]) { Object.assign(unoResult, unoClassMap[className]) - } else if (unoUtilitiesClassMap[className]) { - Object.assign(unoUtilitiesResult, unoUtilitiesClassMap[className]) + } else if (unoVarClassMap[className]) { + Object.assign(unoVarResult, unoVarClassMap[className]) } else if (isObject(this.__props[className])) { // externalClasses必定以对象形式传递下来 Object.assign(result, this.__props[className]) } }) - result = Object.assign({}, unoPreflightsClassMap, unoResult, unoUtilitiesResult, result) + result = Object.assign({}, unoPreflightsClassMap, unoResult, unoVarResult, result) } if (staticStyle || dynamicStyle) { @@ -186,7 +184,8 @@ export default function styleHelperMixin () { if (!mediaQueryClass.length) return '' const { width, height } = Dimensions.get('screen') const colorScheme = Appearance.getColorScheme() - const { entries, entriesMap } = global.__getUnoBreakpoints() + const { unoBreakpoints } = global.__getUnoClass?.() || {} + const { entries = [], entriesMap = {} } = unoBreakpoints return mediaQueryClass.map(([className, querypoints = []]) => { const res = querypoints.every(([prefix = '', point = 0]) => { if (prefix === 'landscape') return width > height diff --git a/packages/unocss-plugin/lib/rn-plugin/index.js b/packages/unocss-plugin/lib/rn-plugin/index.js index 8c25047e1b..d8f1087b0b 100644 --- a/packages/unocss-plugin/lib/rn-plugin/index.js +++ b/packages/unocss-plugin/lib/rn-plugin/index.js @@ -85,7 +85,7 @@ function WebpackPlugin (configOrPath, defaults) { replaced = true return shallowStringify(classMap) }) - .replace('__unoCssMapUtilities__', () => { + .replace('__unoVarUtilitiesCssMap__', () => { return shallowStringify(utilitiesClassMap) }) .replace('__unoCssMapPreflights__', () => { diff --git a/packages/webpack-plugin/lib/react/processStyles.js b/packages/webpack-plugin/lib/react/processStyles.js index 0e224157c0..c1777c571a 100644 --- a/packages/webpack-plugin/lib/react/processStyles.js +++ b/packages/webpack-plugin/lib/react/processStyles.js @@ -58,33 +58,20 @@ module.exports = function (styles, { if (ctorType === 'app') { if (hasUnoCSS) { output += ` - global.__getUnoBreakpoints = function () { - return __unoCssBreakpointsPlaceholder__ - };\n - let __unoClassMap - global.__getUnoClassMap = function () { - const formatValue = global.__formatValue - if (!__unoClassMap) { - __unoClassMap = __unoCssMapPlaceholder__ - } - return __unoClassMap - };\n - let __unoUtilitiesClassMap - global.__getUtilitiesUnoClassMap = function () { + let __unoClass + global.__getUnoClass = function () { const formatValue = global.__formatValue - if (!__unoUtilitiesClassMap) { - __unoUtilitiesClassMap = __unoCssMapUtilities__ + if (!__unoClass) { + __unoClass = { + unoClassMap: __unoCssMapPlaceholder__, + unoVarClassMap: __unoVarUtilitiesCssMap__, + unoPreflightsClassMap: __unoCssMapPreflights__, + unoBreakpoints:__unoCssBreakpointsPlaceholder__ + } } - return __unoUtilitiesClassMap + return __unoClass };\n - let __unoPreflightsClassMap - global.__getPreflightsUnoClassMap = function () { - const formatValue = global.__formatValue - if (!__unoPreflightsClassMap) { - __unoPreflightsClassMap = __unoCssMapPreflights__ - } - return __unoPreflightsClassMap - };\n` + ` } output += ` let __appClassMap From 0efa7f27fefa3143c92db35a10882773f4a98e71 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 7 Jan 2025 15:30:18 +0800 Subject: [PATCH 077/128] [docs]add docs --- docs-vuepress/guide/platform/rn-unocss.md | 113 +++++++++++++++++++++- 1 file changed, 112 insertions(+), 1 deletion(-) diff --git a/docs-vuepress/guide/platform/rn-unocss.md b/docs-vuepress/guide/platform/rn-unocss.md index d06743a2d7..26450afd0d 100644 --- a/docs-vuepress/guide/platform/rn-unocss.md +++ b/docs-vuepress/guide/platform/rn-unocss.md @@ -74,4 +74,115 @@ Mpx 使用 unocss 作为原子类引擎,使得在使用 mpx 开发跨端项目 不支持 -#### Box Decoration Break \ No newline at end of file +#### Box Decoration Break + +不支持 + +#### Image Rendering + +不支持 + +#### Listing + +| 规则 | 是否支持 | 备注 | +| :------------- | :------: | :---: | +| List style type | 否 | | +| List style position | 否 | | +| List style image | 否 | | + +#### Overflow + +仅支持 `hidden`、`scroll`、`visible` 属性值 + +#### Overflow Behavior + +不支持 + +#### Placeholder + +不支持 + +#### Border + +| 规则 | 是否支持 | 备注 | +| :------------- | :------: | :---: | +| Border radius | 是 | 不支持 border-inline-start、border-inline-end、border-block-start、border-block-end 属性,其他都支持 | +| Border width | 是 | | +| Border color | 是 | | +| Border opacity | 是 | | +| Border style | 是 | 不支持 double 样式,其他都支持 | + +#### Divider + +| 规则 | 是否支持 | 备注 | +| :------------- | :------: | :---: | +| Divider width | 否 | | +| Divider color | 否 | | +| Divider opacity | 否 | | +| Divider style | 否 | | + +#### Outline + +| 规则 | 是否支持 | 备注 | +| :------------- | :------: | :---: | +| Outline solid | 否 | | +| Outline dotted | 否 | | + +#### Ring + +| 规则 | 是否支持 | 备注 | +| :------------- | :------: | :---: | +| Ring width | 否 | | +| Ring color | 否 | | +| Ring opacity | 否 | | +| Ring offset width | 否 | | +| Ring offset color | 否 | | + + +#### [Box Shadow](https://windicss.org/utilities/effects/box-shadow.html) + +| 规则 | 是否支持 | 备注 | +| :------------- | :------: | :---: | +| Box shadow size | 是 | | +| Box shadow color | 是 | | + +#### [Opacity](https://windicss.org/utilities/effects/opacity.html) + +支持 + +#### [Mix Blend Mode](https://windicss.org/utilities/effects/mix-blend-mode.html) + +不支持 + + +#### Filter + +RN 0.76 支持,且存在机型的兼容性问题,具体参见 [RN 官方文档](https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#box-shadow-and-filter-style-props) + +| 规则 | 是否支持 | 备注 | +| :------------- | :------: | :---: | +| Filter blur | 是 | | +| Filter brightness | 是 | | +| Filter contrast | 是 | | +| Filter drop shadow | 是 | | +| Filter grayscale | 是 | | +| Filter hue rotate | 是 | | +| Filter invert | 是 | | +| Filter saturate | 是 | | +| Filter Sepia | 是 | | + +#### Backdrop Filter + +不支持 + +| 规则 | 是否支持 | 备注 | +| :------------- | :------: | :---: | +| Backdrop blur | 否 | | +| Backdrop brightness | 否 | | +| Backdrop contrast | 否 | | +| Backdrop drop shadow | 否 | | +| Backdrop grayscale | 否 | | +| Backdrop hue rotate | 否 | | +| Backdrop invert | 否 | | +| Backdrop saturate | 否 | | +| Backdrop Sepia | 否 | | \ No newline at end of file From 74f0b63acaa11c9256043c3992cf52044e6a02f2 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 7 Jan 2025 15:35:42 +0800 Subject: [PATCH 078/128] [feat]border rule --- packages/unocss-base/preset-rn/rules/border.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/unocss-base/preset-rn/rules/border.js b/packages/unocss-base/preset-rn/rules/border.js index d408e00a9b..9512db8c4b 100644 --- a/packages/unocss-base/preset-rn/rules/border.js +++ b/packages/unocss-base/preset-rn/rules/border.js @@ -13,7 +13,9 @@ const unSupport = [ const bordersRules = borders.map(([rule]) => (raw) => { const result = raw.match(rule) - if (result && unSupport.includes(result[1])) { + if (raw === 'border-double') { + return true + } else if (result && unSupport.includes(result[1])) { return true } }) From d75716fd40219b7a5ac6e45429dda3b17dab913a Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 7 Jan 2025 16:00:36 +0800 Subject: [PATCH 079/128] [docs] --- docs-vuepress/guide/platform/rn-unocss.md | 80 ++++++++++++++++++----- 1 file changed, 65 insertions(+), 15 deletions(-) diff --git a/docs-vuepress/guide/platform/rn-unocss.md b/docs-vuepress/guide/platform/rn-unocss.md index 26450afd0d..c38fb20cde 100644 --- a/docs-vuepress/guide/platform/rn-unocss.md +++ b/docs-vuepress/guide/platform/rn-unocss.md @@ -4,7 +4,7 @@ Mpx 使用 unocss 作为原子类引擎,使得在使用 mpx 开发跨端项目 受限于 RN 平台的样式规则能力限制,绝大部分的 unocss 提供的原子类并不能在跨 RN 项目当中使用,以下是目前所支持的原子类: -> 对于不支持的原子类,在编译阶段会有 error 提示,且最终的编译产物当中不会产出对应的原子类结果 +> 对于不支持的原子类,在项目编译构建阶段会将不支持的原子类以 error 形式提示,且最终的编译产物当中不会产出对应的原子类结果 #### [Typography](https://windicss.org/utilities/general/typography.html#typography) @@ -44,6 +44,56 @@ Mpx 使用 unocss 作为原子类引擎,使得在使用 mpx 开发跨端项目 #### Variants +* Screen Variants + +Mobile First + +| Varaint | 规则 | 备注 | +| :------------- | :------: | :---: | +| sm | @media (min-width: 640px) | | +| md | @media (min-width: 768px) | | +| lg | @media (min-width: 1024px) | | +| xl | @media (min-width: 1280px) | | +| 2xl | @media (min-width: 1536px) | | + +Desktop First + +| Varaint | 规则 | 备注 | +| :------------- | :------: | :---: | +| Date: Tue, 7 Jan 2025 16:03:49 +0800 Subject: [PATCH 080/128] [docs] --- docs-vuepress/guide/platform/rn-unocss.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-vuepress/guide/platform/rn-unocss.md b/docs-vuepress/guide/platform/rn-unocss.md index c38fb20cde..66ceef63e2 100644 --- a/docs-vuepress/guide/platform/rn-unocss.md +++ b/docs-vuepress/guide/platform/rn-unocss.md @@ -42,7 +42,7 @@ Mpx 使用 unocss 作为原子类引擎,使得在使用 mpx 开发跨端项目 不支持 -#### Variants +#### [Variants](https://windicss.org/utilities/general/variants.html) * Screen Variants From cc5e28745bdf519d1b45b440624b1211ea9c143d Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 7 Jan 2025 16:36:08 +0800 Subject: [PATCH 081/128] fix: docs --- docs-vuepress/guide/platform/rn-unocss.md | 56 +++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/docs-vuepress/guide/platform/rn-unocss.md b/docs-vuepress/guide/platform/rn-unocss.md index 4a9f795463..abd0c17f6a 100644 --- a/docs-vuepress/guide/platform/rn-unocss.md +++ b/docs-vuepress/guide/platform/rn-unocss.md @@ -260,4 +260,60 @@ Mpx 使用 unocss 作为原子类引擎,使得在使用 mpx 开发跨端项目 #### Positioning +| 规则 | 是否支持 | 备注 | +| :------------------ | :------: | :--: | +| Justify Content | 是 | 只支持(justify-around,justify-between,justify-center,justify-end,justify-evenly,justify-start) | +| Justify Items | 否 | | +| Justify Self | 否 | | +| Align Content | 是 | | +| Align Items | 是 | | +| Align Self | 是 | | +| Place Content | 否 | | +| Place Items | 否 | | +| Place Self | 否 | | +| Position | 是 | 只支持(absolute,relative) | +| Top / Right / Bottom / Left | 是 | | +| Floats | 否 | | +| Clear | 否 | | +| Isolation | 否 | | +| Object Fit | 否 | | +| Object Position | 否 | | +| Z-Index | 是 | | + #### Sizing + +| 规则 | 是否支持 | 备注 | +| :------------------ | :------: | :--: | +| Width | 是 | | +| Min-Width | 是 | | +| Max-Width | 是 | | +| Min-Height | 是 | | +| Max-Height | 是 | | +| Box Sizing | 否 | | + +#### Spacing + +| 规则 | 是否支持 | 备注 | +| :------------------ | :------: | :--: | +| Padding | 是 | | +| Padding Y | 是 | | +| Padding X | 是 | | +| Padding Top | 是 | | +| Padding Left | 是 | | +| Padding Bottom | 是 | | +| Padding Right | 是 | | +| Margin | 是 | | +| Margin Y | 是 | | +| Margin X | 是 | | +| Margin Top | 是 | | +| Margin Left | 是 | | +| Margin Bottom | 是 | | +| Margin Right | 是 | | +| Space Between Y | 否 | | +| Space Between Y Reverse | 否 | | +| Space Between X | 否 | | +| Space Between X Reverse | 否 | | + +#### Tables + +不支持 From a3fedee6824d727ea8067f596b473e5419c7e297 Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 7 Jan 2025 17:35:17 +0800 Subject: [PATCH 082/128] fix: docs --- docs-vuepress/guide/platform/rn-unocss.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs-vuepress/guide/platform/rn-unocss.md b/docs-vuepress/guide/platform/rn-unocss.md index 0bf8a8ba05..0213182c20 100644 --- a/docs-vuepress/guide/platform/rn-unocss.md +++ b/docs-vuepress/guide/platform/rn-unocss.md @@ -331,6 +331,8 @@ RN 0.76 支持,且存在机型的兼容性问题,具体参见 [RN 官方文 #### [Flexbox](https://windicss.org/utilities/layout/flexbox.html) +| 规则 | 是否支持 | 备注 | +| :------------------ | :------: | :--: | | Flex | 是 | | | Flex Basis | 是 | | | Inline Flex | 是 | | From 774632fbd4abe9c2279093f6f031b665af4322bb Mon Sep 17 00:00:00 2001 From: mater Date: Wed, 8 Jan 2025 10:53:41 +0800 Subject: [PATCH 083/128] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E6=97=A0=E7=94=A8=E7=9A=84=E6=96=87=E6=A1=A3=E5=92=8C?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../theme/global-components/ColorsPalette.vue | 28 ------------- .../theme/global-components/SingleColor.vue | 39 ------------------- docs-vuepress/guide/platform/web.md | 1 - 3 files changed, 68 deletions(-) delete mode 100644 docs-vuepress/.vuepress/theme/global-components/ColorsPalette.vue delete mode 100644 docs-vuepress/.vuepress/theme/global-components/SingleColor.vue delete mode 100644 docs-vuepress/guide/platform/web.md diff --git a/docs-vuepress/.vuepress/theme/global-components/ColorsPalette.vue b/docs-vuepress/.vuepress/theme/global-components/ColorsPalette.vue deleted file mode 100644 index b51e4dd693..0000000000 --- a/docs-vuepress/.vuepress/theme/global-components/ColorsPalette.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - diff --git a/docs-vuepress/.vuepress/theme/global-components/SingleColor.vue b/docs-vuepress/.vuepress/theme/global-components/SingleColor.vue deleted file mode 100644 index 6dd577884e..0000000000 --- a/docs-vuepress/.vuepress/theme/global-components/SingleColor.vue +++ /dev/null @@ -1,39 +0,0 @@ - - diff --git a/docs-vuepress/guide/platform/web.md b/docs-vuepress/guide/platform/web.md deleted file mode 100644 index 9ec4f99340..0000000000 --- a/docs-vuepress/guide/platform/web.md +++ /dev/null @@ -1 +0,0 @@ -# 123 From a6e1c435f519b2f16f029c5f4f0dfc4d47dab82f Mon Sep 17 00:00:00 2001 From: mater Date: Wed, 8 Jan 2025 11:13:53 +0800 Subject: [PATCH 084/128] =?UTF-8?q?fix:=20unocss=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs-vuepress/.vuepress/config.js | 2 +- .../platform/builtInMixins/styleHelperMixin.ios.js | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs-vuepress/.vuepress/config.js b/docs-vuepress/.vuepress/config.js index 485456387d..796588e020 100644 --- a/docs-vuepress/.vuepress/config.js +++ b/docs-vuepress/.vuepress/config.js @@ -119,7 +119,7 @@ const sidebar = { { title: '小程序跨端组件库 Mpx-cube-ui 开源啦', path: 'mpx-cube-ui' }, { title: 'Mpx-cli 插件化改造', path: 'mpx-cli-next' }, { title: 'Mpx 小程序单元测试能力建设与实践', path: 'unit-test'} - ], + ] } const nav = [ diff --git a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js index 6d45d8b62e..fe1a30217f 100644 --- a/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js +++ b/packages/core/src/platform/builtInMixins/styleHelperMixin.ios.js @@ -140,10 +140,11 @@ export default function styleHelperMixin () { }, __getStyle (staticClass, dynamicClass, staticStyle, dynamicStyle, hide) { let result = {} - const unoResult = {} + let unoResult = {} const unoVarResult = {} const classMap = this.__getClassMap?.() || {} const { unoClassMap = {}, unoVarClassMap = {}, unoPreflightsClassMap = {} } = global.__getUnoClass?.() || {} + let hasUnoClass = false const appClassMap = global.__getAppClassMap?.() || {} if (staticClass || dynamicClass) { const classString = concat(staticClass, stringifyDynamicClass(dynamicClass)) @@ -154,6 +155,7 @@ export default function styleHelperMixin () { // todo 全局样式在每个页面和组件中生效,以支持全局原子类,后续支持样式模块复用后可考虑移除 Object.assign(result, appClassMap[className]) } else if (unoClassMap[className]) { + hasUnoClass = true Object.assign(unoResult, unoClassMap[className]) } else if (unoVarClassMap[className]) { Object.assign(unoVarResult, unoVarClassMap[className]) @@ -162,7 +164,14 @@ export default function styleHelperMixin () { Object.assign(result, this.__props[className]) } }) - result = Object.assign({}, unoPreflightsClassMap, unoResult, unoVarResult, result) + if (hasUnoClass) { + // 两个类需要前置默认css变量 + if (unoResult.transform || unoResult.filter) { + unoResult = Object.assign({}, unoPreflightsClassMap, unoResult) + } + // 合并uno工具变量 + result = Object.assign({}, unoResult, unoVarResult, result) + } } if (staticStyle || dynamicStyle) { From ca2b28d417b7bf4841ca63278760dad04cbeecaf Mon Sep 17 00:00:00 2001 From: Mater Date: Wed, 8 Jan 2025 11:15:28 +0800 Subject: [PATCH 085/128] Update platform.md --- docs-vuepress/guide/platform/platform.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-vuepress/guide/platform/platform.md b/docs-vuepress/guide/platform/platform.md index f01ebc3a0b..290c3407c1 100644 --- a/docs-vuepress/guide/platform/platform.md +++ b/docs-vuepress/guide/platform/platform.md @@ -11,7 +11,7 @@ Mpx以微信增强DSL为基础,支持跨端输出至多端小程序、web和 new MpxwebpackPlugin({ // mode为mpx编译的目标平台,可选值有(wx|ali|swan|qq|tt|jd|web|ios|android|harmony) mode: 'ali', - // srcMode为mpx编译的源码平台,目前仅支持wx + // srcMode为mpx编译的源码平台,目前仅支持wx srcMode: 'wx' }) ``` From 9f2566b17daa5b24bfeec0ac5865564ae8391f25 Mon Sep 17 00:00:00 2001 From: chenwanyue <527202897@qq.com> Date: Fri, 18 Apr 2025 16:05:45 +0800 Subject: [PATCH 086/128] =?UTF-8?q?unocss=E5=8D=87=E7=BA=A7=20esm-only?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs-vitepress/api/compile.md | 2 +- packages/unocss-base/lib/index.js | 11 +++- packages/unocss-base/package.json | 3 +- packages/unocss-plugin/lib/index.js | 58 ++++++++----------- packages/unocss-plugin/lib/parser.js | 4 +- packages/unocss-plugin/lib/platform.js | 2 +- packages/unocss-plugin/lib/source.js | 6 +- packages/unocss-plugin/lib/transform.js | 8 +-- .../unocss-plugin/lib/web-plugin/consts.js | 2 +- .../unocss-plugin/lib/web-plugin/index.js | 16 ++--- .../lib/web-plugin/transform-loader.js | 10 ++-- .../unocss-plugin/lib/web-plugin/utils.js | 24 ++++---- packages/unocss-plugin/package.json | 11 ++-- 13 files changed, 77 insertions(+), 80 deletions(-) diff --git a/docs-vitepress/api/compile.md b/docs-vitepress/api/compile.md index dd2fe24cc2..d5d4afc5a9 100644 --- a/docs-vitepress/api/compile.md +++ b/docs-vitepress/api/compile.md @@ -1688,7 +1688,7 @@ module.exports = defineConfig({ ## MpxUnocssBase -Mpx 内置的 unocss preset,继承自 `@unocss/preset-uno`,并额外提供小程序原子类的预设样式,安装示例如下: +Mpx 内置的 unocss preset,继承自 `@unocss/preset-wind3`,并额外提供小程序原子类的预设样式,安装示例如下: ```bash npm install -D @mpxjs/unocss-base diff --git a/packages/unocss-base/lib/index.js b/packages/unocss-base/lib/index.js index 670dbd383d..d11e9e4da1 100644 --- a/packages/unocss-base/lib/index.js +++ b/packages/unocss-base/lib/index.js @@ -1,10 +1,16 @@ -const { presetUno } = require('@unocss/preset-uno') +const { presetWind3 } = require('@unocss/preset-wind3') +const { presetLegacyCompat } = require('@unocss/preset-legacy-compat') + // eslint-disable-next-line const remRE = /(-?[\.\d]+)rem/g module.exports = function presetMpx (options = {}) { - const uno = presetUno(options) + const uno = presetWind3(options) + const LegacyCompat = presetLegacyCompat({ + // commaStyleColorFunction: true, + legacyColorSpace: true + }) const { baseFontSize = 37.5 } = options return { ...uno, @@ -22,6 +28,7 @@ module.exports = function presetMpx (options = {}) { : `${p1 * baseFontSize}rpx`) } }) + LegacyCompat.postprocess(util) } } } diff --git a/packages/unocss-base/package.json b/packages/unocss-base/package.json index 68b8ec19dd..8f7eb50513 100644 --- a/packages/unocss-base/package.json +++ b/packages/unocss-base/package.json @@ -14,6 +14,7 @@ "access": "public" }, "dependencies": { - "@unocss/preset-uno": "^0.52.7" + "@unocss/preset-wind3": "^66.0.0", + "@unocss/preset-legacy-compat": "^66.0.0" } } diff --git a/packages/unocss-plugin/lib/index.js b/packages/unocss-plugin/lib/index.js index 74054bbad2..979ea7f547 100644 --- a/packages/unocss-plugin/lib/index.js +++ b/packages/unocss-plugin/lib/index.js @@ -1,33 +1,22 @@ -const path = require('path') -const { minimatch } = require('minimatch') -const unoConfig = require('@unocss/config') -const core = require('@unocss/core') -const mpxConfig = require('@mpxjs/webpack-plugin/lib/config') -const toPosix = require('@mpxjs/webpack-plugin/lib/utils/to-posix') -const fixRelative = require('@mpxjs/webpack-plugin/lib/utils/fix-relative') -const parseRequest = require('@mpxjs/webpack-plugin/lib/utils/parse-request') -const { has } = require('@mpxjs/webpack-plugin/lib/utils/set') -const MpxWebpackPlugin = require('@mpxjs/webpack-plugin') -const UnoCSSWebpackPlugin = require('./web-plugin') -const transformerDirectives = require('@unocss/transformer-directives').default -const transformerVariantGroup = require('@unocss/transformer-variant-group') -const { - parseClasses, - parseStrings, - parseMustache, - stringifyAttr, - parseComments, - parseCommentConfig -} = require('./parser') -const { getReplaceSource, getConcatSource, getRawSource } = require('./source') -const { - transformStyle, - buildAliasTransformer, - transformGroups, - mpEscape, - cssRequiresTransform -} = require('./transform') -const platformPreflightsMap = require('./platform') +import {loadConfig} from '@unocss/config' +import {createGenerator,e as cssEscape} from '@unocss/core' +import transformerDirectives from '@unocss/transformer-directives' +import transformerVariantGroup from '@unocss/transformer-variant-group' +import path from 'path' +import { minimatch } from 'minimatch' +import mpxConfig from '@mpxjs/webpack-plugin/lib/config.js' +import toPosix from '@mpxjs/webpack-plugin/lib/utils/to-posix.js' +import fixRelative from '@mpxjs/webpack-plugin/lib/utils/fix-relative.js' +import parseRequest from '@mpxjs/webpack-plugin/lib/utils/parse-request.js' +import set from '@mpxjs/webpack-plugin/lib/utils/set.js' +import MpxWebpackPlugin from '@mpxjs/webpack-plugin' +import { parseClasses, parseStrings, parseMustache, stringifyAttr, parseComments, parseCommentConfig } from './parser.js' +import { getReplaceSource, getConcatSource, getRawSource } from './source.js' +import { transformStyle, buildAliasTransformer, transformGroups, mpEscape, cssRequiresTransform } from './transform.js' +import platformPreflightsMap from './platform.js' +import UnoCSSWebpackPlugin from './web-plugin/index.js' +const { has } = set + const PLUGIN_NAME = 'MpxUnocssPlugin' function filterFile (file, scan) { @@ -206,16 +195,16 @@ class MpxUnocssPlugin { async createContext (compilation, mode) { const { root, config, configFiles } = this.options - const { config: resolved, sources } = await unoConfig.loadConfig(root, config, configFiles) + const { config: resolved, sources } = await loadConfig(root, config, configFiles) sources.forEach((item) => { compilation.fileDependencies.add(item) // fix jiti require cache for watch - delete require.cache[item] + // delete require.cache[item] }) const platformPreflights = platformPreflightsMap[mode] || [] - return core.createGenerator({ + return createGenerator({ ...resolved, preflights: [ ...(resolved.preflights || []), @@ -311,7 +300,6 @@ class MpxUnocssPlugin { const commentConfigMap = {} const mainClassesMap = packageClassesMaps.main - const cssEscape = core.e // config中的safelist视为主包classes const safeListClasses = this.getSafeListClasses(config.safelist) @@ -538,4 +526,4 @@ class MpxUnocssPlugin { } } -module.exports = MpxUnocssPlugin +export default MpxUnocssPlugin diff --git a/packages/unocss-plugin/lib/parser.js b/packages/unocss-plugin/lib/parser.js index 1ce02abc72..3966a9ce99 100644 --- a/packages/unocss-plugin/lib/parser.js +++ b/packages/unocss-plugin/lib/parser.js @@ -1,4 +1,4 @@ -const { parseMustache, stringifyAttr } = require('@mpxjs/webpack-plugin/lib/template-compiler/compiler') +import { parseMustache, stringifyAttr } from '@mpxjs/webpack-plugin/lib/template-compiler/compiler.js' function parseClasses (content) { const output = [] @@ -78,7 +78,7 @@ function parseStrings (content) { return output } -module.exports = { +export { parseClasses, parseStrings, parseComments, diff --git a/packages/unocss-plugin/lib/platform.js b/packages/unocss-plugin/lib/platform.js index 08ba96519b..793a88a20a 100644 --- a/packages/unocss-plugin/lib/platform.js +++ b/packages/unocss-plugin/lib/platform.js @@ -1,6 +1,6 @@ // todo 此处进行跨端preflights定义,保障跨端样式表现一致,待补充完善 // todo 目前不支持声明web preflight,待完善 -module.exports = { +export default { ali: [ { getCSS: () => ` diff --git a/packages/unocss-plugin/lib/source.js b/packages/unocss-plugin/lib/source.js index 2c29592bf9..fd766e0141 100644 --- a/packages/unocss-plugin/lib/source.js +++ b/packages/unocss-plugin/lib/source.js @@ -1,5 +1,5 @@ -const { ReplaceSource, RawSource, ConcatSource, Source } = require('webpack').sources - +import pkg from 'webpack' +const { ReplaceSource, RawSource, ConcatSource, Source } = pkg.sources function getRawSource (s) { if (s instanceof RawSource) { return s } if (s instanceof Source) { return new RawSource(s.source()) } @@ -17,7 +17,7 @@ function getConcatSource (s) { return new ConcatSource(s) } -module.exports = { +export { getRawSource, getReplaceSource, getConcatSource diff --git a/packages/unocss-plugin/lib/transform.js b/packages/unocss-plugin/lib/transform.js index bf0daffc95..6cf457da72 100644 --- a/packages/unocss-plugin/lib/transform.js +++ b/packages/unocss-plugin/lib/transform.js @@ -1,6 +1,6 @@ -const MagicString = require('magic-string') -const transformerDirectives = require('@unocss/transformer-directives').default -const { getReplaceSource } = require('./source') +import MagicString from 'magic-string' +import transformerDirectives from '@unocss/transformer-directives' //default +import { getReplaceSource } from './source.js' const escapedReg = /\\(.)/g function mpEscape (str, escapeMap = {}) { @@ -81,7 +81,7 @@ async function transformStyle ( return code } -module.exports = { +export { cssRequiresTransform, transformGroups, mpEscape, diff --git a/packages/unocss-plugin/lib/web-plugin/consts.js b/packages/unocss-plugin/lib/web-plugin/consts.js index e56289c26c..6d91c54604 100644 --- a/packages/unocss-plugin/lib/web-plugin/consts.js +++ b/packages/unocss-plugin/lib/web-plugin/consts.js @@ -29,7 +29,7 @@ function getLayerPlaceholder (layer) { return `#--unocss--{layer:${layer}}` } -module.exports = { +export { LAYER_MARK_ALL, LAYER_PLACEHOLDER_RE, RESOLVED_ID_RE, diff --git a/packages/unocss-plugin/lib/web-plugin/index.js b/packages/unocss-plugin/lib/web-plugin/index.js index 3b8df3ef7e..8bed7f02ed 100644 --- a/packages/unocss-plugin/lib/web-plugin/index.js +++ b/packages/unocss-plugin/lib/web-plugin/index.js @@ -1,10 +1,10 @@ -const WebpackSources = require('webpack-sources') -const VirtualModulesPlugin = require('webpack-virtual-modules') -const node_path = require('node:path') -const process = require('process') -const fs = require('fs') -const { createContext, getPath, normalizeAbsolutePath } = require('./utils') -const { LAYER_MARK_ALL, LAYER_PLACEHOLDER_RE, RESOLVED_ID_RE, getLayerPlaceholder, resolveId, resolveLayer } = require('./consts') +import WebpackSources from 'webpack-sources' +import VirtualModulesPlugin from 'webpack-virtual-modules' +import node_path from'node:path' +import process from 'process' +import fs from 'fs' +import { createContext, getPath, normalizeAbsolutePath } from './utils.js' +import { LAYER_MARK_ALL, LAYER_PLACEHOLDER_RE, RESOLVED_ID_RE, getLayerPlaceholder, resolveId, resolveLayer} from './consts.js' const PLUGIN_NAME = 'unocss:webpack' const VIRTUAL_MODULE_PREFIX = node_path.resolve(process.cwd(), '_virtual_') @@ -133,4 +133,4 @@ function getLayer (id) { } return layer } -module.exports = WebpackPlugin +export default WebpackPlugin diff --git a/packages/unocss-plugin/lib/web-plugin/transform-loader.js b/packages/unocss-plugin/lib/web-plugin/transform-loader.js index fd151e6bf5..b995630058 100644 --- a/packages/unocss-plugin/lib/web-plugin/transform-loader.js +++ b/packages/unocss-plugin/lib/web-plugin/transform-loader.js @@ -1,7 +1,7 @@ -const { applyTransformers, isCssId } = require('./utils') -const parseComponent = require('@mpxjs/webpack-plugin/lib/parser') -const genComponentTag = require('@mpxjs/webpack-plugin/lib/utils/gen-component-tag') -const path = require('path') +import { applyTransformers, isCssId } from './utils.js' +import parseComponent from '@mpxjs/webpack-plugin/lib/parser.js' +import genComponentTag from '@mpxjs/webpack-plugin/lib/utils/gen-component-tag.js' +import path from 'path' async function transform (code, map) { const callback = this.async() @@ -78,4 +78,4 @@ async function transform (code, map) { } } -module.exports = transform +export default transform diff --git a/packages/unocss-plugin/lib/web-plugin/utils.js b/packages/unocss-plugin/lib/web-plugin/utils.js index dfdabcc510..4e328ced8f 100644 --- a/packages/unocss-plugin/lib/web-plugin/utils.js +++ b/packages/unocss-plugin/lib/web-plugin/utils.js @@ -1,15 +1,15 @@ -const pluginutils = require('@rollup/pluginutils') -const config = require('@unocss/config') -const core = require('@unocss/core') -const node_path = require('node:path') -const MagicString = require('magic-string') -const remapping = require('@ampproject/remapping') +import pluginutils from '@rollup/pluginutils' +import { loadConfig } from '@unocss/config' +import {cssIdRE as defCssIdRE, createGenerator} from '@unocss/core' +import node_path from 'node:path' +import MagicString from 'magic-string' +import remapping from '@ampproject/remapping' const INCLUDE_COMMENT = '@unocss-include' const IGNORE_COMMENT = '@unocss-ignore' const CSS_PLACEHOLDER = '@unocss-placeholder' -const defaultExclude = [core.cssIdRE] +const defaultExclude = [defCssIdRE] const defaultInclude = [/\.(vue|mpx|svelte|[jt]sx|mdx?|astro|elm|php|phtml|html)($|\?)/] const sfcIdRE = /\.(vue|mpx)($|\?)/ const templateIdRE = /\.(wxml|axml|swan|qml|ttml|qxml|jxml|ddml|html)($|\?)/ @@ -18,13 +18,13 @@ const cssIdRE = /\.(wxss|acss|css|qss|ttss|jxss|ddss)($|\?)/ function createContext (configOrPath, defaults = {}, extraConfigSources = []) { const root = process.cwd() let rawConfig = {} - const uno = core.createGenerator(rawConfig, defaults) + const uno = createGenerator(rawConfig, defaults) let rollupFilter = pluginutils.createFilter(defaultInclude, defaultExclude) - const idFilter = pluginutils.createFilter([sfcIdRE, templateIdRE, cssIdRE, core.cssIdRE]) + const idFilter = pluginutils.createFilter([sfcIdRE, templateIdRE, cssIdRE, defCssIdRE]) const ready = reloadConfig() async function reloadConfig () { - const result = await config.loadConfig(root, configOrPath, extraConfigSources, defaults) + const result = await loadConfig(root, configOrPath, extraConfigSources, defaults) rawConfig = result.config uno.setConfig(rawConfig) rollupFilter = pluginutils.createFilter( @@ -140,10 +140,10 @@ function getPath (id) { } function isCssId (id) { - return core.cssIdRE.test(id) || cssIdRE.test(id) + return defCssIdRE.test(id) || cssIdRE.test(id) } -module.exports = { +export { createContext, applyTransformers, getPath, diff --git a/packages/unocss-plugin/package.json b/packages/unocss-plugin/package.json index 1c5b3e99db..9a655db9fe 100644 --- a/packages/unocss-plugin/package.json +++ b/packages/unocss-plugin/package.json @@ -6,6 +6,7 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, + "type": "module", "author": "", "license": "Apache-2.0", "peerDependencies": { @@ -19,13 +20,13 @@ "dependencies": { "@ampproject/remapping": "^2.2.1", "@rollup/pluginutils": "^5.0.2", - "@unocss/config": "0.52.7", - "@unocss/core": "0.52.7", - "@unocss/transformer-directives": "^0.52.1", - "@unocss/transformer-variant-group": "^0.52.1", + "@unocss/config": "66.0.0", + "@unocss/core": "66.0.0", + "@unocss/transformer-directives": "^66.0.0", + "@unocss/transformer-variant-group": "^66.0.0", "magic-string": "^0.30.3", "minimatch": "^9.0.1", - "unocss": "^0.52.7", + "unocss": "66.0.0", "webpack-sources": "^3.2.3", "webpack-virtual-modules": "^0.6.0" } From 4dffe761dc532e8e10d202a81cec55cf35af61ff Mon Sep 17 00:00:00 2001 From: chenwanyue <527202897@qq.com> Date: Mon, 28 Apr 2025 10:49:16 +0800 Subject: [PATCH 087/128] fix: lint --- packages/unocss-base/lib/index.js | 1 - packages/unocss-plugin/lib/index.js | 4 ++-- packages/unocss-plugin/lib/source.js | 4 ++-- packages/unocss-plugin/lib/transform.js | 2 +- packages/unocss-plugin/lib/web-plugin/index.js | 4 ++-- packages/unocss-plugin/lib/web-plugin/transform-loader.js | 4 ++-- packages/unocss-plugin/lib/web-plugin/utils.js | 2 +- 7 files changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/unocss-base/lib/index.js b/packages/unocss-base/lib/index.js index d11e9e4da1..a617988165 100644 --- a/packages/unocss-base/lib/index.js +++ b/packages/unocss-base/lib/index.js @@ -1,7 +1,6 @@ const { presetWind3 } = require('@unocss/preset-wind3') const { presetLegacyCompat } = require('@unocss/preset-legacy-compat') - // eslint-disable-next-line const remRE = /(-?[\.\d]+)rem/g diff --git a/packages/unocss-plugin/lib/index.js b/packages/unocss-plugin/lib/index.js index 979ea7f547..bcb6ad7fcc 100644 --- a/packages/unocss-plugin/lib/index.js +++ b/packages/unocss-plugin/lib/index.js @@ -1,5 +1,5 @@ -import {loadConfig} from '@unocss/config' -import {createGenerator,e as cssEscape} from '@unocss/core' +import { loadConfig } from '@unocss/config' +import { createGenerator, e as cssEscape } from '@unocss/core' import transformerDirectives from '@unocss/transformer-directives' import transformerVariantGroup from '@unocss/transformer-variant-group' import path from 'path' diff --git a/packages/unocss-plugin/lib/source.js b/packages/unocss-plugin/lib/source.js index fd766e0141..4ea1d006b8 100644 --- a/packages/unocss-plugin/lib/source.js +++ b/packages/unocss-plugin/lib/source.js @@ -1,5 +1,5 @@ -import pkg from 'webpack' -const { ReplaceSource, RawSource, ConcatSource, Source } = pkg.sources +import webpack from 'webpack' +const { ReplaceSource, RawSource, ConcatSource, Source } = webpack.sources function getRawSource (s) { if (s instanceof RawSource) { return s } if (s instanceof Source) { return new RawSource(s.source()) } diff --git a/packages/unocss-plugin/lib/transform.js b/packages/unocss-plugin/lib/transform.js index 6cf457da72..c47f0572c1 100644 --- a/packages/unocss-plugin/lib/transform.js +++ b/packages/unocss-plugin/lib/transform.js @@ -1,5 +1,5 @@ import MagicString from 'magic-string' -import transformerDirectives from '@unocss/transformer-directives' //default +import transformerDirectives from '@unocss/transformer-directives' // default import { getReplaceSource } from './source.js' const escapedReg = /\\(.)/g diff --git a/packages/unocss-plugin/lib/web-plugin/index.js b/packages/unocss-plugin/lib/web-plugin/index.js index 8bed7f02ed..92b2eec716 100644 --- a/packages/unocss-plugin/lib/web-plugin/index.js +++ b/packages/unocss-plugin/lib/web-plugin/index.js @@ -1,10 +1,10 @@ import WebpackSources from 'webpack-sources' import VirtualModulesPlugin from 'webpack-virtual-modules' -import node_path from'node:path' +import node_path from 'node:path' import process from 'process' import fs from 'fs' import { createContext, getPath, normalizeAbsolutePath } from './utils.js' -import { LAYER_MARK_ALL, LAYER_PLACEHOLDER_RE, RESOLVED_ID_RE, getLayerPlaceholder, resolveId, resolveLayer} from './consts.js' +import { LAYER_MARK_ALL, LAYER_PLACEHOLDER_RE, RESOLVED_ID_RE, getLayerPlaceholder, resolveId, resolveLayer } from './consts.js' const PLUGIN_NAME = 'unocss:webpack' const VIRTUAL_MODULE_PREFIX = node_path.resolve(process.cwd(), '_virtual_') diff --git a/packages/unocss-plugin/lib/web-plugin/transform-loader.js b/packages/unocss-plugin/lib/web-plugin/transform-loader.js index b995630058..6b1b805519 100644 --- a/packages/unocss-plugin/lib/web-plugin/transform-loader.js +++ b/packages/unocss-plugin/lib/web-plugin/transform-loader.js @@ -1,6 +1,6 @@ import { applyTransformers, isCssId } from './utils.js' import parseComponent from '@mpxjs/webpack-plugin/lib/parser.js' -import genComponentTag from '@mpxjs/webpack-plugin/lib/utils/gen-component-tag.js' +import genComponentTag from '@mpxjs/webpack-plugin/lib/utils/gen-component-tag.js' import path from 'path' async function transform (code, map) { @@ -78,4 +78,4 @@ async function transform (code, map) { } } -export default transform +export default transform diff --git a/packages/unocss-plugin/lib/web-plugin/utils.js b/packages/unocss-plugin/lib/web-plugin/utils.js index 4e328ced8f..c41a0b6a50 100644 --- a/packages/unocss-plugin/lib/web-plugin/utils.js +++ b/packages/unocss-plugin/lib/web-plugin/utils.js @@ -1,6 +1,6 @@ import pluginutils from '@rollup/pluginutils' import { loadConfig } from '@unocss/config' -import {cssIdRE as defCssIdRE, createGenerator} from '@unocss/core' +import { cssIdRE as defCssIdRE, createGenerator } from '@unocss/core' import node_path from 'node:path' import MagicString from 'magic-string' import remapping from '@ampproject/remapping' From 524b8836269ce6b5ecf751c7241994b269c8ec1b Mon Sep 17 00:00:00 2001 From: mater Date: Tue, 27 May 2025 14:19:27 +0800 Subject: [PATCH 088/128] fix: merge master conflict error --- .eslintrc.js | 21 +- .github/workflows/docs.yml | 8 +- .github/workflows/publish.yml | 4 +- .github/workflows/test.yml | 8 +- .gitignore | 6 +- docs-vitepress/.vitepress/config.ts | 398 +++ .../inter-italic-cyrillic-ext.r48I6akx.woff2 | Bin 0 -> 43112 bytes .../inter-italic-cyrillic.By2_1cv3.woff2 | Bin 0 -> 31300 bytes .../inter-italic-greek-ext.1u6EdAuj.woff2 | Bin 0 -> 17404 bytes .../assets/inter-italic-greek.DJ8dCoTZ.woff2 | Bin 0 -> 32564 bytes .../inter-italic-latin-ext.CN1xVJS-.woff2 | Bin 0 -> 120840 bytes .../assets/inter-italic-latin.C2AdPX0b.woff2 | Bin 0 -> 74784 bytes .../inter-italic-vietnamese.BSbpV94h.woff2 | Bin 0 -> 14884 bytes .../inter-roman-cyrillic-ext.BBPuwvHQ.woff2 | Bin 0 -> 40488 bytes .../inter-roman-cyrillic.C5lxZ8CY.woff2 | Bin 0 -> 29164 bytes .../inter-roman-greek-ext.CqjqNYQ-.woff2 | Bin 0 -> 16272 bytes .../assets/inter-roman-greek.BBVDIX6e.woff2 | Bin 0 -> 29920 bytes .../inter-roman-latin-ext.4ZJIpNVo.woff2 | Bin 0 -> 110160 bytes .../assets/inter-roman-latin.Di8DUHzh.woff2 | Bin 0 -> 67792 bytes .../inter-roman-vietnamese.BjW4sHH5.woff2 | Bin 0 -> 14072 bytes .../dist/assets/start-tips1.B10pt_bp.png | Bin .../dist/assets/start-tips2.DL_IWEZM.png | Bin .../theme/components/AlgoliaSearchBox.vue | 13 +- .../.vitepress}/theme/components/CodeList.vue | 2 +- .../theme/components/CustomLayout.vue | 52 + .../theme/components/MobileSwiper.vue | 9 +- .../theme/components/MobileView.vue | 66 +- .../.vitepress}/theme/components/Navbar.vue | 138 +- .../.vitepress}/theme/components/Popover.vue | 0 .../theme/components/RegisterSW.vue | 99 + .../theme/components/SlideItem.vue | 0 .../.vitepress}/theme/components/Swiper.vue | 7 +- .../theme/components/SwiperImg.vue | 2 +- .../theme/global-components/Content.vue | 106 +- .../theme/global-components/Footer.vue | 23 +- .../theme/global-components/Header.vue | 0 docs-vitepress/.vitepress/theme/index.js | 19 + .../theme/layouts/GlobalLayout.vue | 0 .../theme/layouts/HomepageLayout.vue | 85 + .../.vitepress}/theme/layouts/Layout.vue | 4 +- .../.vitepress/theme/styles/index.css | 159 + .../theme/styles/switchAppearance.css | 16 + .../.vitepress/theme/translations.ts | 59 + .../vuepress-format-header-slug-plugin.js | 5 +- .../api/ApiIndex.vue | 84 +- .../api/app-config.md | 7 +- .../api/builtIn.md | 0 .../api/compile.md | 42 +- .../api/composition-api.md | 6 + .../api/directives.md | 56 +- .../api/extend.md | 73 +- .../api/global-api.md | 2 +- .../api/index.md | 4 + .../api/instance-api.md | 0 docs-vitepress/api/optional-api.md | 68 + .../api/reactivity-api.md | 0 .../api/store-api.md | 0 .../articles/1.0.md | 2 +- .../articles/2.0.md | 0 .../articles/2.7-release.md | 0 .../articles/2.8-release-alter.md | 0 .../articles/2.8-release.md | 0 .../articles/2.9-release-alter.md | 0 .../articles/2.9-release.md | 0 .../articles/index.md | 0 .../articles/mpx-cli-next.md | 0 .../articles/mpx-cube-ui.md | 0 .../articles/mpx1.md | 0 .../articles/mpx2.md | 0 .../articles/performance.md | 0 .../articles/size-control.md | 0 .../articles/ts-derivation.md | 0 .../articles/unit-test.md | 0 .../assets/images/1666074957603.jpg | Bin .../assets/images/cloud.png | Bin docs-vitepress/assets/images/harmonyOS.svg | 4 + .../assets/images/select-ts-version.png | Bin .../assets}/images/start-tips1.png | Bin .../assets}/images/start-tips2.png | Bin {docs-vuepress => docs-vitepress}/desc.md | 13 +- .../guide/advance/ability-compatible.md | 0 .../guide/advance/async-subpackage.md | 0 docs-vitepress/guide/advance/build-config.md | 114 + .../guide/advance/custom-output-path.md | 0 .../guide/advance/dll-plugin.md | 0 .../guide/advance/i18n.md | 0 .../guide/advance/image-process.md | 0 .../guide/advance/mixin.md | 0 .../guide/advance/npm.md | 0 .../guide/advance/pinia.md | 0 .../guide/advance/platform.md | 0 .../guide/advance/plugin.md | 0 .../guide/advance/progressive.md | 0 .../guide/advance/provide-inject.md | 51 +- .../guide/advance/resource-resolve.md | 0 .../guide/advance/size-report.md | 0 .../guide/advance/ssr.md | 0 .../guide/advance/store.md | 0 .../guide/advance/subpackage.md | 0 .../guide/advance/utility-first-css.md | 39 +- .../guide/basic/class-style-binding.md | 0 docs-vitepress/guide/basic/component.md | 758 +++++ .../guide/basic/conditional-render.md | 0 .../guide/basic/css.md | 0 docs-vitepress/guide/basic/event.md | 220 ++ .../guide/basic/ide.md | 71 +- .../guide/basic/intro.md | 0 .../guide/basic/list-render.md | 0 .../guide/basic/option-chain.md | 0 .../guide/basic/reactive.md | 0 .../guide/basic/refs.md | 0 .../guide/basic/single-file.md | 0 .../guide/basic/start.md | 74 +- .../guide/basic/template.md | 0 .../guide/basic/two-way-binding.md | 0 .../guide/composition-api/composition-api.md | 16 +- .../guide/composition-api/reactive-api.md | 8 +- .../guide/extend/api-proxy.md | 14 +- .../guide/extend/fetch.md | 0 .../guide/extend/index.md | 0 .../guide/extend/mock.md | 0 .../guide/migrate/2.7.md | 0 .../guide/migrate/2.8.md | 0 .../guide/migrate/2.9.md | 0 .../guide/migrate/mpx-cli-3.md | 0 .../guide/platform/basic.md | 0 docs-vitepress/guide/platform/miniprogram.md | 1 + docs-vitepress/guide/platform/platform.md | 345 +++ .../guide/platform/rn-unocss.md | 0 docs-vitepress/guide/platform/rn.md | 2570 +++++++++++++++++ docs-vitepress/guide/platform/web.md | 1 + .../guide/tool/e2e-test.md | 0 .../guide/tool/ts.md | 0 .../guide/tool/unit-test.md | 0 .../guide/understand/compile.md | 0 .../guide/understand/runtime.md | 0 .../README.md => docs-vitepress/index.md | 36 +- docs-vitepress/package.json | 18 + .../public/favicon.ico | Bin .../public/logo.png | Bin .../public/manifest.webmanifest | 0 docs-vitepress/public/service-worker.js | 30 + docs-vuepress/.vuepress/config.js | 189 -- docs-vuepress/.vuepress/enhanceApp.js | 18 - docs-vuepress/.vuepress/headerMdPlugin.js | 84 - .../baidu_verify_codeva-GYcT5ujCTB.html | 1 - docs-vuepress/.vuepress/styles/index.styl | 151 - docs-vuepress/.vuepress/styles/pallete.styl | 4 - docs-vuepress/.vuepress/theme/index.js | 12 - .../theme/layouts/HomepageLayout.vue | 51 - docs-vuepress/api/optional-api.md | 16 - docs-vuepress/guide/basic/component.md | 94 - docs-vuepress/guide/basic/event.md | 53 - docs-vuepress/guide/platform/miniprogram.md | 0 docs-vuepress/guide/platform/rn.md | 40 - docs-vuepress/rn-api.md | 152 - docs-vuepress/rn-component.md | 73 - docs-vuepress/rn-style.md | 706 ----- docs-vuepress/rn-template.md | 617 ---- docs/README.md | 9 - docs/SUMMARY.md | 78 - docs/Version2.0.md | 16 - docs/api.md | 321 -- docs/articles/1.0.md | 89 - docs/articles/2.0.md | 156 - docs/articles/2.0inner.md | 161 -- docs/articles/details.md | 55 - docs/articles/index.md | 4 - docs/articles/mpx1.md | 184 -- docs/assets/dingding.jpg | Bin 54650 -> 0 bytes docs/book.json | 38 - docs/compilationEnhance/index.md | 184 -- docs/extend/index.md | 281 -- docs/favicon.ico | Bin 9662 -> 0 bytes docs/i18n.md | 85 - docs/images/start-install.png | Bin 21168 -> 0 bytes docs/images/start-start.png | Bin 180606 -> 0 bytes docs/instance-api.md | 134 - docs/intro.md | 224 -- docs/migrate.md | 100 - docs/platform.md | 434 --- docs/plugin.md | 3 - docs/progressive.md | 181 -- docs/single/json-enhance.md | 255 -- docs/single/script-enhance.md | 238 -- docs/single/style-enhance.md | 190 -- docs/single/template-enhance.md | 248 -- docs/single/what-is-single-file.md | 184 -- docs/start.md | 229 -- docs/store/index.md | 802 ----- docs/ts.md | 188 -- docs/understanding/resource.md | 157 - docs/understanding/understanding.md | 60 - examples/mpx-webview/H5/webviewbridge.min.js | 6 +- lerna.json | 2 +- package.json | 16 +- packages/api-proxy/@types/index.d.ts | 9 + packages/api-proxy/package.json | 20 +- packages/api-proxy/src/common/js/promisify.js | 29 +- packages/api-proxy/src/common/js/utils.js | 19 +- .../api/action-sheet/rnActionSheet.jsx | 326 ++- .../{animation.react.js => animation.ios.js} | 34 +- .../src/platform/api/animation/index.ios.js | 2 +- .../platform/api/clipboard-data/index.ios.js | 1 - .../api/clipboard-data/rnClipboard.js | 90 +- .../IntersectionObserver.js | 4 +- .../rnIntersectionObserver.js | 37 +- .../src/platform/api/image/index.ali.js | 9 +- .../src/platform/api/image/index.ios.js | 5 +- .../api-proxy/src/platform/api/image/index.js | 5 +- .../src/platform/api/image/index.web.js | 5 +- .../src/platform/api/location/index.ali.js | 18 +- .../src/platform/api/location/index.ios.js | 14 +- .../src/platform/api/location/index.js | 14 +- .../src/platform/api/location/index.web.js | 14 +- .../src/platform/api/modal/rnModal.jsx | 50 +- .../src/platform/api/next-tick/index.web.js | 2 +- .../src/platform/api/route/index.ios.js | 50 +- .../api/screen-brightness/index.ali.js | 14 +- .../api/screen-brightness/index.ios.js | 1 - .../platform/api/screen-brightness/index.js | 11 +- .../screen-brightness/rnScreenBrightness.js | 79 +- .../api/set-navigation-bar/index.ios.js | 2 +- .../src/platform/api/system/index.ali.js | 38 +- .../src/platform/api/system/index.ios.js | 2 +- .../src/platform/api/system/index.web.js | 2 +- .../src/platform/api/system/rnSystem.js | 12 +- .../src/platform/api/toast/rnToast.jsx | 93 +- .../src/platform/api/vibrate/index.ios.js | 1 + .../src/platform/api/video/index.web.js | 12 +- packages/api-proxy/src/platform/index.js | 8 +- packages/core/@types/global.d.ts | 2 +- packages/core/@types/index.d.ts | 5 +- packages/core/@types/node.d.ts | 2 + packages/core/package.json | 36 +- packages/core/src/convertor/convertor.js | 3 +- packages/core/src/convertor/getConvertMode.js | 3 +- packages/core/src/convertor/wxToReact.js | 2 +- packages/core/src/core/mergeOptions.js | 46 +- packages/core/src/core/proxy.js | 48 +- packages/core/src/core/transferOptions.js | 4 + packages/core/src/dynamic/vnode/render.js | 2 +- packages/core/src/observer/scheduler.js | 10 +- .../core/src/platform/builtInMixins/index.js | 17 +- .../src/platform/builtInMixins/pageIdMixin.js | 13 + .../platform/builtInMixins/pageIdMixin.web.js | 25 + .../builtInMixins/proxyEventMixin.ios.js | 2 +- .../platform/builtInMixins/proxyEventMixin.js | 2 +- .../builtInMixins/proxyEventMixin.web.js | 58 +- .../platform/builtInMixins/refsMixin.ios.js | 18 +- .../builtInMixins/relationsMixin.ios.js | 67 + .../builtInMixins/styleHelperMixin.ios.js | 9 +- packages/core/src/platform/createApp.ios.js | 228 +- packages/core/src/platform/createApp.js | 50 +- packages/core/src/platform/env/event.js | 91 +- packages/core/src/platform/env/index.ios.js | 32 +- packages/core/src/platform/env/index.js | 2 + packages/core/src/platform/env/index.web.js | 4 +- .../platform/env/navigationHelper.android.js | 17 + .../src/platform/env/navigationHelper.ios.js | 17 + packages/core/src/platform/env/vuePlugin.js | 16 +- packages/core/src/platform/export/inject.js | 42 +- .../platform/patch/getDefaultOptions.ios.js | 400 ++- .../src/platform/patch/getDefaultOptions.js | 2 - .../platform/patch/getDefaultOptions.web.js | 7 +- .../patch/react/getDefaultOptions.ios.js | 0 packages/fetch/package.json | 6 +- packages/fetch/src/xfetch.js | 2 +- packages/pinia/package.json | 4 +- packages/size-report/package.json | 4 +- packages/size-report/src/SizeReportPlugin.js | 2 +- packages/size-report/src/utils/parse-asset.js | 110 +- packages/store/package.json | 4 +- packages/unocss-plugin/lib/index.js | 24 +- .../unocss-plugin/lib/web-plugin/index.js | 2 +- packages/unocss-plugin/package.json | 2 +- packages/utils/package.json | 2 +- packages/utils/src/env.js | 2 +- packages/utils/src/errorHandling.js | 14 +- packages/utils/src/log.js | 12 +- packages/utils/src/object.js | 14 +- packages/utils/src/path.js | 6 +- packages/webpack-plugin/lib/config.js | 7 +- .../RecordPageConfigsMapDependency.js | 45 + packages/webpack-plugin/lib/file-loader.js | 5 + packages/webpack-plugin/lib/index.js | 61 +- .../lib/json-compiler/helper.js | 5 +- packages/webpack-plugin/lib/parser.js | 2 +- .../lib/platform/json/wx/index.js | 9 +- .../lib/platform/style/wx/index.js | 117 +- .../template/wx/component-config/button.js | 21 +- .../template/wx/component-config/canvas.js | 4 + .../wx/component-config/checkbox-group.js | 4 + .../template/wx/component-config/checkbox.js | 4 + .../wx/component-config/cover-image.js | 8 +- .../wx/component-config/cover-view.js | 4 + .../wx/component-config/fix-component-name.js | 5 +- .../template/wx/component-config/form.js | 8 +- .../template/wx/component-config/icon.js | 4 + .../template/wx/component-config/image.js | 8 +- .../template/wx/component-config/input.js | 23 +- .../template/wx/component-config/label.js | 4 + .../wx/component-config/movable-area.js | 8 +- .../wx/component-config/movable-view.js | 22 +- .../template/wx/component-config/navigator.js | 4 + .../wx/component-config/picker-view-column.js | 4 + .../wx/component-config/picker-view.js | 14 +- .../template/wx/component-config/picker.js | 8 +- .../wx/component-config/radio-group.js | 4 + .../template/wx/component-config/radio.js | 4 + .../template/wx/component-config/rich-text.js | 4 + .../wx/component-config/root-portal.js | 4 + .../wx/component-config/scroll-view.js | 14 +- .../wx/component-config/swiper-item.js | 8 +- .../template/wx/component-config/swiper.js | 15 +- .../template/wx/component-config/switch.js | 4 + .../template/wx/component-config/text.js | 27 +- .../template/wx/component-config/textarea.js | 21 +- .../wx/component-config/unsupported.js | 9 +- .../template/wx/component-config/video.js | 37 +- .../template/wx/component-config/view.js | 26 +- .../template/wx/component-config/web-view.js | 4 + .../lib/platform/template/wx/index.js | 151 +- packages/webpack-plugin/lib/react/index.js | 1 - .../webpack-plugin/lib/react/processJSON.js | 15 +- .../webpack-plugin/lib/react/processScript.js | 33 +- .../lib/react/processTemplate.js | 36 +- .../webpack-plugin/lib/react/script-helper.js | 30 +- .../lib/resolver/PackageEntryPlugin.js | 4 +- .../lib/runtime/components/react/context.ts | 27 +- .../runtime/components/react/event.config.ts | 5 +- .../components/react/getInnerListeners.ts | 363 ++- .../runtime/components/react/mpx-button.tsx | 96 +- .../components/react/mpx-canvas/Image.ts | 8 +- .../components/react/mpx-canvas/html.ts | 6 +- .../components/react/mpx-canvas/index.tsx | 87 +- .../components/react/mpx-checkbox-group.tsx | 17 +- .../runtime/components/react/mpx-checkbox.tsx | 27 +- .../lib/runtime/components/react/mpx-form.tsx | 44 +- .../lib/runtime/components/react/mpx-icon.tsx | 102 - .../react/mpx-icon/icons/cancel.png | Bin 0 -> 3010 bytes .../components/react/mpx-icon/icons/clear.png | Bin 0 -> 2238 bytes .../react/mpx-icon/icons/download.png | Bin 0 -> 1739 bytes .../components/react/mpx-icon/icons/info.png | Bin 0 -> 1812 bytes .../react/mpx-icon/icons/search.png | Bin 0 -> 2199 bytes .../react/mpx-icon/icons/success.png | Bin 0 -> 2239 bytes .../mpx-icon/icons/success_no_circle.png | Bin 0 -> 1824 bytes .../react/mpx-icon/icons/waiting.png | Bin 0 -> 1971 bytes .../components/react/mpx-icon/icons/warn.png | Bin 0 -> 1889 bytes .../components/react/mpx-icon/index.tsx | 120 + .../runtime/components/react/mpx-image.tsx | 104 +- .../components/react/mpx-inline-text.tsx | 18 + .../runtime/components/react/mpx-input.tsx | 226 +- .../react/mpx-keyboard-avoiding-view.tsx | 111 + .../runtime/components/react/mpx-label.tsx | 19 +- .../components/react/mpx-movable-area.tsx | 43 +- .../components/react/mpx-movable-view.tsx | 360 ++- .../components/react/mpx-navigator.tsx | 12 +- .../react/mpx-picker-view-column.tsx | 289 -- .../react/mpx-picker-view-column/index.tsx | 367 +++ .../pickerViewColumnItem.tsx | 79 + .../pickerViewFaces.ts} | 24 +- .../pickerViewIndicator.tsx | 34 + .../mpx-picker-view-column/pickerViewMask.tsx | 30 + .../index.tsx} | 160 +- .../mpx-picker-view/pickerVIewContext.ts | 27 + .../components/react/mpx-picker/date.tsx | 295 +- .../components/react/mpx-picker/dateData.ts | 22 + .../components/react/mpx-picker/index.tsx | 364 ++- .../react/mpx-picker/multiSelector.tsx | 235 +- .../components/react/mpx-picker/region.tsx | 306 +- .../components/react/mpx-picker/selector.tsx | 155 +- .../components/react/mpx-picker/time.tsx | 354 +-- .../components/react/mpx-picker/type.ts | 156 +- .../components/react/mpx-popup/index.tsx | 86 + .../components/react/mpx-popup/popupBase.tsx | 130 + .../components/react/mpx-portal/index.tsx | 39 + .../react/mpx-portal/portal-host.tsx | 141 + .../react/mpx-portal/portal-manager.tsx | 63 + .../components/react/mpx-radio-group.tsx | 36 +- .../runtime/components/react/mpx-radio.tsx | 27 +- .../components/react/mpx-rich-text/index.tsx | 55 +- .../components/react/mpx-root-portal.tsx | 2 +- .../components/react/mpx-scroll-view.tsx | 545 +++- .../components/react/mpx-simple-text.tsx | 25 +- .../components/react/mpx-simple-view.tsx | 33 + .../components/react/mpx-swiper-item.tsx | 109 +- .../runtime/components/react/mpx-swiper.tsx | 806 ++++++ .../components/react/mpx-swiper/carouse.tsx | 527 ---- .../components/react/mpx-swiper/index.tsx | 80 - .../components/react/mpx-swiper/type.ts | 87 - .../runtime/components/react/mpx-switch.tsx | 45 +- .../lib/runtime/components/react/mpx-text.tsx | 41 +- .../runtime/components/react/mpx-textarea.tsx | 28 +- .../runtime/components/react/mpx-video.tsx | 394 +++ .../lib/runtime/components/react/mpx-view.tsx | 150 +- .../runtime/components/react/mpx-web-view.tsx | 248 +- .../components/react/pickerOverlay.tsx | 32 - .../react/types/{common.ts => common.d.ts} | 0 .../react/types/getInnerListeners.d.ts | 102 + .../react/types/getInnerListeners.ts | 69 - .../components/react/types/global.d.ts | 18 + .../components/react/useAnimationHooks.ts | 173 +- .../lib/runtime/components/react/utils.tsx | 301 +- .../components/web/mini-video-controls.min.js | 2 +- .../runtime/components/web/mpx-checkbox.vue | 2 +- .../lib/runtime/components/web/mpx-input.vue | 2 +- .../components/web/mpx-picker-view-column.vue | 13 +- .../runtime/components/web/mpx-web-view.vue | 2 +- .../webpack-plugin/lib/runtime/mpxGlobal.js | 1 + .../lib/runtime/optionProcessor.d.ts | 5 + .../lib/runtime/optionProcessor.js | 5 +- .../webpack-plugin/lib/runtime/stringify.wxs | 4 +- .../lib/script-setup-compiler/index.js | 8 +- .../lib/style-compiler/index.js | 21 +- .../strip-conditional-loader.js | 127 + .../lib/template-compiler/bind-this.js | 15 +- .../lib/template-compiler/compiler.js | 206 +- .../lib/template-compiler/index.js | 8 +- packages/webpack-plugin/lib/utils/env.js | 2 +- .../lib/utils/match-condition.js | 22 +- .../lib/utils/pre-process-json.js | 14 +- .../webpack-plugin/lib/web/processJSON.js | 4 +- .../webpack-plugin/lib/web/processTemplate.js | 12 +- packages/webpack-plugin/lib/wxs/loader.js | 4 +- packages/webpack-plugin/lib/wxs/pre-loader.js | 5 +- packages/webpack-plugin/lib/wxss/loader.js | 17 +- packages/webpack-plugin/package.json | 13 +- .../test/platform/common/bind-this.spec.js | 65 +- .../test/platform/common/css-if.spec.js | 198 ++ .../test/platform/common/mode.spec.js | 2 +- .../test/platform/wx/template/common.spec.js | 6 +- .../dist/webviewbridge.esm.browser.js | 83 +- .../dist/webviewbridge.esm.browser.min.js | 6 +- .../webview-bridge/dist/webviewbridge.esm.js | 75 +- packages/webview-bridge/dist/webviewbridge.js | 75 +- .../webview-bridge/dist/webviewbridge.min.js | 6 +- packages/webview-bridge/package.json | 2 +- packages/webview-bridge/src/index.js | 79 +- 439 files changed, 14660 insertions(+), 12527 deletions(-) create mode 100644 docs-vitepress/.vitepress/config.ts create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 create mode 100644 docs-vitepress/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 rename docs-vuepress/assets/images/start-tips1.png => docs-vitepress/.vitepress/dist/assets/start-tips1.B10pt_bp.png (100%) rename docs-vuepress/assets/images/start-tips2.png => docs-vitepress/.vitepress/dist/assets/start-tips2.DL_IWEZM.png (100%) rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/components/AlgoliaSearchBox.vue (68%) rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/components/CodeList.vue (93%) create mode 100644 docs-vitepress/.vitepress/theme/components/CustomLayout.vue rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/components/MobileSwiper.vue (95%) rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/components/MobileView.vue (85%) rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/components/Navbar.vue (55%) rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/components/Popover.vue (100%) create mode 100644 docs-vitepress/.vitepress/theme/components/RegisterSW.vue rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/components/SlideItem.vue (100%) rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/components/Swiper.vue (94%) rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/components/SwiperImg.vue (90%) rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/global-components/Content.vue (82%) rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/global-components/Footer.vue (77%) rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/global-components/Header.vue (100%) create mode 100644 docs-vitepress/.vitepress/theme/index.js rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/layouts/GlobalLayout.vue (100%) create mode 100644 docs-vitepress/.vitepress/theme/layouts/HomepageLayout.vue rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/layouts/Layout.vue (88%) create mode 100644 docs-vitepress/.vitepress/theme/styles/index.css create mode 100644 docs-vitepress/.vitepress/theme/styles/switchAppearance.css create mode 100644 docs-vitepress/.vitepress/theme/translations.ts rename {docs-vuepress/.vuepress => docs-vitepress/.vitepress}/theme/vuepress-format-header-slug-plugin.js (79%) rename {docs-vuepress => docs-vitepress}/api/ApiIndex.vue (96%) rename {docs-vuepress => docs-vitepress}/api/app-config.md (96%) rename {docs-vuepress => docs-vitepress}/api/builtIn.md (100%) rename {docs-vuepress => docs-vitepress}/api/compile.md (97%) rename {docs-vuepress => docs-vitepress}/api/composition-api.md (97%) rename {docs-vuepress => docs-vitepress}/api/directives.md (91%) rename {docs-vuepress => docs-vitepress}/api/extend.md (87%) rename {docs-vuepress => docs-vitepress}/api/global-api.md (99%) rename {docs-vuepress => docs-vitepress}/api/index.md (83%) rename {docs-vuepress => docs-vitepress}/api/instance-api.md (100%) create mode 100644 docs-vitepress/api/optional-api.md rename {docs-vuepress => docs-vitepress}/api/reactivity-api.md (100%) rename {docs-vuepress => docs-vitepress}/api/store-api.md (100%) rename {docs-vuepress => docs-vitepress}/articles/1.0.md (99%) rename {docs-vuepress => docs-vitepress}/articles/2.0.md (100%) rename {docs-vuepress => docs-vitepress}/articles/2.7-release.md (100%) rename {docs-vuepress => docs-vitepress}/articles/2.8-release-alter.md (100%) rename {docs-vuepress => docs-vitepress}/articles/2.8-release.md (100%) rename {docs-vuepress => docs-vitepress}/articles/2.9-release-alter.md (100%) rename {docs-vuepress => docs-vitepress}/articles/2.9-release.md (100%) rename {docs-vuepress => docs-vitepress}/articles/index.md (100%) rename {docs-vuepress => docs-vitepress}/articles/mpx-cli-next.md (100%) rename {docs-vuepress => docs-vitepress}/articles/mpx-cube-ui.md (100%) rename {docs-vuepress => docs-vitepress}/articles/mpx1.md (100%) rename {docs-vuepress => docs-vitepress}/articles/mpx2.md (100%) rename {docs-vuepress => docs-vitepress}/articles/performance.md (100%) rename {docs-vuepress => docs-vitepress}/articles/size-control.md (100%) rename {docs-vuepress => docs-vitepress}/articles/ts-derivation.md (100%) rename {docs-vuepress => docs-vitepress}/articles/unit-test.md (100%) rename {docs-vuepress => docs-vitepress}/assets/images/1666074957603.jpg (100%) rename {docs-vuepress => docs-vitepress}/assets/images/cloud.png (100%) create mode 100644 docs-vitepress/assets/images/harmonyOS.svg rename {docs-vuepress => docs-vitepress}/assets/images/select-ts-version.png (100%) rename {docs => docs-vitepress/assets}/images/start-tips1.png (100%) rename {docs => docs-vitepress/assets}/images/start-tips2.png (100%) rename {docs-vuepress => docs-vitepress}/desc.md (71%) rename {docs-vuepress => docs-vitepress}/guide/advance/ability-compatible.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/async-subpackage.md (100%) create mode 100644 docs-vitepress/guide/advance/build-config.md rename {docs-vuepress => docs-vitepress}/guide/advance/custom-output-path.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/dll-plugin.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/i18n.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/image-process.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/mixin.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/npm.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/pinia.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/platform.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/plugin.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/progressive.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/provide-inject.md (80%) rename {docs-vuepress => docs-vitepress}/guide/advance/resource-resolve.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/size-report.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/ssr.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/store.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/subpackage.md (100%) rename {docs-vuepress => docs-vitepress}/guide/advance/utility-first-css.md (95%) rename {docs-vuepress => docs-vitepress}/guide/basic/class-style-binding.md (100%) create mode 100644 docs-vitepress/guide/basic/component.md rename {docs-vuepress => docs-vitepress}/guide/basic/conditional-render.md (100%) rename {docs-vuepress => docs-vitepress}/guide/basic/css.md (100%) create mode 100644 docs-vitepress/guide/basic/event.md rename {docs-vuepress => docs-vitepress}/guide/basic/ide.md (62%) rename {docs-vuepress => docs-vitepress}/guide/basic/intro.md (100%) rename {docs-vuepress => docs-vitepress}/guide/basic/list-render.md (100%) rename {docs-vuepress => docs-vitepress}/guide/basic/option-chain.md (100%) rename {docs-vuepress => docs-vitepress}/guide/basic/reactive.md (100%) rename {docs-vuepress => docs-vitepress}/guide/basic/refs.md (100%) rename {docs-vuepress => docs-vitepress}/guide/basic/single-file.md (100%) rename {docs-vuepress => docs-vitepress}/guide/basic/start.md (82%) rename {docs-vuepress => docs-vitepress}/guide/basic/template.md (100%) rename {docs-vuepress => docs-vitepress}/guide/basic/two-way-binding.md (100%) rename {docs-vuepress => docs-vitepress}/guide/composition-api/composition-api.md (98%) rename {docs-vuepress => docs-vitepress}/guide/composition-api/reactive-api.md (97%) rename {docs-vuepress => docs-vitepress}/guide/extend/api-proxy.md (84%) rename {docs-vuepress => docs-vitepress}/guide/extend/fetch.md (100%) rename {docs-vuepress => docs-vitepress}/guide/extend/index.md (100%) rename {docs-vuepress => docs-vitepress}/guide/extend/mock.md (100%) rename {docs-vuepress => docs-vitepress}/guide/migrate/2.7.md (100%) rename {docs-vuepress => docs-vitepress}/guide/migrate/2.8.md (100%) rename {docs-vuepress => docs-vitepress}/guide/migrate/2.9.md (100%) rename {docs-vuepress => docs-vitepress}/guide/migrate/mpx-cli-3.md (100%) rename docs-vuepress/guide/platform/platform.md => docs-vitepress/guide/platform/basic.md (100%) create mode 100644 docs-vitepress/guide/platform/miniprogram.md create mode 100644 docs-vitepress/guide/platform/platform.md rename {docs-vuepress => docs-vitepress}/guide/platform/rn-unocss.md (100%) create mode 100644 docs-vitepress/guide/platform/rn.md create mode 100644 docs-vitepress/guide/platform/web.md rename {docs-vuepress => docs-vitepress}/guide/tool/e2e-test.md (100%) rename {docs-vuepress => docs-vitepress}/guide/tool/ts.md (100%) rename {docs-vuepress => docs-vitepress}/guide/tool/unit-test.md (100%) rename {docs-vuepress => docs-vitepress}/guide/understand/compile.md (100%) rename {docs-vuepress => docs-vitepress}/guide/understand/runtime.md (100%) rename docs-vuepress/README.md => docs-vitepress/index.md (88%) create mode 100644 docs-vitepress/package.json rename {docs-vuepress/.vuepress => docs-vitepress}/public/favicon.ico (100%) rename {docs-vuepress/.vuepress => docs-vitepress}/public/logo.png (100%) rename {docs-vuepress/.vuepress => docs-vitepress}/public/manifest.webmanifest (100%) create mode 100644 docs-vitepress/public/service-worker.js delete mode 100644 docs-vuepress/.vuepress/config.js delete mode 100644 docs-vuepress/.vuepress/enhanceApp.js delete mode 100644 docs-vuepress/.vuepress/headerMdPlugin.js delete mode 100644 docs-vuepress/.vuepress/public/baidu_verify_codeva-GYcT5ujCTB.html delete mode 100644 docs-vuepress/.vuepress/styles/index.styl delete mode 100644 docs-vuepress/.vuepress/styles/pallete.styl delete mode 100644 docs-vuepress/.vuepress/theme/index.js delete mode 100644 docs-vuepress/.vuepress/theme/layouts/HomepageLayout.vue delete mode 100644 docs-vuepress/api/optional-api.md delete mode 100644 docs-vuepress/guide/basic/component.md delete mode 100644 docs-vuepress/guide/basic/event.md delete mode 100644 docs-vuepress/guide/platform/miniprogram.md delete mode 100644 docs-vuepress/guide/platform/rn.md delete mode 100644 docs-vuepress/rn-api.md delete mode 100644 docs-vuepress/rn-component.md delete mode 100644 docs-vuepress/rn-style.md delete mode 100644 docs-vuepress/rn-template.md delete mode 100644 docs/README.md delete mode 100644 docs/SUMMARY.md delete mode 100644 docs/Version2.0.md delete mode 100644 docs/api.md delete mode 100644 docs/articles/1.0.md delete mode 100644 docs/articles/2.0.md delete mode 100644 docs/articles/2.0inner.md delete mode 100644 docs/articles/details.md delete mode 100644 docs/articles/index.md delete mode 100644 docs/articles/mpx1.md delete mode 100644 docs/assets/dingding.jpg delete mode 100644 docs/book.json delete mode 100644 docs/compilationEnhance/index.md delete mode 100644 docs/extend/index.md delete mode 100644 docs/favicon.ico delete mode 100644 docs/i18n.md delete mode 100644 docs/images/start-install.png delete mode 100644 docs/images/start-start.png delete mode 100644 docs/instance-api.md delete mode 100644 docs/intro.md delete mode 100644 docs/migrate.md delete mode 100644 docs/platform.md delete mode 100644 docs/plugin.md delete mode 100644 docs/progressive.md delete mode 100644 docs/single/json-enhance.md delete mode 100644 docs/single/script-enhance.md delete mode 100644 docs/single/style-enhance.md delete mode 100644 docs/single/template-enhance.md delete mode 100644 docs/single/what-is-single-file.md delete mode 100644 docs/start.md delete mode 100644 docs/store/index.md delete mode 100644 docs/ts.md delete mode 100644 docs/understanding/resource.md delete mode 100644 docs/understanding/understanding.md rename packages/api-proxy/src/platform/api/animation/{animation.react.js => animation.ios.js} (87%) delete mode 100644 packages/api-proxy/src/platform/api/clipboard-data/index.ios.js delete mode 100644 packages/api-proxy/src/platform/api/screen-brightness/index.ios.js create mode 100644 packages/core/src/platform/builtInMixins/pageIdMixin.js create mode 100644 packages/core/src/platform/builtInMixins/pageIdMixin.web.js create mode 100644 packages/core/src/platform/builtInMixins/relationsMixin.ios.js create mode 100644 packages/core/src/platform/env/navigationHelper.android.js create mode 100644 packages/core/src/platform/env/navigationHelper.ios.js rename docs-vuepress/.vuepress/theme/enhanceApp.js => packages/core/src/platform/patch/react/getDefaultOptions.ios.js (100%) create mode 100644 packages/webpack-plugin/lib/dependencies/RecordPageConfigsMapDependency.js delete mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-icon.tsx create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-icon/icons/cancel.png create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-icon/icons/clear.png create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-icon/icons/download.png create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-icon/icons/info.png create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-icon/icons/search.png create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-icon/icons/success.png create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-icon/icons/success_no_circle.png create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-icon/icons/waiting.png create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-icon/icons/warn.png create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-icon/index.tsx create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-inline-text.tsx create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-keyboard-avoiding-view.tsx delete mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-picker-view-column.tsx create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-picker-view-column/index.tsx create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-picker-view-column/pickerViewColumnItem.tsx rename packages/webpack-plugin/lib/runtime/components/react/{pickerFaces.ts => mpx-picker-view-column/pickerViewFaces.ts} (83%) create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-picker-view-column/pickerViewIndicator.tsx create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-picker-view-column/pickerViewMask.tsx rename packages/webpack-plugin/lib/runtime/components/react/{mpx-picker-view.tsx => mpx-picker-view/index.tsx} (61%) create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-picker-view/pickerVIewContext.ts create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-picker/dateData.ts create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-popup/index.tsx create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-popup/popupBase.tsx create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-portal/index.tsx create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-portal/portal-host.tsx create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-portal/portal-manager.tsx create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-simple-view.tsx create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-swiper.tsx delete mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-swiper/carouse.tsx delete mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-swiper/index.tsx delete mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-swiper/type.ts create mode 100644 packages/webpack-plugin/lib/runtime/components/react/mpx-video.tsx delete mode 100644 packages/webpack-plugin/lib/runtime/components/react/pickerOverlay.tsx rename packages/webpack-plugin/lib/runtime/components/react/types/{common.ts => common.d.ts} (100%) create mode 100644 packages/webpack-plugin/lib/runtime/components/react/types/getInnerListeners.d.ts delete mode 100644 packages/webpack-plugin/lib/runtime/components/react/types/getInnerListeners.ts create mode 100644 packages/webpack-plugin/lib/runtime/mpxGlobal.js create mode 100644 packages/webpack-plugin/lib/style-compiler/strip-conditional-loader.js create mode 100644 packages/webpack-plugin/test/platform/common/css-if.spec.js diff --git a/.eslintrc.js b/.eslintrc.js index 37bb6af70f..404ba438a4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -5,11 +5,9 @@ module.exports = { sourceType: 'module' }, extends: 'standard', - plugins: [ - 'html', - 'jest' - ], + plugins: ['html', 'jest'], globals: { + mpxGlobal: 'readonly', wx: 'readonly', my: 'readonly', swan: 'readonly', @@ -32,7 +30,8 @@ module.exports = { 'no-cond-assign': 0, camelcase: 0, indent: 0, - 'symbol-description': 0 + 'symbol-description': 0, + 'node/no-callback-literal': 0 }, env: { 'jest/globals': true, @@ -40,12 +39,12 @@ module.exports = { }, overrides: [ { - files: ['**/*.tsx', '**/*.ts'], + files: ['**/*.tsx', '**/*.ts', '**/*.jsx'], parser: '@typescript-eslint/parser', extends: [ 'standard', 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended' ], plugins: ['@typescript-eslint'], rules: { @@ -56,7 +55,13 @@ module.exports = { '@typescript-eslint/no-empty-interface': 0, '@typescript-eslint/no-unused-vars': 0, '@typescript-eslint/no-non-null-assertion': 0, - camelcase: 0, + camelcase: 0 + } + }, { + files: ['packages/webpack-plugin/lib/runtime/components/react/**/*.{js,jsx,ts,tsx}'], + plugins: ['react-hooks'], + rules: { + 'react-hooks/rules-of-hooks': 'error' } } ] diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 574ad5b622..00ec6a133c 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -8,12 +8,12 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - uses: technote-space/get-diff-action@v4 with: PATTERNS: | - +(docs|docs-vuepress)/**/* - +(docs|docs-vuepress)/.*/**/* + +(docs|docs-vitepress)/**/* + +(docs|docs-vitepress)/.*/**/* # vuepress生成最终文档 - name: generate docs file if: env.GIT_DIFF @@ -30,6 +30,6 @@ jobs: username: ${{ secrets.DOCS_SERVER_USER }} key: ${{ secrets.DOCS_SERVER_KEY }} command_timeout: "20m" - source: "./docs-vuepress/.vuepress/dist/" + source: "./docs-vitepress/.vitepress/dist/" strip_components: 4 target: "${{ secrets.DOCS_SERVER_DIR }}" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 899278bbd3..f627cf9be5 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -11,12 +11,12 @@ jobs: # lint: # runs-on: ubuntu-latest # steps: -# - uses: actions/checkout@v2 +# - uses: actions/checkout@v4 # - run: npm run lint publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - run: | npm i echo "//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN}" >> $HOME/.npmrc 2> /dev/null diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 178205991f..ec2bbdae7c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,22 +6,22 @@ jobs: tsc: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - run: npm i && npm run tsc:build lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - run: npm i && npm run lint unit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Cache node modules id: cache - uses: actions/cache@v2 + uses: actions/cache@v4 env: cache-name: cache-node-modules with: diff --git a/.gitignore b/.gitignore index 684ff00936..4680643a94 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ package-lock.json pnpm-lock.yaml yarn.lock .DS_Store -docs-vuepress/.vuepress/dist elevate/ -packages/webpack-plugin/lib/runtime/components/react/dist/ \ No newline at end of file +docs-vitepress/.vitepress/dist +docs-vitepress/.vitepress/cache +dev-dist +packages/webpack-plugin/lib/runtime/components/react/dist/ diff --git a/docs-vitepress/.vitepress/config.ts b/docs-vitepress/.vitepress/config.ts new file mode 100644 index 0000000000..82150b4b40 --- /dev/null +++ b/docs-vitepress/.vitepress/config.ts @@ -0,0 +1,398 @@ +import { defineConfig, Plugin } from "vitepress" +import { + groupIconMdPlugin, + groupIconVitePlugin, + localIconLoader, +} from "vitepress-plugin-group-icons" +import llmstxt from "vitepress-plugin-llms" +import { withPwa } from "@vite-pwa/vitepress" +import { transformerTwoslash } from "@shikijs/vitepress-twoslash" +import { localSearchTranslations } from "./theme/translations" + +const sidebar = { + "/guide/": [ + { + text: "基础", + collapsable: false, + items: [ + { text: "快速开始", link: "/guide/basic/start" }, + { text: "介绍", link: "/guide/basic/intro" }, + { text: "单文件开发", link: "/guide/basic/single-file" }, + { text: "IDE 高亮配置", link: "/guide/basic/ide" }, + { text: "模板语法", link: "/guide/basic/template" }, + { text: "CSS 处理", link: "/guide/basic/css" }, + { text: "数据响应", link: "/guide/basic/reactive" }, + { + text: "类名样式绑定", + link: "/guide/basic/class-style-binding", + }, + { text: "条件渲染", link: "/guide/basic/conditional-render" }, + { text: "列表渲染", link: "/guide/basic/list-render" }, + { text: "事件处理", link: "/guide/basic/event" }, + { text: "双向绑定", link: "/guide/basic/two-way-binding" }, + { text: "自定义组件", link: "/guide/basic/component" }, + { text: "获取组件实例/节点信息", link: "/guide/basic/refs" }, + { + text: "模版内可选链表达式", + link: "/guide/basic/option-chain", + }, + ], + }, + { + text: "进阶", + collapsable: false, + items: [ + { text: "状态管理(store)", link: "/guide/advance/store" }, + { text: "状态管理(pinia)", link: "/guide/advance/pinia" }, + { text: "使用 mixin", link: "/guide/advance/mixin" }, + { text: "使用 npm", link: "/guide/advance/npm" }, + { text: "使用分包", link: "/guide/advance/subpackage" }, + { text: "分包异步化", link: "/guide/advance/async-subpackage" }, + { text: "跨平台", link: "/guide/advance/platform" }, + { text: "国际化 i18n", link: "/guide/advance/i18n" }, + { text: "包体积分析", link: "/guide/advance/size-report" }, + { text: "图像资源处理", link: "/guide/advance/image-process" }, + { text: "原生渐进迁移", link: "/guide/advance/progressive" }, + { + text: "原生能力兼容", + link: "/guide/advance/ability-compatible", + }, + { text: "小程序插件", link: "/guide/advance/plugin" }, + { + text: "自定义路径", + link: "/guide/advance/custom-output-path", + }, + { + text: "使用原子类", + link: "/guide/advance/utility-first-css", + }, + { text: "SSR", link: "/guide/advance/ssr" }, + { + text: "依赖注入(Provide/Inject)", + link: "/guide/advance/provide-inject", + }, + { text: "编译配置", link: "/guide/advance/build-config" }, + ], + }, + { + text: "跨端", + collapsable: false, + items: [ + { text: "跨端输出基础", link: "/guide/platform/basic" }, + { text: "跨端输出 RN", link: "/guide/platform/rn" }, + ], + }, + { + text: "组合式 API", + collapsable: false, + items: [ + { + text: "组合式 API", + link: "/guide/composition-api/composition-api", + }, + { + text: "响应式 API", + link: "/guide/composition-api/reactive-api", + }, + ], + }, + { + text: "工具", + collapsable: false, + items: [ + { text: "使用TypeScript开发小程序", link: "/guide/tool/ts" }, + { text: "单元测试", link: "/guide/tool/unit-test" }, + { text: "E2E自动化测试", link: "/guide/tool/e2e-test" }, + ], + }, + { + text: "拓展", + collapsable: false, + items: [ + { text: "网络请求", link: "/guide/extend/fetch" }, + { text: "API 转换", link: "/guide/extend/api-proxy" }, + { text: "数据 Mock", link: "/guide/extend/mock" }, + ], + }, + { + text: "理解", + collapsable: false, + items: [ + { + text: "Mpx运行时增强原理", + link: "/guide/understand/runtime", + }, + { text: "Mpx编译构建原理", link: "/guide/understand/compile" }, + ], + }, + { + text: "迁移", + collapsable: false, + items: [ + { text: "从 2.8 升级至 2.9", link: "/guide/migrate/2.9" }, + { text: "从 2.7 升级至 2.8", link: "/guide/migrate/2.8" }, + { text: "从旧版本迁移至 2.7", link: "/guide/migrate/2.7" }, + { + text: "mpx-cli v2 迁移到 v3", + link: "/guide/migrate/mpx-cli-3", + }, + ], + }, + ], + "/api/": [ + { + text: "API", + collapsable: false, + items: [ + { text: "API 参考", link: "/api/" }, + { text: "全局配置", link: "/api/app-config" }, + { text: "全局 API", link: "/api/global-api" }, + { text: "实例 API", link: "/api/instance-api" }, + { text: "Store API", link: "/api/store-api" }, + { text: "模板指令", link: "/api/directives" }, + { text: "编译构建", link: "/api/compile" }, + { text: "内建组件", link: "/api/builtIn" }, + { text: "响应式 API", link: "/api/reactivity-api" }, + { text: "组合式 API", link: "/api/composition-api" }, + { text: "选项式 API", link: "/api/optional-api" }, + { text: "周边拓展", link: "/api/extend" }, + ], + }, + ], + "/articles/": [ + { + text: "文章", + collapsable: false, + items: [ + { text: "滴滴开源小程序框架Mpx", link: "/articles/1.0" }, + { + text: "Mpx 发布2.0,完美支持跨平台开发", + link: "/articles/2.0", + }, + { + text: "小程序框架运行时性能大测评", + link: "/articles/performance", + }, + { + text: "小程序开发者,为什么你应该尝试下MPX", + link: "/articles/mpx1", + }, + { text: "Mpx 小程序框架技术揭秘", link: "/articles/mpx2" }, + { + text: "滴滴出行小程序体积优化实践", + link: "/articles/size-control", + }, + { + text: "使用Typescript新特性Template Literal Types完善链式key的类型推导", + link: "/articles/ts-derivation", + }, + { + text: "Mpx2.7 版本正式发布,大幅提升编译构建速度", + link: "/articles/2.7-release", + }, + { + text: "Mpx2.8 版本正式发布,使用组合式 API 开发小程序", + link: "/articles/2.8-release", + }, + { + text: "Mpx2.9 版本正式发布,支持原子类、SSR 和包体积优化", + link: "/articles/2.9-release", + }, + { + text: "小程序跨端组件库 Mpx-cube-ui 开源啦", + link: "/articles/mpx-cube-ui", + }, + { + text: "@mpxjs/cli 插件化改造", + link: "/articles/mpx-cli-next", + }, + { + text: "Mpx 小程序单元测试能力建设与实践", + link: "/articles/unit-test", + }, + ], + }, + ], +} + +const ogUrl = "https://mpxjs.cn/" +const ogImage = `${ogUrl}logo.png` +const title = "Mpx 框架" +const description = "深度性能优化的增强型小程序开发框架" + +export default withPwa( + defineConfig({ + base: "/", + head: [ + ["link", { rel: "icon", href: "/favicon.ico" }], + ["link", { rel: "manifest", href: "/manifest.webmanifest" }], + [ + "script", + { type: "text/javascript" }, + `(function(c,l,a,r,i,t,y){ + c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; + t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; + y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); + })(window, document, "clarity", "script", "jtvvy52wxy");`, + ], + ["meta", { name: "author", content: title }], + ["meta", { property: "og:type", content: "website" }], + ["meta", { name: "og:title", content: title }], + ["meta", { name: "og:description", content: description }], + ["meta", { property: "og:image", content: ogImage }], + ["meta", { property: "og:url", content: ogUrl }], + ], + title, + locales: { + // 如果有其他语言,也可以在这里添加 + // '/zh/': { + // prev: '上一页', + // }, + "/": { + label: "中文", + lang: "zh-CN", // 将会被设置为 的 lang 属性 + title, + description, + }, + }, + ignoreDeadLinks: true, + markdown: { + theme: { + light: "github-light", + dark: "github-dark", + }, + // @ts-ignore + codeTransformers: [transformerTwoslash()], + config(md) { + md.use(groupIconMdPlugin) + }, + }, + pwa: { + base: "/", + scope: "/", + registerType: "prompt", + includeAssets: ["favicon.ico", "logo.png"], + manifest: { + name: "Mpx", + short_name: "Mpx", + description, + theme_color: "#ffffff", + icons: [ + { + src: "https://dpubstatic.udache.com/static/dpubimg/1ESVodfAED/logo.png", + sizes: "192x192", + type: "image/png", + }, + ], + }, + workbox: { + globPatterns: ["**/*.{css,js,html,svg,png,ico,txt,woff2}"], + sourcemap: true, + navigateFallbackDenylist: [/^\/mpx-cube-ui/], + }, + devOptions: { + enabled: false, + suppressWarnings: true, + navigateFallback: "/", + }, + }, + themeConfig: { + // navbar: false, + search: { + provider: "local", + options: { + // // apiKey: '7849f511f78afc4383a81f0137a91c0f', + // appId: "DZ8S6HN0MP", + // apiKey: "a34809e24ae1eb13ca3afc255d0a0cef", + // indexName: "mpxjs", + // placeholder: "搜索文档", + translations: localSearchTranslations, + }, + }, + logo: "/favicon.ico", + socialLinks: [ + { icon: "github", link: "https://github.com/didi/mpx" }, + ], + nav: [ + { + text: "指南", + activeMatch: "^/guide/", + link: "/guide/basic/start", + }, + // 未来热门的链接可以用下面的折叠标题 + // { + // text: "文档", + // activeMatch: "^/guide/(basic/start|platform/basic)/", + // items: [ + // { text: "快速开始", link: "/guide/basic/start" }, + // { text: "跨端输出", link: "/guide/platform/basic" }, + // ], + // }, + { text: "API", activeMatch: "^/api/", link: "/api/" }, + { + text: "文章", + activeMatch: "^/articles/", + link: "/articles/", + }, + { + text: "更新记录", + activeMatch: "^/releases/", + link: "https://github.com/didi/mpx/releases", + target: "_blank", + }, + ], + outline: { + level: [2, 3], + label: "本页目录", + }, + sidebar, + darkModeSwitchLabel: "外观", + sidebarMenuLabel: "菜单", + returnToTopLabel: "返回顶部", + langMenuLabel: "语言", + notFound: { + title: "页面未找到", + linkText: "返回首页", + quote: "😩 抱歉,迷路了~", + }, + lastUpdated: { + text: "最后更新于", + formatOptions: { + dateStyle: "short", + timeStyle: "short", + }, + }, + docFooter: { + prev: "上一页", + next: "下一页", + }, + }, + vite: { + logLevel: "info", + plugins: [ + llmstxt({ + customTemplateVariables: { + title, + description, + }, + ignoreFiles: ["index.md", "api/index.md"], + }) as Plugin, + groupIconVitePlugin({ + customIcon: { + ios: "logos:apple", + android: "logos:android-icon", + harmony: localIconLoader( + import.meta.url, + "../assets/images/harmonyOS.svg" + ), + }, + }) as Plugin, + ], + }, + // @ts-ignore + chainWebpack: (config) => { + // 添加node_modules避免resolve错误 + config.resolve.modules.add("node_modules") + }, + }) +) diff --git a/docs-vitepress/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/docs-vitepress/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b6b603d596933f026dfecf98550bbe4d0876276b GIT binary patch literal 43112 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 literal 0 HcmV?d00001 diff --git a/docs-vitepress/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/docs-vitepress/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..def40a4f658cf8a9f7029c98931f5c9ff5a00910 GIT binary patch literal 31300 zcmV(?K-a%_Pew8T0RR910D43K6951J0MIl50C~{>1ONa400000000000000000000 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 literal 0 HcmV?d00001 diff --git a/docs-vitepress/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/docs-vitepress/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a3c16ca40b2a8f454c34cfa91996ec99ae2e4aa0 GIT binary patch literal 32564 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 b6r&82^QQ+ZZ1?Zre-i}g|91_a`#}W>14e7b literal 0 HcmV?d00001 diff --git a/docs-vitepress/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/docs-vitepress/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2210a899edaeb06655f7bc50e7f94444da140b94 GIT binary patch literal 120840 zcmV)DK*7IvPew8T0RR910oVut6951J1HHHa0oRcL1ONa400000000000000000000 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̍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�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

l(X_I+GK&R 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 H00000K--!s literal 0 HcmV?d00001 diff --git a/docs-vitepress/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/docs-vitepress/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..36d67487dcf5fbe3dc6d0a6b01cf4d29dc997765 GIT binary patch literal 16272 zcmV;BKX1TyPew8T0RR9106&lb6951J0Hgo_06!c61ONa400000000000000000000 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 G0RR9|PM1{x literal 0 HcmV?d00001 diff --git a/docs-vitepress/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 b/docs-vitepress/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2bed1e85e8b20cb3903206a6cace251c52bdd8c3 GIT binary patch literal 29920 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 literal 0 HcmV?d00001 diff --git a/docs-vitepress/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/docs-vitepress/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9a8d1e2b5ef22b97801781478d477685dd6119f3 GIT binary patch literal 110160 zcmV)XK&`)bPew8T0RR910j^L06951J1C_)80j=5q1ONa400000000000000000000 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 literal 0 HcmV?d00001 diff --git a/docs-vitepress/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 b/docs-vitepress/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..07d3c53aef14e7e3aec6b11684395f2833e0b3d5 GIT binary patch literal 67792 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 IZR%D40KZ@npa1{> literal 0 HcmV?d00001 diff --git a/docs-vitepress/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/docs-vitepress/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..57bdc22ae88555c6217307e4064a642f83d642b1 GIT binary patch literal 14072 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 literal 0 HcmV?d00001 diff --git a/docs-vuepress/assets/images/start-tips1.png b/docs-vitepress/.vitepress/dist/assets/start-tips1.B10pt_bp.png similarity index 100% rename from docs-vuepress/assets/images/start-tips1.png rename to docs-vitepress/.vitepress/dist/assets/start-tips1.B10pt_bp.png diff --git a/docs-vuepress/assets/images/start-tips2.png b/docs-vitepress/.vitepress/dist/assets/start-tips2.DL_IWEZM.png similarity index 100% rename from docs-vuepress/assets/images/start-tips2.png rename to docs-vitepress/.vitepress/dist/assets/start-tips2.DL_IWEZM.png diff --git a/docs-vuepress/.vuepress/theme/components/AlgoliaSearchBox.vue b/docs-vitepress/.vitepress/theme/components/AlgoliaSearchBox.vue similarity index 68% rename from docs-vuepress/.vuepress/theme/components/AlgoliaSearchBox.vue rename to docs-vitepress/.vitepress/theme/components/AlgoliaSearchBox.vue index f2a1cdd4b6..59f59b5d92 100644 --- a/docs-vuepress/.vuepress/theme/components/AlgoliaSearchBox.vue +++ b/docs-vitepress/.vitepress/theme/components/AlgoliaSearchBox.vue @@ -8,6 +8,8 @@ + + diff --git a/docs-vuepress/.vuepress/theme/components/MobileSwiper.vue b/docs-vitepress/.vitepress/theme/components/MobileSwiper.vue similarity index 95% rename from docs-vuepress/.vuepress/theme/components/MobileSwiper.vue rename to docs-vitepress/.vitepress/theme/components/MobileSwiper.vue index 3d7c7ac4b0..7ec8c9eb3b 100644 --- a/docs-vuepress/.vuepress/theme/components/MobileSwiper.vue +++ b/docs-vitepress/.vitepress/theme/components/MobileSwiper.vue @@ -1,6 +1,6 @@ @@ -127,6 +148,7 @@ export default { .header-menu { width: 100%; + height: 60px; display: flex; align-items: center; justify-content: space-between; @@ -160,6 +182,7 @@ export default { box-shadow rgb(240 241 242) 0px 2px 8px padding: 0.5rem 3rem; // justify-content center + box-sizing: content-box; } .nav-link { @@ -168,6 +191,7 @@ export default { align-items: center; width: 100%; justify-content: space-between; + font-weight: 500; } a.router-link-active { @@ -235,7 +259,7 @@ a.router-link-active { height: 60px; line-height: 60px; padding: 0 16px; - display: flex + display: flex; align-items: center; justify-content: space-between; box-sizing: border-box; diff --git a/docs-vuepress/.vuepress/theme/components/Popover.vue b/docs-vitepress/.vitepress/theme/components/Popover.vue similarity index 100% rename from docs-vuepress/.vuepress/theme/components/Popover.vue rename to docs-vitepress/.vitepress/theme/components/Popover.vue diff --git a/docs-vitepress/.vitepress/theme/components/RegisterSW.vue b/docs-vitepress/.vitepress/theme/components/RegisterSW.vue new file mode 100644 index 0000000000..4224b8b0eb --- /dev/null +++ b/docs-vitepress/.vitepress/theme/components/RegisterSW.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/docs-vuepress/.vuepress/theme/components/SlideItem.vue b/docs-vitepress/.vitepress/theme/components/SlideItem.vue similarity index 100% rename from docs-vuepress/.vuepress/theme/components/SlideItem.vue rename to docs-vitepress/.vitepress/theme/components/SlideItem.vue diff --git a/docs-vuepress/.vuepress/theme/components/Swiper.vue b/docs-vitepress/.vitepress/theme/components/Swiper.vue similarity index 94% rename from docs-vuepress/.vuepress/theme/components/Swiper.vue rename to docs-vitepress/.vitepress/theme/components/Swiper.vue index a48e1347ce..039d949865 100644 --- a/docs-vuepress/.vuepress/theme/components/Swiper.vue +++ b/docs-vitepress/.vitepress/theme/components/Swiper.vue @@ -1,7 +1,7 @@ @@ -156,6 +156,7 @@ export default { transform filter 0.3s .swiper-img cursor pointer + display inline-block .swiper-disable cursor not-allowed filter grayscale(100%) diff --git a/docs-vuepress/.vuepress/theme/components/SwiperImg.vue b/docs-vitepress/.vitepress/theme/components/SwiperImg.vue similarity index 90% rename from docs-vuepress/.vuepress/theme/components/SwiperImg.vue rename to docs-vitepress/.vitepress/theme/components/SwiperImg.vue index c2409843d3..319a44930d 100644 --- a/docs-vuepress/.vuepress/theme/components/SwiperImg.vue +++ b/docs-vitepress/.vitepress/theme/components/SwiperImg.vue @@ -2,7 +2,7 @@
- img + img
diff --git a/docs-vuepress/.vuepress/theme/global-components/Content.vue b/docs-vitepress/.vitepress/theme/global-components/Content.vue similarity index 82% rename from docs-vuepress/.vuepress/theme/global-components/Content.vue rename to docs-vitepress/.vitepress/theme/global-components/Content.vue index f204c5a218..98c3d6e316 100644 --- a/docs-vuepress/.vuepress/theme/global-components/Content.vue +++ b/docs-vitepress/.vitepress/theme/global-components/Content.vue @@ -7,18 +7,18 @@
@@ -29,8 +29,8 @@
    -
  • - svg +
  • + svg

    {{item.title}}

    {{item.details}}

    @@ -39,26 +39,26 @@
-
+
phone + width="410" + style="height: 712px;max-width: none;" + src="https://dpubstatic.udache.com/static/dpubimg/Vx5n_3YCtP/anli_pic_phone.png" + alt="phone" + loading="lazy" />
@@ -66,19 +66,19 @@
-

{{$page.frontmatter.threeSection.title}}

-

- - 扫码体验Mpx版本的 +

{{$frontmatter.threeSection.title}}

+

+ + 扫码体验 Mpx 版本的 todoMVC - 在各个小程序平台和web中的一致表现 ,更多示例项目可点击 + 在各个小程序平台和 web 中的一致表现 ,更多示例项目可点击 这里 进入查看。

@@ -88,13 +88,13 @@
-
+
svg
@@ -102,14 +102,14 @@
-

{{$page.frontmatter.fourSection.title}}

+

{{$frontmatter.fourSection && $frontmatter.fourSection.title}}

- {{$page.frontmatter.fourSection.details}} + {{$frontmatter.fourSection.details}}

@@ -119,21 +119,21 @@
-
+
-

{{$page.frontmatter.fiveSection.title}}

+

{{$frontmatter.fiveSection.title}}

- {{$page.frontmatter.fiveSection.details}} + {{$frontmatter.fiveSection.details}}

@@ -141,7 +141,7 @@
svg
@@ -150,17 +150,17 @@
-
+
-

{{$page.frontmatter.sixSection.title}}

+

{{$frontmatter.sixSection.title}}

  • - svg + svg
    {{item.title}}
    @@ -175,7 +175,7 @@
    -

    {{$page.frontmatter.sevenSection.title}}

    +

    {{$frontmatter.sevenSection.title}}

    @@ -184,11 +184,11 @@

    -
    +
    phone @@ -218,7 +218,7 @@ export default { computed: { list () { let result = [] - let details = this.$page.frontmatter.sixSection.details + let details = this.$frontmatter.sixSection.details let current = [] let i = 0 while (i < details.length) { @@ -231,13 +231,11 @@ export default { } return result }, - dataList () { - const list = this.$page.frontmatter.sevenSection.details - return list - }, mvcList () { - const list = this.$page.frontmatter.threeSection.list - return list + return this.$frontmatter.threeSection.list + }, + dataList () { + return this.$frontmatter.sevenSection.details }, currentTitle () { return this.dataList[this.currentIndex].title @@ -272,12 +270,14 @@ section .title font-size 30px + margin-top 40px margin-bottom 20px font-weight 500 .desc font-size 14px line-height 22px + margin-top 30px margin-bottom 40px .btn @@ -323,6 +323,7 @@ section flex 1 .one-section__title + margin-top 30px margin-bottom 20px font-size 40px font-weight 500 @@ -332,6 +333,7 @@ section width 450px line-height 30px margin-bottom 70px + padding-top 20px .one-section__btn width 162px diff --git a/docs-vuepress/.vuepress/theme/global-components/Footer.vue b/docs-vitepress/.vitepress/theme/global-components/Footer.vue similarity index 77% rename from docs-vuepress/.vuepress/theme/global-components/Footer.vue rename to docs-vitepress/.vitepress/theme/global-components/Footer.vue index e96e4cca1a..6d157f2f2f 100644 --- a/docs-vuepress/.vuepress/theme/global-components/Footer.vue +++ b/docs-vitepress/.vitepress/theme/global-components/Footer.vue @@ -12,9 +12,9 @@
  • @@ -22,9 +22,9 @@
  • @@ -150,7 +150,8 @@ ul li @media (max-width: 750px) { .footer__list { - margin-bottom 16px + margin 16px 0 + padding-left 16px } .footer__text { @@ -167,7 +168,7 @@ ul li } .footer-container { - background #606D7C + background #606D7C height auto margin-top 0 } diff --git a/docs-vuepress/.vuepress/theme/global-components/Header.vue b/docs-vitepress/.vitepress/theme/global-components/Header.vue similarity index 100% rename from docs-vuepress/.vuepress/theme/global-components/Header.vue rename to docs-vitepress/.vitepress/theme/global-components/Header.vue diff --git a/docs-vitepress/.vitepress/theme/index.js b/docs-vitepress/.vitepress/theme/index.js new file mode 100644 index 0000000000..06fcb62ce6 --- /dev/null +++ b/docs-vitepress/.vitepress/theme/index.js @@ -0,0 +1,19 @@ +import { h } from "vue" +import DefaultTheme from "vitepress/theme" +import TwoslashFloatingVue from "@shikijs/vitepress-twoslash/client" +import HomepageLayout from "./layouts/HomepageLayout.vue" + +import '@shikijs/vitepress-twoslash/style.css' +import "virtual:group-icons.css" +import "./styles/index.css" +import "./styles/switchAppearance.css" + +export default { + ...DefaultTheme, + Layout() { + return h(HomepageLayout) + }, + enhanceApp({ app }) { + app.use(TwoslashFloatingVue) + }, +} diff --git a/docs-vuepress/.vuepress/theme/layouts/GlobalLayout.vue b/docs-vitepress/.vitepress/theme/layouts/GlobalLayout.vue similarity index 100% rename from docs-vuepress/.vuepress/theme/layouts/GlobalLayout.vue rename to docs-vitepress/.vitepress/theme/layouts/GlobalLayout.vue diff --git a/docs-vitepress/.vitepress/theme/layouts/HomepageLayout.vue b/docs-vitepress/.vitepress/theme/layouts/HomepageLayout.vue new file mode 100644 index 0000000000..3f1177fe32 --- /dev/null +++ b/docs-vitepress/.vitepress/theme/layouts/HomepageLayout.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/docs-vuepress/.vuepress/theme/layouts/Layout.vue b/docs-vitepress/.vitepress/theme/layouts/Layout.vue similarity index 88% rename from docs-vuepress/.vuepress/theme/layouts/Layout.vue rename to docs-vitepress/.vitepress/theme/layouts/Layout.vue index a8fa6ef843..b6f7cc3e9f 100644 --- a/docs-vuepress/.vuepress/theme/layouts/Layout.vue +++ b/docs-vitepress/.vitepress/theme/layouts/Layout.vue @@ -1,6 +1,6 @@ @@ -21,4 +21,4 @@ export default { height: 200px; background: red; } - \ No newline at end of file + diff --git a/docs-vitepress/.vitepress/theme/styles/index.css b/docs-vitepress/.vitepress/theme/styles/index.css new file mode 100644 index 0000000000..ac0839a944 --- /dev/null +++ b/docs-vitepress/.vitepress/theme/styles/index.css @@ -0,0 +1,159 @@ +:root { + --vt-c-green: #42b883; + --vt-c-text-code: #476582; + --vt-c-green-light: #42d392; + --vt-c-green-lighter: #35eb9a; + --vt-c-green-dark: #33a06f; + --vt-c-green-darker: #155f3e; + --vt-c-text-2: rgba(60, 60, 60, 0.7); + --vt-c-text-3: rgba(60, 60, 60, 0.33); + --vt-c-divider: rgba(60, 60, 60, 0.29); + --vt-c-divider-light: rgba(60, 60, 60, 0.12); + --vt-c-brand-highlight: var(--vt-c-brand-dark); + --vt-c-brand: var(--vt-c-green); + --vt-c-brand-light: var(--vt-c-green-light); + --vt-c-brand-dark: var(--vt-c-green-dark); + --vp-c-brand-1: var(--vt-c-brand); +} + +.dark { + --vt-c-text-code: #aac8e4; + --vt-c-text-2: rgba(235, 235, 235, 0.6); + --vt-c-text-3: rgba(235, 235, 235, 0.38); + --vt-c-divider: rgba(84, 84, 84, 0.65); + --vt-c-divider-light: rgba(84, 84, 84, 0.48); + --vt-c-brand-highlight: var(--vt-c-brand-light); +} + +.vp-doc { + a { + text-decoration: none; + color: var(--vt-c-brand); + } + a:hover { + color: var(--vt-c-brand-highlight); + } +} + +.VPNavBarAppearance { + .VPSwitch:hover { + border: 1px solid var(--vt-c-brand) !important; + } +} + +.VPNavBarMenuLink:hover { + color: var(--vt-c-brand-highlight) !important; +} + +.VPNavBarMenuLink.active { + color: var(--vt-c-brand) !important; + border-bottom: 1px solid var(--vt-c-brand); +} + +.VPLocalNavOutlineDropdown { + .top-link { + color: var(--vt-c-brand) !important; + } +} + +.VPSidebarItem.is-link { + .item .link { + .text { + color: var(--vt-c-text-2); + font-weight: 500; + } + } + .item .link:hover { + .text { + color: var(--vt-c-text-1) !important; + } + } +} + +.VPSidebarItem.is-link.is-active { + .item .link .text { + color: var(--vt-c-brand) !important; + font-weight: 600; + } +} + +.VPDocAside { + .outline-marker { + height: 20px; + background-color: var(--vt-c-brand); + } +} + +.VPContent { + .link { + border: 1px solid var(--vt-c-brand); + color: var(--vt-c-brand); + } + .link:hover { + border: 1px solid var(--vt-c-brand); + color: var(--vt-c-brand-highlight); + } +} + +/* Algolia Search */ +.DocSearch-Button { + background-color: transparent; +} + +.DocSearch-Button:hover { + background-color: transparent; + border-color: var(--vt-c-brand-highlight); +} + +.DocSearch-Modal { + .DocSearch-Form { + border: 1px solid var(--vt-c-brand); + + .DocSearch-MagnifierLabel { + color: var(--vt-c-brand); + } + } + + .DocSearch-Hit-source { + color: var(--vt-c-brand); + } + + .DocSearch-Hit[aria-selected="true"] { + a { + background-color: var(--vt-c-brand); + } + + .DocSearch-Hit-title { + color: #fff; + } + } + + .DocSearch-Hits mark { + color: var(--vt-c-brand); + } + + .DocSearch-Prefill { + color: var(--vt-c-brand); + } + + .DocSearch-Cancel { + color: var(--vt-c-brand); + } +} + +/* Local Search */ +.VPLocalSearchBox { + z-index: 120 !important; +} + +.pager-link.title { + color: var(--vt-c-brand) !important; +} + +.pager-link:hover { + border: 1px solid var(--vt-c-brand) !important; + + .title { + color: var(--vt-c-brand-highlight) !important; + } +} diff --git a/docs-vitepress/.vitepress/theme/styles/switchAppearance.css b/docs-vitepress/.vitepress/theme/styles/switchAppearance.css new file mode 100644 index 0000000000..cc0b383936 --- /dev/null +++ b/docs-vitepress/.vitepress/theme/styles/switchAppearance.css @@ -0,0 +1,16 @@ +/* dark/light radial transition */ +::view-transition-old(root), +::view-transition-new(root) { + animation: none; + mix-blend-mode: normal; +} + +::view-transition-old(root), +.dark::view-transition-new(root) { + z-index: 1; +} + +::view-transition-new(root), +.dark::view-transition-old(root) { + z-index: 9999; +} diff --git a/docs-vitepress/.vitepress/theme/translations.ts b/docs-vitepress/.vitepress/theme/translations.ts new file mode 100644 index 0000000000..2dc0e5e25b --- /dev/null +++ b/docs-vitepress/.vitepress/theme/translations.ts @@ -0,0 +1,59 @@ +export const algoliaTranslations = { + button: { + buttonText: "搜索", + }, + modal: { + searchBox: { + resetButtonTitle: "清除查询条件", + resetButtonAriaLabel: "清除查询条件", + cancelButtonText: "取消", + cancelButtonAriaLabel: "取消", + }, + startScreen: { + recentSearchesTitle: "搜索历史", + noRecentSearchesText: "没有搜索历史", + saveRecentSearchButtonTitle: "保存到搜索历史", + removeRecentSearchButtonTitle: "从搜索历史中移除", + favoriteSearchesTitle: "收藏", + removeFavoriteSearchButtonTitle: "从收藏中移除", + }, + errorScreen: { + titleText: "无法获取结果", + helpText: "你可能需要检查你的网络连接", + }, + footer: { + selectText: "选择", + navigateText: "切换", + closeText: "关闭", + searchByText: "搜索供应商", + }, + noResultsScreen: { + noResultsText: "无法找到相关结果", + suggestedQueryText: "你可以尝试查询", + reportMissingResultsText: "你认为这个查询应该有结果?", + reportMissingResultsLinkText: "向我们反馈", + }, + }, +} + +export const localSearchTranslations = { + button: { + buttonText: "搜索文档", + buttonAriaLabel: "搜索文档", + }, + modal: { + displayDetails: "显示详细列表", + resetButtonTitle: "重置搜索", + backButtonTitle: "关闭搜索", + noResultsText: "没有结果", + footer: { + selectText: "选择", + selectKeyAriaLabel: "输入", + navigateText: "导航", + navigateUpKeyAriaLabel: "上箭头", + navigateDownKeyAriaLabel: "下箭头", + closeText: "关闭", + closeKeyAriaLabel: "esc", + }, + }, +} diff --git a/docs-vuepress/.vuepress/theme/vuepress-format-header-slug-plugin.js b/docs-vitepress/.vitepress/theme/vuepress-format-header-slug-plugin.js similarity index 79% rename from docs-vuepress/.vuepress/theme/vuepress-format-header-slug-plugin.js rename to docs-vitepress/.vitepress/theme/vuepress-format-header-slug-plugin.js index 00794ef428..ed34cc1540 100644 --- a/docs-vuepress/.vuepress/theme/vuepress-format-header-slug-plugin.js +++ b/docs-vitepress/.vitepress/theme/vuepress-format-header-slug-plugin.js @@ -1,5 +1,6 @@ -const {deeplyParseHeader, slugify$1} = require('../headerMdPlugin') -module.exports = (options, ctx) => ({ +import { deeplyParseHeader, slugify$1 } from '../headerMdPlugin' + +export default (options, ctx) => ({ async ready () { const { pages } = ctx pages.forEach(page => { diff --git a/docs-vuepress/api/ApiIndex.vue b/docs-vitepress/api/ApiIndex.vue similarity index 96% rename from docs-vuepress/api/ApiIndex.vue rename to docs-vitepress/api/ApiIndex.vue index 5293ff8487..dd1607b42e 100644 --- a/docs-vuepress/api/ApiIndex.vue +++ b/docs-vitepress/api/ApiIndex.vue @@ -422,6 +422,14 @@ const data = [ { text: 'useFetch', anchor: '#useFetch' + }, + { + text: 'provide', + anchor: '#provide' + }, + { + text: 'inject', + anchor: '#inject' } ] } @@ -936,7 +944,7 @@ export default { @@ -975,49 +983,18 @@ export default { max-width: 1024px; margin: 0px auto; padding: 64px 32px; -} -a{ - text-decoration: none; -} - -h1, -h2, -h3 { - font-weight: 600; - line-height: 1; -} - -h1, -h2 { - letter-spacing: -0.02em; -} - -h1 { - font-size: 38px; -} -ul { - list-style: none; - margin: 0; - padding: 0; -} - -h2 { - font-size: 24px; - color: var(--vt-c-text-1); - margin: 36px 0; - transition: color 0.5s; - padding-top: 36px; - border-top: 1px solid var(--vt-c-divider-light); - border-bottom: none; -} + ul { + list-style: none !important; + padding: 0 !important; + } -h3 { - letter-spacing: -0.01em; - color: var(--vt-c-green); - font-size: 18px; - margin-bottom: 1em; - transition: color 0.5s; + h3 { + color: var(--vt-c-brand) !important; + font-size: 18px !important; + margin-top: 0 !important; + transition: color 0.5s !important; + } } .api-section { @@ -1028,16 +1005,13 @@ h3 { font-size: 15px; font-weight: 500; line-height: 2; - color: var(--vt-c-text-code); + color: var(--vt-c-text-code) !important; transition: color 0.5s; -} - -.dark api-groups a { - font-weight: 400; + text-decoration: none; } .api-groups a:hover { - color: var(--vt-c-green); + color: var(--vt-c-brand) !important; transition: none; } @@ -1045,9 +1019,9 @@ h3 { break-inside: avoid; overflow: auto; margin-bottom: 20px; - background-color: var(--vt-c-bg-soft); + background-color: var(--vp-c-bg-soft); border-radius: 8px; - padding: 28px 26px; + padding: 24px 18px; transition: background-color 0.5s; } @@ -1065,13 +1039,13 @@ h3 { } .api-filter input { - border: 1px solid var(--vt-c-divider); - border-radius: 8px; - padding: 6px 12px; + border: 1px solid var(--vt-c-divider) !important; + border-radius: 8px !important; + padding: 6px 12px !important; } -.api-filter:focus { - border-color: var(--vt-c-green-light); +#api-filter:focus { + box-shadow: 0 0 4pt #00d47499 !important; } .no-match { diff --git a/docs-vuepress/api/app-config.md b/docs-vitepress/api/app-config.md similarity index 96% rename from docs-vuepress/api/app-config.md rename to docs-vitepress/api/app-config.md index f13a35d79a..b8de1c993a 100644 --- a/docs-vuepress/api/app-config.md +++ b/docs-vitepress/api/app-config.md @@ -91,8 +91,9 @@ mpx.config.ignoreConflictWhiteList = ['id', 'test'] ```js import mpx from '@mpxjs/core' -mpx.config.proxyEventHandler = function (event) { - // 入参为 event 事件对象 +mpx.config.proxyEventHandler = function (event, componentIns) { + // 首个入参为 event 事件对象 + // 其次入参为 触发事件的组件实例 } ``` @@ -167,4 +168,4 @@ mpx.config.webConfig.routeConfig = { } // 禁用页面切换动画 mpx.config.webConfig.disablePageTransition = true -``` \ No newline at end of file +``` diff --git a/docs-vuepress/api/builtIn.md b/docs-vitepress/api/builtIn.md similarity index 100% rename from docs-vuepress/api/builtIn.md rename to docs-vitepress/api/builtIn.md diff --git a/docs-vuepress/api/compile.md b/docs-vitepress/api/compile.md similarity index 97% rename from docs-vuepress/api/compile.md rename to docs-vitepress/api/compile.md index 201c4fada2..14c81ca306 100644 --- a/docs-vuepress/api/compile.md +++ b/docs-vitepress/api/compile.md @@ -52,12 +52,22 @@ interface Rules { Mpx 编译构建跨平台小程序和 web 的 webpack 主插件,安装示例如下: -```bash +::: code-group + +```sh [npm] npm install -D @mpxjs/webpack-plugin -pnpm install -D @mpxjs/webpack-plugin +``` + +```sh [pnpm] +pnpm add -D @mpxjs/webpack-plugin +``` + +```sh [yarn] yarn add -D @mpxjs/webpack-plugin ``` +::: + 使用示例如下: ```javascript // vue.config.js @@ -284,7 +294,7 @@ module.exports = defineConfig({ mpx: { plugin: { forceProxyEventRules: { - include: ['bindtap'] + include: ['src/packages/index.mpx'] } } } @@ -455,7 +465,7 @@ module.exports = defineConfig({ **参考**:weui组件库 -### miniNpmPackage +### miniNpmPackages `Array` @@ -473,7 +483,29 @@ module.exports = defineConfig({ pluginOptions: { mpx: { plugin: { - miniNpmPackage: ['@vant/weapp'] + miniNpmPackages: ['@vant/weapp'] + } + } + } +}) +``` + +### normalNpmPackages +`Array` + +使用小程序原生 npm 包时,由于微信小程序 npm 包要求根目录下必须有构建文件生成目录,(默认为 miniprogram_dist 目录),此目录可以通过在 package.json 文件中新增一个 miniprogram 字段来指定。 + +因此大多小程序 npm 包 package.json 中都会存在 miniprogram 字段,Mpx 框架在构建时也会默认读取 miniprogram 拼接到资源路径和输出路径中。 + +但存在一种场景,例如使用 antd-mini 组件库时,使用纯支付宝场景下的包无需读取 miniprogram 字段进行拼接,但是对应 npm 包又存在 miniprogram 字段,这时需要通过该配置告诉框架不要去读,直接走默认路径。 + +```js +// vue.config.js +module.exports = defineConfig({ + pluginOptions: { + mpx: { + plugin: { + normalNpmPackages: ['antd-mini'] } } } diff --git a/docs-vuepress/api/composition-api.md b/docs-vitepress/api/composition-api.md similarity index 97% rename from docs-vuepress/api/composition-api.md rename to docs-vitepress/api/composition-api.md index d35d912e4e..0e70e301dd 100644 --- a/docs-vuepress/api/composition-api.md +++ b/docs-vitepress/api/composition-api.md @@ -214,3 +214,9 @@ getCurrentInstance 只能在 setup 或生命周期钩子中调用。 ## useFetch 点击[查看详情](./extend.md#usefetch) + +## provide +点击[查看详情](../guide/advance/provide-inject.md#组合式语法) + +## inject +点击[查看详情](../guide/advance/provide-inject.md#组合式语法-1) diff --git a/docs-vuepress/api/directives.md b/docs-vitepress/api/directives.md similarity index 91% rename from docs-vuepress/api/directives.md rename to docs-vitepress/api/directives.md index 1814839ef3..efe15ab5d0 100644 --- a/docs-vuepress/api/directives.md +++ b/docs-vitepress/api/directives.md @@ -91,7 +91,8 @@ Page({ ``` ``` js -Page({ +import { createComponent } from '@mpxjs/core' +createComponent({ data: { array: [{ id: 1, text: 'foo' @@ -126,7 +127,8 @@ Page({ ``` ``` js -Page({ +import { createComponent } from '@mpxjs/core' +createComponent({ data: { array: [{ id: 1, text: 'foo' @@ -549,7 +551,8 @@ Mpx提供了 `wx:ref=xxx` 来更方便获取 WXML 节点信息的对象。在JS ``` ```js -Page({ +import {createPage} from '@mpxjs/core' +createPage({ data: { show: false } @@ -679,22 +682,28 @@ capture-catch中断捕获阶段和取消冒泡阶段 ## @mode -`type mode = 'wx' | 'ali' | 'qq' | 'swan' | 'tt' | 'web' | 'qa'` +`type mode = 'wx' | 'ali' | 'qq' | 'swan' | 'tt' | 'web' | 'qa' | 'ios' | 'android' | 'harmony'` +### 属性中使用 跨平台输出场景下,Mpx 框架允许用户在组件上使用 @ 和 | 符号来指定某个节点或属性只在某些平台下有效。 ```html ``` -在上方示例中,开发者可以便捷的设置在支付宝小程序与微信和百度小程序等平台分别生效的 open-type 属性, -以及事件绑定或其他属性。假设当前 srcMode 为 wx,目标平台为 ali,则输出产物为: +例如在上述示例中: +* 在支付宝小程序与微信和百度小程序等平台分别生效的 open-type 等属性 +* 在输出iOS或android平台时,enable-background 属性生效 +* 以及事件绑定或其他属性灵活的进行条件编译 + +假设当前 srcMode 为 wx,目标平台为 ali,则输出产物为: ```html +``` + +### 节点中使用 +同时,该指令也可以作用在单个节点上,来对节点进行跨平台条件判断。 + +但需要注意的是,该指令作用在单个节点时,节点仅在目标平台输出,同时节点自身属性不会进行跨平台语法转换,不过其子节点不受影响。 + ```html @@ -715,10 +740,17 @@ capture-catch中断捕获阶段和取消冒泡阶段 text ``` +::: danger +另外在跨端输出 React Native 和 H5 时,不要在基础组件节点上使用 @mode 指令,仅可在自定义组件节点使用 @mode 指令 +::: +```html + +测试数据 +``` ## @_mode -`type _mode = '_wx' | '_ali' | '_qq' | '_swan' | '_tt' | '_web' | '_qa'` +`type _mode = '_wx' | '_ali' | '_qq' | '_swan' | '_tt' | '_web' | '_qa' | '_ios' | '_android' | '_harmony'` 有时开发者期望使用 @mode 这种方式仅控制节点的展示,保留节点属性的平台转换能力,为此 Mpx 实现了一个隐式属性条件编译能力。 ```html @@ -727,6 +759,8 @@ capture-catch中断捕获阶段和取消冒泡阶段 ``` 在对应的平台前加一个_,例如@_ali、@_swan、@_tt等,使用该隐式规则仅有条件编译能力,节点属性语法转换能力依旧。 +在跨端输出 React Native 和 H5 时,可以在节点上使用该属性。 + ## @env `string` diff --git a/docs-vuepress/api/extend.md b/docs-vitepress/api/extend.md similarity index 87% rename from docs-vuepress/api/extend.md rename to docs-vitepress/api/extend.md index 6eb54a6fd7..e805d4afc5 100644 --- a/docs-vuepress/api/extend.md +++ b/docs-vitepress/api/extend.md @@ -459,19 +459,60 @@ useFetch().fetch({ | ------------- |:-----:| :-----:| :-----: | :-----: | | getSystemInfo|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| | getSystemInfoSync|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| -| nextTick |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| -| showToast |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| -| hideToast |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| -| showModal |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| -| showLoading |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| -| hideLoading |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| -| showActionSheet |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| +| getDeviceInfo|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| getWindowInfo|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| getLaunchOptionsSync|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| getEnterOptionsSync|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| nextTick |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| showToast |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| hideToast |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| showModal |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| showLoading |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| hideLoading |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| showActionSheet |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| createAnimation |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| onAppShow |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| onAppHide |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| offAppShow |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| offAppHide |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| onError |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| offError |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| onUnhandledRejection |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| offUnhandledRejection |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| createInnerAudioContext |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| +| closeBLEConnection |:white_check_mark:|:white_check_mark:|:x:|:x:| +| createBLEConnection |:white_check_mark:|:white_check_mark:|:x:|:x:| +| onBLEConnectionStateChange |:white_check_mark:|:white_check_mark:|:x:|:x:| +| createIntersectionObserver |:white_check_mark:|:white_check_mark:|:x:|:x:| +| createSelectorQuery |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| getExtConfig |:white_check_mark:|:white_check_mark:|:x:|:x:| +| getExtConfigSync |:white_check_mark:|:white_check_mark:|:x:|:x:| +| onKeyboardHeightChange |:white_check_mark:|:x:|:x:|:white_check_mark:| +| offKeyboardHeightChange |:white_check_mark:|:x:|:x:|:white_check_mark:| +| hideKeyboard |:white_check_mark:|:white_check_mark:|:x:|:white_check_mark:| +| getLocation |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| openLocation |:white_check_mark:|:white_check_mark:|:x:|:x:| +| chooseLocation |:white_check_mark:|:white_check_mark:|:x:|:x:| +| pageScrollTo |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| +| stopPullDownRefresh |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| +| startPullDownRefresh |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| +| redirectTo |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| navigateTo |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| navigateBack |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| reLaunch |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| switchTab |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| +| setTabBarItem |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| +| setTabBarStyle |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| +| showTabBar |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| +| hideTabBar |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| +| vibrateShort |:white_check_mark:|:white_check_mark:|:x:|:white_check_mark:| +| vibrateLong |:white_check_mark:|:white_check_mark:|:x:|:white_check_mark:| | showNavigationBarLoading |:white_check_mark:|:white_check_mark:|:x:|:x:| | hideNavigationBarLoading |:white_check_mark:|:white_check_mark:|:x:|:x:| -| setNavigationBarTitle |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| -| setNavigationBarColor |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| +| setNavigationBarTitle |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| setNavigationBarColor |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| | request |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| -| downloadFile |:white_check_mark:|:white_check_mark:|:x:|:white_check_mark:|:x:| +| downloadFile |:white_check_mark:|:white_check_mark:|:x:|:x:| | uploadFile |:white_check_mark:|:white_check_mark:|:x:|:x:| | setStorage |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| | setStorageSync |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| @@ -487,14 +528,15 @@ useFetch().fetch({ | previewImage |:white_check_mark:|:white_check_mark:|:x:|:x:| | compressImage |:white_check_mark:|:white_check_mark:|:x:|:x:| | chooseImage |:white_check_mark:|:white_check_mark:|:x:|:x:| +| getImageInfo |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| | getLocation |:white_check_mark:|:white_check_mark:|:x:|:x:| | saveFile |:white_check_mark:|:white_check_mark:|:x:|:x:| | removeSavedFile |:white_check_mark:|:white_check_mark:|:x:|:x:| | getSavedFileList |:white_check_mark:|:white_check_mark:|:x:|:x:| | getSavedFileInfo |:white_check_mark:|:white_check_mark:|:x:|:x:| | addPhoneContact |:white_check_mark:|:white_check_mark:|:x:|:x:| -| setClipboardData |:white_check_mark:|:white_check_mark:|:x:|:white_check_mark:| -| getClipboardData |:white_check_mark:|:white_check_mark:|:x:|:white_check_mark:| +| setClipboardData |:white_check_mark:|:white_check_mark:|:x:|:x:| +| getClipboardData |:white_check_mark:|:white_check_mark:|:x:|:x:| | setScreenBrightness |:white_check_mark:|:white_check_mark:|:x:|:x:| | getScreenBrightness |:white_check_mark:|:white_check_mark:|:x:|:x:| | makePhoneCall |:white_check_mark:|:white_check_mark:|:x:|:white_check_mark:| @@ -511,9 +553,9 @@ useFetch().fetch({ | requestPayment |:white_check_mark:|:white_check_mark:|:x:|:x:| | createCanvasContext |:white_check_mark:|:white_check_mark:|:x:|:x:| | canvasToTempFilePath |:white_check_mark:|:white_check_mark:|:x:|:x:| -| canvasPutImageData |:white_check_mark:|:white_check_mark:|:x:|:x:| -| canvasGetImageData |:white_check_mark:|:white_check_mark:|:x:|:x:| -| createSelectorQuery |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| +| canvasPutImageData |:white_check_mark:|:x:|:x:|:x:| +| canvasGetImageData |:white_check_mark:|:x:|:x:|:x:| +| createSelectorQuery |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| | onWindowResize |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| | offWindowResize |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| | arrayBufferToBase64 |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| @@ -522,6 +564,7 @@ useFetch().fetch({ | getNetworkType |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| | onNetworkStatusChange |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| | offNetworkStatusChange |:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +| createVideoContext |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:| ## webview-bridge Mpx 支持小程序跨平台后,多个平台的小程序里都提供了 webview 组件,webview 打开的 H5 页面可以通过小程序提供的 API 来与小程序通信以及调用一些小程序的能力,但是各家小程序对于 webview 提供的API是不一样的。 diff --git a/docs-vuepress/api/global-api.md b/docs-vitepress/api/global-api.md similarity index 99% rename from docs-vuepress/api/global-api.md rename to docs-vitepress/api/global-api.md index 88a3f66e7b..0860890b9d 100644 --- a/docs-vuepress/api/global-api.md +++ b/docs-vitepress/api/global-api.md @@ -402,7 +402,7 @@ createComponent({ 选项式 API 中使用,作用同[onResize](/api/composition-api.html#onresize) ## 响应式 API -详情请[移步](/api/reactivity-api/basic-reactivity.html) +详情请[移步](/api/reactivity-api.html) ## 组合式 API 详情请[移步](/api/composition-api.html) diff --git a/docs-vuepress/api/index.md b/docs-vitepress/api/index.md similarity index 83% rename from docs-vuepress/api/index.md rename to docs-vitepress/api/index.md index 1cbc924472..55412548c0 100644 --- a/docs-vuepress/api/index.md +++ b/docs-vitepress/api/index.md @@ -1,3 +1,7 @@ +--- +title: API 参考 +--- + + + + + +``` + +> 注意 + +### onAppInit +- **类型:** `Function` +- **详细:** + +通过 createApp 注册一个应用期间被调用,输出 web 时 SSR渲染模式下,需要在此钩子中生成 pinia 的实例并返回。 + + +### onSSRAppCreated +- **类型:** `Function` +- **详细:** + +SSR渲染定制钩子,在服务端渲染期间被调用,可以在这个钩子中可以去返回应用程序实例,以及完成服务器端路由匹配,store 的状态挂载等。类 Vue 的 server entry 中的功能。 + +**注意:** 仅 web 环境支持 diff --git a/docs-vuepress/api/reactivity-api.md b/docs-vitepress/api/reactivity-api.md similarity index 100% rename from docs-vuepress/api/reactivity-api.md rename to docs-vitepress/api/reactivity-api.md diff --git a/docs-vuepress/api/store-api.md b/docs-vitepress/api/store-api.md similarity index 100% rename from docs-vuepress/api/store-api.md rename to docs-vitepress/api/store-api.md diff --git a/docs-vuepress/articles/1.0.md b/docs-vitepress/articles/1.0.md similarity index 99% rename from docs-vuepress/articles/1.0.md rename to docs-vitepress/articles/1.0.md index 60698afc74..4d42244dcf 100644 --- a/docs-vuepress/articles/1.0.md +++ b/docs-vitepress/articles/1.0.md @@ -11,7 +11,7 @@ Mpx是一款致力于提高小程序开发体验的增强型小程序框架, * 增强的模板语法(动态组件/样式绑定/类名绑定/内联事件函数/双向绑定等) * 深度性能优化(原生自定义组件/基于依赖收集和数据变化的setData) * Webpack编译(npm/循环依赖/Babel/ESLint/css预编译/代码优化等) -* 单文件组件开发 +* 单文件组件开发 testtest123 * 状态管理(Vuex规范/多实例/可合并) * 跨团队合作(packages) * 逻辑复用能力(mixins) diff --git a/docs-vuepress/articles/2.0.md b/docs-vitepress/articles/2.0.md similarity index 100% rename from docs-vuepress/articles/2.0.md rename to docs-vitepress/articles/2.0.md diff --git a/docs-vuepress/articles/2.7-release.md b/docs-vitepress/articles/2.7-release.md similarity index 100% rename from docs-vuepress/articles/2.7-release.md rename to docs-vitepress/articles/2.7-release.md diff --git a/docs-vuepress/articles/2.8-release-alter.md b/docs-vitepress/articles/2.8-release-alter.md similarity index 100% rename from docs-vuepress/articles/2.8-release-alter.md rename to docs-vitepress/articles/2.8-release-alter.md diff --git a/docs-vuepress/articles/2.8-release.md b/docs-vitepress/articles/2.8-release.md similarity index 100% rename from docs-vuepress/articles/2.8-release.md rename to docs-vitepress/articles/2.8-release.md diff --git a/docs-vuepress/articles/2.9-release-alter.md b/docs-vitepress/articles/2.9-release-alter.md similarity index 100% rename from docs-vuepress/articles/2.9-release-alter.md rename to docs-vitepress/articles/2.9-release-alter.md diff --git a/docs-vuepress/articles/2.9-release.md b/docs-vitepress/articles/2.9-release.md similarity index 100% rename from docs-vuepress/articles/2.9-release.md rename to docs-vitepress/articles/2.9-release.md diff --git a/docs-vuepress/articles/index.md b/docs-vitepress/articles/index.md similarity index 100% rename from docs-vuepress/articles/index.md rename to docs-vitepress/articles/index.md diff --git a/docs-vuepress/articles/mpx-cli-next.md b/docs-vitepress/articles/mpx-cli-next.md similarity index 100% rename from docs-vuepress/articles/mpx-cli-next.md rename to docs-vitepress/articles/mpx-cli-next.md diff --git a/docs-vuepress/articles/mpx-cube-ui.md b/docs-vitepress/articles/mpx-cube-ui.md similarity index 100% rename from docs-vuepress/articles/mpx-cube-ui.md rename to docs-vitepress/articles/mpx-cube-ui.md diff --git a/docs-vuepress/articles/mpx1.md b/docs-vitepress/articles/mpx1.md similarity index 100% rename from docs-vuepress/articles/mpx1.md rename to docs-vitepress/articles/mpx1.md diff --git a/docs-vuepress/articles/mpx2.md b/docs-vitepress/articles/mpx2.md similarity index 100% rename from docs-vuepress/articles/mpx2.md rename to docs-vitepress/articles/mpx2.md diff --git a/docs-vuepress/articles/performance.md b/docs-vitepress/articles/performance.md similarity index 100% rename from docs-vuepress/articles/performance.md rename to docs-vitepress/articles/performance.md diff --git a/docs-vuepress/articles/size-control.md b/docs-vitepress/articles/size-control.md similarity index 100% rename from docs-vuepress/articles/size-control.md rename to docs-vitepress/articles/size-control.md diff --git a/docs-vuepress/articles/ts-derivation.md b/docs-vitepress/articles/ts-derivation.md similarity index 100% rename from docs-vuepress/articles/ts-derivation.md rename to docs-vitepress/articles/ts-derivation.md diff --git a/docs-vuepress/articles/unit-test.md b/docs-vitepress/articles/unit-test.md similarity index 100% rename from docs-vuepress/articles/unit-test.md rename to docs-vitepress/articles/unit-test.md diff --git a/docs-vuepress/assets/images/1666074957603.jpg b/docs-vitepress/assets/images/1666074957603.jpg similarity index 100% rename from docs-vuepress/assets/images/1666074957603.jpg rename to docs-vitepress/assets/images/1666074957603.jpg diff --git a/docs-vuepress/assets/images/cloud.png b/docs-vitepress/assets/images/cloud.png similarity index 100% rename from docs-vuepress/assets/images/cloud.png rename to docs-vitepress/assets/images/cloud.png diff --git a/docs-vitepress/assets/images/harmonyOS.svg b/docs-vitepress/assets/images/harmonyOS.svg new file mode 100644 index 0000000000..9031db9a76 --- /dev/null +++ b/docs-vitepress/assets/images/harmonyOS.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/docs-vuepress/assets/images/select-ts-version.png b/docs-vitepress/assets/images/select-ts-version.png similarity index 100% rename from docs-vuepress/assets/images/select-ts-version.png rename to docs-vitepress/assets/images/select-ts-version.png diff --git a/docs/images/start-tips1.png b/docs-vitepress/assets/images/start-tips1.png similarity index 100% rename from docs/images/start-tips1.png rename to docs-vitepress/assets/images/start-tips1.png diff --git a/docs/images/start-tips2.png b/docs-vitepress/assets/images/start-tips2.png similarity index 100% rename from docs/images/start-tips2.png rename to docs-vitepress/assets/images/start-tips2.png diff --git a/docs-vuepress/desc.md b/docs-vitepress/desc.md similarity index 71% rename from docs-vuepress/desc.md rename to docs-vitepress/desc.md index d57fb2d2d2..63c1ccb1cd 100644 --- a/docs-vuepress/desc.md +++ b/docs-vitepress/desc.md @@ -1,19 +1,16 @@ -# 文档指南 +# 文档写作指南 -该文档使用vuepress生成 +该文档使用 [vitepress](https://vitepress.dev/zh/) 生成 ## 该项目指南 -已安装依赖vuepress,并已经在package.json中新增写作和部署脚本 - - ``` sh # 写作时 npm run docs:dev # 部署时 npm run docs:build -# 将在docs-vuepress/.vuepress/dist下生成静态文件,部署到相应服务器即可,部署参考下方链接 +# 将在 docs-vitepress/.vitepress/dist 下生成静态文件,部署到相应服务器即可,部署参考下方链接 ``` ## 编写格式指南 @@ -29,5 +26,5 @@ npm run docs:build ## 参考 -- [部署指南](https://www.vuepress.cn/guide/deploy.html) -- [Vuepress文档](https://www.vuepress.cn/) +- [部署指南](https://vitepress.dev/zh/guide/deploy) +- [Vitepress 文档](https://vitepress.dev/zh/) diff --git a/docs-vuepress/guide/advance/ability-compatible.md b/docs-vitepress/guide/advance/ability-compatible.md similarity index 100% rename from docs-vuepress/guide/advance/ability-compatible.md rename to docs-vitepress/guide/advance/ability-compatible.md diff --git a/docs-vuepress/guide/advance/async-subpackage.md b/docs-vitepress/guide/advance/async-subpackage.md similarity index 100% rename from docs-vuepress/guide/advance/async-subpackage.md rename to docs-vitepress/guide/advance/async-subpackage.md diff --git a/docs-vitepress/guide/advance/build-config.md b/docs-vitepress/guide/advance/build-config.md new file mode 100644 index 0000000000..550d3e70c9 --- /dev/null +++ b/docs-vitepress/guide/advance/build-config.md @@ -0,0 +1,114 @@ +# 编译配置 + +新版的 `@mpxjs/cli` 整体是基于 `@vue/cli` 的架构设计开发的。因此有关 `mpx` 编译构建相关的配置统一使用 `vue.config.js` 来进行管理。 + +### 编译构建配置 + +#### mpx 编译构建配置 + +有关 `mpx` 相关的 webpack 插件、loader 等在 `vue.config.js` 当中 `pluginOptions.mpx` 进行相关的配置: + +```javascript +// vue.config.js +module.exports = { + pluginOptions: { + mpx: { + // 传入 @mpxjs/webpack-plugin 当中的配置信息 + // 具体可参考文档:https://www.mpxjs.cn/api/compile.html#mpxwebpackplugin-options + plugin: { + srcMode: 'wx', + }, + // 传入 @mpxjs/webpack-plugin loader 当中的配置信息 + // 具体可参考文档:https://www.mpxjs.cn/api/compile.html#mpxwebpackplugin-loader + loader: {}, + // 提供图片资源处理简单操作 + // 具体配置参考 https://mpxjs.cn/guide/advance/image-process.html#%E5%9B%BE%E5%83%8F%E8%B5%84%E6%BA%90%E5%BC%95%E5%85%A5%E6%9C%89%E4%B8%89%E7%A7%8D%E6%96%B9%E5%BC%8F + urlLoader: { + name: 'img/[name][hash].[ext]', + publicPath: '', + publicPathScope: '', + limit: 10 + } + } + } +} +``` + +注:通过 `@mpxjs/cli` 初始化的项目提供了开箱即用的配置(在[插件内部](https://github.com/mpx-ecology/mpx-cli/blob/master/packages/vue-cli-plugin-mpx/utils/resolveMpxWebpackPluginConf.js#L6-L59)设置了默认的配置),如果开发过程中有一些其他的配置需求,参见 [mpx 官方文档](https://www.mpxjs.cn/api/compile.html#mpxwebpackplugin-options)。 + +#### vue.config.js + +以下表格为 `vue.config.js` 当中 `web` 侧和 `小程序` 侧支持的字段一览表,具体每个字段的配置功能请参见 [@vue/cli 官方配置](https://cli.vuejs.org/config/#configuration-reference): + +注:`yes` 表示在对应环境支持配置,`no` 表示在对应环境不支持配置。 + +| 字段 | web | 小程序 | 备注 | +| -------------------------- | --- | ------ | ------------------------------------------------------------- | +| publicPath | yes | no | - | +| outputDir | yes | yes | `dist/${process.env.MPX_CURRENT_TARGET_MODE}`目录作为输出目录 | +| assetsDir | yes | no | - | +| indexPath | yes | no | - | +| filenameHashing | yes | no | - | +| pages | yes | no | - | +| lintOnSave | yes | yes | - | +| runtimeCompiler | yes | no | - | +| transpileDependencies | yes | yes | - | +| productionSourceMap | yes | yes | | +| crossorigin | yes | no | - | +| integrity | yes | no | - | +| configureWebpack | yes | yes | - | +| chainWebpack | yes | yes | - | +| css.requireModuleExtension | yes | no | - | +| css.extract | yes | no | - | +| css.sourceMap | yes | no | 未来会支持 | +| css.loaderOptions | yes | no | 未来会支持 | +| devServer | yes | no | - | +| devServer.proxy | yes | no | - | +| parallel | yes | no | - | +| pwa | yes | no | - | +| pluginOptions | yes | yes | - | + +可通过 `vue.config.js` 中提供的 `chainWebpack` 或 `configureWebpack` 字段进行配置,具体使用规则请参见[@vue/cli](https://cli.vuejs.org/guide/webpack.html#simple-configuration): + +```javascript +// vue.config.js +module.exports = { + configureWebpack: { + plugins: [new MyOwnWebpackPlugin()] + }, + chainWebpack: (config) => { + config + .rule('some-rule') + .test(/some-rule/) + .use('some-loader') + .loader('some-loader') + } +} +``` + +### 根据不同的构建目标配置 + +可根据构建平台和开发环境进行选择性的配置,在构建过程中暴露出来的环境变量包括: + +- `MPX_CLI_MODE`: 'mp' | 'web' | 'rn' +- `NODE_ENV`:'development' | 'production' +- `MPX_CURRENT_TARGET_MODE`: 'wx' | 'ali' | 'swan' | 'qq' | 'tt' | 'dd' | 'web' | 'ios' | 'android' | 'harmony' +- `MPX_CURRENT_TARGET_ENV` : 'development' | 'production' + +```javascript +// vue.config.js +module.exports = { + chainWebpack: (config) => { + if (process.env.MPX_CLI_MODE === 'mp') { + // do something + } + + if ( + process.env.MPX_CLI_MODE === 'web' && + process.env.NODE_ENV === 'development' + ) { + // do something + } + } +} +``` diff --git a/docs-vuepress/guide/advance/custom-output-path.md b/docs-vitepress/guide/advance/custom-output-path.md similarity index 100% rename from docs-vuepress/guide/advance/custom-output-path.md rename to docs-vitepress/guide/advance/custom-output-path.md diff --git a/docs-vuepress/guide/advance/dll-plugin.md b/docs-vitepress/guide/advance/dll-plugin.md similarity index 100% rename from docs-vuepress/guide/advance/dll-plugin.md rename to docs-vitepress/guide/advance/dll-plugin.md diff --git a/docs-vuepress/guide/advance/i18n.md b/docs-vitepress/guide/advance/i18n.md similarity index 100% rename from docs-vuepress/guide/advance/i18n.md rename to docs-vitepress/guide/advance/i18n.md diff --git a/docs-vuepress/guide/advance/image-process.md b/docs-vitepress/guide/advance/image-process.md similarity index 100% rename from docs-vuepress/guide/advance/image-process.md rename to docs-vitepress/guide/advance/image-process.md diff --git a/docs-vuepress/guide/advance/mixin.md b/docs-vitepress/guide/advance/mixin.md similarity index 100% rename from docs-vuepress/guide/advance/mixin.md rename to docs-vitepress/guide/advance/mixin.md diff --git a/docs-vuepress/guide/advance/npm.md b/docs-vitepress/guide/advance/npm.md similarity index 100% rename from docs-vuepress/guide/advance/npm.md rename to docs-vitepress/guide/advance/npm.md diff --git a/docs-vuepress/guide/advance/pinia.md b/docs-vitepress/guide/advance/pinia.md similarity index 100% rename from docs-vuepress/guide/advance/pinia.md rename to docs-vitepress/guide/advance/pinia.md diff --git a/docs-vuepress/guide/advance/platform.md b/docs-vitepress/guide/advance/platform.md similarity index 100% rename from docs-vuepress/guide/advance/platform.md rename to docs-vitepress/guide/advance/platform.md diff --git a/docs-vuepress/guide/advance/plugin.md b/docs-vitepress/guide/advance/plugin.md similarity index 100% rename from docs-vuepress/guide/advance/plugin.md rename to docs-vitepress/guide/advance/plugin.md diff --git a/docs-vuepress/guide/advance/progressive.md b/docs-vitepress/guide/advance/progressive.md similarity index 100% rename from docs-vuepress/guide/advance/progressive.md rename to docs-vitepress/guide/advance/progressive.md diff --git a/docs-vuepress/guide/advance/provide-inject.md b/docs-vitepress/guide/advance/provide-inject.md similarity index 80% rename from docs-vuepress/guide/advance/provide-inject.md rename to docs-vitepress/guide/advance/provide-inject.md index 15af05b8d3..cf4672d2e2 100644 --- a/docs-vuepress/guide/advance/provide-inject.md +++ b/docs-vitepress/guide/advance/provide-inject.md @@ -210,39 +210,62 @@ export const InjectionKeys = { 直接使用字符串注入 key 时,注入值的类型默认推导会是 `unknown`,需要通过泛型参数显式声明。因为无法保证运行时一定存在这个 provide,所以推导类型也可能是 `undefined`。当声明一个默认值后,这个 `undefined` 类型就可以成功被移除。 -```ts - +const foo1 = inject('foo') // 类型:unknown +const foo2 = inject('foo') // 类型:string | undefined +const foo3 = inject('foo', 'default value') // 类型:string ✅ ``` 当然,如果你已经确定注入名肯定被提供了,也可以强制断言。 -```ts +```ts twoslash +import { inject } from '@mpxjs/core' + const foo = inject('foo') as string ``` 如果使用 `Symbol` 作为注入名,可以使用我们提供的 `InjectionKey` 泛型接口,使用它对注入名进行注解或者断言后,可以用来在不同组件之间同步注入值的类型。建议将注入 key 放在单独文件,这样方便在多个组件中导入使用。 -```ts{4} +```ts{4} twoslash +// @errors: 2345 1146 1005 import { provide, inject } from '@mpxjs/core' import type { InjectionKey } from '@mpxjs/core' export const key: InjectionKey = Symbol() // 类型注解 // const key = Symbol() as InjectionKey // 类型断言写法等效 -provide(key, 'foo') // 若默认值是非字符串则会 TS 类型报错 +provide(key, 'foo') // ✅ +provide(key, 123) // 提供值应当为字符串类型 -const foo = inject(key) // ✅ foo 的类型:string | undefined -const foo = inject(key, 'default value') // ✅ foo 的类型:string -const foo = inject(key, 1) // ❌ 默认值是非字符串则会 TS 类型报错 +const foo1 = inject(key) // ✅ foo1: string | undefined +const foo2 = inject(key, 'default value') // ✅ foo2: string +const foo3 = inject(key, 123) // 默认值应当为字符串类型 ``` +> 👀 鼠标悬浮到上面代码可以查看具体 TS 类型 + ## 跨端差异 -- Mpx 输出 Web 端后,使用规则与 Vue 一致,`provide/inject` 的生效范围严格遵行父子组件关系,只有父组件可以成功向子孙组件提供依赖。 -- Mpx 输出小程序端会略有不同,由于小程序原生框架限制,暂时无法在子组件获取真实渲染时的父组件引用关系,所以不能像 Vue 那样基于父组件原型继承来实现 `provide`。在 Mpx 底层实现中,我们将组件层的 `provide` 挂载在所属页面实例上,相当于将组件 scope 提升到页面 scope,可以理解成一种“降级模拟”。当然,这并不影响父组件向子孙组件 `provide` 的能力,只是会额外存在“**副作用**”:同一页面中的组件可以向页面中其他所有在其之后渲染子组件提供依赖。比如同一页面下的组件 A 可以向后渲染的兄弟组件 B 的子孙组件提供数据,这在 Web 端是不允许的。因此,针对小程序端可能出现的“副作用”需要开发者自行保证,可以结合上述注入名的管理优化来规避。 +- Mpx 输出 **Web** 端,使用规则与 Vue 一致,`provide/inject` 的生效范围严格遵行父子组件关系,只有父组件可以成功向子孙组件提供依赖。 +- Mpx 输出 **RN** 端,框架内部基于 React 的 `useContext` 钩子来转换实现,表现和 Web 端一致。 +- Mpx 输出 **小程序** 端同样遵循类似 Vue 的父子组件关系,但是在 `slot` 场景下小程序表现会和 Web、RN 端略有差异。举个例子,如下代码所示:在组件 A 的 `template` 模板中包含子组件 B,然后组件 B 通过 `slot` 包含子组件 C,组件 B 和 C 都定义在组件 A 的模板中。该场景下:在 Web 端,组件 A 是 B 的父组件,B 是 C 的父组件,所以 A 和 B 都可以向 C 提供依赖。但在小程序端,B 和 C 的父组件都是 A,组件 B 不能再向 C 提供依赖。这个跨端差异或者说“副作用”可以理解成:Web 端是基于“节点树”,即虚拟组件节点纬度,而小程序的父子组件关系是基于“组件树”,即组件模板维度,也就是说当前组件的创建者(在 WXML/AXML 模板中定义了此组件的组件)才是它的父组件。 + +```html + + + + + +``` diff --git a/docs-vuepress/guide/advance/resource-resolve.md b/docs-vitepress/guide/advance/resource-resolve.md similarity index 100% rename from docs-vuepress/guide/advance/resource-resolve.md rename to docs-vitepress/guide/advance/resource-resolve.md diff --git a/docs-vuepress/guide/advance/size-report.md b/docs-vitepress/guide/advance/size-report.md similarity index 100% rename from docs-vuepress/guide/advance/size-report.md rename to docs-vitepress/guide/advance/size-report.md diff --git a/docs-vuepress/guide/advance/ssr.md b/docs-vitepress/guide/advance/ssr.md similarity index 100% rename from docs-vuepress/guide/advance/ssr.md rename to docs-vitepress/guide/advance/ssr.md diff --git a/docs-vuepress/guide/advance/store.md b/docs-vitepress/guide/advance/store.md similarity index 100% rename from docs-vuepress/guide/advance/store.md rename to docs-vitepress/guide/advance/store.md diff --git a/docs-vuepress/guide/advance/subpackage.md b/docs-vitepress/guide/advance/subpackage.md similarity index 100% rename from docs-vuepress/guide/advance/subpackage.md rename to docs-vitepress/guide/advance/subpackage.md diff --git a/docs-vuepress/guide/advance/utility-first-css.md b/docs-vitepress/guide/advance/utility-first-css.md similarity index 95% rename from docs-vuepress/guide/advance/utility-first-css.md rename to docs-vitepress/guide/advance/utility-first-css.md index c586615ae4..78730a03e8 100644 --- a/docs-vuepress/guide/advance/utility-first-css.md +++ b/docs-vitepress/guide/advance/utility-first-css.md @@ -97,17 +97,38 @@ plugins.push(new MpxUnocssPlugin()) 即可在项目模版中使用基于`unocss`的原子类功能,`unocss`默认的preset兼容`tailwindcss`/`windicss` ,可以通过查阅[tailwindcss文档](https://tailwindcss.com/docs/installation)、[windicss文档](https://windicss.org/utilities/general/colors.html)或[unocss可交互文档](https://unocss.dev/interactive/)进行探索使用。 -关于`uno.config.js`可用配置项及`@mpxjs/unocss-plugin`及`@mpxjs/unocss-base`的配置项请参考[API文档](../../api/compile.md#mpxunocssplugin-配置) +关于`uno.config.js`可用配置项及`@mpxjs/unocss-plugin`及`@mpxjs/unocss-base`的配置项请参考[API文档](../../api/compile.md#mpxunocssplugin-配置)。 + ### vscode插件支持 -推荐使用unocss官方插件https://unocss.dev/integrations/vscode -mpx文件则需要在unocss.config.js添加如下参数才能生效 -```js -const { defineConfig } = require('unocss') -module.exports = defineConfig({ - include: [/\.mpx($|\?)/] -}) -``` +1. 安装 [unocss 官方插件](https://unocss.dev/integrations/vscode)。 +2. 修改 VSCode 设置中的 `unocss.languageIds` 选项(或者直接修改 VSCode JSON 配置文件),添加 "mpx",实现智能提示等功能。 + > _使用最新版本 [@mpxjs/cli](https://mpxjs.cn/guide/basic/start.html#%E5%AE%89%E8%A3%85%E8%84%9A%E6%89%8B%E6%9E%B6) 脚手架创建的项目会自动生成,可忽略这一步。_ + + ```json + // .vscode/settings.json + { + "unocss.languageIds": [ + "mpx" + ] + } + ``` + +3. 修改 `uno.config.js` 支持 Mpx 预设。 + > _使用 [@mpxjs/cli](https://mpxjs.cn/guide/basic/start.html#%E5%AE%89%E8%A3%85%E8%84%9A%E6%89%8B%E6%9E%B6) 脚手架创建的项目会自动生成,可忽略这一步。_ + + ```js + // uno.config.js + const { defineConfig } = require('unocss') + const presetMpx = require('@mpxjs/unocss-base') + + module.exports = defineConfig({ + include: [/\.mpx($|\?)/], + presets: [ + presetMpx() + ] + }) + ``` ## 功能支持范围 {#config-supports} diff --git a/docs-vuepress/guide/basic/class-style-binding.md b/docs-vitepress/guide/basic/class-style-binding.md similarity index 100% rename from docs-vuepress/guide/basic/class-style-binding.md rename to docs-vitepress/guide/basic/class-style-binding.md diff --git a/docs-vitepress/guide/basic/component.md b/docs-vitepress/guide/basic/component.md new file mode 100644 index 0000000000..c89a3fc33b --- /dev/null +++ b/docs-vitepress/guide/basic/component.md @@ -0,0 +1,758 @@ +# 自定义组件 + +在 Mpx 中也可以使用类似 Vue 中的单文件自定义组件,我们可以在每个组件内封装自定义内容和逻辑。 + +在Mpx中自定义组件,语法默认以微信小程序为基准,与此同时,Mpx 额外提供的数据响应和模版增强语法等一系列增强能力都可以在自定义组件中使用。 + +>作为参考,原生小程序自定义组件的规范详情查看[这里](https://developers.weixin.qq.com/miniprogram/dev/reference/api/Component.html),但在Mpx中自定义组件所支持的属性和功能还需以当前文档为准。 + +## 注册使用 + +```html + + + + + + + + +``` +使用 [createComponent](/api/global-api.html#createcomponent) 方法创建自定义组件,在父组件/页面中通过 usingComponents 注册使用。 + +## 组件属性 + +对于组件属性的讲解,下方暂时使用选项式 API 进行讲解。 + +### properties + +用于声明组件接收的外部属性。属性的类型可以为 String、Number、Boolean、Object、Array 其一,也可以为 null 表示不限制类型。 + +```ts + +type PropType = | StringConstructor // String + | NumberConstructor // Number + | BooleanConstructor // Boolean + | ObjectConstructor // Object + | ArrayConstructor // Array; + | null; // null + +interface ComponentOptions { + properties?: { + [key: string]: PropOptions | PropType + } +} + +interface PropOptions { + type: PropType // type 为必填项 + value?: any + optionalTypes?: PropType[] // 属性的类型(可以指定多个) + observer?: string | ((newVal: any, oldVal: any) => void) +} +``` + +properties 定义包含以下选项: +* **`type`**: 必填,属性的类型 +* **`optionalTypes`**: 可选,属性的类型(可以指定多个) +* **`value`**: 可选,属性的初始值 +* **`observer`**: 可选,属性值变化时的回调函数 + +> **注意:** +> 1. 属性名应避免以 data 开头,例如 data-xyz="" 会被作为节点 dataset 来处理 +> 2. 在组件定义和使用时,属性名和 data 字段相互间都不能冲突 + +```js +createComponent({ + properties: { + // 基础类型 + propA: { + type: String, + value: '' + }, + // 简化的定义方式 + propB: Number, + // 多种类型 + propC: { + type: Number, + optionalTypes: [String, Object], + value: 0 + }, + // 带有属性值变化回调 + propE: { + type: Object, + observer(newVal, oldVal) { + console.log('propE changed:', newVal, oldVal) + } + } + } +}) +``` +**参考**:[微信小程序properties定义](https://developers.weixin.qq.com/miniprogram/dev/reference/api/Component.html#properties-%E5%AE%9A%E4%B9%89) + +### data + +组件的内部数据,和 properties 一同用于组件的模板渲染。 + +```ts +interface ComponentOptions { + data?: object | (() => object) +} +``` +data 可以是一个函数返回一个普通 JavaScript 对象,也可以是一个普通 JavaScript 对象。 + +在 Mpx 中,组件实例会代理 data 对象的所有属性并进行响应式处理,因此可以直接通过 `this.dataName` 访问这些数据, 同时修改这些数据也会触发视图更新。 + +```html + + + +``` +// TODO data 的注意项 + + +### computed + +用于声明基于现有数据的计算属性。 + +```ts +type ComputedGetter = () => T +type ComputedSetter = (value: T) => void + +interface WritableComputedOptions { + get: ComputedGetter + set: ComputedSetter +} + +// 计算属性可以是函数或对象 +type ComputedOption = ComputedGetter | WritableComputedOptions + +// 组件选项的接口 +interface ComponentOptions { + computed?: { + [K: string]: ComputedOption + } +} +``` + +该选项接收一个对象,其中键是计算属性的名称,值是一个计算属性 getter,或一个具有 get 和 set 方法的对象 (用于声明可写的计算属性)。 + +所有的 getters 和 setters 会将它们的 this 上下文自动绑定为组件实例。 + +computed 选项用于声明依赖于其他数据的计算属性。计算属性的结果会被缓存,只有在依赖发生变化时才会重新计算。 + +```js +import { createComponent } from '@mpxjs/core' +createComponent({ + data() { + return { + price: 100, + quantity: 2 + } + }, + computed: { + // 只读计算属性 + total() { + return this.price * this.quantity + }, + // 可读写计算属性 + discount: { + get() { + return this.price * 0.9 + }, + set(value) { + this.price = value / 0.9 + } + } + } +}) +``` +> 注意 +>* 选项式 API 中 computed 尽量不要使用箭头函数,否则无法访问组件实例 this + +### watch + +用于对响应性数据变化调用的侦听回调。 + +```ts +// flush 选项的可选值类型 +type FlushMode = 'sync' | 'post' | 'pre' + +interface ComponentOptions { + watch?: { + [key: string]: WatchOption | WatchCallback | string + } +} + +type WatchCallback = (newValue: any, oldValue: any) => void + +interface WatchOption { + handler: WatchCallback | string + immediate?: boolean // 是否立即执行 + deep?: boolean // 是否深度监听 + flush?: FlushMode // 回调的执行时机 +} +``` + +watch 选项用于监听数据的变化并执行相应的回调函数。支持以下功能: +* 监听单个数据源 +* 监听多个数据源 +* 深度监听(deep) +* 立即执行(immediate) +* 执行时机控制(flush) + * `'sync'`: 同步执行,立即触发回调 + * `'post'`: DOM 更新后执行(默认值) + * `'pre'`: DOM 更新前执行 + +```js +createComponent({ + data() { + return { + message: 'Hello', + user: { + name: 'John', + age: 20 + } + } + }, + watch: { + // 简单监听 + message(newVal, oldVal) { + console.log('message changed:', newVal, oldVal) + }, + + // 深度监听 + user: { + handler(newVal, oldVal) { + console.log('user changed:', newVal, oldVal) + }, + deep: true, + immediate: true + }, + + // 监听对象的属性 + 'user.name'(newVal, oldVal) { + console.log('user.name changed:', newVal, oldVal) + }, + + // 控制执行时机 + count: { + handler(newVal) { + console.log('count changed:', newVal) + }, + flush: 'post' // DOM 更新后执行 + } + } +}) +``` + +### observers + +用于监听数据变化,类似于 watch,最早由微信小程序官方提出,Mpx 框架支持了该能力并做了跨平台兼容。 + +```ts +interface ComponentOptions { + observers?: { + [path: string]: (newValue: any, ...args: any[]) => void + } +} +``` + +observers 选项支持以下功能: +* 监听单个数据 +* 监听多个数据 +* 使用通配符监听对象或数组的所有子数据 + +通配符说明: +* `**`:表示所有子数据 + + +```js +createComponent({ + + observers: { + observers: { + 'numberA, numberB': function(numberA, numberB) { + // 在 numberA 或者 numberB 被设置时,执行这个函数 + this.numberC = numberA + numberB + } + 'some.subfield': function(subfield) { + subfield === this.some.subfield + }, + 'arr[12]': function(arr12) { + // 使用 setData 设置 this.data.arr[12] 时触发 + // (除此以外,使用 setData 设置 this.data.arr 也会触发) + arr12 === this.arr[12] + }, + 'some.field.**': function(field) { + // field 下所有子数据变化都会触发回调 + field === this.some.field + } + } + } +}) +``` + +> **注意:** +> 1. 和 watch 不同,observers 监听多个数据时回调方法的参数为响应性数据最新值,并非数组 +> 2. 使用通配符与 watch deep 属性表现一致 +> 3. 建议尽量统一使用 watch + +**参考**:[微信小程序数据监听器](https://developers.weixin.qq.com/miniprogram/dev/reference/api/Component.html#properties-%E5%AE%9A%E4%B9%89) + +### methods + +用于声明组件的方法。 + +```ts +interface ComponentOptions { + methods?: { + [key: string]: (...args: any[]) => any + } +} +``` + +methods 选项用于声明组件实例可以访问的方法。所有方法的 this 上下文会自动绑定为组件实例。 + +```js +createComponent({ + methods: { + handleClick() { + // 访问数据 + console.log(this.message) + // 调用其他方法 + this.otherMethod() + }, + otherMethod() { + // ... + } + } +}) +``` + +### mixins +一个包含组件选项对象的数组,这些选项都将被混入到当前组件的实例中。 + +具体请查看[Mpx-mixins](https://mpxjs.cn/guide/advance/mixin.html) + +### behaviors + +小程序平台提供的用于组件间代码共享的特性,类似于"mixins"。 + + +**参考**:[微信小程序behaviors](https://developers.weixin.qq.com/miniprogram/dev/reference/api/Component.html#properties-%E5%AE%9A%E4%B9%89) + +在 Mpx 组件内如果使用 behaviors,在跨平台时会进行抹平处理,但建议直接使用 Mpx 提供的 mixins 能力。 + +> **注意:** +> * 使用内置 behaviors(如 wx://form-field),因为牵扯到小程序平台底层能力,无法做到完全跨平台抹平 + +### relations + +用于定义组件间的关系,支持父子、祖孙等关系,实现组件间的通信与控制。 + +该特性 base 微信小程序平台,在Mpx中使用该特性需要注意,输出微信小程序平台时能力完全支持,跨端输出其他平台时受制于平台底层能力,无法完全做抹平支持。 + +| 平台 | 支持情况 | 说明 | +|------|---------|------| +| 微信小程序 | 完全支持 | 完全支持 relations 能力 | +| 支付宝小程序 | 部分支持 | 部分支持,不支持 linkChanged 和 target 能力 | +| 百度小程序 | 不支持 | 不支持使用 relations | +| QQ小程序 | 完全支持 | 完全支持 relations 能力 | +| 字节小程序 | 部分支持 | 部分支持,不支持 linkChanged 能力 | +| Web | 部分支持 | 部分支持,不支持 linkChanged 和 target 能力 | +| RN | 不支持 | 不支持使用 relations | + +因此需要注意,在使用 realtions 能力跨平台时需要做好平台条件编译。 + +```ts +interface RelationOption { + type: 'parent' | 'child' | 'ancestor' | 'descendant' // 关系类型 + linked?: (target: any) => void // 关系建立时的回调 + linkChanged?: (target: any) => void // 关系变化时的回调 + unlinked?: (target: any) => void // 关系解除时的回调 + target?: string // 关联的 behavior +} + +interface ComponentOptions { + relations?: { + [componentPath: string]: RelationOption + } +} +``` + +relations 支持以下功能: +* 定义组件间的层级关系 +* 监听关系的生命周期 +* 获取关联的组件实例 +* 关联使用相同 behavior 的组件 + +详情可参考[微信小程序-relations](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/relations.html) + +```js +// custom-ul 组件 +import { createComponent } from '@mpxjs/core' +createComponent({ + relations: { + './custom-li': { + type: 'child', // 关联的目标节点应为子节点 + linked(target) { + // 每次有 custom-li 被插入时执行 + console.log('li linked', target) + }, + unlinked(target) { + // 每次有 custom-li 被移除时执行 + console.log('li unlinked', target) + } + } + } +}) + +// custom-li 组件 +import { createComponent } from '@mpxjs/core' +createComponent({ + relations: { + './custom-ul': { + type: 'parent', // 关联的目标节点应为父节点 + linked(target) { + // 每次被插入到 custom-ul 时执行 + console.log('ul linked', target) + } + } + } +}) +``` + +### externalClasses + +组件接受的外部样式类,常用于在开启组件样式隔离时,可以通过接收外部样式类来改变组件样式。 + +```ts +interface ComponentOptions { + externalClasses?: string[] +} +``` + +externalClasses 支持以下功能: +* 定义多个外部样式类 +* 在组件 template 中使用外部样式类,同时支持在同一个节点上使用多个外部样式类 + +```html + + +``` + +使用组件: + +```html + + + + + + + + + +``` + +```css +/* 页面 page style */ +.red-text { + color: red; +} + +.large-text { + font-size: 20px; +} + +.active { + background: #f0f0f0; +} +``` + +关于 externalclasses 的更多描述也可以查看[微信小程序-外部样式类](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html#%E5%A4%96%E9%83%A8%E6%A0%B7%E5%BC%8F%E7%B1%BB) + +>**注意:** +>* 该功能默认在微信小程序可用,在跨平台输出时,需要在 @mpxjs/webpack-plugin 中配置相关的 externalClasses, 否则跨平台时该能力不生效,具体配置请[查看](https://mpxjs.cn/api/compile.html#externalclasses)。 + +### options + +开启组件的部分特性时需要设置的选项,例如 virtualHost 、 multipleSlots 之类特性。 + +```ts +interface ComponentOptions { + options?: { + virtualHost?: boolean // 设置组件是否为虚拟节点 + styleIsolation?: 'isolated' | 'apply-shared' | 'shared' | 'page-isolated' | 'page-apply-shared' | 'page-shared' // 设置样式隔离选项 + multipleSlots?: boolean // 启用多 slot 支持 + addGlobalClass?: boolean // 允许组件的样式影响到外部 + } +} +``` + +options 支持以下配置: +* **virtualHost**: 设置组件是否是虚拟的 +* **styleIsolation**: 设置组件样式隔离选项 +* **multipleSlots**: 是否启用多 slot 支持,仅微信和QQ需要配置 +* **addGlobalClass**: 是否允许组件的样式影响外部 + +但需要注意的是,此处的 options 配置为 base 微信小程序的语法特性,在跨端输出其他平台时,由于依赖平台底层能力支持与否,因此无法做到全部功能抹平。 + +| 选项 | 微信 | 支付宝 | 百度 | QQ | 字节 | Web | RN | 说明 | +|------|------|--------|------|-----|------|-----|-----|-----| +| virtualHost | ✓ | ✓ | ✗ | ✓ | ✓ | ✓ | ✗ | Mpx 以微信为base,virtualHost 默认为 false,跨端输出Web、支付宝时默认会在自定义组件根节点包裹一层节点,开发者也可以通过[编译配置](https://mpxjs.cn/api/compile.html#autovirtualhostrules)进行控制 | +| styleIsolation | ✓ | 部分支持 | ✗ | ✓ | ✗ | ✗ | ✗ | 微信默认开启样式隔离,目前只有支付宝小程序平台没有样式隔离能力, 当组件 style 标签配置 scoped 时,Mpx 输出支付宝会默认抹平开启样式隔离,开发者也可通过[编译配置](https://mpxjs.cn/api/compile.html#autoscoperules)进行控制 | +| multipleSlots | ✓ | - | - | ✓ | - | - | - | 目前仅微信和QQ使用多个slot需要配置multipleSlots,其他平台默认支持使用多slot | +| addGlobalClass | ✓ | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ | - | + +>**注意:** +> * virtualHost 在支付宝平台默认为 false +>options 中的特性以微信小程序为 base,随着微信小程序的持续迭代,此处列出的特性可能会存在部分缺失。 +>同时对于上述各特性的具体使用,特别是各小程序平台,开发者也可以在对应小程序开发文档中查找参考。 + +### 组件生命周期 +在 Mpx 内组件生命周期可以使用[框架内置生命周期](框架内置生命周期),也可以使用以微信原生base的生命周期,在使用微信原生base的生命周期时,在跨平台输出时,框架会对生命周期进行映射抹平,将不同小程序平台的生命周期转换映射为内置生命周期后再进行统一的驱动,以抹平不同小程序平台生命周期钩子的差异。 + +在选项式 API 中,可以使用微信 base 或者 Mpx 框架暴露的内置生命周期。 + +微信原生生命周期: + +| 生命周期 | 说明 | +|-----------------|------| +| created | 在组件实例初始化完成时调用 | +| attached | 在组件挂载开始之前调用 | +| ready | 在组件在视图层布局完成后调用 | +| detached | 在组件实例销毁时调用 | + +在组合式 API 中,需要使用框架暴露的统一的[生命周期钩子](https://mpxjs.cn/api/composition-api.html#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90) + +### pageLifetimes +组件中访问页面生命周期 + +在选项式中可以直接使用 pageLifetimes.show 之类的配置: + +| 生命周期 | 说明 | +|-----------------|------| +| show | 组件所在页面显示 | +| hide | 组件所在页面隐藏 | +| resize | 组件所在页面尺寸发生变化 | + +在组合式 API 中,需要使用框架暴露的 onShow、onHide、onResize,详情可[查看](https://mpxjs.cn/api/composition-api.html#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90) + + +## 组件实例方法 + +### setData + +更新视图数据,无论数据value是否改变,都会强制刷新视图。 + +```ts +interface Component { + setData( + data: Record, + callback?: () => void + ): void +} +``` + +setData 支持以下功能: +* 修改 data 数据 +* 支持设置回调函数,回掉函数在视图更新完成后执行 +* 支持批量更新多个数据 + +```js +import { createComponent } from '@mpxjs/core' +createComponent({ + data: { + text: 'init data', + }, + methods: { + changeData() { + // 修改数据 + this.setData({ + text: 'changed data' + }) + // 设置回调函数 + this.setData({ + text: 'changed data' + }, function() { + console.log('数据更新完成') + }) + } + } +}) +``` +在 Mpx 内请慎重使用 setData,建议直接使用组件实例修改数据 +```js +this.text = 'some data' +``` + +| API | 微信 | 支付宝 | 百度 | QQ | 字节 | Web | RN | 说明 | +|------|------|--------|------|-----|------|-----|-----|-----| +| setData | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ | - | + +### triggerEvent + +### getPageId + +### selectComponent + +### createSelectorQuery + +### createIntersectionObserver + +### selectAllComponents + +### hasBehavior + +## 动态组件 + +Mpx中提供了使用方法类似于 Vue 的动态组件能力,这是一个基于 wx:if 实现的语法。通过对 `is` 属性进行动态绑定,可以实现在同一个挂载点切换多个组件,前提需要动态切换的组件已经在全局或者组件中完成注册。 + +使用示例如下: + +```html + + + + + + + + + +``` + +## slot + +在组件中使用slot(插槽)可以使我们封装的组件更具有可扩展性,Mpx完全支持原生插槽的使用。 + +### 基础用法 + +```html + + + + 这是组件模板 + + + +``` + +使用组件时: + +```html + + + + + + +``` + +> 注意:使用多个slot时,需要在组件选项中开启 `multipleSlots: true`。 + +更多关于插槽的使用细节可查看[微信小程序官方文档](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html)。 diff --git a/docs-vuepress/guide/basic/conditional-render.md b/docs-vitepress/guide/basic/conditional-render.md similarity index 100% rename from docs-vuepress/guide/basic/conditional-render.md rename to docs-vitepress/guide/basic/conditional-render.md diff --git a/docs-vuepress/guide/basic/css.md b/docs-vitepress/guide/basic/css.md similarity index 100% rename from docs-vuepress/guide/basic/css.md rename to docs-vitepress/guide/basic/css.md diff --git a/docs-vitepress/guide/basic/event.md b/docs-vitepress/guide/basic/event.md new file mode 100644 index 0000000000..0fb5873068 --- /dev/null +++ b/docs-vitepress/guide/basic/event.md @@ -0,0 +1,220 @@ +# 事件处理 + +Mpx 在事件处理上基于原生小程序,支持原生小程序的全部事件处理技术规范,在此基础上新增了事件处理内联传参的增强机制。 + +## 事件分类 + +事件分为冒泡事件和非冒泡事件: + +1. 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递 +2. 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递 + +常用事件如下: + +| 事件类型 | 触发条件 | +| ----------- | -------------------------------------------------------------- | +| touchstart | 手指触摸动作开始 | +| touchmove | 手指触摸后移动 | +| touchcancel | 手指触摸动作被打断,如来电提醒,弹窗 | +| touchend | 手指触摸动作结束 | +| tap | 手指触摸后马上离开 | +| longpress | 手指触摸后,超过 350ms 再离开,推荐使用 longpress 代替 longtap | +| longtap | 手指触摸后,超过 350ms 再离开 | + +## 事件绑定方式 + +### 基础绑定 + +事件绑定的写法同组件的属性,以 key、value 的形式: + +1. `bind` 绑定: + +```html +点击事件 + +点击事件 +``` + +2. `catch` 绑定(阻止冒泡): + +```html +阻止冒泡的点击事件 + +阻止冒泡的点击事件 +``` + +### 事件捕获 + +捕获阶段位于冒泡阶段之前,且在捕获阶段中,事件到达节点的顺序与冒泡阶段恰好相反。需要在捕获阶段监听事件时,可以采用 `capture-bind`、`capture-catch` 关键字: + +```html +捕获阶段事件 +捕获阶段且停止传递 +``` + +## 事件对象 + +当事件回调触发时,会收到一个事件对象,它的详细属性如下: + +| 属性 | 类型 | 说明 | +| -------------- | ------- | -------------------------------------------- | +| type | String | 事件类型 | +| timeStamp | Integer | 事件生成时的时间戳 | +| target | Object | 触发事件的组件的一些属性值集合 | +| currentTarget | Object | 当前组件的一些属性值集合 | +| detail | Object | 额外的信息 | +| touches | Array | 触摸事件,当前停留在屏幕中的触摸点信息的数组 | +| changedTouches | Array | 触摸事件,当前变化的触摸点信息的数组 | + +### Target 和 CurrentTarget + +- `target` 是触发事件的源组件 +- `currentTarget` 是事件绑定的当前组件 + +两者都具备以下属性: +| 属性 | 类型 | 说明 | +|------|------|------| +| id | String | 元素的 id 属性 | +| dataset | Object | 包含所有以 data- 开头的自定义属性的对象集合,dataset 属性会自动将 data- 后面的属性名转换为驼峰命名。 例如:data-user-name 会变成 dataset.userName | + +```html + + + outer-view + inner-view + +``` + +上述示例中,点击 inner-view 时: + +- `e.target.id` 为 inner-view +- `e.currentTarget.id` 为 outer-view + +### touches 和 changedTouches + +touches 数组中每个元素包含以下属性 +| 属性 | 说明 | +|------|------| +| identifier | 触摸点的标识符 | +| pageX, pageY | 距离文档左上角的距离 | +| clientX, clientY | 距离页面可显示区域左上角的距离 | + +### detail + +自定义事件所携带的数据,如表单组件的提交事件会携带用户的输入,媒体的错误事件会携带错误信息等。点击事件的 detail 带有的 x, y 同 pageX, pageY 代表距离文档左上角的距离。 + +## Mpx 增强的内联传参 + +Mpx 提供了比原生小程序更强大的事件传参能力,支持以下几种传参方式: + +### 基础传参 + +```html + +基础传参 + + +``` + +### 模板内联传参 + +```html + +内联传参 + + +``` + +### 传递动态参数 + +```html + +{{text}} + +{{item}} + + +``` + +### 使用 event 对象 + +```html + +获取event对象 + + +``` + +### 动态事件绑定 + +```html + + {{item}} + + +``` diff --git a/docs-vuepress/guide/basic/ide.md b/docs-vitepress/guide/basic/ide.md similarity index 62% rename from docs-vuepress/guide/basic/ide.md rename to docs-vitepress/guide/basic/ide.md index 47c31929d8..d137b53cfb 100644 --- a/docs-vuepress/guide/basic/ide.md +++ b/docs-vitepress/guide/basic/ide.md @@ -1,62 +1,57 @@ # IDE 高亮配置 -- [IntelliJ](ide.md#IntelliJ) -- [vscode](ide.md#vscode) +- [IntelliJ](ide.md#intellij) +- [vscode](ide.md#vscode) ## IntelliJ -如果使用 IntelliJ 系 IDE 开发,可将`.mpx`后缀文件关联到`vue`模板类型,按`vue`模板解析。 +如果使用 IntelliJ 系 IDE 开发,可将 `.mpx` 后缀文件关联到 `vue` 模板类型,按 `vue` 模板解析。 ![关联文件类型](../../assets/images/start-tips2.png) -但会报一个`warning`提示有重复的`script`标签,关闭该警告即可。 +但会报一个 `warning` 提示有重复的 `script` 标签,关闭该警告即可。 ![关闭警告](../../assets/images/start-tips1.png) ## vscode -> [git地址](https://github.com/mpx-ecology/vscode-mpx),有任何vscode插件的问题和需求可在仓库中提issue +### 语法高亮插件 -> 下载 +#### 下载 -1. [下载地址](https://marketplace.visualstudio.com/items?itemName=pagnkelly.mpx) +- [下载地址](https://marketplace.visualstudio.com/items?itemName=pagnkelly.mpx)(也可直接在 vscode 扩展处搜索 mpx 即可下载) +- [git 地址](https://github.com/mpx-ecology/vscode-mpx)(有任何 vscode 插件的问题和需求可在仓库中提 issue) -2. 也可直接在vscode扩展处搜索mpx即可下载 +#### 功能介绍 -> 使用 - -### 插件功能介绍 - -- 高亮 -- emmet -- 跳转定义 -- 自动补全 -- eslint -- 格式化 +- 语法高亮 +- emmet +- 跳转定义 +- 自动补全 +- eslint +- 格式化 [视频介绍](https://gift-static.hongyibo.com.cn/static/kfpub/3227/vscodes.mp4) - #### 高亮 -  与其他语言插件无异,提供相应代码的高亮,因为Mpx分为四个模块,所以每个模块都有相应的语法高亮,还包括注释快捷键,也区分了相应模块,比如`