From fed1d5d3f489a653b4eac1389c686fe0bb8ff02a Mon Sep 17 00:00:00 2001 From: Ajay Ghanwat Date: Mon, 3 Aug 2026 01:03:33 +0530 Subject: [PATCH] perf: omit unused UI CSS and minify final bundles --- packages/cli/src/build.ts | 17 +++++++++++++---- packages/styles/src/config.ts | 2 ++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/cli/src/build.ts b/packages/cli/src/build.ts index 19a3b0b6..54d71a0f 100644 --- a/packages/cli/src/build.ts +++ b/packages/cli/src/build.ts @@ -40,6 +40,7 @@ import { headToString, renderProductionFontHead, findStyleEntry, + bundleCss, renderStyles, resolveThemeConfig, renderThemeCss, @@ -401,12 +402,16 @@ export async function runBuild(appRoot: string): Promise { console.log(`✓ Theme: ${theme.names.length} themes (default: ${theme.default})`); // 1a2) Wire UI stylesheet (all component classes, themed via tokens). - const uiStyles = uiCss(); + const uiStyles = config.styles?.includeUi === false ? "" : uiCss(); writeFileSync(join(distDir, "ui.css"), uiStyles, "utf8"); const frameworkStyles = `${themeCss}\n${uiStyles}`; writeFileSync(join(distDir, "framework.css"), frameworkStyles, "utf8"); assetHash.update(uiStyles); - console.log(`✓ UI: dist/ui.css + framework.css`); + console.log( + config.styles?.includeUi === false + ? `✓ UI: omitted by styles.includeUi` + : `✓ UI: dist/ui.css + framework.css`, + ); // 1a3) Validation: bake schema descriptors into the client script. const descriptors: Record = {}; @@ -447,8 +452,12 @@ export async function runBuild(appRoot: string): Promise { }, config.styles, ); - assetHash.update(css); - const combinedCss = `${frameworkStyles}\n${css}`; + const combinedSource = `${frameworkStyles}\n${css}`; + const combinedInput = join(distDir, ".wrnexus-combined.css"); + writeFileSync(combinedInput, combinedSource, "utf8"); + const combinedCss = await bundleCss(combinedInput, "production"); + rmSync(combinedInput, { force: true }); + assetHash.update(combinedCss); // One blocking CSS request in production: tokens → UI → application CSS. // The standalone framework.css remains available for apps without global CSS. writeFileSync(join(distDir, "styles.css"), combinedCss, "utf8"); diff --git a/packages/styles/src/config.ts b/packages/styles/src/config.ts index f7765f12..00fa66f1 100644 --- a/packages/styles/src/config.ts +++ b/packages/styles/src/config.ts @@ -42,6 +42,8 @@ export interface StyleProcessContext { export interface StylesConfig { /** Path to the CSS entry, relative to the app root. Default: app/styles/global.css */ entry?: string; + /** Include the complete @wrnexus/ui component catalog stylesheet. Default true. */ + includeUi?: boolean; /** * Optional custom processor. Return the final CSS string. Use this to run * Tailwind, PostCSS, Sass, etc. When omitted, the built-in Bun CSS bundler is