weapp-tailwindcss 5.1.4 → 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 (69) hide show
  1. package/README.en.md +1 -1
  2. package/README.md +1 -1
  3. package/dist/bundlers/shared/generator-css/generation-helpers.d.ts +8 -2
  4. package/dist/bundlers/shared/generator-css/source-resolver/metadata.d.ts +5 -1
  5. package/dist/bundlers/shared/generator-css/types.d.ts +1 -0
  6. package/dist/bundlers/shared/generator-css/user-css.d.ts +4 -1
  7. package/dist/bundlers/vite/generate-bundle/finalize.d.ts +1 -0
  8. package/dist/bundlers/vite/generate-bundle/remembered-css-replay.d.ts +1 -0
  9. package/dist/bundlers/vite/generate-bundle/tailwind-v4-css-source.d.ts +6 -3
  10. package/dist/bundlers/vite/hot-css-modules.d.ts +1 -0
  11. package/dist/bundlers/vite/processed-css-assets.d.ts +7 -0
  12. package/dist/bundlers/vite/source-scan/css-entries.d.ts +1 -0
  13. package/dist/bundlers/webpack/BaseUnifiedPlugin/v5-assets/pipeline-helpers.d.ts +2 -1
  14. package/dist/cli.js +18 -3
  15. package/dist/cli.mjs +16 -1
  16. package/dist/{context-Bkpmt3ja.mjs → context-3GGqW9vw.mjs} +20 -5
  17. package/dist/{context-DCVMkTRj.js → context-BCSk_YnL.js} +23 -8
  18. package/dist/core.js +1 -1
  19. package/dist/core.mjs +1 -1
  20. package/dist/css-macro/index.d.ts +2 -1
  21. package/dist/{defaults-BhE26nSw.mjs → defaults-9B6aMyZb.mjs} +2 -2
  22. package/dist/{defaults-DQhgnnn-.js → defaults-nsf4VNMX.js} +2 -2
  23. package/dist/defaults.d.ts +1 -1
  24. package/dist/defaults.js +1 -1
  25. package/dist/defaults.mjs +1 -1
  26. package/dist/{generator-24-HgU9F.mjs → generator-CoT5vu9w.mjs} +2 -2
  27. package/dist/{generator-CilgHtxb.js → generator-CqWzj2Z1.js} +2 -2
  28. package/dist/generator.js +2 -2
  29. package/dist/generator.mjs +2 -2
  30. package/dist/{gulp-0RsqkF_d.mjs → gulp-Bss4wJ8t.mjs} +4 -4
  31. package/dist/{gulp-Bogfnoki.js → gulp-hXE1U4Cu.js} +4 -4
  32. package/dist/gulp.js +1 -1
  33. package/dist/gulp.mjs +1 -1
  34. package/dist/{hmr-timing-BRNaz8Od.mjs → hmr-timing-Cfu-4Bnf.mjs} +229 -576
  35. package/dist/{hmr-timing-BV6nFPoT.js → hmr-timing-Df4203aI.js} +253 -630
  36. package/dist/index.js +4 -4
  37. package/dist/index.mjs +4 -4
  38. package/dist/js/js-string-escape.d.ts +1 -0
  39. package/dist/postcss.js +2 -2
  40. package/dist/postcss.mjs +2 -2
  41. package/dist/presets.js +6 -3
  42. package/dist/presets.mjs +6 -3
  43. package/dist/rspack.js +1 -1
  44. package/dist/rspack.mjs +1 -1
  45. package/dist/runtime-branch/generator-target-env.d.ts +1 -0
  46. package/dist/{source-candidate-scan-signature-CaDT0gkj.js → source-candidate-scan-signature-5Uk6U72B.js} +168 -5
  47. package/dist/{source-candidate-scan-signature-BB1hvW68.mjs → source-candidate-scan-signature-BbCmW975.mjs} +157 -6
  48. package/dist/style-injector/internal.d.ts +7 -0
  49. package/dist/style-injector/options.d.ts +25 -0
  50. package/dist/tailwindcss/v4/preflight.d.ts +4 -0
  51. package/dist/{tailwindcss-D0JF0fuZ.mjs → tailwindcss-Bjr3aphG.mjs} +62 -15
  52. package/dist/{tailwindcss-D2xs4OEu.js → tailwindcss-DYJ3HZD2.js} +67 -14
  53. package/dist/{transform-BP86eSZp.mjs → transform--155BmeJ.mjs} +1 -1
  54. package/dist/{transform-CXCQ28Tc.js → transform-B6_y_yCB.js} +1 -1
  55. package/dist/typedoc.export.d.ts +1 -0
  56. package/dist/types/index.d.ts +2 -1
  57. package/dist/types/user-defined-options/general.d.ts +2 -0
  58. package/dist/{v4-engine-CKtsdKxK.js → v4-engine-C9cmNlP8.js} +610 -3
  59. package/dist/{v4-engine-BuuYDXt1.mjs → v4-engine-DRQaCFMm.mjs} +529 -6
  60. package/dist/{vite-BYgT1ir9.js → vite-Baw9qNrc.js} +652 -140
  61. package/dist/{vite-B1SlBmqO.mjs → vite-PdxjaqhO.mjs} +653 -141
  62. package/dist/vite.js +1 -1
  63. package/dist/vite.mjs +1 -1
  64. package/dist/weapp-tw-css-import-rewrite-loader.js +2981 -2752
  65. package/dist/{webpack-Bg6pefpb.mjs → webpack-BffTDmod.mjs} +69 -26
  66. package/dist/{webpack-khSwkXP5.js → webpack-C9u7mfGE.js} +74 -31
  67. package/dist/webpack.js +1 -1
  68. package/dist/webpack.mjs +1 -1
  69. package/package.json +16 -5
