weapp-tailwindcss 5.1.5 → 5.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.en.md +1 -1
  2. package/README.md +1 -1
  3. package/dist/bundlers/shared/generator-css/types.d.ts +1 -0
  4. package/dist/bundlers/shared/generator-css/user-css.d.ts +4 -1
  5. package/dist/bundlers/vite/generate-bundle/finalize.d.ts +1 -0
  6. package/dist/bundlers/vite/generate-bundle/remembered-css-replay.d.ts +1 -0
  7. package/dist/bundlers/vite/processed-css-assets.d.ts +7 -0
  8. package/dist/{context-rrYZuUBU.mjs → context-3GGqW9vw.mjs} +3 -3
  9. package/dist/{context-BziwyWy1.js → context-BCSk_YnL.js} +3 -3
  10. package/dist/core.js +1 -1
  11. package/dist/core.mjs +1 -1
  12. package/dist/{generator-24-HgU9F.mjs → generator-CoT5vu9w.mjs} +2 -2
  13. package/dist/{generator-CilgHtxb.js → generator-CqWzj2Z1.js} +2 -2
  14. package/dist/generator.js +2 -2
  15. package/dist/generator.mjs +2 -2
  16. package/dist/{gulp-ygWfmOqh.mjs → gulp-Bss4wJ8t.mjs} +4 -4
  17. package/dist/{gulp-CuVsZdO9.js → gulp-hXE1U4Cu.js} +4 -4
  18. package/dist/gulp.js +1 -1
  19. package/dist/gulp.mjs +1 -1
  20. package/dist/{hmr-timing-Dh_nn3w5.mjs → hmr-timing-Cfu-4Bnf.mjs} +24 -511
  21. package/dist/{hmr-timing-BKdCeIrn.js → hmr-timing-Df4203aI.js} +48 -565
  22. package/dist/index.js +4 -4
  23. package/dist/index.mjs +4 -4
  24. package/dist/postcss.js +2 -2
  25. package/dist/postcss.mjs +2 -2
  26. package/dist/presets.js +6 -3
  27. package/dist/presets.mjs +6 -3
  28. package/dist/rspack.js +1 -1
  29. package/dist/rspack.mjs +1 -1
  30. package/dist/runtime-branch/generator-target-env.d.ts +1 -0
  31. package/dist/{source-candidate-scan-signature-DIj9m4wB.js → source-candidate-scan-signature-5Uk6U72B.js} +3 -3
  32. package/dist/{source-candidate-scan-signature-DATRnS1X.mjs → source-candidate-scan-signature-BbCmW975.mjs} +3 -3
  33. package/dist/{tailwindcss-C-uM4rB8.mjs → tailwindcss-Bjr3aphG.mjs} +15 -2
  34. package/dist/{tailwindcss-BwoNQ3t8.js → tailwindcss-DYJ3HZD2.js} +15 -2
  35. package/dist/{transform-DHLemtaX.mjs → transform--155BmeJ.mjs} +1 -1
  36. package/dist/{transform-KLD1tJdb.js → transform-B6_y_yCB.js} +1 -1
  37. package/dist/{v4-engine-CKtsdKxK.js → v4-engine-C9cmNlP8.js} +610 -3
  38. package/dist/{v4-engine-BuuYDXt1.mjs → v4-engine-DRQaCFMm.mjs} +529 -6
  39. package/dist/{vite-Yp14HNyS.js → vite-Baw9qNrc.js} +560 -112
  40. package/dist/{vite-cH0tTMHc.mjs → vite-PdxjaqhO.mjs} +561 -113
  41. package/dist/vite.js +1 -1
  42. package/dist/vite.mjs +1 -1
  43. package/dist/weapp-tw-css-import-rewrite-loader.js +2994 -2958
  44. package/dist/{webpack-DBhmJ-_P.mjs → webpack-BffTDmod.mjs} +12 -13
  45. package/dist/{webpack-DN3tgLbF.js → webpack-C9u7mfGE.js} +18 -19
  46. package/dist/webpack.js +1 -1
  47. package/dist/webpack.mjs +1 -1
  48. package/package.json +3 -3
@@ -1,12 +1,12 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-emK7D4bc.js");
2
2
  const require_framework = require("./framework.js");
3
- const require_v4_engine = require("./v4-engine-CKtsdKxK.js");
4
- const require_generator = require("./generator-CilgHtxb.js");
3
+ const require_v4_engine = require("./v4-engine-C9cmNlP8.js");
4
+ const require_generator = require("./generator-CqWzj2Z1.js");
5
5
  const require_utils = require("./utils-D3h8j7Mk.js");
6
- const require_context = require("./context-BziwyWy1.js");
7
- const require_tailwindcss = require("./tailwindcss-BwoNQ3t8.js");
8
- const require_hmr_timing = require("./hmr-timing-BKdCeIrn.js");
9
- const require_source_candidate_scan_signature = require("./source-candidate-scan-signature-DIj9m4wB.js");
6
+ const require_context = require("./context-BCSk_YnL.js");
7
+ const require_tailwindcss = require("./tailwindcss-DYJ3HZD2.js");
8
+ const require_hmr_timing = require("./hmr-timing-Df4203aI.js");
9
+ const require_source_candidate_scan_signature = require("./source-candidate-scan-signature-5Uk6U72B.js");
10
10
  require("./logger-TlKT3xmR.js");
11
11
  let node_fs = require("node:fs");
12
12
  node_fs = require_rolldown_runtime.__toESM(node_fs);
