Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions c/lightningcss.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ typedef struct ParseOptions {
const char *filename;
bool nesting;
bool custom_media;
bool scroll_navigation_controls;
bool css_modules;
const char *css_modules_pattern;
bool css_modules_dashed_idents;
Expand Down
5 changes: 5 additions & 0 deletions c/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ pub struct ParseOptions {
filename: *const c_char,
nesting: bool,
custom_media: bool,
scroll_navigation_controls: bool,
css_modules: bool,
css_modules_pattern: *const c_char,
css_modules_dashed_idents: bool,
Expand Down Expand Up @@ -259,6 +260,10 @@ pub extern "C" fn lightningcss_stylesheet_parse(
let warnings = Arc::new(RwLock::new(Vec::new()));
let mut flags = ParserFlags::empty();
flags.set(ParserFlags::CUSTOM_MEDIA, options.custom_media);
flags.set(
ParserFlags::SCROLL_NAVIGATION_CONTROLS,
options.scroll_navigation_controls,
);
let opts = ParserOptions {
filename: if options.filename.is_null() {
String::new()
Expand Down
10 changes: 10 additions & 0 deletions napi/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -667,6 +667,8 @@ impl<'a> Into<PseudoClasses<'a>> for &'a OwnedPseudoClasses {
struct Drafts {
#[serde(default)]
custom_media: bool,
#[serde(default)]
scroll_navigation_controls: bool,
}

#[derive(Serialize, Debug, Deserialize, Default)]
Expand Down Expand Up @@ -699,6 +701,10 @@ fn compile<'i>(
let res = {
let mut flags = ParserFlags::empty();
flags.set(ParserFlags::CUSTOM_MEDIA, matches!(drafts, Some(d) if d.custom_media));
flags.set(
ParserFlags::SCROLL_NAVIGATION_CONTROLS,
matches!(drafts, Some(d) if d.scroll_navigation_controls),
);
flags.set(
ParserFlags::DEEP_SELECTOR_COMBINATOR,
matches!(non_standard, Some(v) if v.deep_selector_combinator),
Expand Down Expand Up @@ -834,6 +840,10 @@ fn compile_bundle<
let non_standard = config.non_standard.as_ref();
let mut flags = ParserFlags::empty();
flags.set(ParserFlags::CUSTOM_MEDIA, matches!(drafts, Some(d) if d.custom_media));
flags.set(
ParserFlags::SCROLL_NAVIGATION_CONTROLS,
matches!(drafts, Some(d) if d.scroll_navigation_controls),
);
flags.set(
ParserFlags::DEEP_SELECTOR_COMBINATOR,
matches!(non_standard, Some(v) if v.deep_selector_combinator),
Expand Down
9 changes: 9 additions & 0 deletions node/ast.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6727,6 +6727,15 @@ export type PseudoClass =
| {
kind: "target";
}
| {
kind: "target-current";
}
| {
kind: "target-before";
}
| {
kind: "target-after";
}
| {
kind: "target-within";
}
Expand Down
5 changes: 5 additions & 0 deletions node/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,11 @@ export interface Resolver {
export interface Drafts {
/** Whether to enable @custom-media rules. */
customMedia?: boolean
/**
* Whether to enable the scroll navigation controls.
* https://drafts.csswg.org/css-overflow-5/#scroll-navigation
*/
scrollNavigationControls?: boolean
}

export interface NonStandard {
Expand Down
14 changes: 14 additions & 0 deletions node/test/transform.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,20 @@ test('can enable non-standard syntax', () => {
assert.equal(res.code.toString(), '.foo>>>.bar{color:red}');
});

test('can enable scroll navigation controls draft syntax', () => {
let res = transform({
filename: 'test.css',
code: Buffer.from('a:target-current { color: red }'),
drafts: {
scrollNavigationControls: true
},
minify: true
});

assert.equal(res.code.toString(), 'a:target-current{color:red}');
assert.equal(res.warnings, []);
});

test('can enable features without targets', () => {
let res = transform({
filename: 'test.css',
Expand Down
12 changes: 12 additions & 0 deletions scripts/build-prefixes.js
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,18 @@ addValue(compat, {
ios_saf: parseVersion('10.3')
}, 'LangSelectorList');

addValue(compat, {
chrome: parseVersion('135'),
edge: parseVersion('135'),
android: parseVersion('135')
}, 'TargetCurrent');

addValue(compat, {
chrome: parseVersion('142'),
edge: parseVersion('142'),
android: parseVersion('142')
}, 'TargetBeforeAfter');

let prefixMapping = {
webkit: 'WebKit',
moz: 'Moz',
Expand Down
54 changes: 54 additions & 0 deletions src/compat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,8 @@ pub enum Feature {
StringListStyleType,
SymbolsListStyleType,
TamilListStyleType,
TargetBeforeAfter,
TargetCurrent,
TargetText,
TeluguListStyleType,
TextDecorationThicknessPercent,
Expand Down Expand Up @@ -3631,6 +3633,58 @@ impl Feature {
return false;
}
}
Feature::TargetCurrent => {
if let Some(version) = browsers.chrome {
if version < 8847360 {
return false;
}
}
if let Some(version) = browsers.edge {
if version < 8847360 {
return false;
}
}
if let Some(version) = browsers.android {
if version < 8847360 {
return false;
}
}
if browsers.firefox.is_some()
|| browsers.ie.is_some()
|| browsers.ios_saf.is_some()
|| browsers.opera.is_some()
|| browsers.safari.is_some()
|| browsers.samsung.is_some()
{
return false;
}
}
Feature::TargetBeforeAfter => {
if let Some(version) = browsers.chrome {
if version < 9306112 {
return false;
}
}
if let Some(version) = browsers.edge {
if version < 9306112 {
return false;
}
}
if let Some(version) = browsers.android {
if version < 9306112 {
return false;
}
}
if browsers.firefox.is_some()
|| browsers.ie.is_some()
|| browsers.ios_saf.is_some()
|| browsers.opera.is_some()
|| browsers.safari.is_some()
|| browsers.samsung.is_some()
{
return false;
}
}
Feature::TargetText => {
if let Some(version) = browsers.chrome {
if version < 5832704 {
Expand Down
Loading
Loading