@@ -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-DCVMkTRj.js");
7
- const require_tailwindcss = require("./tailwindcss-D2xs4OEu.js");
8
- const require_hmr_timing = require("./hmr-timing-BV6nFPoT.js");
9
- const require_source_candidate_scan_signature = require("./source-candidate-scan-signature-CaDT0gkj.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-CXCQ28Tc.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));
@@ -1928,8 +1928,14 @@ function resolveSourceStyleSourceFromOutputFile(outputFile, snapshot, outputRoot
1928
1928
  //#endregion
1929
1929
  //#region src/bundlers/vite/generate-bundle/subpackages.ts
1930
1930
  function readBundleAssetSource(output) {
1931
- if (output.type !== "asset") return;
1932
- return typeof output.source === "string" ? output.source : output.source.toString();
1931
+ if ("type" in output && output.type !== "asset") return;
1932
+ const source = output.source;
1933
+ if (typeof source === "string") return source;
1934
+ if (typeof source === "function") {
1935
+ const value = source.call(output);
1936
+ return typeof value === "string" ? value : value?.toString();
1937
+ }
1938
+ if (source != null && typeof source.toString === "function") return source.toString();
1933
1939
  }
1934
1940
  function normalizePackageRoot(root) {
1935
1941
  return require_source_candidate_scan_signature.normalizeOutputPathKey(root).replace(/\/+$/, "");
@@ -2014,6 +2020,21 @@ function appendCss$1(baseCss, css) {
2014
2020
  if (css.length === 0) return baseCss;
2015
2021
  return `${baseCss}\n${css}`;
2016
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
+ }
2017
2038
  function removeTailwindSourceMediaWrappers(css) {
2018
2039
  if (!css.includes("@media source(")) return css;
2019
2040
  try {
@@ -2090,6 +2111,183 @@ function collectRootStyleBundleCssSources(bundle, excludedFile) {
2090
2111
  }
2091
2112
  return sources;
2092
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
+ }
2093
2291
  function collectSingleViteGeneratedCssMarkerFile(rawSource) {
2094
2292
  const blocks = require_source_candidate_scan_signature.parseBundlerGeneratedCssMarkerBlocks(rawSource).filter((block) => block.bundler === "vite");
2095
2293
  if (blocks.length !== 1) return;
@@ -2102,7 +2300,9 @@ function shouldFilterRootGeneratedCssMarkerForScopedAsset(targetFile, markerFile
2102
2300
  return !isMatchingGeneratedCssMarkerFile(targetFile, markerFile, resolveViteProcessedCssOutputFile);
2103
2301
  }
2104
2302
  function removeCssCoveredByRootStyleBundleSources(bundle, file, css) {
2105
- 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 : "";
2106
2306
  }
2107
2307
  function removeDanglingCssSourceTraceComments(css) {
2108
2308
  if (!css.includes("/* tokens:")) return css;
@@ -2126,8 +2326,11 @@ function removeCssCoveredByRootStyleAssets(bundle, options) {
2126
2326
  for (const [bundleFile, output] of Object.entries(bundle)) {
2127
2327
  if (output.type !== "asset") continue;
2128
2328
  const file = getAssetFile$1(bundleFile, output);
2129
- if (!options.cssMatcher(file) || isRootStyleOutputFile(file) || options.isViteProcessedCssAsset?.(output, file) === true || options.subpackageRoots != null && isSubpackageOutputFile(file, options.subpackageRoots)) continue;
2130
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;
2131
2334
  const nextCss = removeCssCoveredByRootStyleBundleSources(bundle, file, rawSource);
2132
2335
  if (nextCss === rawSource) continue;
2133
2336
  output.source = nextCss;
@@ -2180,6 +2383,12 @@ function shouldUseCssAssetAsMainInjectionTarget(opts, file, records) {
2180
2383
  const fileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(file);
2181
2384
  if (!isRootStyleOutputFile(file) && records.some((record) => typeof record.outputFile === "string" && require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) === fileKey)) return true;
2182
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);
2183
2392
  if (records.some((record) => {
2184
2393
  if (record.injectIntoMain !== true) return false;
2185
2394
  return isRootStyleOutputFile(file) || typeof record.outputFile === "string" && require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) === fileKey;
@@ -2200,6 +2409,33 @@ function isViteProcessedCssResultCoveredByImportedBundleAsset(record, importedSt
2200
2409
  }
2201
2410
  return false;
2202
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
+ }
2203
2439
  function removeCssCoveredByImportedViteResults(css, importedCssSources) {
2204
2440
  if (importedCssSources.length === 0) return css;
2205
2441
  const importedCss = importedCssSources.map((source) => require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(source).trim()).filter(Boolean).join("\n");
@@ -2226,6 +2462,38 @@ function collectBundleAssetFiles(bundle) {
2226
2462
  }
2227
2463
  return files;
2228
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
+ }
2229
2497
  function findBundleAssetByOutputFile(bundle, file) {
2230
2498
  const fileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(file);
2231
2499
  return Object.entries(bundle).find(([bundleFile, output]) => {
@@ -2279,6 +2547,8 @@ function collectViteProcessedCssAssetResults(bundle, options) {
2279
2547
  options.markCssAssetProcessed?.(output, file);
2280
2548
  options.recordCssAssetResult?.(file, nextCss);
2281
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;
2282
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))) {
2283
2553
  const targetAsset = findBundleAssetByOutputFile(bundle, resolvedOutputFile);
2284
2554
  if (targetAsset) {
@@ -2298,24 +2568,24 @@ function collectViteProcessedCssAssetResults(bundle, options) {
2298
2568
  continue;
2299
2569
  }
2300
2570
  }
2301
- 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));
2302
2572
  options.recordViteProcessedCssAssetResult?.(file, nextCss, {
2303
2573
  injectIntoMain: shouldReplayIntoMainCss || void 0,
2304
- outputFile: resolvedOutputFile
2574
+ outputFile: recordOutputFile
2305
2575
  });
2306
- 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, {
2307
2577
  injectIntoMain: shouldReplayIntoMainCss || void 0,
2308
- outputFile: resolvedOutputFile
2578
+ outputFile: recordOutputFile
2309
2579
  });
2310
2580
  for (const markerFile of collectMatchingGeneratedCssMarkerFiles(file, rawSource, options.resolveViteProcessedCssOutputFile)) {
2311
2581
  if (require_source_candidate_scan_signature.normalizeOutputPathKey(markerFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(file)) continue;
2312
2582
  options.recordViteProcessedCssAssetResult?.(markerFile, nextCss, {
2313
2583
  injectIntoMain: shouldReplayIntoMainCss || void 0,
2314
- outputFile: resolvedOutputFile
2584
+ outputFile: recordOutputFile
2315
2585
  });
2316
- 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, {
2317
2587
  injectIntoMain: shouldReplayIntoMainCss || void 0,
2318
- outputFile: resolvedOutputFile
2588
+ outputFile: recordOutputFile
2319
2589
  });
2320
2590
  }
2321
2591
  if (isCoveredViteGeneratedSourceAsset(file, existingAssetFiles, options.resolveViteProcessedCssOutputFile)) {
@@ -2330,7 +2600,8 @@ function collectViteProcessedCssAssetResults(bundle, options) {
2330
2600
  return collected;
2331
2601
  }
2332
2602
  function injectViteProcessedCssIntoMainCssAssets(bundle, options) {
2333
- 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]) => {
2334
2605
  return typeof record === "string" ? {
2335
2606
  file,
2336
2607
  css: record,
@@ -2341,10 +2612,14 @@ function injectViteProcessedCssIntoMainCssAssets(bundle, options) {
2341
2612
  injectIntoMain: record.injectIntoMain,
2342
2613
  outputFile: record.outputFile
2343
2614
  };
2344
- }).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);
2345
2619
  let injected = 0;
2346
2620
  for (const [bundleFile, bundleOutput] of Object.entries(bundle)) {
2347
2621
  let output = bundleOutput;
2622
+ if (bundle[bundleFile] !== bundleOutput) continue;
2348
2623
  if (output.type !== "asset") continue;
2349
2624
  let file = getAssetFile$1(bundleFile, output);
2350
2625
  if (!options.opts.cssMatcher(file) || !shouldUseCssAssetAsMainInjectionTarget(options.opts, file, viteCssResults)) continue;
@@ -2366,7 +2641,7 @@ function injectViteProcessedCssIntoMainCssAssets(bundle, options) {
2366
2641
  }
2367
2642
  const fileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(file);
2368
2643
  const mainFileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(file);
2369
- let nextCss = removeTailwindEntryDirectivesFromCss(originalSource);
2644
+ let nextCss = transformCss(removeTailwindEntryDirectivesFromCss(originalSource), file);
2370
2645
  const importedStyleFiles = collectImportedStyleFiles(nextCss, file);
2371
2646
  const importedBundleCssSources = collectImportedBundleCssSources(bundle, importedStyleFiles);
2372
2647
  nextCss = removeCssCoveredByImportedViteResults(nextCss, importedBundleCssSources);
@@ -2375,12 +2650,14 @@ function injectViteProcessedCssIntoMainCssAssets(bundle, options) {
2375
2650
  const uncoveredImportedViteCssResults = importedViteCssResults.filter((record) => !isViteProcessedCssResultCoveredByImportedBundleAsset(record, importedStyleFiles, bundleAssetFiles));
2376
2651
  const importedCssSources = [...importedBundleCssSources, ...uncoveredImportedViteCssResults.map((record) => record.css)];
2377
2652
  nextCss = removeCssCoveredByImportedViteResults(nextCss, uncoveredImportedViteCssResults.map((record) => record.css));
2653
+ const targetViteCssResults = [];
2378
2654
  for (const record of viteCssResults) {
2379
2655
  if (!isRootStyleOutputFile(file)) {
2380
2656
  if (typeof record.outputFile !== "string" || require_source_candidate_scan_signature.normalizeOutputPathKey(record.outputFile) !== fileKey) continue;
2381
2657
  }
2382
2658
  if (!shouldInjectViteProcessedCssResult(options.opts, mainFileKey, record.file, record)) continue;
2383
2659
  if (isViteProcessedCssResultImported(record, importedStyleFiles)) continue;
2660
+ targetViteCssResults.push(record);
2384
2661
  let css = require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(record.css).trim();
2385
2662
  css = removeCssCoveredByImportedViteResults(css, importedCssSources).trim();
2386
2663
  if (css.length === 0) continue;
@@ -2411,29 +2688,19 @@ function injectViteProcessedCssIntoMainCssAssets(bundle, options) {
2411
2688
  if (css.length === 0) continue;
2412
2689
  }
2413
2690
  const missingCss = (0, _weapp_tailwindcss_postcss.filterExistingCssRules)(nextCss, css);
2414
- 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;
2415
2692
  nextCss = appendCss$1(nextCss, missingCss);
2416
2693
  }
2417
- if (nextCss === originalSource) continue;
2418
- output.source = nextCss;
2419
- options.markCssAssetProcessed?.(output, file);
2420
- options.recordCssAssetResult?.(file, nextCss);
2421
- options.onUpdate?.(file, originalSource, nextCss);
2422
- options.debug?.("inject vite-processed css into main css asset: %s bytes=%d", file, nextCss.length);
2423
- for (const record of viteCssResults) {
2424
- if (!options.shouldRemoveInjectedSourceAsset?.(file, record)) continue;
2425
- const recordFileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(record.file);
2426
- for (const [candidateFile, candidateOutput] of Object.entries(bundle)) {
2427
- if (candidateOutput.type !== "asset") continue;
2428
- const candidateKey = require_source_candidate_scan_signature.normalizeOutputPathKey(getAssetFile$1(candidateFile, candidateOutput));
2429
- const isRecordFile = candidateKey === recordFileKey;
2430
- const candidateSource = readAssetSource$2(candidateOutput).trim();
2431
- const isProcessedSource = candidateSource === record.css.trim() || candidateSource.length > 0 && (0, _weapp_tailwindcss_postcss.containsCssAfterMinify)(nextCss, candidateSource);
2432
- if (!isRecordFile && !isProcessedSource || candidateKey === require_source_candidate_scan_signature.normalizeOutputPathKey(file)) continue;
2433
- clearAssetSource(candidateOutput);
2434
- options.debug?.("remove injected vite-processed source css asset: %s -> %s", candidateKey, file);
2435
- }
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);
2436
2701
  }
2702
+ const removedSources = removeCoveredInjectedSourceAssets(bundle, file, nextCss, targetViteCssResults, options);
2703
+ if (nextCss === originalSource && removedSources === 0) continue;
2437
2704
  injected++;
2438
2705
  }
2439
2706
  return injected;
@@ -2705,9 +2972,34 @@ function pruneLastCssResults(resultByFile, sourceHashByFile, activeFiles) {
2705
2972
  function readAssetSource(asset) {
2706
2973
  return typeof asset.source === "string" ? asset.source : asset.source.toString();
2707
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
+ }
2708
2982
  function getAssetFile(bundleFile, asset) {
2709
2983
  return asset.fileName || bundleFile;
2710
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
+ }
2711
3003
  function isRootMiniProgramStyleOutputFile(file) {
2712
3004
  const normalized = require_source_candidate_scan_signature.normalizeOutputPathKey(file.replace(/[?#].*$/, ""));
2713
3005
  return !normalized.includes("/") && /\.(?:wxss|acss|ttss|qss|jxss|tyss)$/i.test(normalized);
@@ -2776,7 +3068,7 @@ function normalizeTaroRootImportShellAssets(bundle, options) {
2776
3068
  return updated;
2777
3069
  }
2778
3070
  async function finalizeGenerateBundle(options) {
2779
- 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;
2780
3072
  const tasksStart = performance.now();
2781
3073
  if (cssTaskFactories.length > 0) {
2782
3074
  const cssTask = require_hmr_timing.runWithConcurrency(cssTaskFactories, resolveViteCssTaskConcurrency(useIncrementalMode, runtimeState.tailwindRuntime.majorVersion)).then(() => void 0);
@@ -2811,6 +3103,7 @@ async function finalizeGenerateBundle(options) {
2811
3103
  recordViteProcessedCssAssetResult,
2812
3104
  resolveViteProcessedCssOutputFile: (file) => resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot, defaultStyleOutputExtension, bundleFiles),
2813
3105
  subpackageRoots: collectMiniProgramSubpackageRoots(bundle),
3106
+ transformCss: transformWebTargetCss,
2814
3107
  debug
2815
3108
  });
2816
3109
  return injectViteProcessedCssIntoMainCssAssets(bundle, {
@@ -2818,6 +3111,7 @@ async function finalizeGenerateBundle(options) {
2818
3111
  getViteProcessedCssAssetResults,
2819
3112
  markCssAssetProcessed,
2820
3113
  recordCssAssetResult,
3114
+ transformCss: transformWebTargetCss,
2821
3115
  shouldRemoveInjectedSourceAsset: (targetFile, record) => {
2822
3116
  if (record.injectIntoMain === false) return false;
2823
3117
  const targetFileKey = require_source_candidate_scan_signature.normalizeOutputPathKey(targetFile);
@@ -2843,11 +3137,13 @@ async function finalizeGenerateBundle(options) {
2843
3137
  removeCssCoveredByRootStyleAssets(bundle, {
2844
3138
  cssMatcher: opts.cssMatcher,
2845
3139
  debug,
3140
+ includeTailwindGeneratedCssAssets: opts.appType === "uni-app-vite" && isWebGeneratorTarget && isUniAppViteWebviewAppBundle(bundleFiles),
2846
3141
  isViteProcessedCssAsset,
2847
3142
  onUpdate,
2848
3143
  recordCssAssetResult,
2849
3144
  subpackageRoots: collectMiniProgramSubpackageRoots(bundle)
2850
3145
  });
3146
+ if (opts.appType === "uni-app-vite" && isWebGeneratorTarget && isUniAppViteWebviewAppBundle(Object.keys(bundle))) removeDuplicateUnlinkedRootCssAssetsReferencedByHtml(bundle, { debug });
2851
3147
  await finalizeMiniProgramCssAssets(bundle, {
2852
3148
  cssMatcher: opts.cssMatcher,
2853
3149
  debug,
@@ -2858,6 +3154,12 @@ async function finalizeGenerateBundle(options) {
2858
3154
  recordCssAssetResult,
2859
3155
  styleHandler
2860
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
+ });
2861
3163
  const stateUpdateStart = performance.now();
2862
3164
  require_source_candidate_scan_signature.updateBundleBuildState(state, snapshot, useIncrementalMode ? linkedByEntry ?? /* @__PURE__ */ new Map() : /* @__PURE__ */ new Map(), { incremental: useIncrementalMode });
2863
3165
  state.generatorCandidateSignature = generatorCandidateSignature;
@@ -3214,13 +3516,15 @@ function createRememberedCssRuntimeSignature(cssRuntimeSignature, cssRuntimeAffe
3214
3516
  function normalizeRememberedSourceIdentity(file) {
3215
3517
  return require_source_candidate_scan_signature.normalizeOutputPathKey(file.replace(/[?#].*$/, ""));
3216
3518
  }
3217
- function selectBestRememberedCssSourceMatches(sources, outputFile, outputRoot, sourceRoot) {
3218
- if (sources.length <= 1) return sources;
3519
+ function selectBestRememberedCssSourceMatches(sources, outputFile, outputRoot, sourceRoot, options = {}) {
3520
+ const minimumScore = options.minimumScore ?? (options.requirePositiveScore ? 1 : 0);
3219
3521
  const scoredMatches = sources.map((remembered) => ({
3220
3522
  remembered,
3221
3523
  score: Math.max(scoreMatchingStyleFileBase(outputFile, remembered.sourceFile, outputRoot, sourceRoot), scoreMatchingStyleFileBase(outputFile, remembered.outputFile, outputRoot, sourceRoot))
3222
- })).filter((match) => match.score > 0).sort((a, b) => b.score - a.score);
3524
+ })).filter((match) => match.score >= minimumScore && match.score > 0).sort((a, b) => b.score - a.score);
3223
3525
  const bestScore = scoredMatches[0]?.score;
3526
+ if (!bestScore && minimumScore > 0) return [];
3527
+ if (sources.length <= 1) return sources;
3224
3528
  return bestScore ? scoredMatches.filter((match) => match.score === bestScore).map((match) => match.remembered) : sources;
3225
3529
  }
3226
3530
  function findRememberedCssSources(sources, outputFile, file, originalSource, outputRoot, sourceRoot) {
@@ -3238,11 +3542,16 @@ function findRememberedCssSources(sources, outputFile, file, originalSource, out
3238
3542
  ...originalSource.originalFileNames ?? []
3239
3543
  ].filter((item) => typeof item === "string" && item.length > 0);
3240
3544
  const sourceMatched = rememberedSources.filter((remembered) => originalFiles.some((originalFile) => normalizeRememberedSourceIdentity(remembered.sourceFile) === normalizeRememberedSourceIdentity(originalFile)));
3241
- if (sourceMatched.length > 0) return sourceMatched;
3545
+ if (sourceMatched.length > 0) {
3546
+ const scoredSourceMatched = selectBestRememberedCssSourceMatches(sourceMatched, outputFile, outputRoot, sourceRoot, { requirePositiveScore: true });
3547
+ if (scoredSourceMatched.length > 0) return scoredSourceMatched;
3548
+ }
3242
3549
  const outputMatched = rememberedSources.filter((remembered) => require_source_candidate_scan_signature.normalizeOutputPathKey(remembered.outputFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile));
3243
3550
  if (outputMatched.length > 0) return outputMatched;
3244
3551
  if (!require_source_candidate_scan_signature.hasBundlerGeneratedCssMarker(source) && !hasTailwindGenerationSource(source)) return [];
3245
3552
  const scoredMatches = selectBestRememberedCssSourceMatches(rememberedSources, outputFile, outputRoot, sourceRoot);
3553
+ const strongScoredMatches = selectBestRememberedCssSourceMatches(rememberedSources, outputFile, outputRoot, sourceRoot, { minimumScore: 1e5 });
3554
+ if (strongScoredMatches.length > 0 && strongScoredMatches.length < rememberedSources.length) return strongScoredMatches;
3246
3555
  return scoredMatches.length === rememberedSources.length ? [] : scoredMatches;
3247
3556
  }
3248
3557
  function mergeRememberedCssSources(sources, outputFile) {
@@ -3265,7 +3574,9 @@ function collectRememberedCssReplayGroups(sources, opts, rootDir, isWebGenerator
3265
3574
  const groups = /* @__PURE__ */ new Map();
3266
3575
  for (const [key, remembered] of sources ?? []) {
3267
3576
  const cleanSourceFile = remembered.sourceFile.replace(/[?#].*$/, "");
3268
- 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);
3269
3580
  const group = groups.get(outputKey) ?? [];
3270
3581
  group.push({
3271
3582
  key,
@@ -3278,7 +3589,7 @@ function collectRememberedCssReplayGroups(sources, opts, rootDir, isWebGenerator
3278
3589
  //#endregion
3279
3590
  //#region src/bundlers/vite/generate-bundle/remembered-css-replay.ts
3280
3591
  async function processRememberedCssReplay(options) {
3281
- 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;
3282
3593
  const rememberedReplayGroups = collectRememberedCssReplayGroups(getRememberedCssSources?.(), opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot, defaultStyleOutputExtension, bundleFiles);
3283
3594
  for (const [outputFile, rememberedGroup] of rememberedReplayGroups) {
3284
3595
  if (require_source_candidate_scan_signature.isHTMLRequest(outputFile) || options.opts.htmlMatcher(outputFile)) continue;
@@ -3329,6 +3640,7 @@ async function processRememberedCssReplay(options) {
3329
3640
  cssHandlerOptions,
3330
3641
  cssUserHandlerOptions: getCssUserHandlerOptions(sourceFile),
3331
3642
  getSourceCandidatesForEntries: scopedSourceCandidateGetter,
3643
+ generatorPlatform,
3332
3644
  styleHandler,
3333
3645
  debug,
3334
3646
  previousCss
@@ -3644,16 +3956,24 @@ function scoreConfiguredTailwindV4SourceForRawSource(rawSource, entrySource) {
3644
3956
  for (const token of entryTokens) if (rawTokens.has(token)) score += token.startsWith("config:") ? 100 : 1;
3645
3957
  return score;
3646
3958
  }
3647
- function resolveSubpackageRootForFile(file, subpackageRoots) {
3648
- if (!file || !subpackageRoots) return;
3649
- return [...subpackageRoots].find((root) => isSubpackageOutputFile(file, /* @__PURE__ */ new Set([root])));
3650
- }
3651
- function isSameSubpackageScope(outputFile, sourceFile, subpackageRoots) {
3652
- return resolveSubpackageRootForFile(outputFile, subpackageRoots) === resolveSubpackageRootForFile(sourceFile, subpackageRoots);
3653
- }
3654
- function selectTailwindV4GenerationCssSourceForOutput(outputFile, entries, rawSource, subpackageRoots) {
3959
+ function selectTailwindV4GenerationCssSourceForOutput(outputFile, entries, rawSource, options = {}) {
3655
3960
  const generationSources = entries.filter((entry) => hasTailwindGenerationSource(entry.source));
3656
3961
  if (generationSources.length <= 1) return generationSources[0];
3962
+ const canMatchByOutputPath = Boolean(options.cwd || options.outputRoot || options.projectRoot);
3963
+ const selectByOutputPath = (candidates) => {
3964
+ if (!canMatchByOutputPath) return;
3965
+ const scoredSources = candidates.map((entry) => ({
3966
+ entry,
3967
+ score: require_hmr_timing.scoreTailwindV4CssSourceFileMatch(outputFile, entry.file, {
3968
+ cwd: options.cwd,
3969
+ outputRoot: options.outputRoot,
3970
+ projectRoot: options.projectRoot
3971
+ })
3972
+ })).filter((item) => item.score > 0).sort((a, b) => b.score - a.score);
3973
+ const bestScore = scoredSources[0]?.score;
3974
+ const bestSources = bestScore ? scoredSources.filter((item) => item.score === bestScore) : [];
3975
+ return bestSources.length === 1 ? bestSources[0]?.entry : void 0;
3976
+ };
3657
3977
  const selectByRawSourceFingerprint = (candidates) => {
3658
3978
  const scoredSources = candidates.map((entry) => ({
3659
3979
  entry,
@@ -3665,14 +3985,10 @@ function selectTailwindV4GenerationCssSourceForOutput(outputFile, entries, rawSo
3665
3985
  };
3666
3986
  const rawSourceMatched = selectByRawSourceFingerprint(generationSources);
3667
3987
  if (rawSourceMatched) return rawSourceMatched;
3668
- const scopedSources = subpackageRoots ? generationSources.filter((entry) => {
3669
- const outputMatchesSubpackage = isSubpackageOutputFile(outputFile, subpackageRoots);
3670
- const sourceMatchesSubpackage = isSubpackageOutputFile(entry.file, subpackageRoots);
3671
- if (!outputMatchesSubpackage) return !sourceMatchesSubpackage;
3672
- return sourceMatchesSubpackage && [...subpackageRoots].some((root) => isSubpackageOutputFile(outputFile, /* @__PURE__ */ new Set([root])) && isSubpackageOutputFile(entry.file, /* @__PURE__ */ new Set([root])));
3673
- }) : generationSources;
3674
- const explicitSources = scopedSources.filter((entry) => /@(?:config|source|plugin|custom-variant|theme|utility|variant|apply)\b/.test(entry.source));
3675
- const candidates = explicitSources.length === 1 ? explicitSources : scopedSources;
3988
+ const explicitSources = generationSources.filter((entry) => /@(?:config|source|plugin|custom-variant|theme|utility|variant|apply)\b/.test(entry.source));
3989
+ const candidates = explicitSources.length === 1 ? explicitSources : generationSources;
3990
+ const outputPathMatched = selectByOutputPath(candidates);
3991
+ if (outputPathMatched) return outputPathMatched;
3676
3992
  if (candidates.length === 1) return candidates[0];
3677
3993
  return selectByRawSourceFingerprint(candidates);
3678
3994
  }
@@ -3906,6 +4222,16 @@ function resolveSourceRootFromBundleGraph(config, bundle) {
3906
4222
  }
3907
4223
  //#endregion
3908
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
+ }
3909
4235
  function createGenerateBundleHook(context) {
3910
4236
  const state = require_source_candidate_scan_signature.createBundleBuildState();
3911
4237
  const lastCssResultByFile = /* @__PURE__ */ new Map();
@@ -3935,23 +4261,32 @@ function createGenerateBundleHook(context) {
3935
4261
  const { cache, onEnd, onStart, onUpdate, styleHandler, templateHandler, jsHandler, uniAppX } = opts;
3936
4262
  const resolvedConfig = getResolvedConfig();
3937
4263
  const uniUtsPlatform = require_utils.resolveUniUtsPlatform();
3938
- 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, {
3939
4266
  appType: opts.appType,
3940
- platform: opts.cssOptions?.platform ?? opts.platform,
4267
+ platform: generatorPlatform,
3941
4268
  tailwindcssMajorVersion: runtimeState.tailwindRuntime.majorVersion,
3942
4269
  uniAppX,
3943
4270
  uniUtsPlatform
3944
- }), {
4271
+ });
4272
+ const generatorBranch = require_generator.resolveGeneratorRuntimeBranch(generatorOptions, {
3945
4273
  appType: opts.appType,
3946
- platform: opts.cssOptions?.platform ?? opts.platform,
4274
+ platform: generatorPlatform,
3947
4275
  tailwindcssMajorVersion: runtimeState.tailwindRuntime.majorVersion,
3948
4276
  uniAppX,
3949
4277
  uniUtsPlatform
3950
4278
  });
3951
4279
  const isWebGeneratorTarget = generatorBranch.isWeb;
3952
- const isNativeAppStyleTarget = uniUtsPlatform.isApp;
3953
- const canInferHarmonyAppStyleTarget = !uniUtsPlatform.normalized || uniUtsPlatform.isApp;
3954
- 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)));
3955
4290
  const shouldPreserveAppCssExtension = isNativeAppStyleTarget || isHarmonyAppStyleTarget;
3956
4291
  const shouldGenerateWebCssByGenerator = isWebGeneratorTarget;
3957
4292
  const { getCssHandlerOptions, getCssUserHandlerOptions } = cssHandlerOptions;
@@ -3973,6 +4308,7 @@ function createGenerateBundleHook(context) {
3973
4308
  recordViteProcessedCssAssetResult,
3974
4309
  resolveViteProcessedCssOutputFile: (file) => resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, shouldPreserveAppCssExtension, sourceRoot, defaultStyleOutputExtension, Object.keys(bundle)),
3975
4310
  subpackageRoots: currentSubpackageRoots,
4311
+ transformCss: transformWebTargetCss,
3976
4312
  debug
3977
4313
  });
3978
4314
  const hmrTimingStartedAt = performance.now();
@@ -4016,7 +4352,47 @@ function createGenerateBundleHook(context) {
4016
4352
  const snapshotStart = performance.now();
4017
4353
  const snapshot = require_source_candidate_scan_signature.buildBundleSnapshot(bundle, opts, outDir, state, envFlags.disableDirtyOptimization || !useIncrementalMode, { hasOmittedKnownFiles });
4018
4354
  const configuredTailwindV4CssSourceEntriesForScope = getConfiguredTailwindV4CssSourceEntries();
4019
- 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
+ };
4020
4396
  const { createScopedSourceCandidateGetter, createScopedSourceCandidateSourceGetter, shouldExcludeSubpackageSourceCandidates, shouldInjectCssIntoMainFromOutput } = createSubpackageSourceCandidateScope({
4021
4397
  cssSourceFiles: configuredTailwindV4CssSourceEntriesForScope.map((entry) => entry.file),
4022
4398
  getSourceCandidateSourcesForEntries,
@@ -4172,10 +4548,14 @@ function createGenerateBundleHook(context) {
4172
4548
  onUpdate,
4173
4549
  debug
4174
4550
  });
4175
- const createHandlerOptions = createJsHandlerOptionsFactory({
4551
+ const createBaseHandlerOptions = createJsHandlerOptionsFactory({
4176
4552
  getMajorVersion: () => runtimeState.tailwindRuntime.majorVersion,
4177
4553
  moduleGraph: moduleGraphOptions
4178
4554
  });
4555
+ const createHandlerOptions = (absoluteFilename, extra) => createBaseHandlerOptions(absoluteFilename, shouldApplyWebviewSafeSelectors ? {
4556
+ needEscaped: true,
4557
+ ...extra
4558
+ } : extra);
4179
4559
  const linkedByEntry = useIncrementalMode ? /* @__PURE__ */ new Map() : void 0;
4180
4560
  const sharedCssResultCache = /* @__PURE__ */ new Map();
4181
4561
  const activeProcessCacheKeys = /* @__PURE__ */ new Set();
@@ -4289,6 +4669,11 @@ function createGenerateBundleHook(context) {
4289
4669
  if (rememberedCssSources.length > 0) rememberedCssSources = await Promise.all(rememberedCssSources.map(async (remembered) => {
4290
4670
  return await refreshRememberedCssSource?.(remembered) ?? remembered;
4291
4671
  }));
4672
+ rememberedCssSources = rememberedCssSources.filter((remembered) => {
4673
+ if (!configuredTailwindV4CssSourceFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(remembered.sourceFile))) return true;
4674
+ const matchedOutputFile = resolveMatchedOutputFileForCurrentAsset(remembered.sourceFile);
4675
+ return !matchedOutputFile || require_source_candidate_scan_signature.normalizeOutputPathKey(matchedOutputFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile);
4676
+ });
4292
4677
  let hasUsableRememberedTailwindSource = rememberedCssSources.some((remembered) => hasTailwindGenerationSource(remembered.rawSource) && require_source_candidate_scan_signature.normalizeOutputPathKey(remembered.sourceFile.replace(/[?#].*$/, "")) !== require_source_candidate_scan_signature.normalizeOutputPathKey(file));
4293
4678
  const inferredSfcStyleSource = await resolveSfcStyleSourceFromOutputFile(outputFile, snapshot, outDir, opts.tailwindcssBasedir, opts.cssMatcher, getSfcSource, debug);
4294
4679
  if (inferredSfcStyleSource) {
@@ -4296,15 +4681,11 @@ function createGenerateBundleHook(context) {
4296
4681
  const rememberedSourcesBelongToInferredSfc = rememberedCssSources.length > 0 && rememberedCssSources.every((remembered) => normalizeSfcSourceFileForCompare(remembered.sourceFile) === inferredSourceFile);
4297
4682
  if (!hasUsableRememberedTailwindSource || rememberedSourcesBelongToInferredSfc) rememberedCssSources = [inferredSfcStyleSource];
4298
4683
  }
4299
- 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)))) {
4300
4685
  rememberedCssSources = [];
4301
4686
  hasUsableRememberedTailwindSource = false;
4302
4687
  }
4303
4688
  let outputCssHandlerOptions = getCssHandlerOptions(outputFile);
4304
- if (currentSubpackageRoots && rememberedCssSources.length > 0 && rememberedCssSources.some((remembered) => configuredTailwindV4CssSourceFileKeysForScope.has(require_source_candidate_scan_signature.normalizeOutputPathKey(remembered.sourceFile.replace(/[?#].*$/, ""))) && !isSameSubpackageScope(outputFile, remembered.sourceFile, currentSubpackageRoots))) {
4305
- rememberedCssSources = [];
4306
- hasUsableRememberedTailwindSource = false;
4307
- }
4308
4689
  if (isTemporaryCssAssetFile(outputFile) && hasTailwindGenerationSource(rawSource)) {
4309
4690
  const resolvedTemporarySource = temporaryCssAssetSourceResolver.resolve(outputFile, rawSource);
4310
4691
  if (resolvedTemporarySource) {
@@ -4328,7 +4709,14 @@ function createGenerateBundleHook(context) {
4328
4709
  }
4329
4710
  if (!hasUsableRememberedTailwindSource) {
4330
4711
  const configuredTailwindV4CssSourceEntries = getConfiguredTailwindV4CssSourceEntries();
4331
- 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;
4332
4720
  if (inferredOriginalSourceStyle) {
4333
4721
  outputFile = resolveMatchedOutputFileForCurrentAsset(inferredOriginalSourceStyle.sourceFile) ?? outputFile;
4334
4722
  activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
@@ -4358,7 +4746,11 @@ function createGenerateBundleHook(context) {
4358
4746
  }
4359
4747
  } else if (hasTailwindGenerationSource(rawSource) && (originalSource.originalFileNames?.length ?? 0) === 0) {
4360
4748
  const availableConfiguredTailwindV4CssSourceEntries = configuredTailwindV4CssSourceEntries.filter((entry) => !usedConfiguredTailwindV4CssSourceFiles.has(require_source_candidate_scan_signature.normalizeOutputPathKey(entry.file)));
4361
- const configuredGenerationSource = selectTailwindV4GenerationCssSourceForOutput(outputFile, availableConfiguredTailwindV4CssSourceEntries, rawSource, currentSubpackageRoots);
4749
+ const configuredGenerationSource = selectTailwindV4GenerationCssSourceForOutput(outputFile, availableConfiguredTailwindV4CssSourceEntries, rawSource, {
4750
+ cwd: opts.tailwindcssBasedir,
4751
+ outputRoot: outDir,
4752
+ projectRoot: sourceRoot ?? rootDir
4753
+ });
4362
4754
  if (configuredGenerationSource && !hasViteProcessedCssResultForSource(configuredGenerationSource.file, getViteProcessedCssAssetResults)) {
4363
4755
  outputFile = resolveMatchedOutputFileForCurrentAsset(configuredGenerationSource.file) ?? outputFile;
4364
4756
  activeViteCssCacheFiles.add(normalizeViteCssCacheKey(outputFile));
@@ -4374,7 +4766,7 @@ function createGenerateBundleHook(context) {
4374
4766
  }
4375
4767
  }
4376
4768
  let rememberedCssSource = mergeRememberedCssSources(rememberedCssSources, outputFile);
4377
- 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))) {
4378
4770
  const matchedOutputFile = resolveMatchedOutputFileForCurrentAsset(rememberedCssSource.sourceFile);
4379
4771
  if (matchedOutputFile && require_source_candidate_scan_signature.normalizeOutputPathKey(matchedOutputFile) !== require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile)) {
4380
4772
  outputFile = matchedOutputFile;
@@ -4403,11 +4795,12 @@ function createGenerateBundleHook(context) {
4403
4795
  }
4404
4796
  const hasRememberedApplyDirective = rememberedCssSource != null && require_v4_engine.hasTailwindApplyDirective(rememberedCssSource.rawSource);
4405
4797
  const hasRememberedTailwindGenerationSource = rememberedCssSource != null && hasTailwindGenerationSource(rememberedCssSource.rawSource);
4406
- 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);
4407
4798
  const hasSameOutputRememberedTailwindGenerationSource = hasRememberedTailwindGenerationSource && rememberedCssSource != null && require_source_candidate_scan_signature.normalizeOutputPathKey(rememberedCssSource.outputFile) === require_source_candidate_scan_signature.normalizeOutputPathKey(outputFile);
4408
4799
  const hasStaleViteProcessedCssSource = vitePipelineCssAsset && hasDifferentRememberedCssSource && (hasCurrentTailwindGenerationDirective || hasRememberedApplyDirective || hasRememberedTailwindGenerationSource);
4409
4800
  const generatorSourceFile = vitePipelineCssAsset ? rememberedCssSource?.sourceFile ?? assetSourceFile : assetSourceFile;
4410
- 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))) {
4411
4804
  usedConfiguredTailwindV4CssSourceFiles.add(require_source_candidate_scan_signature.normalizeOutputPathKey(generatorSourceFile));
4412
4805
  temporaryCssAssetSourceResolver.markUsed(generatorSourceFile);
4413
4806
  }
@@ -4415,12 +4808,13 @@ function createGenerateBundleHook(context) {
4415
4808
  ...getCssHandlerOptions(generatorSourceFile),
4416
4809
  isMainChunk: resolvedFromTemporaryCssAsset ? false : outputCssHandlerOptions.isMainChunk
4417
4810
  } : getCssHandlerOptions(file);
4811
+ const generatorCssEntries = configuredTailwindV4ExplicitCssEntryFileKeysForScope.has(normalizeConfiguredTailwindV4CssEntryFileKey(generatorSourceFile)) ? [generatorSourceFile] : opts.cssEntries;
4418
4812
  const generatorCssHandlerOptions = {
4419
4813
  ...cssHandlerOptions,
4420
4814
  sourceOptions: {
4421
4815
  ...cssHandlerOptions.sourceOptions ?? {},
4422
4816
  sourceFile: generatorSourceFile,
4423
- cssEntries: opts.cssEntries
4817
+ cssEntries: generatorCssEntries
4424
4818
  }
4425
4819
  };
4426
4820
  const scopedSourceCandidateGetter = createScopedSourceCandidateGetter(outputFile, generatorCssHandlerOptions);
@@ -4432,6 +4826,10 @@ function createGenerateBundleHook(context) {
4432
4826
  opts,
4433
4827
  tokenSources: sourceTraceTokenSources
4434
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
+ };
4435
4833
  const shouldRegenerateMainPackageCssWithScopedCandidates = vitePipelineCssAsset && shouldExcludeSubpackageSourceCandidates(outputFile, generatorCssHandlerOptions);
4436
4834
  const generatorCssUserHandlerOptions = getCssUserHandlerOptions(generatorSourceFile);
4437
4835
  const cssRuntimeAffectingSignature = vitePipelineCssAsset ? require_source_candidate_scan_signature.createRuntimeAffectingSourceSignature(generatorRawSource, "css") : snapshot.runtimeAffectingSignatureByFile.get(file) ?? require_source_candidate_scan_signature.createRuntimeAffectingSourceSignature(generatorRawSource, "css");
@@ -4439,19 +4837,30 @@ function createGenerateBundleHook(context) {
4439
4837
  const cssShareScope = createCssTransformShareScopeKey(opts, outputFile, generatorRawSource);
4440
4838
  const shouldRegenerateCollectedViteCss = viteProcessedCssAsset && useIncrementalMode && state.generatorCandidateSignature !== void 0 && generatorCandidatesChanged && (hasTailwindGenerationSource(generatorRawSource) || require_source_candidate_scan_signature.hasBundlerGeneratedCssMarker(rawSource) || rememberedCssSource != null && hasTailwindGenerationSource(rememberedCssSource.rawSource));
4441
4839
  const shouldRefreshViteProcessedCssByCandidates = viteProcessedCssAsset && useIncrementalMode && state.generatorCandidateSignature !== void 0 && generatorCandidatesChanged;
4442
- 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));
4443
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));
4444
4844
  const shouldPreserveCollectedViteCssAsset = !shouldRegenerateCollectedViteCss && (state.generatorCandidateSignature === void 0 || !generatorCandidatesChanged) && (collectedBundlerGeneratedCssFiles.has(file) || require_source_candidate_scan_signature.hasBundlerGeneratedCssMarker(rawSource));
4445
4845
  const strippedViteProcessedCss = require_source_candidate_scan_signature.stripBundlerGeneratedCssMarkers(rawSource);
4446
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);
4447
4847
  if (alreadyProcessedCssAsset && !shouldRefreshViteProcessedCssByCandidates && (!hasStaleViteProcessedCssSource || shouldPreserveStaleGeneratedCssAsset) && !hasRememberedApplySource && !shouldRegenerateMainPackageCssWithScopedCandidates && (!shouldTrackGeneratorRuntime || shouldPreserveCollectedViteCssAsset)) {
4448
- const nextCss = strippedViteProcessedCss;
4848
+ const nextCss = removeRootCoveredCssFromScopedAsset(strippedViteProcessedCss);
4449
4849
  applyCssResult(nextCss);
4450
4850
  markCssAssetProcessed?.(originalSource, outputFile);
4451
4851
  recordCssAssetResult?.(outputFile, nextCss);
4452
- recordViteProcessedCssAssetResult?.(outputFile, nextCss, {
4852
+ if (vitePipelineCssAsset && rememberedCssSource) rememberCssSource?.({
4853
+ outputFile: vitePipelineCssInjectionOutputFile,
4854
+ rawSource: generatorRawSource,
4855
+ sourceFile: generatorSourceFile
4856
+ });
4857
+ if (shouldRecordVitePipelineCssByOutput) recordViteProcessedCssAssetResult?.(vitePipelineCssInjectionOutputFile, nextCss, {
4453
4858
  injectIntoMain: outputCssHandlerOptions.isMainChunk ? false : shouldInjectVitePipelineCssIntoMain,
4454
- outputFile
4859
+ outputFile: vitePipelineCssInjectionOutputFile
4860
+ });
4861
+ if (vitePipelineCssAsset && shouldInjectVitePipelineCssIntoMain) recordViteProcessedCssAssetResult?.(file, nextCss, {
4862
+ injectIntoMain: shouldInjectVitePipelineCssIntoMain,
4863
+ outputFile: vitePipelineCssInjectionOutputFile
4455
4864
  });
4456
4865
  onUpdate(outputFile, rawSource, nextCss);
4457
4866
  debug("css skip vite-processed asset: %s", outputFile);
@@ -4489,7 +4898,7 @@ function createGenerateBundleHook(context) {
4489
4898
  rememberLastCssResult(lastCssResultByFile, lastCssSourceHashByFile, outputFile, source, cssRuntimeAffectingHash);
4490
4899
  markCssAssetProcessed?.(originalSource, outputFile);
4491
4900
  if (rememberedCssSources.length <= 1) rememberCssSource?.({
4492
- outputFile,
4901
+ outputFile: vitePipelineCssInjectionOutputFile,
4493
4902
  rawSource: generatorRawSource,
4494
4903
  sourceFile: generatorSourceFile
4495
4904
  }, rememberedCssRuntimeSignature);
@@ -4524,6 +4933,7 @@ function createGenerateBundleHook(context) {
4524
4933
  cssUserHandlerOptions: generatorCssUserHandlerOptions,
4525
4934
  getSourceCandidatesForEntries: scopedSourceCandidateGetter,
4526
4935
  sourceCandidates: scopedGeneratorRuntime,
4936
+ generatorPlatform,
4527
4937
  styleHandler,
4528
4938
  debug,
4529
4939
  previousCss,
@@ -4531,19 +4941,19 @@ function createGenerateBundleHook(context) {
4531
4941
  ...usesConfiguredTailwindV4FallbackSource ? { restoreLocalCssImports: false } : {}
4532
4942
  }) : void 0;
4533
4943
  if (generated) {
4534
- const tracedCss = annotateCss(generated.css);
4944
+ const tracedCss = removeRootCoveredCssFromScopedAsset(annotateCss(transformWebTargetCss(generated.css)));
4535
4945
  registerGeneratorDependencies$1({ addWatchFile }, generated.dependencies);
4536
4946
  if (envFlags.debugCssDiff) debug("css diff %s: %s", generatorSourceFile, require_source_candidate_scan_signature.summarizeStringDiff(generatorRawSource, tracedCss));
4537
4947
  debug("css generated result: %s bytes=%d", file, tracedCss.length);
4538
4948
  for (const candidate of generated.classSet ?? []) transformRuntime.add(candidate);
4539
4949
  recordCssAssetResult?.(outputFile, tracedCss);
4540
- recordViteProcessedCssAssetResult?.(outputFile, tracedCss, {
4950
+ if (shouldRecordVitePipelineCssByOutput) recordViteProcessedCssAssetResult?.(vitePipelineCssInjectionOutputFile, tracedCss, {
4541
4951
  injectIntoMain: outputCssHandlerOptions.isMainChunk ? false : shouldInjectVitePipelineCssIntoMain,
4542
- outputFile
4952
+ outputFile: vitePipelineCssInjectionOutputFile
4543
4953
  });
4544
4954
  if (vitePipelineCssAsset && shouldInjectVitePipelineCssIntoMain) recordViteProcessedCssAssetResult?.(file, tracedCss, {
4545
4955
  injectIntoMain: shouldInjectVitePipelineCssIntoMain,
4546
- outputFile
4956
+ outputFile: vitePipelineCssInjectionOutputFile
4547
4957
  });
4548
4958
  metrics.css.elapsed += measureElapsed(start);
4549
4959
  metrics.css.transformed++;
@@ -4551,10 +4961,11 @@ function createGenerateBundleHook(context) {
4551
4961
  return tracedCss;
4552
4962
  }
4553
4963
  if (isWebGeneratorTarget) {
4964
+ const outputCss = transformWebTargetCss(rawSource);
4554
4965
  metrics.css.elapsed += measureElapsed(start);
4555
4966
  metrics.css.transformed++;
4556
4967
  debug("css preserve web target: %s", outputFile);
4557
- return annotateCss(rawSource);
4968
+ return annotateCss(outputCss);
4558
4969
  }
4559
4970
  const { css } = await styleHandler(generatorRawSource, cssHandlerOptions);
4560
4971
  const tracedCss = annotateCss(css);
@@ -4574,7 +4985,7 @@ function createGenerateBundleHook(context) {
4574
4985
  continue;
4575
4986
  }
4576
4987
  if (type !== "js") continue;
4577
- if (isWebGeneratorTarget) {
4988
+ if (isWebGeneratorTarget && !shouldApplyWebviewSafeSelectors) {
4578
4989
  debug("js skip web target: %s", file);
4579
4990
  continue;
4580
4991
  }
@@ -4620,6 +5031,7 @@ function createGenerateBundleHook(context) {
4620
5031
  debug,
4621
5032
  defaultStyleOutputExtension,
4622
5033
  emitOrReplayCssAsset,
5034
+ generatorPlatform,
4623
5035
  generatorRuntime,
4624
5036
  getCssHandlerOptions,
4625
5037
  getCssUserHandlerOptions,
@@ -4699,12 +5111,19 @@ function createGenerateBundleHook(context) {
4699
5111
  tasks,
4700
5112
  timingDetails,
4701
5113
  transformRuntime,
5114
+ transformWebTargetCss,
4702
5115
  useIncrementalMode
4703
5116
  });
4704
5117
  };
4705
5118
  }
4706
5119
  //#endregion
4707
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
+ }
4708
5127
  function isAddWatchFileInvalidRollupPhaseError(error) {
4709
5128
  const candidate = error;
4710
5129
  return candidate?.code === "INVALID_ROLLUP_PHASE" || candidate?.pluginCode === "INVALID_ROLLUP_PHASE" || candidate?.message?.includes("Cannot call \"addWatchFile\" after the build has finished.") === true;
@@ -4748,8 +5167,13 @@ function shouldFinalizeProcessedCssAsset(opts, file) {
4748
5167
  function collectViteProcessedCssSources(getViteProcessedCssAssetResults) {
4749
5168
  return [...getViteProcessedCssAssetResults?.() ?? []].map(([, record]) => typeof record === "string" ? record : record.css);
4750
5169
  }
4751
- function finalizeWebCss(css, enabled, webCompat) {
4752
- 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;
4753
5177
  }
4754
5178
  function createViteCssFinalizerOutputPlugin(context) {
4755
5179
  return {
@@ -4761,24 +5185,27 @@ function createViteCssFinalizerOutputPlugin(context) {
4761
5185
  const { opts, runtimeState, ensureRuntimeClassSet, isCssAssetProcessed, markCssAssetProcessed, debug, getResolvedConfig, recordCssAssetResult, recordViteProcessedCssAssetResult, getViteProcessedCssAssetResults, getRecordedGeneratorCandidates, getSourceCandidates, getSourceCandidatesForEntries, getSourceCandidateSourcesForEntries, waitForSourceCandidateSyncs, rememberMainCssSource, getRememberedMainCssSource, isViteProcessedCssAsset } = context;
4762
5186
  const resolvedConfig = getResolvedConfig();
4763
5187
  const uniUtsPlatform = require_utils.resolveUniUtsPlatform();
5188
+ const generatorPlatform = opts.cssOptions?.platform ?? opts.platform ?? inferPlatformFromViteOutDir(resolvedConfig?.build?.outDir);
4764
5189
  const generatorOptions = require_generator.normalizeWeappTailwindcssGeneratorOptions(opts.generator, {
4765
5190
  appType: opts.appType,
4766
- platform: opts.cssOptions?.platform ?? opts.platform,
5191
+ platform: generatorPlatform,
4767
5192
  tailwindcssMajorVersion: runtimeState.tailwindRuntime.majorVersion,
4768
5193
  uniAppX: opts.uniAppX,
4769
5194
  uniUtsPlatform
4770
5195
  });
4771
5196
  const generatorBranch = require_generator.resolveGeneratorRuntimeBranch(generatorOptions, {
4772
5197
  appType: opts.appType,
4773
- platform: opts.cssOptions?.platform ?? opts.platform,
5198
+ platform: generatorPlatform,
4774
5199
  tailwindcssMajorVersion: runtimeState.tailwindRuntime.majorVersion,
4775
5200
  uniAppX: opts.uniAppX,
4776
5201
  uniUtsPlatform
4777
5202
  });
4778
5203
  const isWebGeneratorTarget = generatorBranch.isWeb;
4779
- const canInferHarmonyAppStyleTarget = !uniUtsPlatform.normalized || uniUtsPlatform.isApp;
4780
- const isHarmonyAppStyleTarget = uniUtsPlatform.isAppHarmony || canInferHarmonyAppStyleTarget && (isUniAppXHarmonyBundle(bundle) || isUniAppXHarmonyOutDir(resolvedConfig?.build?.outDir));
4781
- 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);
4782
5209
  if (resolvedConfig?.command !== "build" && !isNativeAppStyleTarget) return;
4783
5210
  const rootDir = resolvedConfig?.root ? node_path.default.resolve(resolvedConfig.root) : node_process.default.cwd();
4784
5211
  const sourceRoot = resolveWeappViteSourceRoot(resolvedConfig, opts.appType) ?? resolveSourceRootFromBundleGraph(resolvedConfig, bundle);
@@ -4795,7 +5222,10 @@ function createViteCssFinalizerOutputPlugin(context) {
4795
5222
  recordCssAssetResult,
4796
5223
  recordViteProcessedCssAssetResult,
4797
5224
  resolveViteProcessedCssOutputFile: (file) => resolveViteCssPipelineOutputFile(file, opts, rootDir, isWebGeneratorTarget, isNativeAppStyleTarget, sourceRoot, resolveMiniProgramStyleOutputExtension({ files: Object.keys(bundle) }), Object.keys(bundle)),
4798
- 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
+ }),
4799
5229
  debug
4800
5230
  });
4801
5231
  };
@@ -4805,6 +5235,10 @@ function createViteCssFinalizerOutputPlugin(context) {
4805
5235
  getViteProcessedCssAssetResults,
4806
5236
  markCssAssetProcessed,
4807
5237
  recordCssAssetResult,
5238
+ transformCss: (css) => finalizeWebCss(css, generatorBranch.isWeb, generatorOptions.webCompat, {
5239
+ escapeMap: opts.escapeMap,
5240
+ safeSelectors: shouldApplyWebviewSafeSelectors
5241
+ }),
4808
5242
  debug,
4809
5243
  onUpdate: opts.onUpdate
4810
5244
  });
@@ -4830,6 +5264,7 @@ function createViteCssFinalizerOutputPlugin(context) {
4830
5264
  isMainChunk: false
4831
5265
  },
4832
5266
  getSourceCandidatesForEntries,
5267
+ generatorPlatform,
4833
5268
  styleHandler: opts.styleHandler,
4834
5269
  debug
4835
5270
  });
@@ -4868,7 +5303,10 @@ function createViteCssFinalizerOutputPlugin(context) {
4868
5303
  const file = output.fileName || bundleFile;
4869
5304
  const rawSource = output.source.toString();
4870
5305
  if (isViteProcessedCssAsset?.(output, file)) {
4871
- 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
+ }));
4872
5310
  output.source = nextCss;
4873
5311
  markCssAssetProcessed(output, file);
4874
5312
  recordCssAssetResult?.(file, nextCss);
@@ -4899,10 +5337,14 @@ function createViteCssFinalizerOutputPlugin(context) {
4899
5337
  cssHandlerOptions: generatorCssHandlerOptions,
4900
5338
  cssUserHandlerOptions: generatorCssUserHandlerOptions,
4901
5339
  getSourceCandidatesForEntries,
5340
+ generatorPlatform,
4902
5341
  styleHandler: opts.styleHandler,
4903
5342
  debug
4904
5343
  }) : void 0;
4905
- 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));
4906
5348
  if (generated) {
4907
5349
  registerGeneratorDependencies(this, generated.dependencies);
4908
5350
  debug("css finalizer generated result: %s bytes=%d", file, nextCss.length);
@@ -5051,6 +5493,7 @@ function createViteCssMemory(options) {
5051
5493
  for (const [rememberedKey, remembered] of relatedRememberedEntries) {
5052
5494
  touchMapEntry(rememberedCssSources, rememberedKey, {
5053
5495
  ...remembered,
5496
+ outputFile: entry.outputFile,
5054
5497
  rawSource: entry.rawSource,
5055
5498
  sourceFile: entry.sourceFile
5056
5499
  });
@@ -5205,6 +5648,22 @@ function resolveHotTailwindCssModules(ctx, tailwindRootCssModuleIds) {
5205
5648
  }
5206
5649
  return modules;
5207
5650
  }
5651
+ function resolveHotSourceModules(ctx) {
5652
+ const modules = [];
5653
+ const seenModules = /* @__PURE__ */ new Set();
5654
+ const collectModule = (mod) => {
5655
+ if (mod == null || seenModules.has(mod)) return;
5656
+ if (require_source_candidate_scan_signature.isSourceStyleRequest(mod.id ?? mod.url)) return;
5657
+ seenModules.add(mod);
5658
+ modules.push(mod);
5659
+ };
5660
+ for (const mod of ctx.modules) collectModule(mod);
5661
+ for (const mod of ctx.server.moduleGraph.getModulesByFile(ctx.file) ?? []) collectModule(mod);
5662
+ for (const mod of ctx.server.moduleGraph.getModulesByFile((0, _weapp_tailwindcss_shared.cleanUrl)(ctx.file)) ?? []) collectModule(mod);
5663
+ collectModule(ctx.server.moduleGraph.getModuleById?.(ctx.file));
5664
+ collectModule(ctx.server.moduleGraph.getModuleById?.((0, _weapp_tailwindcss_shared.cleanUrl)(ctx.file)));
5665
+ return modules;
5666
+ }
5208
5667
  function resolveModuleHotUrl(mod) {
5209
5668
  if (typeof mod.url === "string" && mod.url.length > 0) return mod.url;
5210
5669
  if (typeof mod.id === "string" && mod.id.startsWith("/")) return mod.id;
@@ -5685,6 +6144,15 @@ function sameStringList(first, second) {
5685
6144
  if (!first || !second || first.length !== second.length) return false;
5686
6145
  return first.every((item, index) => item === second[index]);
5687
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
+ }
5688
6156
  function normalizeViteStylePlatform(value, appType) {
5689
6157
  return require_context.normalizeFrameworkStylePlatform(value, appType);
5690
6158
  }
@@ -5697,6 +6165,13 @@ function inferPlatformFromOutDir(outDir) {
5697
6165
  function isWebOrNativeAppPlatform(platform) {
5698
6166
  return platform === "h5" || platform === "web" || platform?.startsWith("web-") === true || platform === "app" || platform === "app-plus" || platform?.startsWith("app-") === true;
5699
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
+ }
5700
6175
  /**
5701
6176
  * @name WeappTailwindcss
5702
6177
  * @description uni-app vite / uni-app-x 版本插件
@@ -5705,7 +6180,7 @@ function isWebOrNativeAppPlatform(platform) {
5705
6180
  function WeappTailwindcss(options = {}) {
5706
6181
  const hasExplicitAppType = typeof options.appType === "string" && options.appType.trim().length > 0;
5707
6182
  const hasExplicitTailwindcssBasedir = typeof options.tailwindcssBasedir === "string" && options.tailwindcssBasedir.trim().length > 0;
5708
- const rawCssEntries = Array.isArray(options.cssEntries) ? [...options.cssEntries] : void 0;
6183
+ const rawCssEntries = collectConfiguredCssEntries(options);
5709
6184
  const opts = require_context.getCompilerContext({
5710
6185
  ...options,
5711
6186
  __internalDeferMissingCssEntriesWarning: true
@@ -5724,7 +6199,7 @@ function WeappTailwindcss(options = {}) {
5724
6199
  return changed;
5725
6200
  };
5726
6201
  syncCssEntriesFromAnchor(opts.tailwindcssBasedir);
5727
- const { disabled, customAttributes, onLoad, mainCssChunkMatcher, styleHandler, jsHandler, tailwindRuntime, refreshTailwindcssRuntime, uniAppX, disabledDefaultTemplateHandler } = opts;
6202
+ const { disabled, customAttributes, onLoad, mainCssChunkMatcher, styleHandler, jsHandler, tailwindRuntime, refreshTailwindcssRuntime, uniAppX, disabledDefaultTemplateHandler, styleInjector } = opts;
5728
6203
  const initialTailwindRuntime = tailwindRuntime;
5729
6204
  const refreshTailwindRuntime = refreshTailwindcssRuntime;
5730
6205
  const uniAppXEnabled = require_tailwindcss.isUniAppXEnabled(uniAppX);
@@ -5733,18 +6208,7 @@ function WeappTailwindcss(options = {}) {
5733
6208
  if (!disabledOptions.plugin && tailwindcssMajorVersion !== 4) throw new Error("weapp-tailwindcss/vite 新生成管线仅支持 Tailwind CSS v4,请升级 tailwindcss 或停留在旧版 weapp-tailwindcss。");
5734
6209
  const shouldOwnTailwindGeneration = !disabledOptions.plugin;
5735
6210
  const shouldRewriteCssImports = opts.rewriteCssImports === true;
5736
- const generatorOptions = require_generator.normalizeWeappTailwindcssGeneratorOptions(opts.generator, {
5737
- appType: opts.appType,
5738
- platform: opts.cssOptions?.platform ?? opts.platform,
5739
- tailwindcssMajorVersion,
5740
- uniAppX
5741
- });
5742
- const generatorBranch = require_generator.resolveGeneratorRuntimeBranch(generatorOptions, {
5743
- appType: opts.appType,
5744
- platform: opts.cssOptions?.platform ?? opts.platform,
5745
- tailwindcssMajorVersion,
5746
- uniAppX
5747
- });
6211
+ let resolvedConfig;
5748
6212
  const resolveViteStylePlatform = () => {
5749
6213
  const explicit = normalizeViteStylePlatform(opts.cssOptions?.platform ?? opts.platform, opts.appType);
5750
6214
  if (explicit) return explicit;
@@ -5754,9 +6218,23 @@ function WeappTailwindcss(options = {}) {
5754
6218
  }
5755
6219
  return inferPlatformFromOutDir(resolvedConfig?.build?.outDir);
5756
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();
5757
6235
  const transformEarlyMiniProgramCss = (code) => {
5758
6236
  const platform = resolveViteStylePlatform();
5759
- if (!shouldOwnTailwindGeneration || (platform ? isWebOrNativeAppPlatform(platform) : generatorBranch.isWeb)) return code;
6237
+ if (!shouldOwnTailwindGeneration || (platform ? isWebOrNativeAppPlatform(platform) : resolveCurrentGeneratorBranch().isWeb)) return code;
5760
6238
  let transformedCode = code;
5761
6239
  if (transformedCode.includes("#if")) transformedCode = (0, _weapp_tailwindcss_postcss.compileCssMacroConditionalComments)(transformedCode, { platform: resolveViteStylePlatform() });
5762
6240
  if (transformedCode.includes("@layer")) transformedCode = (0, _weapp_tailwindcss_postcss.unwrapUnsupportedCascadeLayers)(transformedCode);
@@ -5764,10 +6242,10 @@ function WeappTailwindcss(options = {}) {
5764
6242
  };
5765
6243
  const finalizeViteMiniProgramCss = (css) => {
5766
6244
  const platform = resolveViteStylePlatform();
5767
- if (!shouldOwnTailwindGeneration || (platform ? isWebOrNativeAppPlatform(platform) : generatorBranch.isWeb)) return css;
6245
+ if (!shouldOwnTailwindGeneration || (platform ? isWebOrNativeAppPlatform(platform) : resolveCurrentGeneratorBranch().isWeb)) return css;
5768
6246
  return (0, _weapp_tailwindcss_postcss.unwrapUnsupportedCascadeLayers)(css);
5769
6247
  };
5770
- const shouldInferAppType = !hasExplicitAppType && !generatorBranch.isWeb;
6248
+ const shouldInferAppType = !hasExplicitAppType && !initialGeneratorBranch.isWeb;
5771
6249
  const hasInitialTailwindCssRoots = require_v4_engine.hasConfiguredTailwindV4CssRoots({
5772
6250
  ...options,
5773
6251
  cssEntries: opts.cssEntries ?? options.cssEntries
@@ -5847,7 +6325,6 @@ function WeappTailwindcss(options = {}) {
5847
6325
  await refreshRuntimeStateForAutoCssSources?.(true);
5848
6326
  };
5849
6327
  const customAttributesEntities = require_context.toCustomAttributesEntities(customAttributes);
5850
- let resolvedConfig;
5851
6328
  let recordedGeneratorCandidates;
5852
6329
  const sourceCandidateCollector = require_hmr_timing.createSourceCandidateCollector({ bareArbitraryValues: opts.arbitraryValues?.bareArbitraryValues });
5853
6330
  const sourceCandidateScanCache = new lru_cache.LRUCache({ max: SOURCE_CANDIDATE_SCAN_CACHE_MAX });
@@ -5903,6 +6380,15 @@ function WeappTailwindcss(options = {}) {
5903
6380
  const getSourceCandidateSourcesForEntries = (entries, options) => sourceCandidateCollector.sourcesForEntries(entries, options);
5904
6381
  const isWatchBuild = () => resolvedConfig?.command === "build" && resolvedConfig.build.watch != null;
5905
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";
6383
+ const isCurrentWebLikeStylePlatform = () => {
6384
+ const platform = resolveViteStylePlatform();
6385
+ return platform ? isWebOrNativeAppPlatform(platform) : resolveCurrentGeneratorBranch().isWeb;
6386
+ };
6387
+ const isNuxtPageMacroHotModule = (id) => {
6388
+ if (typeof id !== "string" || !/[?&]macro=true(?:&|$)/.test(id)) return false;
6389
+ const cleanId = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
6390
+ return cleanId.includes("/pages/") && /\.(?:vue|tsx?|jsx?)$/.test(cleanId);
6391
+ };
5906
6392
  const hasSourceCandidateScanState = () => sourceCandidateScanSignature !== void 0;
5907
6393
  const normalizeSourceScanDependency = (file) => node_path.default.normalize(node_path.default.resolve((0, _weapp_tailwindcss_shared.cleanUrl)(file)));
5908
6394
  const isSourceScanDependency = (file) => sourceScanDependencies.has(normalizeSourceScanDependency(file));
@@ -6116,47 +6602,58 @@ function WeappTailwindcss(options = {}) {
6116
6602
  const file = (0, _weapp_tailwindcss_shared.cleanUrl)(id);
6117
6603
  const requestFile = require_source_candidate_scan_signature.isCSSRequest(id) ? id : file;
6118
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);
6119
6606
  const rootDir = resolvedConfig?.root ? node_path.default.resolve(resolvedConfig.root) : node_process.default.cwd();
6120
6607
  const isHarmonyAppStyleTarget = isHarmonyAppBuildTarget();
6121
- const isNativeAppStyleTarget = require_utils.resolveUniUtsPlatform().isApp || isHarmonyAppStyleTarget;
6608
+ const isNativeAppStyleTarget = opts.appType === "uni-app-x" && (require_utils.resolveUniUtsPlatform().isApp || isHarmonyAppStyleTarget);
6122
6609
  const sourceRoot = resolveWeappViteSourceRoot(resolvedConfig, opts.appType);
6123
- 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);
6124
6613
  const runtime = getRecordedGeneratorCandidates() ?? getSourceCandidates() ?? await ensureRuntimeClassSet();
6125
6614
  const outputCssHandlerOptions = transformCssHandlerOptions.getCssHandlerOptions(outputFile);
6126
6615
  const cssHandlerOptions = {
6127
6616
  ...transformCssHandlerOptions.getCssHandlerOptions(file),
6128
6617
  isMainChunk: outputCssHandlerOptions.isMainChunk
6129
6618
  };
6130
- 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) ? {
6131
6620
  base: node_path.default.dirname(node_path.default.resolve(file)),
6132
- css: code,
6621
+ css: generatorCode,
6133
6622
  file: node_path.default.resolve(file)
6134
6623
  } : void 0);
6135
- 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));
6136
6625
  const generated = await require_source_candidate_scan_signature.generateTailwindV4Css({
6137
6626
  opts,
6138
6627
  runtimeState,
6139
6628
  runtime,
6140
- rawSource: code,
6629
+ rawSource: generatorCode,
6141
6630
  file,
6142
6631
  outputFile,
6143
6632
  cssHandlerOptions,
6144
6633
  cssUserHandlerOptions: transformCssHandlerOptions.getCssUserHandlerOptions(file),
6145
6634
  cssSources: transientCssSource ? [transientCssSource] : void 0,
6146
6635
  getSourceCandidatesForEntries,
6636
+ generatorPlatform: resolveGeneratorPlatform(),
6147
6637
  styleHandler,
6148
6638
  debug,
6149
6639
  previousCss: viteGeneratedCssByFile.get(file),
6150
- deferEmptyScopedCssSource: shouldDeferEmptyScopedCssSource
6640
+ deferEmptyScopedCssSource: shouldDeferEmptyScopedCssSource,
6641
+ restoreLocalCssImports: !currentGeneratorBranch.isWeb
6151
6642
  });
6152
6643
  if (!generated) return;
6153
- 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), {
6154
6651
  opts,
6155
6652
  tokenSources: require_hmr_timing.createCssTokenSourceMap(getSourceCandidateSourcesForEntries(void 0), opts)
6156
6653
  });
6157
6654
  for (const dependency of generated.dependencies) hookContext?.addWatchFile?.(dependency);
6158
6655
  viteGeneratedCssByFile.set(file, tracedCss);
6159
- 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("/");
6160
6657
  recordViteProcessedCssAssetResult(file, tracedCss, {
6161
6658
  injectIntoMain: shouldInjectGeneratedCssIntoMain,
6162
6659
  outputFile
@@ -6188,7 +6685,7 @@ function WeappTailwindcss(options = {}) {
6188
6685
  onTailwindRootCss: (id, code) => registerAutoCssSource(id, code),
6189
6686
  onCssSourceTransform: (id, code) => cssMemory.refreshRememberedCssSourceBySourceFile(id, code),
6190
6687
  shouldGenerateCss: (_id, code) => hasVitePipelineTailwindGenerationDirective(code),
6191
- 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 }),
6192
6689
  shouldOwnTailwindGeneration,
6193
6690
  shouldRewrite: shouldRewriteCssImports,
6194
6691
  weappTailwindcssDirPosix
@@ -6287,7 +6784,7 @@ function WeappTailwindcss(options = {}) {
6287
6784
  order: "pre",
6288
6785
  async handler(code, id) {
6289
6786
  let transformedCode = code;
6290
- 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);
6291
6788
  const shouldReturnTransformedCode = transformedCode !== code;
6292
6789
  if (shouldOwnTailwindGeneration) cssMemory.rememberKnownSfcSource(id, transformedCode);
6293
6790
  if (!shouldOwnTailwindGeneration || !require_hmr_timing.isSourceCandidateRequest(id) || !shouldCollectTransformedSourceCandidates(id)) {
@@ -6330,13 +6827,27 @@ function WeappTailwindcss(options = {}) {
6330
6827
  return hmrTimingRecorder.measure("sourceCandidates.handleHotUpdate", async () => {
6331
6828
  const isSourceCandidateHotUpdate = shouldOwnTailwindGeneration && require_hmr_timing.isSourceCandidateRequest(ctx.file);
6332
6829
  await syncChangedSourceCandidateFile(ctx.file);
6333
- if (isSourceCandidateHotUpdate) invalidateRecordedGeneratorCandidates();
6830
+ const isWebLikeHotUpdate = isCurrentWebLikeStylePlatform();
6831
+ if (isSourceCandidateHotUpdate) {
6832
+ invalidateRecordedGeneratorCandidates();
6833
+ if (isWebLikeHotUpdate) {
6834
+ await refreshRuntimeStateForAutoCssSources?.(true);
6835
+ await syncSourceCandidateScan({ force: true });
6836
+ }
6837
+ }
6334
6838
  const cssModules = resolveHotTailwindCssModules(ctx, tailwindRootCssModuleIds);
6335
- if (isSourceCandidateHotUpdate && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file) && (!hasSelfAcceptingNonStyleHotModule(ctx.modules) && cssModules.length === 0 || cssModules.length > 0 && isUniViteProject())) {
6839
+ const sourceModules = isSourceCandidateHotUpdate && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file) ? resolveHotSourceModules(ctx) : ctx.modules;
6840
+ if (isSourceCandidateHotUpdate && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file) && !isWebLikeHotUpdate && (!hasSelfAcceptingNonStyleHotModule(sourceModules) && cssModules.length === 0 || cssModules.length > 0 && isUniViteProject())) {
6841
+ sendFullReloadForUnresolvedHotUpdate(ctx);
6842
+ return [];
6843
+ }
6844
+ if (isWebLikeHotUpdate && isSourceCandidateHotUpdate && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file) && ctx.modules.some((mod) => isNuxtPageMacroHotModule(mod.id ?? mod.url))) {
6336
6845
  sendFullReloadForUnresolvedHotUpdate(ctx);
6337
6846
  return [];
6338
6847
  }
6339
6848
  sendSupplementalCssHotUpdates(ctx, cssModules);
6849
+ if (isWebLikeHotUpdate && isSourceCandidateHotUpdate && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file)) return;
6850
+ if (isSourceCandidateHotUpdate && !require_source_candidate_scan_signature.isSourceStyleRequest(ctx.file) && cssModules.length > 0) return [...sourceModules, ...cssModules];
6340
6851
  return cssModules.length > 0 ? [...ctx.modules, ...cssModules] : void 0;
6341
6852
  }, { emit: false });
6342
6853
  },
@@ -6353,10 +6864,10 @@ function WeappTailwindcss(options = {}) {
6353
6864
  shouldGenerate: () => shouldOwnTailwindGeneration
6354
6865
  }),
6355
6866
  createViteServeJsTransformPlugin({
6356
- createHandlerOptions: serveJsHandlerOptions,
6867
+ createHandlerOptions: (file) => serveJsHandlerOptions(file, opts.appType === "uni-app-vite" && isUniAppViteWebviewStylePlatform(resolveViteStylePlatform()) ? { needEscaped: true } : void 0),
6357
6868
  getCommand: () => resolvedConfig?.command,
6358
6869
  jsHandler,
6359
- shouldTransform: () => shouldOwnTailwindGeneration && !generatorBranch.isWeb,
6870
+ shouldTransform: () => shouldOwnTailwindGeneration && (!resolveCurrentGeneratorBranch().isWeb || opts.appType === "uni-app-vite" && isUniAppViteWebviewStylePlatform(resolveViteStylePlatform())),
6360
6871
  transformRuntime: ensureRuntimeClassSet
6361
6872
  }),
6362
6873
  {
@@ -6433,6 +6944,7 @@ function WeappTailwindcss(options = {}) {
6433
6944
  ];
6434
6945
  if (uniAppXPlugins) plugins.push(...uniAppXPlugins);
6435
6946
  plugins.push(cssFinalizerOutputPlugin);
6947
+ plugins.push(...require_source_candidate_scan_signature.createBuiltinViteStyleInjectorPlugins(styleInjector, () => opts.appType));
6436
6948
  return plugins;
6437
6949
  }
6438
6950
  //#endregion