@@ -515,7 +515,7 @@ function resolveUniAppXStyleIsolationEnabled(root) {
515
515
  //#region src/uni-app-x/vite.ts
516
516
  let transformUVuePromise;
517
517
  function loadTransformUVue() {
518
- transformUVuePromise ?? (transformUVuePromise = Promise.resolve().then(() => require("./transform-KLD1tJdb.js")).then((mod) => mod.transformUVue));
518
+ transformUVuePromise ?? (transformUVuePromise = Promise.resolve().then(() => require("./transform-B6_y_yCB.js")).then((mod) => mod.transformUVue));
519
519
  return transformUVuePromise;
520
520
  }
521
521
  const preprocessorLangs = /* @__PURE__ */ new Set([
@@ -1061,7 +1061,7 @@ function normalizeMatchedCssSourcePath(file) {
1061
1061
  if (!file || !node_path.default.isAbsolute(file)) return;
1062
1062
  return node_path.default.resolve(file.replace(/[?#].*$/, ""));
1063
1063
  }
1064
- function collectConfiguredCssEntries(opts) {
1064
+ function collectConfiguredCssEntries$1(opts) {
1065
1065
  const runtimeCssEntries = opts.tailwindcssRuntimeOptions?.tailwindcss?.v4?.cssEntries ?? [];
1066
1066
  return [
1067
1067
  ...opts.cssEntries ?? [],
@@ -1084,7 +1084,7 @@ function collectCssConfigBaseCandidates(source, file, outputRoot, opts) {
1084
1084
  const runtimeProjectRoot = typeof opts.tailwindcssRuntimeOptions?.projectRoot === "string" ? opts.tailwindcssRuntimeOptions.projectRoot : void 0;
1085
1085
  const sourceBaseFallback = opts.tailwindcss?.v4?.base ?? runtimeProjectRoot ?? opts.tailwindcssBasedir ?? outputRoot;
1086
1086
  const sourceRoot = opts.tailwindcssBasedir ?? runtimeProjectRoot;
1087
- const configuredCssEntries = collectConfiguredCssEntries(opts);
1087
+ const configuredCssEntries = collectConfiguredCssEntries$1(opts);
1088
1088
  for (const cssEntry of configuredCssEntries) {
1089
1089
  const resolvedCssEntry = node_path.default.resolve(cssEntry);
1090
1090
  if (configuredCssEntries.length === 1 || isMatchingCssSourceFile(file, resolvedCssEntry, outputRoot) || hasMatchingStyleFileBase(file, resolvedCssEntry, outputRoot, sourceRoot)) addCandidate(node_path.default.dirname(resolvedCssEntry));
@@ -2020,6 +2020,21 @@ function appendCss$1(baseCss, css) {
2020
2020
  if (css.length === 0) return baseCss;
2021
2021
  return `${baseCss}\n${css}`;
2022
2022
  }
2023
+ function normalizeCssRecordIdentity(css) {
2024
+ return css.trim();
2025
+ }
2026
+ function hasNonCommentCss(css) {
2027
+ return css.replace(/\/\*[\s\S]*?\*\//g, "").trim().length > 0;
2028
+ }
2029
+ function dedupeViteCssResults(records) {
2030
+ const seen = /* @__PURE__ */ new Set();
2031
+ return records.filter((record) => {
2032
+ const key = `${require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile ?? "")}\0${normalizeCssRecordIdentity(record.css)}`;
2033
+ if (seen.has(key)) return false;
2034
+ seen.add(key);
2035
+ return true;
2036
+ });
2037
+ }
2023
2038
  function removeTailwindSourceMediaWrappers(css) {
2024
2039
  if (!css.includes("@media source(")) return css;
2025
2040
  try {
@@ -2096,6 +2111,183 @@ function collectRootStyleBundleCssSources(bundle, excludedFile) {
2096
2111
  }
2097
2112
  return sources;
2098
2113
  }
2114
+ function isHtmlOutputFile(file) {
2115
+ return /\.html(?:$|[?#])/i.test(file);
2116
+ }
2117
+ function stripQueryAndHash(file) {
2118
+ return file.replace(/[?#].*$/, "");
2119
+ }
2120
+ function resolveHtmlLinkedStyleFile(htmlFile, request) {
2121
+ if (!isStyleImportRequest(request)) return;
2122
+ const cleanRequest = stripQueryAndHash(request);
2123
+ if (cleanRequest.startsWith("/")) return require_source_candidate_scan_signature.normalizeOutputPathKey(cleanRequest.slice(1));
2124
+ const htmlDir = posix.posix.dirname(require_source_candidate_scan_signature.normalizeOutputPathKey(stripQueryAndHash(htmlFile)));
2125
+ return require_source_candidate_scan_signature.normalizeOutputPathKey(posix.posix.join(htmlDir === "." ? "" : htmlDir, cleanRequest));
2126
+ }
2127
+ function collectHtmlLinkedStyleFiles(bundle) {
2128
+ const linkedFiles = /* @__PURE__ */ new Set();
2129
+ const linkedBasenames = /* @__PURE__ */ new Set();
2130
+ const linkHrefRE = /<link\s[^>]*href\s*=\s*(["'])([^"']+)\1[^>]*>/gi;
2131
+ for (const [bundleFile, output] of Object.entries(bundle)) {
2132
+ if (output.type !== "asset") continue;
2133
+ const htmlFile = getAssetFile$1(bundleFile, output);
2134
+ if (!isHtmlOutputFile(htmlFile)) continue;
2135
+ const html = readAssetSource$2(output);
2136
+ for (const match of html.matchAll(linkHrefRE)) {
2137
+ const href = match[2];
2138
+ if (!href) continue;
2139
+ const linkedFile = resolveHtmlLinkedStyleFile(htmlFile, href);
2140
+ if (!linkedFile || !isRootStyleOutputFile(linkedFile)) continue;
2141
+ linkedFiles.add(linkedFile);
2142
+ linkedBasenames.add(posix.posix.basename(linkedFile));
2143
+ }
2144
+ }
2145
+ return {
2146
+ linkedBasenames,
2147
+ linkedFiles
2148
+ };
2149
+ }
2150
+ function isLinkedStyleFile(file, linked) {
2151
+ const fileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(stripQueryAndHash(file));
2152
+ return linked.linkedFiles.has(fileKey) || isRootStyleOutputFile(fileKey) && linked.linkedBasenames.has(posix.posix.basename(fileKey));
2153
+ }
2154
+ function removeDuplicateUnlinkedRootCssAssetsReferencedByHtml(bundle, options = {}) {
2155
+ const linked = collectHtmlLinkedStyleFiles(bundle);
2156
+ if (linked.linkedFiles.size === 0 && linked.linkedBasenames.size === 0) return 0;
2157
+ const linkedSources = /* @__PURE__ */ new Set();
2158
+ for (const [bundleFile, output] of Object.entries(bundle)) {
2159
+ if (output.type !== "asset") continue;
2160
+ const file = getAssetFile$1(bundleFile, output);
2161
+ if (!isCssOutputFile(file) || isMiniProgramStyleOutputFile(file) || !isLinkedStyleFile(file, linked)) continue;
2162
+ const source = require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(readAssetSource$2(output)).trim();
2163
+ if (source.length > 0) linkedSources.add(source);
2164
+ }
2165
+ if (linkedSources.size === 0) return 0;
2166
+ let removed = 0;
2167
+ for (const [bundleFile, output] of Object.entries(bundle)) {
2168
+ if (output.type !== "asset") continue;
2169
+ const file = getAssetFile$1(bundleFile, output);
2170
+ if (!isRootStyleOutputFile(file) || isMiniProgramStyleOutputFile(file) || isLinkedStyleFile(file, linked)) continue;
2171
+ const source = require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(readAssetSource$2(output)).trim();
2172
+ if (!linkedSources.has(source)) continue;
2173
+ delete bundle[bundleFile];
2174
+ options.debug?.("remove duplicate unlinked root css asset referenced by html: %s", file);
2175
+ removed++;
2176
+ }
2177
+ return removed;
2178
+ }
2179
+ const VUE_SCOPED_ATTR_RE = /\[data-v-[^\]]+\]/gi;
2180
+ function hasVueScopedAttr(value) {
2181
+ VUE_SCOPED_ATTR_RE.lastIndex = 0;
2182
+ const matched = VUE_SCOPED_ATTR_RE.test(value);
2183
+ VUE_SCOPED_ATTR_RE.lastIndex = 0;
2184
+ return matched;
2185
+ }
2186
+ function normalizeCssSignatureValue(value) {
2187
+ return value.replace(VUE_SCOPED_ATTR_RE, "").replace(/\s+/g, " ").replace(/\s*([>+~])\s*/g, "$1").replace(/\(\s+/g, "(").replace(/\s+\)/g, ")").trim();
2188
+ }
2189
+ function createDeclarationSignature(rule) {
2190
+ return createDeclarationKeys(rule).sort().join(";");
2191
+ }
2192
+ function createRuleCoverageKey(selector, declarations) {
2193
+ return `${normalizeCssSignatureValue(selector)}\0${declarations}`;
2194
+ }
2195
+ function createDeclarationKeys(rule) {
2196
+ return (rule.nodes ?? []).filter((node) => node.type === "decl").map((node) => `${node.prop}:${normalizeCssSignatureValue(node.value)}${node.important ? "!important" : ""}`);
2197
+ }
2198
+ function createAtRuleCoverageKey(atRule) {
2199
+ return `${atRule.name}\0${normalizeCssSignatureValue(atRule.params)}\0${normalizeCssSignatureValue(atRule.toString())}`;
2200
+ }
2201
+ function hasClassSelector(selector) {
2202
+ return /(?:^|[^\\])\.[_a-z\u00A0-\uFFFF-]/i.test(normalizeCssSignatureValue(selector));
2203
+ }
2204
+ function isLikelyTailwindGlobalSelector(selector) {
2205
+ const normalized = normalizeCssSignatureValue(selector);
2206
+ return normalized === "*" || normalized.startsWith("::") || normalized.startsWith(":root") || normalized.startsWith(":host") || /^(?:html|body|hr|abbr|h1|h2|h3|h4|h5|h6|a|b|strong|code|kbd|samp|small|sub|sup|table|button|input|select|optgroup|textarea|summary|blockquote|dl|dd|fieldset|legend|ol|ul|menu|dialog|progress|video|audio|canvas|embed|iframe|img|object|svg|details|template|[uo]ni-progress)(?:$|[:,[\s>+~.#])/.test(normalized);
2207
+ }
2208
+ function isLikelyTailwindGlobalRule(rule) {
2209
+ return (rule.selectors ?? [rule.selector]).every((selector) => !hasClassSelector(selector) && isLikelyTailwindGlobalSelector(selector));
2210
+ }
2211
+ function isLikelyTailwindPropertyAtRule(atRule) {
2212
+ return atRule.name.toLowerCase() === "property" && normalizeCssSignatureValue(atRule.params).startsWith("--tw-");
2213
+ }
2214
+ function collectRootScopedComparableCssCoverage(cssSources) {
2215
+ const rules = /* @__PURE__ */ new Set();
2216
+ const atRules = /* @__PURE__ */ new Set();
2217
+ const declarationsBySelector = /* @__PURE__ */ new Map();
2218
+ for (const source of cssSources) try {
2219
+ const root = _weapp_tailwindcss_postcss.postcss.parse(source);
2220
+ root.walkRules((rule) => {
2221
+ const declarations = createDeclarationSignature(rule);
2222
+ if (declarations.length === 0) return;
2223
+ for (const selector of rule.selectors ?? [rule.selector]) {
2224
+ const normalizedSelector = normalizeCssSignatureValue(selector);
2225
+ rules.add(`${normalizedSelector}\0${declarations}`);
2226
+ const selectorDeclarations = declarationsBySelector.get(normalizedSelector) ?? /* @__PURE__ */ new Set();
2227
+ for (const declaration of createDeclarationKeys(rule)) selectorDeclarations.add(declaration);
2228
+ declarationsBySelector.set(normalizedSelector, selectorDeclarations);
2229
+ }
2230
+ });
2231
+ root.walkAtRules((atRule) => {
2232
+ atRules.add(createAtRuleCoverageKey(atRule));
2233
+ });
2234
+ } catch {}
2235
+ return {
2236
+ rules,
2237
+ atRules,
2238
+ declarationsBySelector
2239
+ };
2240
+ }
2241
+ function isRuleCoveredByRootCss(rule, coverage) {
2242
+ const declarations = createDeclarationSignature(rule);
2243
+ if (declarations.length === 0) return false;
2244
+ const selectors = rule.selectors ?? [rule.selector];
2245
+ if (selectors.every((selector) => coverage.rules.has(createRuleCoverageKey(selector, declarations)))) return true;
2246
+ const declarationKeys = createDeclarationKeys(rule);
2247
+ return declarationKeys.length > 0 && selectors.every((selector) => {
2248
+ const rootDeclarations = coverage.declarationsBySelector.get(normalizeCssSignatureValue(selector));
2249
+ return rootDeclarations != null && declarationKeys.every((declaration) => rootDeclarations.has(declaration));
2250
+ }) || selectors.every((selector) => coverage.declarationsBySelector.has(normalizeCssSignatureValue(selector)));
2251
+ }
2252
+ function removeScopedCssCoveredByRootStyleSources(css, rootSources) {
2253
+ if (!hasVueScopedAttr(css)) return css;
2254
+ const hasScopedTailwindGeneratedCss = /tailwindcss v\d/i.test(css);
2255
+ const coverage = collectRootScopedComparableCssCoverage(rootSources);
2256
+ if (coverage.rules.size === 0 && coverage.atRules.size === 0 && !hasScopedTailwindGeneratedCss) return css;
2257
+ try {
2258
+ const root = _weapp_tailwindcss_postcss.postcss.parse(css);
2259
+ let changed = false;
2260
+ root.walkComments((comment) => {
2261
+ if (/tailwindcss v\d/i.test(comment.text)) {
2262
+ comment.remove();
2263
+ changed = true;
2264
+ }
2265
+ });
2266
+ root.walkRules((rule) => {
2267
+ if (isRuleCoveredByRootCss(rule, coverage) || hasScopedTailwindGeneratedCss && isLikelyTailwindGlobalRule(rule)) {
2268
+ rule.remove();
2269
+ changed = true;
2270
+ }
2271
+ });
2272
+ root.walkAtRules((atRule) => {
2273
+ if (coverage.atRules.has(createAtRuleCoverageKey(atRule)) || hasScopedTailwindGeneratedCss && isLikelyTailwindPropertyAtRule(atRule)) {
2274
+ atRule.remove();
2275
+ changed = true;
2276
+ return;
2277
+ }
2278
+ if (atRule.nodes !== void 0 && atRule.nodes.length === 0) {
2279
+ atRule.remove();
2280
+ changed = true;
2281
+ }
2282
+ });
2283
+ return changed ? removeDanglingCssSourceTraceComments(root.toString()).trim() : css;
2284
+ } catch {
2285
+ return css;
2286
+ }
2287
+ }
2288
+ function removeScopedTailwindPreflightCss(css) {
2289
+ return removeScopedCssCoveredByRootStyleSources(css, []);
2290
+ }
2099
2291
  function collectSingleViteGeneratedCssMarkerFile(rawSource) {
2100
2292
  const blocks = require_source_candidate_scan_signature.parseBundlerGeneratedCssMarkerBlocks(rawSource).filter((block) => block.bundler === "vite");
2101
2293
  if (blocks.length !== 1) return;
@@ -2108,7 +2300,9 @@ function shouldFilterRootGeneratedCssMarkerForScopedAsset(targetFile, markerFile
2108
2300
  return !isMatchingGeneratedCssMarkerFile(targetFile, markerFile, resolveViteProcessedCssOutputFile);
2109
2301
  }
2110
2302
  function removeCssCoveredByRootStyleBundleSources(bundle, file, css) {
2111
- return removeDanglingCssSourceTraceComments(removeCssCoveredByImportedViteResults(css, collectRootStyleBundleCssSources(bundle, file)));
2303
+ const rootSources = collectRootStyleBundleCssSources(bundle, file);
2304
+ const nextCss = removeScopedCssCoveredByRootStyleSources(removeDanglingCssSourceTraceComments(removeCssCoveredByImportedViteResults(css, rootSources)), rootSources);
2305
+ return hasNonCommentCss(nextCss) ? nextCss : "";
2112
2306
  }
2113
2307
  function removeDanglingCssSourceTraceComments(css) {
2114
2308
  if (!css.includes("/* tokens:")) return css;
@@ -2132,8 +2326,11 @@ function removeCssCoveredByRootStyleAssets(bundle, options) {
2132
2326
  for (const [bundleFile, output] of Object.entries(bundle)) {
2133
2327
  if (output.type !== "asset") continue;
2134
2328
  const file = getAssetFile$1(bundleFile, output);
2135
- if (!options.cssMatcher(file) || isRootStyleOutputFile(file) || options.isViteProcessedCssAsset?.(output, file) === true || options.subpackageRoots != null && isSubpackageOutputFile(file, options.subpackageRoots)) continue;
2136
2329
  const rawSource = readAssetSource$2(output);
2330
+ const hasScopedCss = hasVueScopedAttr(rawSource);
2331
+ const hasTailwindGeneratedCss = /tailwindcss v\d/i.test(rawSource);
2332
+ const shouldIncludeTailwindGeneratedCssAsset = options.includeTailwindGeneratedCssAssets === true && hasTailwindGeneratedCss && isCssOutputFile(file) && !isMiniProgramStyleOutputFile(file);
2333
+ if (!(options.cssMatcher(file) || hasScopedCss && isCssOutputFile(file) || shouldIncludeTailwindGeneratedCssAsset) || isRootStyleOutputFile(file) || options.isViteProcessedCssAsset?.(output, file) === true && !hasScopedCss && !shouldIncludeTailwindGeneratedCssAsset || options.subpackageRoots != null && isSubpackageOutputFile(file, options.subpackageRoots)) continue;
2137
2334
  const nextCss = removeCssCoveredByRootStyleBundleSources(bundle, file, rawSource);
2138
2335
  if (nextCss === rawSource) continue;
2139
2336
  output.source = nextCss;
@@ -2186,6 +2383,12 @@ function shouldUseCssAssetAsMainInjectionTarget(opts, file, records) {
2186
2383
  const fileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(file);
2187
2384
  if (!isRootStyleOutputFile(file) && records.some((record) => typeof record.outputFile === "string" && require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) === fileKey)) return true;
2188
2385
  if (!isRootStyleOutputFile(file)) return records.some((record) => record.injectIntoMain === true && typeof record.outputFile === "string" && require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) === fileKey);
2386
+ const matchedRootWebOutputTargets = records.map((record) => typeof record.outputFile === "string" ? require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) : void 0).filter((outputFile) => typeof outputFile === "string" && isRootStyleOutputFile(outputFile) && !isMiniProgramStyleOutputFile(outputFile)).filter((outputFile) => opts.mainCssChunkMatcher(outputFile, opts.appType));
2387
+ if (opts.appType === "uni-app-vite" && !isMiniProgramStyleOutputFile(file) && matchedRootWebOutputTargets.length > 0) return matchedRootWebOutputTargets.includes(fileKey);
2388
+ const explicitRootTargets = records.filter((record) => record.injectIntoMain === true).map((record) => typeof record.outputFile === "string" ? require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) : void 0).filter((outputFile) => typeof outputFile === "string" && isRootStyleOutputFile(outputFile) && !isMiniProgramStyleOutputFile(outputFile));
2389
+ const explicitWebCssTargets = records.filter((record) => record.injectIntoMain === true).map((record) => typeof record.outputFile === "string" ? require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) : void 0).filter((outputFile) => typeof outputFile === "string" && isCssOutputFile(outputFile) && !isMiniProgramStyleOutputFile(outputFile));
2390
+ if (opts.appType === "uni-app-vite" && !isMiniProgramStyleOutputFile(file) && explicitWebCssTargets.length > 0) return explicitRootTargets.includes(fileKey);
2391
+ if (explicitRootTargets.length > 0) return explicitRootTargets.includes(fileKey);
2189
2392
  if (records.some((record) => {
2190
2393
  if (record.injectIntoMain !== true) return false;
2191
2394
  return isRootStyleOutputFile(file) || typeof record.outputFile === "string" && require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) === fileKey;
@@ -2206,6 +2409,33 @@ function isViteProcessedCssResultCoveredByImportedBundleAsset(record, importedSt
2206
2409
  }
2207
2410
  return false;
2208
2411
  }
2412
+ function removeCoveredInjectedSourceAssets(bundle, targetFile, targetCss, records, options) {
2413
+ let removed = 0;
2414
+ const targetFileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(targetFile);
2415
+ const targetIsRootWebStyle = isRootStyleOutputFile(targetFileKey) && !isMiniProgramStyleOutputFile(targetFileKey);
2416
+ for (const record of records) {
2417
+ if (!options.shouldRemoveInjectedSourceAsset?.(targetFile, record)) continue;
2418
+ const recordFileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(record.file);
2419
+ for (const [candidateFile, candidateOutput] of Object.entries(bundle)) {
2420
+ if (candidateOutput.type !== "asset") continue;
2421
+ const candidateKey = require_source_candidate_scan_signature.normalizeOutputPathKey(getAssetFile$1(candidateFile, candidateOutput));
2422
+ if (candidateKey === targetFileKey) continue;
2423
+ const isRecordFile = candidateKey === recordFileKey;
2424
+ const candidateIsRootWebStyle = isRootStyleOutputFile(candidateKey) && !isMiniProgramStyleOutputFile(candidateKey);
2425
+ const candidateSource = readAssetSource$2(candidateOutput).trim();
2426
+ const uncoveredCandidateSource = candidateSource.length > 0 ? (0, _weapp_tailwindcss_postcss.filterExistingCssRules)(targetCss, candidateSource).trim() : candidateSource;
2427
+ const isProcessedSource = candidateSource === record.css.trim() || candidateSource.length > 0 && (0, _weapp_tailwindcss_postcss.containsCssAfterMinify)(targetCss, candidateSource) || targetIsRootWebStyle && candidateIsRootWebStyle && candidateSource.length > 0 && !hasNonCommentCss(uncoveredCandidateSource);
2428
+ if (!isRecordFile && !isProcessedSource) continue;
2429
+ if (candidateIsRootWebStyle && !targetIsRootWebStyle) continue;
2430
+ if (candidateIsRootWebStyle && !isRecordFile) continue;
2431
+ if (candidateIsRootWebStyle) delete bundle[candidateFile];
2432
+ else clearAssetSource(candidateOutput);
2433
+ options.debug?.("remove injected vite-processed source css asset: %s -> %s", candidateKey, targetFile);
2434
+ removed++;
2435
+ }
2436
+ }
2437
+ return removed;
2438
+ }
2209
2439
  function removeCssCoveredByImportedViteResults(css, importedCssSources) {
2210
2440
  if (importedCssSources.length === 0) return css;
2211
2441
  const importedCss = importedCssSources.map((source) => require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(source).trim()).filter(Boolean).join("\n");
@@ -2232,6 +2462,38 @@ function collectBundleAssetFiles(bundle) {
2232
2462
  }
2233
2463
  return files;
2234
2464
  }
2465
+ function normalizeComparableStyleFile(file) {
2466
+ return require_source_candidate_scan_signature.normalizeOutputPathKey(posix.normalize(file.replace(/[?#].*$/, "")));
2467
+ }
2468
+ function collectConfiguredTailwindV4CssEntryFiles(opts) {
2469
+ const runtimeCssEntries = opts.tailwindRuntime?.options?.tailwindcss?.v4?.cssEntries;
2470
+ return [
2471
+ ...Array.isArray(opts.cssEntries) ? opts.cssEntries : [],
2472
+ ...Array.isArray(opts.tailwindcss?.v4?.cssEntries) ? opts.tailwindcss.v4.cssEntries : [],
2473
+ ...Array.isArray(opts.tailwindcssRuntimeOptions?.tailwindcss?.v4?.cssEntries) ? opts.tailwindcssRuntimeOptions.tailwindcss.v4.cssEntries : [],
2474
+ ...Array.isArray(runtimeCssEntries) ? runtimeCssEntries : []
2475
+ ].filter((file) => typeof file === "string" && file.length > 0);
2476
+ }
2477
+ function isConfiguredTailwindV4CssEntryFile(opts, file) {
2478
+ if (typeof file !== "string" || file.length === 0) return false;
2479
+ const fileKey = normalizeComparableStyleFile(file);
2480
+ return collectConfiguredTailwindV4CssEntryFiles(opts).some((entry) => normalizeComparableStyleFile(entry) === fileKey);
2481
+ }
2482
+ function resolveUniAppViteWebviewRootCssInjectionTarget(bundle, opts, sourceFile, outputFile) {
2483
+ if (opts.appType !== "uni-app-vite" || isMiniProgramStyleOutputFile(outputFile) || !isConfiguredTailwindV4CssEntryFile(opts, sourceFile)) return;
2484
+ const rootCssFiles = [];
2485
+ const matchedRootCssFiles = [];
2486
+ for (const [bundleFile, output] of Object.entries(bundle)) {
2487
+ if (output.type !== "asset") continue;
2488
+ const file = getAssetFile$1(bundleFile, output);
2489
+ if (!opts.cssMatcher(file) || !isRootStyleOutputFile(file) || isMiniProgramStyleOutputFile(file)) continue;
2490
+ rootCssFiles.push(file);
2491
+ if (opts.mainCssChunkMatcher(file, opts.appType)) matchedRootCssFiles.push(file);
2492
+ }
2493
+ if (matchedRootCssFiles.length === 1) return matchedRootCssFiles[0];
2494
+ if (matchedRootCssFiles.length > 1) return;
2495
+ return rootCssFiles.length === 1 ? rootCssFiles[0] : void 0;
2496
+ }
2235
2497
  function findBundleAssetByOutputFile(bundle, file) {
2236
2498
  const fileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(file);
2237
2499
  return Object.entries(bundle).find(([bundleFile, output]) => {
@@ -2285,6 +2547,8 @@ function collectViteProcessedCssAssetResults(bundle, options) {
2285
2547
  options.markCssAssetProcessed?.(output, file);
2286
2548
  options.recordCssAssetResult?.(file, nextCss);
2287
2549
  const resolvedOutputFile = resolveViteGeneratedCssMarkerOutputFile(file, singleMarkerFile, existingAssetFiles, options.resolveViteProcessedCssOutputFile);
2550
+ const webviewRootCssInjectionTarget = options.opts ? resolveUniAppViteWebviewRootCssInjectionTarget(bundle, options.opts, singleMarkerFile ?? file, resolvedOutputFile) : void 0;
2551
+ const recordOutputFile = webviewRootCssInjectionTarget ?? resolvedOutputFile;
2288
2552
  if (singleMarkerFile && require_source_candidate_scan_signature.normalizeOutputPathKey(resolvedOutputFile) !== require_source_candidate_scan_signature.normalizeOutputPathKey(file) && !isRootStyleOutputFile(resolvedOutputFile) && existingAssetFiles.has(require_source_candidate_scan_signature.normalizeOutputPathKey(resolvedOutputFile))) {
2289
2553
  const targetAsset = findBundleAssetByOutputFile(bundle, resolvedOutputFile);
2290
2554
  if (targetAsset) {
@@ -2304,24 +2568,24 @@ function collectViteProcessedCssAssetResults(bundle, options) {
2304
2568
  continue;
2305
2569
  }
2306
2570
  }
2307
- const shouldReplayIntoMainCss = options.opts != null && shouldReplayViteProcessedCssIntoMainCss(options.opts, file, singleMarkerFile, resolvedOutputFile, options.subpackageRoots);
2571
+ const shouldReplayIntoMainCss = options.opts != null && (webviewRootCssInjectionTarget != null || shouldReplayViteProcessedCssIntoMainCss(options.opts, file, singleMarkerFile, resolvedOutputFile, options.subpackageRoots));
2308
2572
  options.recordViteProcessedCssAssetResult?.(file, nextCss, {
2309
2573
  injectIntoMain: shouldReplayIntoMainCss || void 0,
2310
- outputFile: resolvedOutputFile
2574
+ outputFile: recordOutputFile
2311
2575
  });
2312
- if (require_source_candidate_scan_signature.normalizeOutputPathKey(resolvedOutputFile) !== require_source_candidate_scan_signature.normalizeOutputPathKey(file)) options.recordViteProcessedCssAssetResult?.(resolvedOutputFile, nextCss, {
2576
+ if (require_source_candidate_scan_signature.normalizeOutputPathKey(recordOutputFile) !== require_source_candidate_scan_signature.normalizeOutputPathKey(file)) options.recordViteProcessedCssAssetResult?.(recordOutputFile, nextCss, {
2313
2577
  injectIntoMain: shouldReplayIntoMainCss || void 0,
2314
- outputFile: resolvedOutputFile
2578
+ outputFile: recordOutputFile
2315
2579
  });
2316
2580
  for (const markerFile of collectMatchingGeneratedCssMarkerFiles(file, rawSource, options.resolveViteProcessedCssOutputFile)) {
2317
2581
  if (require_source_candidate_scan_signature.normalizeOutputPathKey(markerFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(file)) continue;
2318
2582
  options.recordViteProcessedCssAssetResult?.(markerFile, nextCss, {
2319
2583
  injectIntoMain: shouldReplayIntoMainCss || void 0,
2320
- outputFile: resolvedOutputFile
2584
+ outputFile: recordOutputFile
2321
2585
  });
2322
- if (require_source_candidate_scan_signature.normalizeOutputPathKey(resolvedOutputFile) !== require_source_candidate_scan_signature.normalizeOutputPathKey(markerFile) && require_source_candidate_scan_signature.normalizeOutputPathKey(resolvedOutputFile) !== require_source_candidate_scan_signature.normalizeOutputPathKey(file)) options.recordViteProcessedCssAssetResult?.(resolvedOutputFile, nextCss, {
2586
+ if (require_source_candidate_scan_signature.normalizeOutputPathKey(recordOutputFile) !== require_source_candidate_scan_signature.normalizeOutputPathKey(markerFile) && require_source_candidate_scan_signature.normalizeOutputPathKey(recordOutputFile) !== require_source_candidate_scan_signature.normalizeOutputPathKey(file)) options.recordViteProcessedCssAssetResult?.(recordOutputFile, nextCss, {
2323
2587
  injectIntoMain: shouldReplayIntoMainCss || void 0,
2324
- outputFile: resolvedOutputFile
2588
+ outputFile: recordOutputFile
2325
2589
  });
2326
2590
  }
2327
2591
  if (isCoveredViteGeneratedSourceAsset(file, existingAssetFiles, options.resolveViteProcessedCssOutputFile)) {
@@ -2336,7 +2600,8 @@ function collectViteProcessedCssAssetResults(bundle, options) {
2336
2600
  return collected;
2337
2601
  }
2338
2602
  function injectViteProcessedCssIntoMainCssAssets(bundle, options) {
2339
- const viteCssResults = [...options.getViteProcessedCssAssetResults?.() ?? []].map(([file, record]) => {
2603
+ const transformCss = (css, file) => options.transformCss?.(css, file) ?? css;
2604
+ const viteCssResults = dedupeViteCssResults([...options.getViteProcessedCssAssetResults?.() ?? []].map(([file, record]) => {
2340
2605
  return typeof record === "string" ? {
2341
2606
  file,
2342
2607
  css: record,
@@ -2347,10 +2612,14 @@ function injectViteProcessedCssIntoMainCssAssets(bundle, options) {
2347
2612
  injectIntoMain: record.injectIntoMain,
2348
2613
  outputFile: record.outputFile
2349
2614
  };
2350
- }).filter((record) => record.css.length > 0);
2615
+ })).map((record) => ({
2616
+ ...record,
2617
+ css: transformCss(record.css, record.outputFile ?? record.file)
2618
+ })).filter((record) => record.css.length > 0);
2351
2619
  let injected = 0;
2352
2620
  for (const [bundleFile, bundleOutput] of Object.entries(bundle)) {
2353
2621
  let output = bundleOutput;
2622
+ if (bundle[bundleFile] !== bundleOutput) continue;
2354
2623
  if (output.type !== "asset") continue;
2355
2624
  let file = getAssetFile$1(bundleFile, output);
2356
2625
  if (!options.opts.cssMatcher(file) || !shouldUseCssAssetAsMainInjectionTarget(options.opts, file, viteCssResults)) continue;
@@ -2372,7 +2641,7 @@ function injectViteProcessedCssIntoMainCssAssets(bundle, options) {
2372
2641
  }
2373
2642
  const fileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(file);
2374
2643
  const mainFileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(file);
2375
- let nextCss = removeTailwindEntryDirectivesFromCss(originalSource);
2644
+ let nextCss = transformCss(removeTailwindEntryDirectivesFromCss(originalSource), file);
2376
2645
  const importedStyleFiles = collectImportedStyleFiles(nextCss, file);
2377
2646
  const importedBundleCssSources = collectImportedBundleCssSources(bundle, importedStyleFiles);
2378
2647
  nextCss = removeCssCoveredByImportedViteResults(nextCss, importedBundleCssSources);
@@ -2381,12 +2650,14 @@ function injectViteProcessedCssIntoMainCssAssets(bundle, options) {
2381
2650
  const uncoveredImportedViteCssResults = importedViteCssResults.filter((record) => !isViteProcessedCssResultCoveredByImportedBundleAsset(record, importedStyleFiles, bundleAssetFiles));
2382
2651
  const importedCssSources = [...importedBundleCssSources, ...uncoveredImportedViteCssResults.map((record) => record.css)];
2383
2652
  nextCss = removeCssCoveredByImportedViteResults(nextCss, uncoveredImportedViteCssResults.map((record) => record.css));
2653
+ const targetViteCssResults = [];
2384
2654
  for (const record of viteCssResults) {
2385
2655
  if (!isRootStyleOutputFile(file)) {
2386
2656
  if (typeof record.outputFile !== "string" || require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) !== fileKey) continue;
2387
2657
  }
2388
2658
  if (!shouldInjectViteProcessedCssResult(options.opts, mainFileKey, record.file, record)) continue;
2389
2659
  if (isViteProcessedCssResultImported(record, importedStyleFiles)) continue;
2660
+ targetViteCssResults.push(record);
2390
2661
  let css = require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(record.css).trim();
2391
2662
  css = removeCssCoveredByImportedViteResults(css, importedCssSources).trim();
2392
2663
  if (css.length === 0) continue;
@@ -2417,29 +2688,19 @@ function injectViteProcessedCssIntoMainCssAssets(bundle, options) {
2417
2688
  if (css.length === 0) continue;
2418
2689
  }
2419
2690
  const missingCss = (0, _weapp_tailwindcss_postcss.filterExistingCssRules)(nextCss, css);
2420
- if (missingCss.length === 0 || (0, _weapp_tailwindcss_postcss.containsCssAfterMinify)(nextCss, missingCss)) continue;
2691
+ if (missingCss.length === 0 || !hasNonCommentCss(missingCss) || (0, _weapp_tailwindcss_postcss.containsCssAfterMinify)(nextCss, missingCss)) continue;
2421
2692
  nextCss = appendCss$1(nextCss, missingCss);
2422
2693
  }
2423
- if (nextCss === originalSource) continue;
2424
- output.source = nextCss;
2425
- options.markCssAssetProcessed?.(output, file);
2426
- options.recordCssAssetResult?.(file, nextCss);
2427
- options.onUpdate?.(file, originalSource, nextCss);
2428
- options.debug?.("inject vite-processed css into main css asset: %s bytes=%d", file, nextCss.length);
2429
- for (const record of viteCssResults) {
2430
- if (!options.shouldRemoveInjectedSourceAsset?.(file, record)) continue;
2431
- const recordFileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(record.file);
2432
- for (const [candidateFile, candidateOutput] of Object.entries(bundle)) {
2433
- if (candidateOutput.type !== "asset") continue;
2434
- const candidateKey = require_source_candidate_scan_signature.normalizeOutputPathKey(getAssetFile$1(candidateFile, candidateOutput));
2435
- const isRecordFile = candidateKey === recordFileKey;
2436
- const candidateSource = readAssetSource$2(candidateOutput).trim();
2437
- const isProcessedSource = candidateSource === record.css.trim() || candidateSource.length > 0 && (0, _weapp_tailwindcss_postcss.containsCssAfterMinify)(nextCss, candidateSource);
2438
- if (!isRecordFile && !isProcessedSource || candidateKey === require_source_candidate_scan_signature.normalizeOutputPathKey(file)) continue;
2439
- clearAssetSource(candidateOutput);
2440
- options.debug?.("remove injected vite-processed source css asset: %s -> %s", candidateKey, file);
2441
- }
2694
+ nextCss = transformCss(nextCss, file);
2695
+ if (nextCss !== originalSource) {
2696
+ output.source = nextCss;
2697
+ options.markCssAssetProcessed?.(output, file);
2698
+ options.recordCssAssetResult?.(file, nextCss);
2699
+ options.onUpdate?.(file, originalSource, nextCss);
2700
+ options.debug?.("inject vite-processed css into main css asset: %s bytes=%d", file, nextCss.length);
2442
2701
  }
2702
+ const removedSources = removeCoveredInjectedSourceAssets(bundle, file, nextCss, targetViteCssResults, options);
2703
+ if (nextCss === originalSource && removedSources === 0) continue;
2443
2704
  injected++;
2444
2705
  }
2445
2706
  return injected;
@@ -2711,9 +2972,34 @@ function pruneLastCssResults(resultByFile, sourceHashByFile, activeFiles) {
2711
2972
  function readAssetSource(asset) {
2712
2973
  return typeof asset.source === "string" ? asset.source : asset.source.toString();
2713
2974
  }
2975
+ function isUniAppViteWebviewAppBundle(bundleFiles) {
2976
+ return bundleFiles.some((file) => node_path.default.basename(file.replace(/[?#].*$/, "")) === "app-service.js");
2977
+ }
2978
+ function isUniAppViteWebviewOutDir$2(outDir) {
2979
+ const normalized = outDir ? node_path.default.basename(node_path.default.normalize(outDir)).trim().toLowerCase() : void 0;
2980
+ return normalized === "app" || normalized === "app-plus";
2981
+ }
2714
2982
  function getAssetFile(bundleFile, asset) {
2715
2983
  return asset.fileName || bundleFile;
2716
2984
  }
2985
+ function finalizeUniAppViteWebviewCssCompat(bundle, options) {
2986
+ if (options.opts.generator?.webCompat === false) return 0;
2987
+ let transformed = 0;
2988
+ for (const [bundleFile, output] of Object.entries(bundle)) {
2989
+ if (output.type !== "asset") continue;
2990
+ const file = getAssetFile(bundleFile, output);
2991
+ if (!options.opts.cssMatcher(file) || !/\.css(?:$|[?#])/i.test(file)) continue;
2992
+ const rawSource = readAssetSource(output);
2993
+ const nextCss = (0, _weapp_tailwindcss_postcss.transformWebCssSafeSelectors)((0, _weapp_tailwindcss_postcss.transformWebCssCompat)(rawSource, options.opts.generator?.webCompat ?? true), { escapeMap: options.opts.escapeMap });
2994
+ if (nextCss === rawSource) continue;
2995
+ output.source = nextCss;
2996
+ options.recordCssAssetResult?.(file, nextCss);
2997
+ options.onUpdate(file, rawSource, nextCss);
2998
+ options.debug("finalize uni-app vite webview css compat: %s bytes=%d", file, nextCss.length);
2999
+ transformed++;
3000
+ }
3001
+ return transformed;
3002
+ }
2717
3003
  function isRootMiniProgramStyleOutputFile(file) {
2718
3004
  const normalized = require_source_candidate_scan_signature.normalizeOutputPathKey(file.replace(/[?#].*$/, ""));
2719
3005
  return !normalized.includes("/") && /\.(?:wxss|acss|ttss|qss|jxss|tyss)$/i.test(normalized);
@@ -2782,7 +3068,7 @@ function normalizeTaroRootImportShellAssets(bundle, options) {
2782
3068
  return updated;
2783
3069
  }
2784
3070
  async function finalizeGenerateBundle(options) {
2785
- const { activeProcessCacheKeys, activeProcessHashKeys, activeViteCssCacheFiles, bundle, bundleFiles, cache, cssTaskFactories, debug, defaultStyleOutputExtension, formatIteration, generatorCandidateSignature, generatorRuntime, getCssHandlerOptions, getSourceCandidateSourcesForEntries, getSourceCandidatesForEntries, getViteCssCacheStats, getViteProcessedCssAssetResults, hmrTimingRecorder, hmrTimingStartedAt, isHarmonyAppStyleTarget, isNativeAppStyleTarget, isViteProcessedCssAsset, isWebGeneratorTarget, jsAfterCss, jsTaskFactories, lastCssResultByFile, lastCssSourceHashByFile, linkedByEntry, markCssAssetProcessed, metrics, onEnd, onUpdate, opts, pendingLinkedUpdates, pruneViteCssCaches, recordCssAssetResult, recordTimingDetail, recordViteProcessedCssAssetResult, rootDir, runtime, runtimeState, shouldPreserveAppCssExtension, snapshot, sourceCandidates, sourceRoot, state, styleHandler, tasks, timingDetails, transformRuntime, useIncrementalMode } = options;
3071
+ const { activeProcessCacheKeys, activeProcessHashKeys, activeViteCssCacheFiles, bundle, bundleFiles, cache, cssTaskFactories, debug, defaultStyleOutputExtension, formatIteration, generatorCandidateSignature, generatorRuntime, getCssHandlerOptions, getSourceCandidateSourcesForEntries, getSourceCandidatesForEntries, getViteCssCacheStats, getViteProcessedCssAssetResults, hmrTimingRecorder, hmrTimingStartedAt, isHarmonyAppStyleTarget, isNativeAppStyleTarget, isViteProcessedCssAsset, isWebGeneratorTarget, jsAfterCss, jsTaskFactories, lastCssResultByFile, lastCssSourceHashByFile, linkedByEntry, markCssAssetProcessed, metrics, onEnd, onUpdate, opts, outDir, pendingLinkedUpdates, pruneViteCssCaches, recordCssAssetResult, recordTimingDetail, recordViteProcessedCssAssetResult, rootDir, runtime, runtimeState, shouldPreserveAppCssExtension, snapshot, sourceCandidates, sourceRoot, state, styleHandler, tasks, timingDetails, transformRuntime, transformWebTargetCss, useIncrementalMode } = options;
2786
3072
  const tasksStart = performance.now();
2787
3073
  if (cssTaskFactories.length > 0) {
2788
3074
  const cssTask = require_hmr_timing.runWithConcurrency(cssTaskFactories, resolveViteCssTaskConcurrency(useIncrementalMode, runtimeState.tailwindRuntime.majorVersion)).then(() => void 0);
@@ -2817,6 +3103,7 @@ async function finalizeGenerateBundle(options) {
2817
3103
  recordViteProcessedCssAssetResult,
2818
3104
  resolveViteProcessedCssOutputFile: (file) => resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot, defaultStyleOutputExtension, bundleFiles),
2819
3105
  subpackageRoots: collectMiniProgramSubpackageRoots(bundle),
3106
+ transformCss: transformWebTargetCss,
2820
3107
  debug
2821
3108
  });
2822
3109
  return injectViteProcessedCssIntoMainCssAssets(bundle, {
@@ -2824,6 +3111,7 @@ async function finalizeGenerateBundle(options) {
2824
3111
  getViteProcessedCssAssetResults,
2825
3112
  markCssAssetProcessed,
2826
3113
  recordCssAssetResult,
3114
+ transformCss: transformWebTargetCss,
2827
3115
  shouldRemoveInjectedSourceAsset: (targetFile, record) => {
2828
3116
  if (record.injectIntoMain === false) return false;
2829
3117
  const targetFileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(targetFile);
@@ -2849,11 +3137,13 @@ async function finalizeGenerateBundle(options) {
2849
3137
  removeCssCoveredByRootStyleAssets(bundle, {
2850
3138
  cssMatcher: opts.cssMatcher,
2851
3139
  debug,
3140
+ includeTailwindGeneratedCssAssets: opts.appType === "uni-app-vite" && isWebGeneratorTarget && isUniAppViteWebviewAppBundle(bundleFiles),
2852
3141
  isViteProcessedCssAsset,
2853
3142
  onUpdate,
2854
3143
  recordCssAssetResult,
2855
3144
  subpackageRoots: collectMiniProgramSubpackageRoots(bundle)
2856
3145
  });
3146
+ if (opts.appType === "uni-app-vite" && isWebGeneratorTarget && isUniAppViteWebviewAppBundle(Object.keys(bundle))) removeDuplicateUnlinkedRootCssAssetsReferencedByHtml(bundle, { debug });
2857
3147
  await finalizeMiniProgramCssAssets(bundle, {
2858
3148
  cssMatcher: opts.cssMatcher,
2859
3149
  debug,
@@ -2864,6 +3154,12 @@ async function finalizeGenerateBundle(options) {
2864
3154
  recordCssAssetResult,
2865
3155
  styleHandler
2866
3156
  });
3157
+ if (opts.appType === "uni-app-vite" && (isWebGeneratorTarget || isUniAppViteWebviewAppBundle(Object.keys(bundle)) || isUniAppViteWebviewOutDir$2(outDir))) finalizeUniAppViteWebviewCssCompat(bundle, {
3158
+ debug,
3159
+ onUpdate,
3160
+ opts,
3161
+ recordCssAssetResult
3162
+ });
2867
3163
  const stateUpdateStart = performance.now();
2868
3164
  require_source_candidate_scan_signature.updateBundleBuildState(state, snapshot, useIncrementalMode ? linkedByEntry ?? /* @__PURE__ */ new Map() : /* @__PURE__ */ new Map(), { incremental: useIncrementalMode });
2869
3165
  state.generatorCandidateSignature = generatorCandidateSignature;
@@ -3278,7 +3574,9 @@ function collectRememberedCssReplayGroups(sources, opts, rootDir, isWebGenerator
3278
3574
  const groups = /* @__PURE__ */ new Map();
3279
3575
  for (const [key, remembered] of sources ?? []) {
3280
3576
  const cleanSourceFile = remembered.sourceFile.replace(/[?#].*$/, "");
3281
- const outputKey = require_source_candidate_scan_signature.normalizeOutputPathKey(CSS_SOURCE_OUTPUT_EXT_RE.test(cleanSourceFile) ? resolveViteCssPipelineOutputFileFromSourceFile(remembered.sourceFile, opts, rootDir, isWebGeneratorTarget, preserveCssExtension, sourceRoot, styleOutputExtension, styleOutputFiles) : resolveViteCssPipelineOutputFileFromSourceFile(remembered.outputFile, opts, rootDir, isWebGeneratorTarget, preserveCssExtension, sourceRoot, styleOutputExtension, styleOutputFiles));
3577
+ const resolvedOutputFile = CSS_SOURCE_OUTPUT_EXT_RE.test(cleanSourceFile) ? resolveViteCssPipelineOutputFileFromSourceFile(remembered.sourceFile, opts, rootDir, isWebGeneratorTarget, preserveCssExtension, sourceRoot, styleOutputExtension, styleOutputFiles) : resolveViteCssPipelineOutputFileFromSourceFile(remembered.outputFile, opts, rootDir, isWebGeneratorTarget, preserveCssExtension, sourceRoot, styleOutputExtension, styleOutputFiles);
3578
+ const rememberedOutputFile = remembered.outputFile.replace(/[?#].*$/, "");
3579
+ const outputKey = require_source_candidate_scan_signature.normalizeOutputPathKey(opts.cssMatcher(rememberedOutputFile) && !require_source_candidate_scan_signature.normalizeOutputPathKey(rememberedOutputFile).includes("/") && require_source_candidate_scan_signature.normalizeOutputPathKey(rememberedOutputFile) !== require_source_candidate_scan_signature.normalizeOutputPathKey(resolvedOutputFile.replace(/[?#].*$/, "")) ? remembered.outputFile : resolvedOutputFile);
3282
3580
  const group = groups.get(outputKey) ?? [];
3283
3581
  group.push({
3284
3582
  key,
@@ -3291,7 +3589,7 @@ function collectRememberedCssReplayGroups(sources, opts, rootDir, isWebGenerator
3291
3589
  //#endregion
3292
3590
  //#region src/bundlers/vite/generate-bundle/remembered-css-replay.ts
3293
3591
  async function processRememberedCssReplay(options) {
3294
- const { addWatchFile, activeViteCssCacheFiles, bundleFiles, cache, createScopedGeneratorRuntime, createScopedSourceCandidateGetter, createScopedSourceCandidateSourceGetter, cssTaskFactories, debug, defaultStyleOutputExtension, emitOrReplayCssAsset, generatorRuntime, getCssHandlerOptions, getCssUserHandlerOptions, getRememberedCssSignature, getRememberedCssSources, isNativeAppStyleTarget, isWebGeneratorTarget, lastCssResultByFile, lastCssSourceHashByFile, markCssAssetProcessed, metrics, normalizeViteCssCacheKey, onUpdate, opts, recordCssAssetResult, recordViteProcessedCssAssetResult, refreshRememberedCssSource, rootDir, runtimeState, setRememberedCssSignature, shouldInjectCssIntoMainFromOutput, shouldPreserveAppCssExtension, sourceRoot, styleHandler, timeTask, useIncrementalMode } = options;
3592
+ const { addWatchFile, activeViteCssCacheFiles, bundleFiles, cache, createScopedGeneratorRuntime, createScopedSourceCandidateGetter, createScopedSourceCandidateSourceGetter, cssTaskFactories, debug, defaultStyleOutputExtension, emitOrReplayCssAsset, generatorRuntime, generatorPlatform, getCssHandlerOptions, getCssUserHandlerOptions, getRememberedCssSignature, getRememberedCssSources, isNativeAppStyleTarget, isWebGeneratorTarget, lastCssResultByFile, lastCssSourceHashByFile, markCssAssetProcessed, metrics, normalizeViteCssCacheKey, onUpdate, opts, recordCssAssetResult, recordViteProcessedCssAssetResult, refreshRememberedCssSource, rootDir, runtimeState, setRememberedCssSignature, shouldInjectCssIntoMainFromOutput, shouldPreserveAppCssExtension, sourceRoot, styleHandler, timeTask, useIncrementalMode } = options;
3295
3593
  const rememberedReplayGroups = collectRememberedCssReplayGroups(getRememberedCssSources?.(), opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot, defaultStyleOutputExtension, bundleFiles);
3296
3594
  for (const [outputFile, rememberedGroup] of rememberedReplayGroups) {
3297
3595
  if (require_source_candidate_scan_signature.isHTMLRequest(outputFile) || options.opts.htmlMatcher(outputFile)) continue;
@@ -3342,6 +3640,7 @@ async function processRememberedCssReplay(options) {
3342
3640
  cssHandlerOptions,
3343
3641
  cssUserHandlerOptions: getCssUserHandlerOptions(sourceFile),
3344
3642
  getSourceCandidatesForEntries: scopedSourceCandidateGetter,
3643
+ generatorPlatform,
3345
3644
  styleHandler,
3346
3645
  debug,
3347
3646
  previousCss
@@ -3923,6 +4222,16 @@ function resolveSourceRootFromBundleGraph(config, bundle) {
3923
4222
  }
3924
4223
  //#endregion
3925
4224
  //#region src/bundlers/vite/generate-bundle.ts
4225
+ function inferPlatformFromViteOutDir$1(outDir) {
4226
+ const segment = outDir ? node_path.default.basename(node_path.default.normalize(outDir)) : void 0;
4227
+ if (!segment) return;
4228
+ const normalized = segment.trim().toLowerCase();
4229
+ if (normalized === "h5" || normalized === "web" || normalized === "app" || normalized === "app-plus" || normalized.startsWith("app-") || normalized.startsWith("mp-") || normalized.startsWith("quickapp-webview")) return normalized;
4230
+ }
4231
+ function isUniAppViteWebviewOutDir$1(outDir) {
4232
+ const normalized = outDir ? node_path.default.basename(node_path.default.normalize(outDir)).trim().toLowerCase() : void 0;
4233
+ return normalized === "app" || normalized === "app-plus";
4234
+ }
3926
4235
  function createGenerateBundleHook(context) {
3927
4236
  const state = require_source_candidate_scan_signature.createBundleBuildState();
3928
4237
  const lastCssResultByFile = /* @__PURE__ */ new Map();
@@ -3952,23 +4261,32 @@ function createGenerateBundleHook(context) {
3952
4261
  const { cache, onEnd, onStart, onUpdate, styleHandler, templateHandler, jsHandler, uniAppX } = opts;
3953
4262
  const resolvedConfig = getResolvedConfig();
3954
4263
  const uniUtsPlatform = require_utils.resolveUniUtsPlatform();
3955
- const generatorBranch = require_generator.resolveGeneratorRuntimeBranch(require_generator.normalizeWeappTailwindcssGeneratorOptions(opts.generator, {
4264
+ const generatorPlatform = opts.cssOptions?.platform ?? opts.platform ?? inferPlatformFromViteOutDir$1(resolvedConfig?.build?.outDir);
4265
+ const generatorOptions = require_generator.normalizeWeappTailwindcssGeneratorOptions(opts.generator, {
3956
4266
  appType: opts.appType,
3957
- platform: opts.cssOptions?.platform ?? opts.platform,
4267
+ platform: generatorPlatform,
3958
4268
  tailwindcssMajorVersion: runtimeState.tailwindRuntime.majorVersion,
3959
4269
  uniAppX,
3960
4270
  uniUtsPlatform
3961
- }), {
4271
+ });
4272
+ const generatorBranch = require_generator.resolveGeneratorRuntimeBranch(generatorOptions, {
3962
4273
  appType: opts.appType,
3963
- platform: opts.cssOptions?.platform ?? opts.platform,
4274
+ platform: generatorPlatform,
3964
4275
  tailwindcssMajorVersion: runtimeState.tailwindRuntime.majorVersion,
3965
4276
  uniAppX,
3966
4277
  uniUtsPlatform
3967
4278
  });
3968
4279
  const isWebGeneratorTarget = generatorBranch.isWeb;
3969
- const isNativeAppStyleTarget = uniUtsPlatform.isApp;
3970
- const canInferHarmonyAppStyleTarget = !uniUtsPlatform.normalized || uniUtsPlatform.isApp;
3971
- const isHarmonyAppStyleTarget = uniUtsPlatform.isAppHarmony || canInferHarmonyAppStyleTarget && (isUniAppXHarmonyBundle(bundle) || isUniAppXHarmonyOutDir(resolvedConfig?.build?.outDir));
4280
+ const shouldApplyWebviewSafeSelectors = opts.appType === "uni-app-vite" && isUniAppViteWebviewOutDir$1(resolvedConfig?.build?.outDir);
4281
+ const shouldApplyWebviewCssCompat = isWebGeneratorTarget || shouldApplyWebviewSafeSelectors;
4282
+ const transformWebTargetCss = (css) => {
4283
+ const compatCss = isWebGeneratorTarget ? (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(css, generatorOptions.webCompat) : shouldApplyWebviewCssCompat ? (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(css, generatorOptions.webCompat ?? true) : css;
4284
+ return shouldApplyWebviewSafeSelectors ? (0, _weapp_tailwindcss_postcss.transformWebCssSafeSelectors)(compatCss, { escapeMap: opts.escapeMap }) : compatCss;
4285
+ };
4286
+ const isUniAppXStyleTarget = opts.appType === "uni-app-x";
4287
+ const isNativeAppStyleTarget = isUniAppXStyleTarget && uniUtsPlatform.isApp;
4288
+ const canInferHarmonyAppStyleTarget = isUniAppXStyleTarget && (!uniUtsPlatform.normalized || uniUtsPlatform.isApp);
4289
+ const isHarmonyAppStyleTarget = isUniAppXStyleTarget && (uniUtsPlatform.isAppHarmony || canInferHarmonyAppStyleTarget && (isUniAppXHarmonyBundle(bundle) || isUniAppXHarmonyOutDir(resolvedConfig?.build?.outDir)));
3972
4290
  const shouldPreserveAppCssExtension = isNativeAppStyleTarget || isHarmonyAppStyleTarget;
3973
4291
  const shouldGenerateWebCssByGenerator = isWebGeneratorTarget;
3974
4292
  const { getCssHandlerOptions, getCssUserHandlerOptions } = cssHandlerOptions;
@@ -3990,6 +4308,7 @@ function createGenerateBundleHook(context) {
3990
4308
  recordViteProcessedCssAssetResult,
3991
4309
  resolveViteProcessedCssOutputFile: (file) => resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot, defaultStyleOutputExtension, Object.keys(bundle)),
3992
4310
  subpackageRoots: currentSubpackageRoots,
4311
+ transformCss: transformWebTargetCss,
3993
4312
  debug
3994
4313
  });
3995
4314
  const hmrTimingStartedAt = performance.now();
@@ -4033,7 +4352,47 @@ function createGenerateBundleHook(context) {
4033
4352
  const snapshotStart = performance.now();
4034
4353
  const snapshot = require_source_candidate_scan_signature.buildBundleSnapshot(bundle, opts, outDir, state, envFlags.disableDirtyOptimization || !useIncrementalMode, { hasOmittedKnownFiles });
4035
4354
  const configuredTailwindV4CssSourceEntriesForScope = getConfiguredTailwindV4CssSourceEntries();
4036
- const configuredTailwindV4CssSourceFileKeysForScope = new Set(configuredTailwindV4CssSourceEntriesForScope.map((entry) => require_source_candidate_scan_signature.normalizeOutputPathKey(entry.file.replace(/[?#].*$/, ""))));
4355
+ const normalizeSystemAliasPathKey = (file) => file.startsWith("/private/var/") ? file.slice(8) : file;
4356
+ const normalizeConfiguredTailwindV4CssEntryFileKey = (file) => {
4357
+ const cleanFile = file.replace(/[?#].*$/, "");
4358
+ return normalizeSystemAliasPathKey(require_source_candidate_scan_signature.normalizeOutputPathKey(node_path.default.isAbsolute(cleanFile) ? node_path.default.resolve(cleanFile) : node_path.default.resolve(opts.tailwindcssBasedir ?? rootDir, cleanFile)));
4359
+ };
4360
+ const runtimeTailwindcssOptions = require_v4_engine.resolveTailwindcssOptions(opts.tailwindcssRuntimeOptions);
4361
+ const tailwindRuntimeOptions = require_v4_engine.resolveTailwindcssOptions(runtimeState.tailwindRuntime.options);
4362
+ const configuredTailwindV4CssSourceFileKeysForScope = new Set(configuredTailwindV4CssSourceEntriesForScope.map((entry) => normalizeConfiguredTailwindV4CssEntryFileKey(entry.file)));
4363
+ const configuredTailwindV4ExplicitCssEntryFileKeysForScope = new Set([
4364
+ ...Array.isArray(opts.cssEntries) ? opts.cssEntries : [],
4365
+ ...Array.isArray(opts.tailwindcss?.v4?.cssEntries) ? opts.tailwindcss.v4.cssEntries : [],
4366
+ ...Array.isArray(runtimeTailwindcssOptions?.v4?.cssEntries) ? runtimeTailwindcssOptions.v4.cssEntries : [],
4367
+ ...Array.isArray(tailwindRuntimeOptions?.v4?.cssEntries) ? tailwindRuntimeOptions.v4.cssEntries : []
4368
+ ].filter((file) => typeof file === "string" && file.length > 0).map(normalizeConfiguredTailwindV4CssEntryFileKey));
4369
+ const resolveUniAppViteWebviewRootCssInjectionTarget = (sourceFile, outputFile) => {
4370
+ if (opts.appType !== "uni-app-vite" || !outputFile.replace(/[?#].*$/, "").endsWith(".css") || typeof sourceFile !== "string" || !configuredTailwindV4ExplicitCssEntryFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(sourceFile))) return;
4371
+ const rootCssFiles = bundleFiles.filter((file) => {
4372
+ const normalized = require_source_candidate_scan_signature.normalizeOutputPathKey(file.replace(/[?#].*$/, ""));
4373
+ return opts.cssMatcher(file) && normalized.endsWith(".css") && !normalized.includes("/");
4374
+ });
4375
+ const matchedRootCssFiles = rootCssFiles.filter((file) => getCssHandlerOptions(file).isMainChunk);
4376
+ if (matchedRootCssFiles.length === 1) return matchedRootCssFiles[0];
4377
+ if (matchedRootCssFiles.length > 1) return;
4378
+ return rootCssFiles.length === 1 ? rootCssFiles[0] : void 0;
4379
+ };
4380
+ const resolveConfiguredTailwindV4CssEntryOutputFile = (sourceFile) => resolveViteCssPipelineOutputFile(sourceFile, opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot, defaultStyleOutputExtension, bundleFiles);
4381
+ const selectUniAppViteWebviewRootCssSourceEntry = (outputFile, entries) => {
4382
+ if (opts.appType !== "uni-app-vite" || !isWebGeneratorTarget || !opts.cssMatcher(outputFile) || require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile.replace(/[?#].*$/, "")).includes("/")) return;
4383
+ const generationEntries = entries.filter((entry) => hasTailwindGenerationSource(entry.source));
4384
+ if (generationEntries.length <= 1) return generationEntries[0];
4385
+ const rootOutputEntries = generationEntries.filter((entry) => {
4386
+ return !require_source_candidate_scan_signature.normalizeOutputPathKey(resolveConfiguredTailwindV4CssEntryOutputFile(entry.file).replace(/[?#].*$/, "")).includes("/");
4387
+ });
4388
+ if (rootOutputEntries.length === 1) return rootOutputEntries[0];
4389
+ if (currentSubpackageRoots) {
4390
+ const mainPackageEntries = generationEntries.filter((entry) => {
4391
+ return !isSubpackageOutputFile(resolveConfiguredTailwindV4CssEntryOutputFile(entry.file), currentSubpackageRoots);
4392
+ });
4393
+ if (mainPackageEntries.length === 1) return mainPackageEntries[0];
4394
+ }
4395
+ };
4037
4396
  const { createScopedSourceCandidateGetter, createScopedSourceCandidateSourceGetter, shouldExcludeSubpackageSourceCandidates, shouldInjectCssIntoMainFromOutput } = createSubpackageSourceCandidateScope({
4038
4397
  cssSourceFiles: configuredTailwindV4CssSourceEntriesForScope.map((entry) => entry.file),
4039
4398
  getSourceCandidateSourcesForEntries,
@@ -4189,10 +4548,14 @@ function createGenerateBundleHook(context) {
4189
4548
  onUpdate,
4190
4549
  debug
4191
4550
  });
4192
- const createHandlerOptions = createJsHandlerOptionsFactory({
4551
+ const createBaseHandlerOptions = createJsHandlerOptionsFactory({
4193
4552
  getMajorVersion: () => runtimeState.tailwindRuntime.majorVersion,
4194
4553
  moduleGraph: moduleGraphOptions
4195
4554
  });
4555
+ const createHandlerOptions = (absoluteFilename, extra) => createBaseHandlerOptions(absoluteFilename, shouldApplyWebviewSafeSelectors ? {
4556
+ needEscaped: true,
4557
+ ...extra
4558
+ } : extra);
4196
4559
  const linkedByEntry = useIncrementalMode ? /* @__PURE__ */ new Map() : void 0;
4197
4560
  const sharedCssResultCache = /* @__PURE__ */ new Map();
4198
4561
  const activeProcessCacheKeys = /* @__PURE__ */ new Set();
@@ -4307,7 +4670,7 @@ function createGenerateBundleHook(context) {
4307
4670
  return await refreshRememberedCssSource?.(remembered) ?? remembered;
4308
4671
  }));
4309
4672
  rememberedCssSources = rememberedCssSources.filter((remembered) => {
4310
- if (!configuredTailwindV4CssSourceFileKeysForScope.has(require_source_candidate_scan_signature.normalizeOutputPathKey(remembered.sourceFile.replace(/[?#].*$/, "")))) return true;
4673
+ if (!configuredTailwindV4CssSourceFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(remembered.sourceFile))) return true;
4311
4674
  const matchedOutputFile = resolveMatchedOutputFileForCurrentAsset(remembered.sourceFile);
4312
4675
  return !matchedOutputFile || require_source_candidate_scan_signature.normalizeOutputPathKey(matchedOutputFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile);
4313
4676
  });
@@ -4318,7 +4681,7 @@ function createGenerateBundleHook(context) {
4318
4681
  const rememberedSourcesBelongToInferredSfc = rememberedCssSources.length > 0 && rememberedCssSources.every((remembered) => normalizeSfcSourceFileForCompare(remembered.sourceFile) === inferredSourceFile);
4319
4682
  if (!hasUsableRememberedTailwindSource || rememberedSourcesBelongToInferredSfc) rememberedCssSources = [inferredSfcStyleSource];
4320
4683
  }
4321
- if (isTemporaryCssAssetFile(outputFile) && rememberedCssSources.some((remembered) => configuredTailwindV4CssSourceFileKeysForScope.has(require_source_candidate_scan_signature.normalizeOutputPathKey(remembered.sourceFile.replace(/[?#].*$/, ""))))) {
4684
+ if (isTemporaryCssAssetFile(outputFile) && rememberedCssSources.some((remembered) => configuredTailwindV4CssSourceFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(remembered.sourceFile)))) {
4322
4685
  rememberedCssSources = [];
4323
4686
  hasUsableRememberedTailwindSource = false;
4324
4687
  }
@@ -4346,7 +4709,14 @@ function createGenerateBundleHook(context) {
4346
4709
  }
4347
4710
  if (!hasUsableRememberedTailwindSource) {
4348
4711
  const configuredTailwindV4CssSourceEntries = getConfiguredTailwindV4CssSourceEntries();
4349
- const inferredOriginalSourceStyle = resolveSourceStyleSourceFromOutputFile(outputFile, snapshot, outDir, sourceRoot, getCssSource, getSourceCandidateSources, configuredTailwindV4CssSourceEntries.map((entry) => [entry.file, entry.source]), debug) ?? (outputFile === file ? void 0 : resolveSourceStyleSourceFromOutputFile(file, snapshot, outDir, sourceRoot, getCssSource, getSourceCandidateSources, configuredTailwindV4CssSourceEntries.map((entry) => [entry.file, entry.source]), debug));
4712
+ const inferredSourceStyle = resolveSourceStyleSourceFromOutputFile(outputFile, snapshot, outDir, sourceRoot, getCssSource, getSourceCandidateSources, configuredTailwindV4CssSourceEntries.map((entry) => [entry.file, entry.source]), debug);
4713
+ const inferredWebviewRootSourceEntry = inferredSourceStyle ? void 0 : selectUniAppViteWebviewRootCssSourceEntry(outputFile, configuredTailwindV4CssSourceEntries);
4714
+ const inferredWebviewRootSourceStyle = inferredWebviewRootSourceEntry ? {
4715
+ outputFile,
4716
+ rawSource: inferredWebviewRootSourceEntry.source,
4717
+ sourceFile: inferredWebviewRootSourceEntry.file
4718
+ } : void 0;
4719
+ const inferredOriginalSourceStyle = inferredSourceStyle ?? (outputFile === file ? void 0 : resolveSourceStyleSourceFromOutputFile(file, snapshot, outDir, sourceRoot, getCssSource, getSourceCandidateSources, configuredTailwindV4CssSourceEntries.map((entry) => [entry.file, entry.source]), debug)) ?? inferredWebviewRootSourceStyle;
4350
4720
  if (inferredOriginalSourceStyle) {
4351
4721
  outputFile = resolveMatchedOutputFileForCurrentAsset(inferredOriginalSourceStyle.sourceFile) ?? outputFile;
4352
4722
  activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
@@ -4396,7 +4766,7 @@ function createGenerateBundleHook(context) {
4396
4766
  }
4397
4767
  }
4398
4768
  let rememberedCssSource = mergeRememberedCssSources(rememberedCssSources, outputFile);
4399
- if (rememberedCssSource && viteProcessedCssAsset && outputCssHandlerOptions.isMainChunk !== true && configuredTailwindV4CssSourceFileKeysForScope.has(require_source_candidate_scan_signature.normalizeOutputPathKey(rememberedCssSource.sourceFile.replace(/[?#].*$/, "")))) {
4769
+ if (rememberedCssSource && viteProcessedCssAsset && outputCssHandlerOptions.isMainChunk !== true && configuredTailwindV4CssSourceFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(rememberedCssSource.sourceFile))) {
4400
4770
  const matchedOutputFile = resolveMatchedOutputFileForCurrentAsset(rememberedCssSource.sourceFile);
4401
4771
  if (matchedOutputFile && require_source_candidate_scan_signature.normalizeOutputPathKey(matchedOutputFile) !== require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile)) {
4402
4772
  outputFile = matchedOutputFile;
@@ -4425,11 +4795,12 @@ function createGenerateBundleHook(context) {
4425
4795
  }
4426
4796
  const hasRememberedApplyDirective = rememberedCssSource != null && require_v4_engine.hasTailwindApplyDirective(rememberedCssSource.rawSource);
4427
4797
  const hasRememberedTailwindGenerationSource = rememberedCssSource != null && hasTailwindGenerationSource(rememberedCssSource.rawSource);
4428
- const usesConfiguredTailwindV4FallbackSource = rememberedCssSource != null && require_source_candidate_scan_signature.normalizeOutputPathKey(rememberedCssSource.outputFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile) && require_source_candidate_scan_signature.normalizeOutputPathKey(rememberedCssSource.sourceFile.replace(/[?#].*$/, "")) !== require_source_candidate_scan_signature.normalizeOutputPathKey(file);
4429
4798
  const hasSameOutputRememberedTailwindGenerationSource = hasRememberedTailwindGenerationSource && rememberedCssSource != null && require_source_candidate_scan_signature.normalizeOutputPathKey(rememberedCssSource.outputFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile);
4430
4799
  const hasStaleViteProcessedCssSource = vitePipelineCssAsset && hasDifferentRememberedCssSource && (hasCurrentTailwindGenerationDirective || hasRememberedApplyDirective || hasRememberedTailwindGenerationSource);
4431
4800
  const generatorSourceFile = vitePipelineCssAsset ? rememberedCssSource?.sourceFile ?? assetSourceFile : assetSourceFile;
4432
- if (vitePipelineCssAsset && outputCssHandlerOptions.isMainChunk !== true && configuredTailwindV4CssSourceFileKeysForScope.has(require_source_candidate_scan_signature.normalizeOutputPathKey(generatorSourceFile.replace(/[?#].*$/, "")))) {
4801
+ const webviewRootCssInjectionTarget = vitePipelineCssAsset ? resolveUniAppViteWebviewRootCssInjectionTarget(generatorSourceFile, outputFile) : void 0;
4802
+ const usesConfiguredTailwindV4FallbackSource = rememberedCssSource != null && require_source_candidate_scan_signature.normalizeOutputPathKey(rememberedCssSource.outputFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile) && require_source_candidate_scan_signature.normalizeOutputPathKey(rememberedCssSource.sourceFile.replace(/[?#].*$/, "")) !== require_source_candidate_scan_signature.normalizeOutputPathKey(file);
4803
+ if (vitePipelineCssAsset && outputCssHandlerOptions.isMainChunk !== true && configuredTailwindV4CssSourceFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(generatorSourceFile))) {
4433
4804
  usedConfiguredTailwindV4CssSourceFiles.add(require_source_candidate_scan_signature.normalizeOutputPathKey(generatorSourceFile));
4434
4805
  temporaryCssAssetSourceResolver.markUsed(generatorSourceFile);
4435
4806
  }
@@ -4437,7 +4808,7 @@ function createGenerateBundleHook(context) {
4437
4808
  ...getCssHandlerOptions(generatorSourceFile),
4438
4809
  isMainChunk: resolvedFromTemporaryCssAsset ? false : outputCssHandlerOptions.isMainChunk
4439
4810
  } : getCssHandlerOptions(file);
4440
- const generatorCssEntries = configuredTailwindV4CssSourceFileKeysForScope.has(require_source_candidate_scan_signature.normalizeOutputPathKey(generatorSourceFile.replace(/[?#].*$/, ""))) ? [generatorSourceFile] : opts.cssEntries;
4811
+ const generatorCssEntries = configuredTailwindV4ExplicitCssEntryFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(generatorSourceFile)) ? [generatorSourceFile] : opts.cssEntries;
4441
4812
  const generatorCssHandlerOptions = {
4442
4813
  ...cssHandlerOptions,
4443
4814
  sourceOptions: {
@@ -4455,6 +4826,10 @@ function createGenerateBundleHook(context) {
4455
4826
  opts,
4456
4827
  tokenSources: sourceTraceTokenSources
4457
4828
  });
4829
+ const removeRootCoveredCssFromScopedAsset = (css) => {
4830
+ const normalizedOutputFile = require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile.replace(/[?#].*$/, ""));
4831
+ return !normalizedOutputFile.includes("/") || currentSubpackageRoots != null && isSubpackageOutputFile(normalizedOutputFile, currentSubpackageRoots) ? css : removeCssCoveredByRootStyleBundleSources(bundle, outputFile, css);
4832
+ };
4458
4833
  const shouldRegenerateMainPackageCssWithScopedCandidates = vitePipelineCssAsset && shouldExcludeSubpackageSourceCandidates(outputFile, generatorCssHandlerOptions);
4459
4834
  const generatorCssUserHandlerOptions = getCssUserHandlerOptions(generatorSourceFile);
4460
4835
  const cssRuntimeAffectingSignature = vitePipelineCssAsset ? require_source_candidate_scan_signature.createRuntimeAffectingSourceSignature(generatorRawSource, "css") : snapshot.runtimeAffectingSignatureByFile.get(file) ?? require_source_candidate_scan_signature.createRuntimeAffectingSourceSignature(generatorRawSource, "css");
@@ -4462,19 +4837,30 @@ function createGenerateBundleHook(context) {
4462
4837
  const cssShareScope = createCssTransformShareScopeKey(opts, outputFile, generatorRawSource);
4463
4838
  const shouldRegenerateCollectedViteCss = viteProcessedCssAsset && useIncrementalMode && state.generatorCandidateSignature !== void 0 && generatorCandidatesChanged && (hasTailwindGenerationSource(generatorRawSource) || require_source_candidate_scan_signature.hasBundlerGeneratedCssMarker(rawSource) || rememberedCssSource != null && hasTailwindGenerationSource(rememberedCssSource.rawSource));
4464
4839
  const shouldRefreshViteProcessedCssByCandidates = viteProcessedCssAsset && useIncrementalMode && state.generatorCandidateSignature !== void 0 && generatorCandidatesChanged;
4465
- const shouldInjectVitePipelineCssIntoMain = vitePipelineCssAsset && outputCssHandlerOptions.isMainChunk !== true && shouldInjectCssIntoMainFromOutput(outputFile, generatorSourceFile, outputCssHandlerOptions);
4840
+ const vitePipelineCssInjectionOutputFile = webviewRootCssInjectionTarget ?? outputFile;
4841
+ const shouldRecordVitePipelineCssByOutput = require_source_candidate_scan_signature.normalizeOutputPathKey(vitePipelineCssInjectionOutputFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile);
4842
+ const shouldInjectVitePipelineCssIntoMain = vitePipelineCssAsset && outputCssHandlerOptions.isMainChunk !== true && (webviewRootCssInjectionTarget != null || shouldInjectCssIntoMainFromOutput(outputFile, generatorSourceFile, outputCssHandlerOptions));
4466
4843
  const shouldTrackGeneratorRuntime = hasStaleViteProcessedCssSource || shouldRegenerateMainPackageCssWithScopedCandidates || hasCurrentTailwindGenerationDirective || hasSameOutputRememberedTailwindGenerationSource || shouldProcessTailwindGeneration && (!useIncrementalMode || cssHandlerOptions.isMainChunk || processFiles.css.has(file) || runtimeLinkedCssFiles.has(file) || runtimeLinkedCssFiles.has(outputFile) || shouldRegenerateCollectedViteCss || hasRuntimeAffectingChanges && (alreadyProcessedCssAsset || vitePipelineCssAsset));
4467
4844
  const shouldPreserveCollectedViteCssAsset = !shouldRegenerateCollectedViteCss && (state.generatorCandidateSignature === void 0 || !generatorCandidatesChanged) && (collectedBundlerGeneratedCssFiles.has(file) || require_source_candidate_scan_signature.hasBundlerGeneratedCssMarker(rawSource));
4468
4845
  const strippedViteProcessedCss = require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(rawSource);
4469
4846
  const shouldPreserveStaleGeneratedCssAsset = hasStaleViteProcessedCssSource && shouldPreserveCollectedViteCssAsset && strippedViteProcessedCss.trim().length > 0 && !strippedViteProcessedCss.includes("weapp-tailwindcss generator-placeholder") && !strippedViteProcessedCss.includes("vite-placeholder") && !hasTailwindGenerationSource(strippedViteProcessedCss) && !require_v4_engine.hasTailwindApplyDirective(strippedViteProcessedCss);
4470
4847
  if (alreadyProcessedCssAsset && !shouldRefreshViteProcessedCssByCandidates && (!hasStaleViteProcessedCssSource || shouldPreserveStaleGeneratedCssAsset) && !hasRememberedApplySource && !shouldRegenerateMainPackageCssWithScopedCandidates && (!shouldTrackGeneratorRuntime || shouldPreserveCollectedViteCssAsset)) {
4471
- const nextCss = strippedViteProcessedCss;
4848
+ const nextCss = removeRootCoveredCssFromScopedAsset(strippedViteProcessedCss);
4472
4849
  applyCssResult(nextCss);
4473
4850
  markCssAssetProcessed?.(originalSource, outputFile);
4474
4851
  recordCssAssetResult?.(outputFile, nextCss);
4475
- recordViteProcessedCssAssetResult?.(outputFile, nextCss, {
4852
+ if (vitePipelineCssAsset && rememberedCssSource) rememberCssSource?.({
4853
+ outputFile: vitePipelineCssInjectionOutputFile,
4854
+ rawSource: generatorRawSource,
4855
+ sourceFile: generatorSourceFile
4856
+ });
4857
+ if (shouldRecordVitePipelineCssByOutput) recordViteProcessedCssAssetResult?.(vitePipelineCssInjectionOutputFile, nextCss, {
4476
4858
  injectIntoMain: outputCssHandlerOptions.isMainChunk ? false : shouldInjectVitePipelineCssIntoMain,
4477
- outputFile
4859
+ outputFile: vitePipelineCssInjectionOutputFile
4860
+ });
4861
+ if (vitePipelineCssAsset && shouldInjectVitePipelineCssIntoMain) recordViteProcessedCssAssetResult?.(file, nextCss, {
4862
+ injectIntoMain: shouldInjectVitePipelineCssIntoMain,
4863
+ outputFile: vitePipelineCssInjectionOutputFile
4478
4864
  });
4479
4865
  onUpdate(outputFile, rawSource, nextCss);
4480
4866
  debug("css skip vite-processed asset: %s", outputFile);
@@ -4512,7 +4898,7 @@ function createGenerateBundleHook(context) {
4512
4898
  rememberLastCssResult(lastCssResultByFile, lastCssSourceHashByFile, outputFile, source, cssRuntimeAffectingHash);
4513
4899
  markCssAssetProcessed?.(originalSource, outputFile);
4514
4900
  if (rememberedCssSources.length <= 1) rememberCssSource?.({
4515
- outputFile,
4901
+ outputFile: vitePipelineCssInjectionOutputFile,
4516
4902
  rawSource: generatorRawSource,
4517
4903
  sourceFile: generatorSourceFile
4518
4904
  }, rememberedCssRuntimeSignature);
@@ -4547,6 +4933,7 @@ function createGenerateBundleHook(context) {
4547
4933
  cssUserHandlerOptions: generatorCssUserHandlerOptions,
4548
4934
  getSourceCandidatesForEntries: scopedSourceCandidateGetter,
4549
4935
  sourceCandidates: scopedGeneratorRuntime,
4936
+ generatorPlatform,
4550
4937
  styleHandler,
4551
4938
  debug,
4552
4939
  previousCss,
@@ -4554,19 +4941,19 @@ function createGenerateBundleHook(context) {
4554
4941
  ...usesConfiguredTailwindV4FallbackSource ? { restoreLocalCssImports: false } : {}
4555
4942
  }) : void 0;
4556
4943
  if (generated) {
4557
- const tracedCss = annotateCss(generated.css);
4944
+ const tracedCss = removeRootCoveredCssFromScopedAsset(annotateCss(transformWebTargetCss(generated.css)));
4558
4945
  registerGeneratorDependencies$1({ addWatchFile }, generated.dependencies);
4559
4946
  if (envFlags.debugCssDiff) debug("css diff %s: %s", generatorSourceFile, require_source_candidate_scan_signature.summarizeStringDiff(generatorRawSource, tracedCss));
4560
4947
  debug("css generated result: %s bytes=%d", file, tracedCss.length);
4561
4948
  for (const candidate of generated.classSet ?? []) transformRuntime.add(candidate);
4562
4949
  recordCssAssetResult?.(outputFile, tracedCss);
4563
- recordViteProcessedCssAssetResult?.(outputFile, tracedCss, {
4950
+ if (shouldRecordVitePipelineCssByOutput) recordViteProcessedCssAssetResult?.(vitePipelineCssInjectionOutputFile, tracedCss, {
4564
4951
  injectIntoMain: outputCssHandlerOptions.isMainChunk ? false : shouldInjectVitePipelineCssIntoMain,
4565
- outputFile
4952
+ outputFile: vitePipelineCssInjectionOutputFile
4566
4953
  });
4567
4954
  if (vitePipelineCssAsset && shouldInjectVitePipelineCssIntoMain) recordViteProcessedCssAssetResult?.(file, tracedCss, {
4568
4955
  injectIntoMain: shouldInjectVitePipelineCssIntoMain,
4569
- outputFile
4956
+ outputFile: vitePipelineCssInjectionOutputFile
4570
4957
  });
4571
4958
  metrics.css.elapsed += measureElapsed(start);
4572
4959
  metrics.css.transformed++;
@@ -4574,10 +4961,11 @@ function createGenerateBundleHook(context) {
4574
4961
  return tracedCss;
4575
4962
  }
4576
4963
  if (isWebGeneratorTarget) {
4964
+ const outputCss = transformWebTargetCss(rawSource);
4577
4965
  metrics.css.elapsed += measureElapsed(start);
4578
4966
  metrics.css.transformed++;
4579
4967
  debug("css preserve web target: %s", outputFile);
4580
- return annotateCss(rawSource);
4968
+ return annotateCss(outputCss);
4581
4969
  }
4582
4970
  const { css } = await styleHandler(generatorRawSource, cssHandlerOptions);
4583
4971
  const tracedCss = annotateCss(css);
@@ -4597,7 +4985,7 @@ function createGenerateBundleHook(context) {
4597
4985
  continue;
4598
4986
  }
4599
4987
  if (type !== "js") continue;
4600
- if (isWebGeneratorTarget) {
4988
+ if (isWebGeneratorTarget && !shouldApplyWebviewSafeSelectors) {
4601
4989
  debug("js skip web target: %s", file);
4602
4990
  continue;
4603
4991
  }
@@ -4643,6 +5031,7 @@ function createGenerateBundleHook(context) {
4643
5031
  debug,
4644
5032
  defaultStyleOutputExtension,
4645
5033
  emitOrReplayCssAsset,
5034
+ generatorPlatform,
4646
5035
  generatorRuntime,
4647
5036
  getCssHandlerOptions,
4648
5037
  getCssUserHandlerOptions,
@@ -4722,12 +5111,19 @@ function createGenerateBundleHook(context) {
4722
5111
  tasks,
4723
5112
  timingDetails,
4724
5113
  transformRuntime,
5114
+ transformWebTargetCss,
4725
5115
  useIncrementalMode
4726
5116
  });
4727
5117
  };
4728
5118
  }
4729
5119
  //#endregion
4730
5120
  //#region src/bundlers/vite/css-finalizer.ts
5121
+ function inferPlatformFromViteOutDir(outDir) {
5122
+ const segment = outDir ? node_path.default.basename(node_path.default.normalize(outDir)) : void 0;
5123
+ if (!segment) return;
5124
+ const normalized = segment.trim().toLowerCase();
5125
+ if (normalized === "h5" || normalized === "web" || normalized === "app" || normalized === "app-plus" || normalized.startsWith("app-") || normalized.startsWith("mp-") || normalized.startsWith("quickapp-webview")) return normalized;
5126
+ }
4731
5127
  function isAddWatchFileInvalidRollupPhaseError(error) {
4732
5128
  const candidate = error;
4733
5129
  return candidate?.code === "INVALID_ROLLUP_PHASE" || candidate?.pluginCode === "INVALID_ROLLUP_PHASE" || candidate?.message?.includes("Cannot call \"addWatchFile\" after the build has finished.") === true;
@@ -4771,8 +5167,13 @@ function shouldFinalizeProcessedCssAsset(opts, file) {
4771
5167
  function collectViteProcessedCssSources(getViteProcessedCssAssetResults) {
4772
5168
  return [...getViteProcessedCssAssetResults?.() ?? []].map(([, record]) => typeof record === "string" ? record : record.css);
4773
5169
  }
4774
- function finalizeWebCss(css, enabled, webCompat) {
4775
- return enabled ? (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(css, webCompat) : css;
5170
+ function isUniAppViteWebviewOutDir(outDir) {
5171
+ const normalized = outDir ? node_path.default.basename(node_path.default.normalize(outDir)).trim().toLowerCase() : void 0;
5172
+ return normalized === "app" || normalized === "app-plus";
5173
+ }
5174
+ function finalizeWebCss(css, enabled, webCompat, options = {}) {
5175
+ const compatCss = enabled ? (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(css, webCompat) : css;
5176
+ return options.safeSelectors ? (0, _weapp_tailwindcss_postcss.transformWebCssSafeSelectors)(compatCss, { escapeMap: options.escapeMap }) : compatCss;
4776
5177
  }
4777
5178
  function createViteCssFinalizerOutputPlugin(context) {
4778
5179
  return {
@@ -4784,24 +5185,27 @@ function createViteCssFinalizerOutputPlugin(context) {
4784
5185
  const { opts, runtimeState, ensureRuntimeClassSet, isCssAssetProcessed, markCssAssetProcessed, debug, getResolvedConfig, recordCssAssetResult, recordViteProcessedCssAssetResult, getViteProcessedCssAssetResults, getRecordedGeneratorCandidates, getSourceCandidates, getSourceCandidatesForEntries, getSourceCandidateSourcesForEntries, waitForSourceCandidateSyncs, rememberMainCssSource, getRememberedMainCssSource, isViteProcessedCssAsset } = context;
4785
5186
  const resolvedConfig = getResolvedConfig();
4786
5187
  const uniUtsPlatform = require_utils.resolveUniUtsPlatform();
5188
+ const generatorPlatform = opts.cssOptions?.platform ?? opts.platform ?? inferPlatformFromViteOutDir(resolvedConfig?.build?.outDir);
4787
5189
  const generatorOptions = require_generator.normalizeWeappTailwindcssGeneratorOptions(opts.generator, {
4788
5190
  appType: opts.appType,
4789
- platform: opts.cssOptions?.platform ?? opts.platform,
5191
+ platform: generatorPlatform,
4790
5192
  tailwindcssMajorVersion: runtimeState.tailwindRuntime.majorVersion,
4791
5193
  uniAppX: opts.uniAppX,
4792
5194
  uniUtsPlatform
4793
5195
  });
4794
5196
  const generatorBranch = require_generator.resolveGeneratorRuntimeBranch(generatorOptions, {
4795
5197
  appType: opts.appType,
4796
- platform: opts.cssOptions?.platform ?? opts.platform,
5198
+ platform: generatorPlatform,
4797
5199
  tailwindcssMajorVersion: runtimeState.tailwindRuntime.majorVersion,
4798
5200
  uniAppX: opts.uniAppX,
4799
5201
  uniUtsPlatform
4800
5202
  });
4801
5203
  const isWebGeneratorTarget = generatorBranch.isWeb;
4802
- const canInferHarmonyAppStyleTarget = !uniUtsPlatform.normalized || uniUtsPlatform.isApp;
4803
- const isHarmonyAppStyleTarget = uniUtsPlatform.isAppHarmony || canInferHarmonyAppStyleTarget && (isUniAppXHarmonyBundle(bundle) || isUniAppXHarmonyOutDir(resolvedConfig?.build?.outDir));
4804
- const isNativeAppStyleTarget = uniUtsPlatform.isApp || isHarmonyAppStyleTarget;
5204
+ const shouldApplyWebviewSafeSelectors = opts.appType === "uni-app-vite" && isUniAppViteWebviewOutDir(resolvedConfig?.build?.outDir);
5205
+ const isUniAppXStyleTarget = opts.appType === "uni-app-x";
5206
+ const canInferHarmonyAppStyleTarget = isUniAppXStyleTarget && (!uniUtsPlatform.normalized || uniUtsPlatform.isApp);
5207
+ const isHarmonyAppStyleTarget = isUniAppXStyleTarget && (uniUtsPlatform.isAppHarmony || canInferHarmonyAppStyleTarget && (isUniAppXHarmonyBundle(bundle) || isUniAppXHarmonyOutDir(resolvedConfig?.build?.outDir)));
5208
+ const isNativeAppStyleTarget = isUniAppXStyleTarget && (uniUtsPlatform.isApp || isHarmonyAppStyleTarget);
4805
5209
  if (resolvedConfig?.command !== "build" && !isNativeAppStyleTarget) return;
4806
5210
  const rootDir = resolvedConfig?.root ? node_path.default.resolve(resolvedConfig.root) : node_process.default.cwd();
4807
5211
  const sourceRoot = resolveWeappViteSourceRoot(resolvedConfig, opts.appType) ?? resolveSourceRootFromBundleGraph(resolvedConfig, bundle);
@@ -4818,7 +5222,10 @@ function createViteCssFinalizerOutputPlugin(context) {
4818
5222
  recordCssAssetResult,
4819
5223
  recordViteProcessedCssAssetResult,
4820
5224
  resolveViteProcessedCssOutputFile: (file) => resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, isNativeAppStyleTarget, sourceRoot, resolveMiniProgramStyleOutputExtension({ files: Object.keys(bundle) }), Object.keys(bundle)),
4821
- transformCss: (css) => finalizeWebCss(css, generatorBranch.isWeb, generatorOptions.webCompat),
5225
+ transformCss: (css) => finalizeWebCss(css, generatorBranch.isWeb, generatorOptions.webCompat, {
5226
+ escapeMap: opts.escapeMap,
5227
+ safeSelectors: shouldApplyWebviewSafeSelectors
5228
+ }),
4822
5229
  debug
4823
5230
  });
4824
5231
  };
@@ -4828,6 +5235,10 @@ function createViteCssFinalizerOutputPlugin(context) {
4828
5235
  getViteProcessedCssAssetResults,
4829
5236
  markCssAssetProcessed,
4830
5237
  recordCssAssetResult,
5238
+ transformCss: (css) => finalizeWebCss(css, generatorBranch.isWeb, generatorOptions.webCompat, {
5239
+ escapeMap: opts.escapeMap,
5240
+ safeSelectors: shouldApplyWebviewSafeSelectors
5241
+ }),
4831
5242
  debug,
4832
5243
  onUpdate: opts.onUpdate
4833
5244
  });
@@ -4853,6 +5264,7 @@ function createViteCssFinalizerOutputPlugin(context) {
4853
5264
  isMainChunk: false
4854
5265
  },
4855
5266
  getSourceCandidatesForEntries,
5267
+ generatorPlatform,
4856
5268
  styleHandler: opts.styleHandler,
4857
5269
  debug
4858
5270
  });
@@ -4891,7 +5303,10 @@ function createViteCssFinalizerOutputPlugin(context) {
4891
5303
  const file = output.fileName || bundleFile;
4892
5304
  const rawSource = output.source.toString();
4893
5305
  if (isViteProcessedCssAsset?.(output, file)) {
4894
- const nextCss = annotateCss(finalizeWebCss(require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(rawSource), generatorBranch.isWeb, generatorOptions.webCompat));
5306
+ const nextCss = annotateCss(finalizeWebCss(require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(rawSource), generatorBranch.isWeb, generatorOptions.webCompat, {
5307
+ escapeMap: opts.escapeMap,
5308
+ safeSelectors: shouldApplyWebviewSafeSelectors
5309
+ }));
4895
5310
  output.source = nextCss;
4896
5311
  markCssAssetProcessed(output, file);
4897
5312
  recordCssAssetResult?.(file, nextCss);
@@ -4922,10 +5337,14 @@ function createViteCssFinalizerOutputPlugin(context) {
4922
5337
  cssHandlerOptions: generatorCssHandlerOptions,
4923
5338
  cssUserHandlerOptions: generatorCssUserHandlerOptions,
4924
5339
  getSourceCandidatesForEntries,
5340
+ generatorPlatform,
4925
5341
  styleHandler: opts.styleHandler,
4926
5342
  debug
4927
5343
  }) : void 0;
4928
- const nextCss = annotateCss(generated?.css ?? (generatorBranch.isWeb ? finalizeWebCss(rawSource, true, generatorOptions.webCompat) : (await opts.styleHandler(rawSource, cssHandlerOptions)).css));
5344
+ const nextCss = annotateCss(generated?.css ?? (generatorBranch.isWeb ? finalizeWebCss(rawSource, true, generatorOptions.webCompat, {
5345
+ escapeMap: opts.escapeMap,
5346
+ safeSelectors: shouldApplyWebviewSafeSelectors
5347
+ }) : (await opts.styleHandler(rawSource, cssHandlerOptions)).css));
4929
5348
  if (generated) {
4930
5349
  registerGeneratorDependencies(this, generated.dependencies);
4931
5350
  debug("css finalizer generated result: %s bytes=%d", file, nextCss.length);
@@ -5074,6 +5493,7 @@ function createViteCssMemory(options) {
5074
5493
  for (const [rememberedKey, remembered] of relatedRememberedEntries) {
5075
5494
  touchMapEntry(rememberedCssSources, rememberedKey, {
5076
5495
  ...remembered,
5496
+ outputFile: entry.outputFile,
5077
5497
  rawSource: entry.rawSource,
5078
5498
  sourceFile: entry.sourceFile
5079
5499
  });
@@ -5724,6 +6144,15 @@ function sameStringList(first, second) {
5724
6144
  if (!first || !second || first.length !== second.length) return false;
5725
6145
  return first.every((item, index) => item === second[index]);
5726
6146
  }
6147
+ function collectConfiguredCssEntries(options) {
6148
+ const runtimeCssEntries = options.tailwindcssRuntimeOptions?.tailwindcss?.v4?.cssEntries;
6149
+ const entries = [
6150
+ ...Array.isArray(options.cssEntries) ? options.cssEntries : [],
6151
+ ...Array.isArray(options.tailwindcss?.v4?.cssEntries) ? options.tailwindcss.v4.cssEntries : [],
6152
+ ...Array.isArray(runtimeCssEntries) ? runtimeCssEntries : []
6153
+ ].filter((item) => typeof item === "string" && item.length > 0);
6154
+ return entries.length > 0 ? [...new Set(entries)] : void 0;
6155
+ }
5727
6156
  function normalizeViteStylePlatform(value, appType) {
5728
6157
  return require_context.normalizeFrameworkStylePlatform(value, appType);
5729
6158
  }
@@ -5736,6 +6165,13 @@ function inferPlatformFromOutDir(outDir) {
5736
6165
  function isWebOrNativeAppPlatform(platform) {
5737
6166
  return platform === "h5" || platform === "web" || platform?.startsWith("web-") === true || platform === "app" || platform === "app-plus" || platform?.startsWith("app-") === true;
5738
6167
  }
6168
+ function isUniAppViteWebviewStylePlatform(platform) {
6169
+ return platform === "app" || platform === "app-plus";
6170
+ }
6171
+ function applyUniAppViteWebviewCssCompat(css, options) {
6172
+ const compatCss = (0, _weapp_tailwindcss_postcss.transformWebCssCompat)(css, options.compat);
6173
+ return options.safeSelectors ? (0, _weapp_tailwindcss_postcss.transformWebCssSafeSelectors)(compatCss, { escapeMap: options.escapeMap }) : compatCss;
6174
+ }
5739
6175
  /**
5740
6176
  * @name WeappTailwindcss
5741
6177
  * @description uni-app vite / uni-app-x 版本插件
@@ -5744,7 +6180,7 @@ function isWebOrNativeAppPlatform(platform) {
5744
6180
  function WeappTailwindcss(options = {}) {
5745
6181
  const hasExplicitAppType = typeof options.appType === "string" && options.appType.trim().length > 0;
5746
6182
  const hasExplicitTailwindcssBasedir = typeof options.tailwindcssBasedir === "string" && options.tailwindcssBasedir.trim().length > 0;
5747
- const rawCssEntries = Array.isArray(options.cssEntries) ? [...options.cssEntries] : void 0;
6183
+ const rawCssEntries = collectConfiguredCssEntries(options);
5748
6184
  const opts = require_context.getCompilerContext({
5749
6185
  ...options,
5750
6186
  __internalDeferMissingCssEntriesWarning: true
@@ -5772,18 +6208,7 @@ function WeappTailwindcss(options = {}) {
5772
6208
  if (!disabledOptions.plugin && tailwindcssMajorVersion !== 4) throw new Error("weapp-tailwindcss/vite 新生成管线仅支持 Tailwind CSS v4,请升级 tailwindcss 或停留在旧版 weapp-tailwindcss。");
5773
6209
  const shouldOwnTailwindGeneration = !disabledOptions.plugin;
5774
6210
  const shouldRewriteCssImports = opts.rewriteCssImports === true;
5775
- const generatorOptions = require_generator.normalizeWeappTailwindcssGeneratorOptions(opts.generator, {
5776
- appType: opts.appType,
5777
- platform: opts.cssOptions?.platform ?? opts.platform,
5778
- tailwindcssMajorVersion,
5779
- uniAppX
5780
- });
5781
- const generatorBranch = require_generator.resolveGeneratorRuntimeBranch(generatorOptions, {
5782
- appType: opts.appType,
5783
- platform: opts.cssOptions?.platform ?? opts.platform,
5784
- tailwindcssMajorVersion,
5785
- uniAppX
5786
- });
6211
+ let resolvedConfig;
5787
6212
  const resolveViteStylePlatform = () => {
5788
6213
  const explicit = normalizeViteStylePlatform(opts.cssOptions?.platform ?? opts.platform, opts.appType);
5789
6214
  if (explicit) return explicit;
@@ -5793,9 +6218,23 @@ function WeappTailwindcss(options = {}) {
5793
6218
  }
5794
6219
  return inferPlatformFromOutDir(resolvedConfig?.build?.outDir);
5795
6220
  };
6221
+ const resolveGeneratorPlatform = () => opts.cssOptions?.platform ?? opts.platform ?? resolveViteStylePlatform();
6222
+ const resolveCurrentGeneratorOptions = () => require_generator.normalizeWeappTailwindcssGeneratorOptions(opts.generator, {
6223
+ appType: opts.appType,
6224
+ platform: resolveGeneratorPlatform(),
6225
+ tailwindcssMajorVersion,
6226
+ uniAppX
6227
+ });
6228
+ const resolveCurrentGeneratorBranch = () => require_generator.resolveGeneratorRuntimeBranch(resolveCurrentGeneratorOptions(), {
6229
+ appType: opts.appType,
6230
+ platform: resolveGeneratorPlatform(),
6231
+ tailwindcssMajorVersion,
6232
+ uniAppX
6233
+ });
6234
+ const initialGeneratorBranch = resolveCurrentGeneratorBranch();
5796
6235
  const transformEarlyMiniProgramCss = (code) => {
5797
6236
  const platform = resolveViteStylePlatform();
5798
- if (!shouldOwnTailwindGeneration || (platform ? isWebOrNativeAppPlatform(platform) : generatorBranch.isWeb)) return code;
6237
+ if (!shouldOwnTailwindGeneration || (platform ? isWebOrNativeAppPlatform(platform) : resolveCurrentGeneratorBranch().isWeb)) return code;
5799
6238
  let transformedCode = code;
5800
6239
  if (transformedCode.includes("#if")) transformedCode = (0, _weapp_tailwindcss_postcss.compileCssMacroConditionalComments)(transformedCode, { platform: resolveViteStylePlatform() });
5801
6240
  if (transformedCode.includes("@layer")) transformedCode = (0, _weapp_tailwindcss_postcss.unwrapUnsupportedCascadeLayers)(transformedCode);
@@ -5803,10 +6242,10 @@ function WeappTailwindcss(options = {}) {
5803
6242
  };
5804
6243
  const finalizeViteMiniProgramCss = (css) => {
5805
6244
  const platform = resolveViteStylePlatform();
5806
- if (!shouldOwnTailwindGeneration || (platform ? isWebOrNativeAppPlatform(platform) : generatorBranch.isWeb)) return css;
6245
+ if (!shouldOwnTailwindGeneration || (platform ? isWebOrNativeAppPlatform(platform) : resolveCurrentGeneratorBranch().isWeb)) return css;
5807
6246
  return (0, _weapp_tailwindcss_postcss.unwrapUnsupportedCascadeLayers)(css);
5808
6247
  };
5809
- const shouldInferAppType = !hasExplicitAppType && !generatorBranch.isWeb;
6248
+ const shouldInferAppType = !hasExplicitAppType && !initialGeneratorBranch.isWeb;
5810
6249
  const hasInitialTailwindCssRoots = require_v4_engine.hasConfiguredTailwindV4CssRoots({
5811
6250
  ...options,
5812
6251
  cssEntries: opts.cssEntries ?? options.cssEntries
@@ -5886,7 +6325,6 @@ function WeappTailwindcss(options = {}) {
5886
6325
  await refreshRuntimeStateForAutoCssSources?.(true);
5887
6326
  };
5888
6327
  const customAttributesEntities = require_context.toCustomAttributesEntities(customAttributes);
5889
- let resolvedConfig;
5890
6328
  let recordedGeneratorCandidates;
5891
6329
  const sourceCandidateCollector = require_hmr_timing.createSourceCandidateCollector({ bareArbitraryValues: opts.arbitraryValues?.bareArbitraryValues });
5892
6330
  const sourceCandidateScanCache = new lru_cache.LRUCache({ max: SOURCE_CANDIDATE_SCAN_CACHE_MAX });
@@ -5944,7 +6382,7 @@ function WeappTailwindcss(options = {}) {
5944
6382
  const isWatchLikeBuild = () => isWatchBuild() || resolvedConfig?.command === "serve" || node_process.default.env["WEAPP_TW_WATCH_REGRESSION"] === "1" || node_process.default.env["WEAPP_TW_HMR_TIMING"] === "1";
5945
6383
  const isCurrentWebLikeStylePlatform = () => {
5946
6384
  const platform = resolveViteStylePlatform();
5947
- return platform ? isWebOrNativeAppPlatform(platform) : generatorBranch.isWeb;
6385
+ return platform ? isWebOrNativeAppPlatform(platform) : resolveCurrentGeneratorBranch().isWeb;
5948
6386
  };
5949
6387
  const isNuxtPageMacroHotModule = (id) => {
5950
6388
  if (typeof id !== "string" || !/[?&]macro=true(?:&|$)/.test(id)) return false;
@@ -6164,48 +6602,58 @@ function WeappTailwindcss(options = {}) {
6164
6602
  const file = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
6165
6603
  const requestFile = require_source_candidate_scan_signature.isCSSRequest(id) ? id : file;
6166
6604
  if (!require_source_candidate_scan_signature.isCSSRequest(requestFile) || opts.htmlMatcher(file) || require_source_candidate_scan_signature.isHTMLRequest(file)) return;
6605
+ const generatorCode = require_v4_engine.normalizeEmptyTailwindCustomVariants(code);
6167
6606
  const rootDir = resolvedConfig?.root ? node_path.default.resolve(resolvedConfig.root) : node_process.default.cwd();
6168
6607
  const isHarmonyAppStyleTarget = isHarmonyAppBuildTarget();
6169
- const isNativeAppStyleTarget = require_utils.resolveUniUtsPlatform().isApp || isHarmonyAppStyleTarget;
6608
+ const isNativeAppStyleTarget = opts.appType === "uni-app-x" && (require_utils.resolveUniUtsPlatform().isApp || isHarmonyAppStyleTarget);
6170
6609
  const sourceRoot = resolveWeappViteSourceRoot(resolvedConfig, opts.appType);
6171
- const outputFile = resolveViteCssPipelineOutputFile(requestFile, opts, rootDir, generatorBranch.isWeb, isNativeAppStyleTarget, sourceRoot);
6610
+ const currentGeneratorOptions = resolveCurrentGeneratorOptions();
6611
+ const currentGeneratorBranch = resolveCurrentGeneratorBranch();
6612
+ const outputFile = resolveViteCssPipelineOutputFile(requestFile, opts, rootDir, currentGeneratorBranch.isWeb, isNativeAppStyleTarget, sourceRoot);
6172
6613
  const runtime = getRecordedGeneratorCandidates() ?? getSourceCandidates() ?? await ensureRuntimeClassSet();
6173
6614
  const outputCssHandlerOptions = transformCssHandlerOptions.getCssHandlerOptions(outputFile);
6174
6615
  const cssHandlerOptions = {
6175
6616
  ...transformCssHandlerOptions.getCssHandlerOptions(file),
6176
6617
  isMainChunk: outputCssHandlerOptions.isMainChunk
6177
6618
  };
6178
- const transientCssSource = transientAutoCssSources.get(file) ?? (require_v4_engine.hasTailwindRootDirectives(code, { importFallback: generatorOptions.importFallback }) || require_v4_engine.hasTailwindSourceDirectives(code, { importFallback: generatorOptions.importFallback }) || require_v4_engine.hasTailwindApplyDirective(code) ? {
6619
+ const transientCssSource = transientAutoCssSources.get(file) ?? (require_v4_engine.hasTailwindRootDirectives(generatorCode, { importFallback: currentGeneratorOptions.importFallback }) || require_v4_engine.hasTailwindSourceDirectives(generatorCode, { importFallback: currentGeneratorOptions.importFallback }) || require_v4_engine.hasTailwindApplyDirective(generatorCode) ? {
6179
6620
  base: node_path.default.dirname(node_path.default.resolve(file)),
6180
- css: code,
6621
+ css: generatorCode,
6181
6622
  file: node_path.default.resolve(file)
6182
6623
  } : void 0);
6183
- const shouldDeferEmptyScopedCssSource = transientCssSource == null && !(opts.appType === "uni-app-x" && !cssHandlerOptions.isMainChunk && require_v4_engine.hasTailwindApplyDirective(code));
6624
+ const shouldDeferEmptyScopedCssSource = transientCssSource == null && !(opts.appType === "uni-app-x" && !cssHandlerOptions.isMainChunk && require_v4_engine.hasTailwindApplyDirective(generatorCode));
6184
6625
  const generated = await require_source_candidate_scan_signature.generateTailwindV4Css({
6185
6626
  opts,
6186
6627
  runtimeState,
6187
6628
  runtime,
6188
- rawSource: code,
6629
+ rawSource: generatorCode,
6189
6630
  file,
6190
6631
  outputFile,
6191
6632
  cssHandlerOptions,
6192
6633
  cssUserHandlerOptions: transformCssHandlerOptions.getCssUserHandlerOptions(file),
6193
6634
  cssSources: transientCssSource ? [transientCssSource] : void 0,
6194
6635
  getSourceCandidatesForEntries,
6636
+ generatorPlatform: resolveGeneratorPlatform(),
6195
6637
  styleHandler,
6196
6638
  debug,
6197
6639
  previousCss: viteGeneratedCssByFile.get(file),
6198
6640
  deferEmptyScopedCssSource: shouldDeferEmptyScopedCssSource,
6199
- restoreLocalCssImports: !generatorBranch.isWeb
6641
+ restoreLocalCssImports: !currentGeneratorBranch.isWeb
6200
6642
  });
6201
6643
  if (!generated) return;
6202
- const tracedCss = require_hmr_timing.annotateCssSourceTrace(finalizeViteMiniProgramCss(generated.css), {
6644
+ const finalizedCss = finalizeViteMiniProgramCss(generated.css);
6645
+ const isUniAppViteWebviewPlatform = opts.appType === "uni-app-vite" && isUniAppViteWebviewStylePlatform(resolveViteStylePlatform());
6646
+ const tracedCss = require_hmr_timing.annotateCssSourceTrace(removeScopedTailwindPreflightCss(currentGeneratorBranch.isWeb || isUniAppViteWebviewPlatform ? applyUniAppViteWebviewCssCompat(finalizedCss, {
6647
+ compat: currentGeneratorOptions.webCompat ?? true,
6648
+ escapeMap: opts.escapeMap,
6649
+ safeSelectors: isUniAppViteWebviewPlatform
6650
+ }) : finalizedCss), {
6203
6651
  opts,
6204
6652
  tokenSources: require_hmr_timing.createCssTokenSourceMap(getSourceCandidateSourcesForEntries(void 0), opts)
6205
6653
  });
6206
6654
  for (const dependency of generated.dependencies) hookContext?.addWatchFile?.(dependency);
6207
6655
  viteGeneratedCssByFile.set(file, tracedCss);
6208
- const shouldInjectGeneratedCssIntoMain = mainCssChunkMatcher(outputFile, opts.appType) || require_v4_engine.hasTailwindRootDirectives(code, { importFallback: generatorOptions.importFallback }) && !require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile).includes("/");
6656
+ const shouldInjectGeneratedCssIntoMain = mainCssChunkMatcher(outputFile, opts.appType) || require_v4_engine.hasTailwindRootDirectives(generatorCode, { importFallback: currentGeneratorOptions.importFallback }) && !require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile).includes("/");
6209
6657
  recordViteProcessedCssAssetResult(file, tracedCss, {
6210
6658
  injectIntoMain: shouldInjectGeneratedCssIntoMain,
6211
6659
  outputFile
@@ -6237,7 +6685,7 @@ function WeappTailwindcss(options = {}) {
6237
6685
  onTailwindRootCss: (id, code) => registerAutoCssSource(id, code),
6238
6686
  onCssSourceTransform: (id, code) => cssMemory.refreshRememberedCssSourceBySourceFile(id, code),
6239
6687
  shouldGenerateCss: (_id, code) => hasVitePipelineTailwindGenerationDirective(code),
6240
- shouldDeferGeneration: (_id, code) => !shouldRewriteCssImports && require_v4_engine.hasTailwindRootDirectives(code, { importFallback: generatorOptions.importFallback }),
6688
+ shouldDeferGeneration: (_id, code) => !shouldRewriteCssImports && require_v4_engine.hasTailwindRootDirectives(code, { importFallback: resolveCurrentGeneratorOptions().importFallback }),
6241
6689
  shouldOwnTailwindGeneration,
6242
6690
  shouldRewrite: shouldRewriteCssImports,
6243
6691
  weappTailwindcssDirPosix
@@ -6336,7 +6784,7 @@ function WeappTailwindcss(options = {}) {
6336
6784
  order: "pre",
6337
6785
  async handler(code, id) {
6338
6786
  let transformedCode = code;
6339
- if (shouldOwnTailwindGeneration && !generatorBranch.isWeb && require_source_candidate_scan_signature.isCSSRequest(id)) transformedCode = transformEarlyMiniProgramCss(code);
6787
+ if (shouldOwnTailwindGeneration && !resolveCurrentGeneratorBranch().isWeb && require_source_candidate_scan_signature.isCSSRequest(id)) transformedCode = transformEarlyMiniProgramCss(code);
6340
6788
  const shouldReturnTransformedCode = transformedCode !== code;
6341
6789
  if (shouldOwnTailwindGeneration) cssMemory.rememberKnownSfcSource(id, transformedCode);
6342
6790
  if (!shouldOwnTailwindGeneration || !require_hmr_timing.isSourceCandidateRequest(id) || !shouldCollectTransformedSourceCandidates(id)) {
@@ -6416,10 +6864,10 @@ function WeappTailwindcss(options = {}) {
6416
6864
  shouldGenerate: () => shouldOwnTailwindGeneration
6417
6865
  }),
6418
6866
  createViteServeJsTransformPlugin({
6419
- createHandlerOptions: serveJsHandlerOptions,
6867
+ createHandlerOptions: (file) => serveJsHandlerOptions(file, opts.appType === "uni-app-vite" && isUniAppViteWebviewStylePlatform(resolveViteStylePlatform()) ? { needEscaped: true } : void 0),
6420
6868
  getCommand: () => resolvedConfig?.command,
6421
6869
  jsHandler,
6422
- shouldTransform: () => shouldOwnTailwindGeneration && !generatorBranch.isWeb,
6870
+ shouldTransform: () => shouldOwnTailwindGeneration && (!resolveCurrentGeneratorBranch().isWeb || opts.appType === "uni-app-vite" && isUniAppViteWebviewStylePlatform(resolveViteStylePlatform())),
6423
6871
  transformRuntime: ensureRuntimeClassSet
6424
6872
  }),
6425
6873
  {