All Versions
40
Latest Version
Avg Release Cycle
196 days
Latest Release
109 days ago
Changelog History
Page 1
Changelog History
Page 1
-
v9.3.0 Changes
March 03, 2026➕ Added
- ➕ Add support for modern CSS at-rules:
@layer,@scope, and@starting-style(#1549)
🛠 Fixed
- 📜 Avoid double autoloading of class aliases (#1552)
🆕 New Contributors
Full Changelog : v9.2.0...v9.3.0
- ➕ Add support for modern CSS at-rules:
-
v9.2.0 Changes
February 21, 2026➕ Added
- ➕ Add
OutputFormat::setSpaceAroundSelectorCombinator()(#1504) - ➕ Add support for escaped quotes in the selectors (#1485, #1489)
- 👻 Provide line number in exception message for mismatched parentheses in
📜 selector (#1435) - ➕ Add support for CSS container queries (#1400)
🔄 Changed
- 📜
RuleSet\RuleContaineris renamed toRuleSet\DeclarationList(#1530, #1539) - Methods like
setRule()inRuleSetandDeclarationBlockhave been renamed
📜 tosetDeclaration(), etc. (#1521) Rule\Ruleclass is renamed toProperty\Declaration
📜 (#1508, #1512, #1513, #1522)Rule::setRule()andgetRule()are replaced withsetPropertyName()and
📜getPropertyName()(#1506)Selectoris now represented as a sequence ofSelector\Componentobjects
which can be accessed viagetComponents(), manipulated individually, or set
📜 viasetComponents()(#1478, #1486, #1487, #1488, #1494, #1496, #1536, #1537)- 👻
Selector::setSelector()andSelectorconstructor will now throw exception
📜 upon provision of an invalid selectior (#1498, #1502) - 📜 Clean up extra whitespace in CSS selector (#1398)
- The array keys passed to
DeclarationBlock::setSelectors()are no longer
📜 preserved (#1407)
🗄 Deprecated
- 🗄
RuleSet\RuleContaineris deprecated; useRuleSet\DeclarationListinstead
📜 (#1530) - 🗄 Methods like
setRule()inRuleSetandDeclarationBlockare deprecated;
📜 there are direct replacements such assetDeclaration()(#1521) - 🗄
Rule\Ruleclass is deprecated;Property\Declarationis a direct
📜 replacement (#1508) - 🗄
Rule::setRule()andgetRule()are deprecated and replaced with
📜setPropertyName()andgetPropertyName()(#1506, #1519)
🛠 Fixed
- 📜 Do not escape characters that do not need escaping in CSS string (#1444)
- 📜 Reject selector comprising only whitespace (#1433)
- 👌 Improve recovery parsing when a rogue
}is encountered (#1425, #1426) - 📜 Parse comment(s) immediately preceding a selector (#1421, #1424)
- 📜 Parse consecutive comments (#1421)
- 👌 Support attribute selectors with values containing commas in
📜DeclarationBlock::setSelectors()(#1419) - 👍 Allow
removeDeclarationBlockBySelector()to be order-insensitve (#1406) - 🛠 Fix parsing of
calcexpressions when a newline immediately precedes or
📜 follows a+or-operator (#1399) - 📜 Use typesafe versions of PHP functions (#1379, #1380, #1382, #1383, #1384)
🆕 New Contributors
- 📜 @scq made their first contribution in #1399
- 📜 @8ctopus made their first contribution in #1398
- 📜 @samuil-banti-wpenigne made their first contribution in #1485
Full Changelog : v9.1.0...v9.2.0
- ➕ Add
-
v9.1.0 Changes
September 14, 2025 -
v9.0.0 Changes
July 27, 2025➕ Added
- 📜 Interface
RuleContainerforRuleSetRulemanipulation methods (#1256) 👍 Partial support for CSS Color Module Level 4:
➕ Add a class diagram to the README (#482)
➕ Add more tests (#449)
🔄 Changed
DeclarationBlockno longer extendsRuleSetand instead has aRuleSetas
📜 a property; usegetRuleSet()to access it directly (#1194)- 0️⃣ The default line (and column) number is now
null(not zero) (#1288) setPosition()(inRuleand other classes) now has fluent interface,
📜 returning itself (#1259)- 🚚
RuleSet::removeRule()now only allowsRuleas the parameter
(implementing classes areAtRuleSetandDeclarationBlock);
🚚 useremoveMatchingRules()orremoveAllRules()for other functions (#1255) RuleSet::getRules()andgetRulesAssoc()now only allowstringornull
as the parameter (implementing classes areAtRuleSetandDeclarationBlock)
📜 (#1253)- 🎉 Initialize
KeyFrameproperties to sensible defaults (#1146) - 📜 Make
OutputFormatfinal(#1128) - 📜 Make
SelectoraRenderable(#1017) - 📜 Only allow
stringfor someOutputFormatproperties (#885) - 👉 Use more native type declarations and strict mode
📜 (#641, #772, #774, #778, #804, #841, #873, #875, #891, #922, #923, #933, #958,
📜 #964, #967, #1000, #1044, #1134, #1136, #1137, #1139, #1140, #1141, #1145,
📜 #1162, #1163, #1166, #1172, #1174, #1178, #1179, #1181, #1183, #1184, #1186,
📜 #1187, #1190, #1192, #1193, #1203) - ➕ Add visibility to all class/interface constants (#469)
✂ Removed
- ✂ Remove
getLineNo()from these classes (usegetLineNumber()instead):
Comment,CSSList,SourceException,Charset,CSSNamespace,Import,
📜Rule,DeclarationBlock,RuleSet,CSSFunction,Value(#1258) - ✂ Remove
Rule::getColNo()(usegetColumnNumber()instead) (#1287) - Passing a string as the first argument to
getAllValues()is no longer
👌 supported and will not work;
📜 the search pattern should now be passed as the second argument (#1243) - Passing a Boolean as the second argument to
getAllValues()is no longer
👌 supported and will not work; the flag for searching in function arguments
📜 should now be passed as the third argument (#1243) - ✂ Remove
__toString()(#1046) - ⬇️ Drop magic method forwarding in
OutputFormat(#898) - ⬇️ Drop
atRuleArgs()from theAtRuleinterface (#1141) - ✂ Remove
OutputFormat::get()and::set()(#1108, #1110) - ⬇️ Drop special support for vendor prefixes (#1083)
- ✂ Remove the IE hack in
Rule(#995) - ⬇️ Drop
getLineNo()from theRenderableinterface (#1038) - ✂ Remove
OutputFormat::level()(#874) - ✂ Remove expansion of shorthand properties (#838)
- ✂ Remove
Parser::setCharset/getCharset(#808) - ✂ Remove
Rule::getValues()(#582) - ✂ Remove
Rule::setValues()(#562) - ✂ Remove
Document::getAllSelectors()(#561) - ✂ Remove
DeclarationBlock::getSelector()(#559) - ✂ Remove
DeclarationBlock::setSelector()(#560) - ⬇️ Drop support for PHP < 7.2 (#420)
🛠 Fixed
- ✂ Remove trailing semicolon from declaration blocks with 'compact'
📜OutputFormat(#1345) - 📜 Parse selector functions (like
:not) with comma-separated arguments (#1292) - 📜 Parse quoted attribute selector value containing comma (#1323)
- 👍 Allow comma in selectors (e.g.
:not(html, body)) (#1293) - Insert
Rulebefore sibling even with different property name
📜 (inRuleSet::addRule()) (#1270) - Ensure
RuleSet::addRule()sets non-negative column number when sibling
📜 provided (#1268) - 📜 Don't render
rgbcolors with percentage values using hex notation (#803)
📚 Documentation
- ➕ Add an API and deprecation policy (#720)
🚀 @ziegenberg is a new contributor to this release and did a lot of the heavy
lifting. Thanks! ❤️ - 📜 Interface
-
v8.9.0 Changes
July 11, 2025➕ Added
- 🚚
RuleSet::removeMatchingRules()method
📜 (for the implementing classesAtRuleSetandDeclarationBlock) (#1249) - 🚚
RuleSet::removeAllRules()method
📜 (for the implementing classesAtRuleSetandDeclarationBlock) (#1249) - ➕ Add Interface
CSSElement(#1231) - Methods
getLineNumberandgetColumnNumberwhich return a nullableint
for the following classes:
Comment,CSSList,SourceException,Charset,CSSNamespace,Import,
📜Rule,DeclarationBlock,RuleSet,CSSFunction,Value(#1225, #1263) Positionableinterface for CSS items that may have a position
📜 (line and perhaps column number) in the parsed CSS (#1221)
🔄 Changed
- Parameters for
getAllValues()are deconflated, so it now takes three (all
optional), allowing$elementand$ruleSearchPatternto be specified
📜 separately (#1241) - Implement
Positionablein the following CSS item classes:
Comment,CSSList,SourceException,Charset,CSSNamespace,Import,
📜Rule,DeclarationBlock,RuleSet,CSSFunction,Value(#1225)
🗄 Deprecated
- 👌 Support for PHP < 7.2 is deprecated; version 9.0 will require PHP 7.2 or later
📜 (#1264) - 🚚 Passing a
stringornulltoRuleSet::removeRule()is deprecated
(implementing classes areAtRuleSetandDeclarationBlock);
🚚 useremoveMatchingRules()orremoveAllRules()instead (#1249) - 🗄 Passing a
RuletoRuleSet::getRules()orgetRulesAssoc()is deprecated,
affecting the implementing classesAtRuleSetandDeclarationBlock
📜 (call e.g.getRules($rule->getRule())instead) (#1248) - 🗄 Passing a string as the first argument to
getAllValues()is deprecated;
📜 the search pattern should now be passed as the second argument (#1241) - 🗄 Passing a Boolean as the second argument to
getAllValues()is deprecated;
the flag for searching in function arguments should now be passed as the third
📜 argument (#1241) - 🗄
getLineNo()is deprecated in these classes (usegetLineNumber()instead):
Comment,CSSList,SourceException,Charset,CSSNamespace,Import,
📜Rule,DeclarationBlock,RuleSet,CSSFunction,Value(#1225, #1233) - 🗄
Rule::getColNo()is deprecated (usegetColumnNumber()instead)
📜 (#1225, #1233) - Providing zero as the line number argument to
Rule::setPosition()is
🗄 deprecated (passnullinstead if there is no line number) (#1225, #1233)
🛠 Fixed
- 🚚
-
v8.8.0 Changes
March 23, 2025➕ Added
- 📜
OutputFormatproperties for space around specific list separators (#880)
🔄 Changed
- 📜 Mark the
OutputFormatconstructor as@internal(#1131) - 📜 Mark
OutputFormatteras@internal(#896) - 📜 Mark
Selector::isValid()as@internal(#1037) - 📜 Mark parsing-related methods of most CSS elements as
@internal(#908) - 📜 Mark
OutputFormat::nextLevel()as@internal(#901) - 📜 Make all non-private properties
@internal(#886)
🗄 Deprecated
- 🗄 Deprecate extending
OutputFormat(#1131) - 🗄 Deprecate
OutputFormat::get()and::set()(#1107) - 🗄 Deprecate support for
-webkit-calcand-moz-calc(#1086) - 🗄 Deprecate magic method forwarding from
OutputFormattoOutputFormatter
📜 (#894) - 🗄 Deprecate
__toString()(#1006) - 🗄 Deprecate greedy calculation of selector specificity (#1018)
- 🗄 Deprecate the IE hack in
Rule(#993, #1003) - 📜
OutputFormatproperties for space around list separators as an array (#880) - 🗄 Deprecate
OutputFormat::level()(#870)
🛠 Fixed
- 📜
-
v8.7.0 Changes
October 27, 2024 -
v8.6.0 Changes
July 01, 2024➕ Added
- 👌 Support arithmetic operators in CSS function arguments (#607)
- ➕ Add support for inserting an item in a CSS list (#545)
- ➕ Add support for the
dvh,lvhandsvhlength units (#415)
🔄 Changed
- 👌 Improve performance of Value::parseValue with many delimiters by refactoring to remove array_search() (#413)
-
v8.5.2 Changes
June 28, 2024 -
v8.5.1 Changes
February 15, 2024🛠 Fixed
- 🛠 Fix (regression) failure to parse at-rules with strict parsing (#456)