diff --git a/.changeset/tiny-rocks-hunt.md b/.changeset/tiny-rocks-hunt.md
new file mode 100644
index 00000000..d19bfefd
--- /dev/null
+++ b/.changeset/tiny-rocks-hunt.md
@@ -0,0 +1,19 @@
+---
+"@devup-ui/rsbuild-plugin": patch
+"@devup-ui/webpack-plugin": patch
+"@devup-ui/wasm": patch
+"@devup-ui/next-plugin": patch
+"@devup-ui/vite-plugin": patch
+---
+
+Optimized typography CSS values
+
+Merged base component CSS to avoid duplicate generation
+
+Introduced @layer to ensure style order consistency in CSS split mode
+
+Downgraded nm base to avoid issues with g-ad class (display: none when AdBlock is enabled)
+
+Fixed global CSS logic issue in CSS split mode
+
+
diff --git a/.changeset/tiny-rocks-hunt2.md b/.changeset/tiny-rocks-hunt2.md
new file mode 100644
index 00000000..b81b3eb7
--- /dev/null
+++ b/.changeset/tiny-rocks-hunt2.md
@@ -0,0 +1,9 @@
+---
+"@devup-ui/vite-plugin": patch
+---
+
+Fixed duplicate main.css generation in CSS split mode on vite
+
+
+
+
diff --git a/.changeset/tiny-rocks-hunt3.md b/.changeset/tiny-rocks-hunt3.md
new file mode 100644
index 00000000..f345b438
--- /dev/null
+++ b/.changeset/tiny-rocks-hunt3.md
@@ -0,0 +1,11 @@
+---
+"@devup-ui/webpack-plugin": patch
+---
+
+Fixed default theme issue in Webpack
+
+
+
+
+
+
diff --git a/Cargo.lock b/Cargo.lock
index 87f4ef92..b9ddd544 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -658,9 +658,9 @@ dependencies = [
[[package]]
name = "oxc_allocator"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dad79355dfb8a36a772d2aa758e429ae02f533d33c314f538d20ef188db0147"
+checksum = "9bdf7abfb88ad84430ccaf674d3fa463af5dceb0fd21ddaae83e7d2057668ce3"
dependencies = [
"allocator-api2",
"bumpalo",
@@ -671,9 +671,9 @@ dependencies = [
[[package]]
name = "oxc_ast"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9987f0e42aef7eb2deccec8dec26b17c658c8616bb7260a53037b765db708f0"
+checksum = "cd6a0d0ba1b1115575d35bfcd64f1458fe5db70fd988c08b742da223be2ea65f"
dependencies = [
"bitflags",
"oxc_allocator",
@@ -687,9 +687,9 @@ dependencies = [
[[package]]
name = "oxc_ast_macros"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08b4b00b34d96543ca44ce82e2e48098197b651b639ff211df48d1725215db08"
+checksum = "55f299cae11166ffa2fe60a87df1de417f2ac05f21b7dffba173a004f667f321"
dependencies = [
"phf",
"proc-macro2",
@@ -699,9 +699,9 @@ dependencies = [
[[package]]
name = "oxc_ast_visit"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "522d1393ad48548702a8ff9b747100e9c0959dbd37cd677e12d9ffb5eb7f6490"
+checksum = "5b27334d066366a5d1289f0de12725be057ff1ac90e5b8fe6589d94d14c8a1fa"
dependencies = [
"oxc_allocator",
"oxc_ast",
@@ -711,9 +711,9 @@ dependencies = [
[[package]]
name = "oxc_cfg"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bdf2665550303cfdc9843e4a7f6d88f3216075f42e38b2c2cc0224bf0ba1632"
+checksum = "9b807d606f5fe3ccf7ea64d2d857b755b6d31e8120c9de73591dd5851e6fe59a"
dependencies = [
"bitflags",
"itertools 0.14.0",
@@ -726,9 +726,9 @@ dependencies = [
[[package]]
name = "oxc_codegen"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "081b3d96db8e9f1677d56a959873f971285bf565276c11d61e7b61affee15790"
+checksum = "2bca273354501a56cad5f7705cf857ace9d3a1a0c767503df323e0b5be30dffa"
dependencies = [
"bitflags",
"cow-utils",
@@ -748,15 +748,15 @@ dependencies = [
[[package]]
name = "oxc_data_structures"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2d124d0e1498479cd9410b494fe12d4018a1db55400508c0f8d9d0817934dc6"
+checksum = "39656fa64b09714c36416d954897e8fb0f42c462c3082fda22c8760282f55a15"
[[package]]
name = "oxc_diagnostics"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0befbac8654a5a1cef8ee9b31ff6cf669c9abde763f30fb12c2c284993c86498"
+checksum = "da029cea375d098fc97993afe96413563a55ebc80ff704b831e1dddea2e78911"
dependencies = [
"cow-utils",
"oxc-miette",
@@ -765,9 +765,9 @@ dependencies = [
[[package]]
name = "oxc_ecmascript"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c59f9f0cfb236ae7b1e8f1be956f3585078256d8a4f8881cbe3b02edd7c57b1"
+checksum = "b868985647967b7b173c9681a6486691cf9c5d0fb4e64d114e65cc8a8978657a"
dependencies = [
"cow-utils",
"num-bigint",
@@ -780,9 +780,9 @@ dependencies = [
[[package]]
name = "oxc_estree"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70bffad4cb83abd3db5310ccdb5f298b19377244d43eda7ec3912b544452bcb2"
+checksum = "3c20498f0f4b7afec0a8b772174bf7736d79ff31a8e0073dd9081747801407c5"
[[package]]
name = "oxc_index"
@@ -792,9 +792,9 @@ checksum = "2fa07b0cfa997730afed43705766ef27792873fdf5215b1391949fec678d2392"
[[package]]
name = "oxc_parser"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90a651f61f532b9c5485c65786363b42c3a711ba60871746740409f381b49bea"
+checksum = "df72e23adc7a481f60a1410fafc3833a5411c077271e2a5bb97083c93b274683"
dependencies = [
"bitflags",
"cow-utils",
@@ -815,9 +815,9 @@ dependencies = [
[[package]]
name = "oxc_regular_expression"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b97261c926b800200a07309eefc7b5801432ed3a91b76b5ea9780f97fc961d4"
+checksum = "97247d67a14e17dcb004ca57e59283b235e1a84813a2048e0585ca901a64eb99"
dependencies = [
"bitflags",
"oxc_allocator",
@@ -831,9 +831,9 @@ dependencies = [
[[package]]
name = "oxc_semantic"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b594d9a93b359ba5421118c0cc2664795138e171ffb60c345e621fc8ea4cf4dd"
+checksum = "b81b3fd1c502c5179740c1688a4062f4db35cf4107da311786c2005809f542b5"
dependencies = [
"itertools 0.14.0",
"oxc_allocator",
@@ -867,9 +867,9 @@ dependencies = [
[[package]]
name = "oxc_span"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1948fe931738f956b2c673804bce7f93b3dc8fcb4575485ef65adc15fcae3d92"
+checksum = "6b70dfb43ba1c04ae09ba4c0e85dbb7af2260ff029458fe45a7f4e7d0384442c"
dependencies = [
"compact_str",
"oxc-miette",
@@ -880,9 +880,9 @@ dependencies = [
[[package]]
name = "oxc_syntax"
-version = "0.83.0"
+version = "0.86.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad28a43d5b4ccf4f286b68f377d364790c098128729b44a52421cf9de2ce3ec0"
+checksum = "5478a4c0b503ac61c09e5450a607517ad7f8dba36b7bea53db17d4b7221ef7df"
dependencies = [
"bitflags",
"cow-utils",
diff --git a/README.md b/README.md
index 07f6a914..ff8cfbe4 100644
--- a/README.md
+++ b/README.md
@@ -42,6 +42,12 @@ npm install @devup-ui/next-plugin
# on vite
npm install @devup-ui/vite-plugin
+
+# on rsbuild
+npm install @devup-ui/rsbuild-plugin
+
+# on webpack
+npm install @devup-ui/webpack-plugin
```
## Features
diff --git a/apps/landing/package.json b/apps/landing/package.json
index dbdd0c7a..f2c030b5 100644
--- a/apps/landing/package.json
+++ b/apps/landing/package.json
@@ -7,15 +7,15 @@
"dev": "node ./script.js && next dev",
"search": "node ./script.js",
"build": "node ./script.js && next build",
- "start": "node ./script.js && next start",
+ "start": "npx serve ./out",
"lint": "eslint"
},
"dependencies": {
"@devup-ui/components": "workspace:*",
"@devup-ui/react": "workspace:*",
"@devup-ui/reset-css": "workspace:*",
- "@mdx-js/loader": "^3.1.0",
- "@mdx-js/react": "^3.1.0",
+ "@mdx-js/loader": "^3.1.1",
+ "@mdx-js/react": "^3.1.1",
"@next/mdx": "^15.5.2",
"@types/mdx": "^2.0.13",
"body-scroll-lock": "3.1.5",
diff --git a/apps/next/package.json b/apps/next/package.json
index bb6490a7..b93bbc17 100644
--- a/apps/next/package.json
+++ b/apps/next/package.json
@@ -6,7 +6,7 @@
"scripts": {
"dev": "next dev",
"build": "next build",
- "start": "next start",
+ "start": "npx serve ./out",
"lint": "next lint"
},
"dependencies": {
diff --git a/apps/rsbuild/package.json b/apps/rsbuild/package.json
index 372902aa..e777c13f 100644
--- a/apps/rsbuild/package.json
+++ b/apps/rsbuild/package.json
@@ -7,6 +7,7 @@
"build": "rsbuild build",
"dev": "rsbuild dev --open",
"preview": "rsbuild preview",
+ "start": "npx serve ./dist",
"lint": "tsc && eslint"
},
"dependencies": {
@@ -15,7 +16,7 @@
"@devup-ui/react": "workspace:*"
},
"devDependencies": {
- "@rsbuild/core": "^1.5.1",
+ "@rsbuild/core": "^1.5.3",
"@rsbuild/plugin-react": "^1.4.0",
"@devup-ui/rsbuild-plugin": "workspace:*"
}
diff --git a/apps/rsbuild/src/App.jsx b/apps/rsbuild/src/App.jsx
index 722f2acb..ca246e87 100644
--- a/apps/rsbuild/src/App.jsx
+++ b/apps/rsbuild/src/App.jsx
@@ -1,4 +1,4 @@
-import { Box } from '@devup-ui/react';
+import { Box, Flex, Text } from '@devup-ui/react';
const App = () => {
return (
@@ -6,6 +6,11 @@ const App = () => {
Rsbuild support
+
+ a
+ b
+ typo
+
);
};
diff --git a/apps/vite-lib/package.json b/apps/vite-lib/package.json
index 04ba5b10..ed587305 100644
--- a/apps/vite-lib/package.json
+++ b/apps/vite-lib/package.json
@@ -19,7 +19,7 @@
"vite-plugin-dts": "^4.5.4",
"@devup-ui/vite-plugin": "workspace:*",
"@vitejs/plugin-react": "^5.0.2",
- "vite": "^7.1.3",
+ "vite": "^7.1.4",
"typescript": "^5",
"@types/node": "^24",
"@types/react": "^19"
diff --git a/apps/vite/package.json b/apps/vite/package.json
index 1a0829da..32be17ed 100644
--- a/apps/vite/package.json
+++ b/apps/vite/package.json
@@ -6,7 +6,7 @@
"scripts": {
"dev": "vite dev",
"build": "vite build",
- "start": "vite start",
+ "start": "npx serve ./dist",
"lint": "tsc && eslint"
},
"dependencies": {
@@ -17,11 +17,11 @@
},
"devDependencies": {
"@devup-ui/vite-plugin": "workspace:*",
- "vite": "^7.1.3",
+ "vite": "^7.1.4",
"@vitejs/plugin-react": "^5.0.2",
"typescript": "^5",
"@types/node": "^24",
"@types/react": "^19",
"@types/react-dom": "^19"
}
-}
+}
\ No newline at end of file
diff --git a/benchmark/next-mui/package.json b/benchmark/next-mui/package.json
index 8d0ea7bb..2deaa5db 100644
--- a/benchmark/next-mui/package.json
+++ b/benchmark/next-mui/package.json
@@ -12,7 +12,7 @@
"dependencies": {
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
- "@mui/material": "7.3.1",
+ "@mui/material": "7.3.2",
"next": "^15.5.2",
"next-themes": "^0.4.6",
"react": "^19.1.1",
diff --git a/bindings/devup-ui-wasm/src/lib.rs b/bindings/devup-ui-wasm/src/lib.rs
index 1e81040d..b6176a0f 100644
--- a/bindings/devup-ui-wasm/src/lib.rs
+++ b/bindings/devup-ui-wasm/src/lib.rs
@@ -1,8 +1,6 @@
use css::class_map::{get_class_map, set_class_map};
use css::file_map::{get_file_map, get_filename_by_file_num, set_file_map};
-use extractor::extract_style::ExtractStyleProperty;
use extractor::extract_style::extract_style_value::ExtractStyleValue;
-use extractor::extract_style::style_property::StyleProperty;
use extractor::{ExtractOption, extract};
use once_cell::sync::Lazy;
use sheet::StyleSheet;
@@ -16,12 +14,10 @@ static GLOBAL_STYLE_SHEET: Lazy> =
#[wasm_bindgen]
pub struct Output {
code: String,
- styles: HashSet,
map: Option,
- default_collected: bool,
- single_css: bool,
- filename: String,
- css_file: String,
+ css_file: Option,
+ updated_base_style: bool,
+ css: Option,
}
#[wasm_bindgen]
extern "C" {
@@ -37,150 +33,61 @@ extern "C" {
#[wasm_bindgen]
impl Output {
+ fn new(
+ code: String,
+ styles: HashSet,
+ map: Option,
+ single_css: bool,
+ filename: String,
+ css_file: Option,
+ import_main_css: bool,
+ ) -> Self {
+ let mut sheet = GLOBAL_STYLE_SHEET.lock().unwrap();
+ let default_collected = sheet.rm_global_css(&filename);
+ let (collected, updated_base_style) = sheet.update_styles(&styles, &filename, single_css);
+ Self {
+ code,
+ map,
+ css_file,
+ updated_base_style,
+ css: {
+ if !collected && !default_collected {
+ None
+ } else {
+ Some(sheet.create_css(
+ if !single_css { Some(&filename) } else { None },
+ import_main_css,
+ ))
+ }
+ },
+ }
+ }
+
/// Get the code
- #[wasm_bindgen(getter)]
+ #[wasm_bindgen(getter, js_name = "code")]
pub fn code(&self) -> String {
self.code.clone()
}
- #[wasm_bindgen(getter)]
- pub fn css_file(&self) -> String {
+ #[wasm_bindgen(getter, js_name = "cssFile")]
+ pub fn css_file(&self) -> Option {
self.css_file.clone()
}
- #[wasm_bindgen(getter)]
+ #[wasm_bindgen(getter, js_name = "map")]
pub fn map(&self) -> Option {
self.map.clone()
}
+ #[wasm_bindgen(getter, js_name = "updatedBaseStyle")]
+ pub fn updated_base_style(&self) -> bool {
+ self.updated_base_style
+ }
+
/// Get the css
- #[wasm_bindgen(getter)]
+ #[wasm_bindgen(getter, js_name = "css")]
pub fn css(&self) -> Option {
- let mut sheet = GLOBAL_STYLE_SHEET.lock().unwrap();
- let mut collected = false;
- for style in self.styles.iter() {
- match style {
- ExtractStyleValue::Static(st) => {
- let (cls, _) = match style.extract(if !self.single_css {
- Some(self.filename.as_str())
- } else {
- None
- }) {
- Some(StyleProperty::ClassName(cls)) => (cls, None),
- Some(StyleProperty::Variable {
- class_name,
- variable_name,
- ..
- }) => (class_name, Some(variable_name)),
- None => continue,
- };
- if sheet.add_property(
- &cls,
- st.property(),
- st.level(),
- st.value(),
- st.selector(),
- st.style_order(),
- if !self.single_css {
- Some(self.filename.as_str())
- } else {
- None
- },
- ) {
- collected = true;
- }
- }
- ExtractStyleValue::Dynamic(dy) => {
- let (cls, variable) = match style.extract(if !self.single_css {
- Some(self.filename.as_str())
- } else {
- None
- }) {
- Some(StyleProperty::ClassName(cls)) => (cls, None),
- Some(StyleProperty::Variable {
- class_name,
- variable_name,
- ..
- }) => (class_name, Some(variable_name)),
- None => continue,
- };
- if sheet.add_property(
- &cls,
- dy.property(),
- dy.level(),
- &format!("var({})", variable.unwrap()),
- dy.selector(),
- dy.style_order(),
- if !self.single_css {
- Some(self.filename.as_str())
- } else {
- None
- },
- ) {
- collected = true;
- }
- }
-
- ExtractStyleValue::Keyframes(keyframes) => {
- if sheet.add_keyframes(
- &keyframes
- .extract(if !self.single_css {
- Some(self.filename.as_str())
- } else {
- None
- })
- .to_string(),
- keyframes
- .keyframes
- .iter()
- .map(|(key, value)| {
- (
- key.clone(),
- value
- .iter()
- .map(|style| {
- (
- style.property().to_string(),
- style.value().to_string(),
- )
- })
- .collect::>(),
- )
- })
- .collect(),
- if !self.single_css {
- Some(self.filename.as_str())
- } else {
- None
- },
- ) {
- collected = true;
- }
- }
- ExtractStyleValue::Css(cs) => {
- if sheet.add_css(&cs.file, &cs.css) {
- collected = true;
- }
- }
- ExtractStyleValue::Typography(_) => {}
- ExtractStyleValue::Import(st) => {
- sheet.add_import(&st.file, &st.url);
- }
- ExtractStyleValue::FontFace(font) => {
- sheet.add_font_face(&font.file, &font.properties);
- }
- }
- }
-
- if !collected && !self.default_collected {
- return None;
- }
-
- Some(sheet.create_css(if !self.single_css {
- Some(&self.filename)
- } else {
- None
- }))
+ self.css.clone()
}
}
@@ -242,9 +149,9 @@ pub fn code_extract(
package: &str,
css_dir: String,
single_css: bool,
+ import_main_css_in_code: bool,
+ import_main_css_in_css: bool,
) -> Result