This is an automated email from the ASF dual-hosted git repository.
Harbs pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
The following commit(s) were added to refs/heads/develop by this push:
new e55b6721b3 media and container queries
e55b6721b3 is described below
commit e55b6721b3ad4def7ca9322765119ea372a7ba1f
Author: Harbs <[email protected]>
AuthorDate: Thu Jun 18 22:36:37 2026 +0300
media and container queries
---
.../Style/src/main/resources/style-manifest.xml | 3 +
.../projects/Style/src/main/royale/StyleClasses.as | 3 +
.../style/stylebeads/states/QueryBaseStyle.as | 20 +++++
.../stylebeads/states/media/ContainerBreakpoint.as | 8 +-
.../style/stylebeads/states/media/MediaBetween.as | 12 ++-
.../stylebeads/states/media/MediaBreakpoint.as | 6 +-
...gerTest.as => ContainerBreakpointTestHelper.as} | 36 ++------
.../test/royale/flexUnitTests/StyleManagerTest.as | 95 ++++++++++++++++++++++
8 files changed, 137 insertions(+), 46 deletions(-)
diff --git a/frameworks/projects/Style/src/main/resources/style-manifest.xml
b/frameworks/projects/Style/src/main/resources/style-manifest.xml
index 0c0882cc7d..407135f4da 100644
--- a/frameworks/projects/Style/src/main/resources/style-manifest.xml
+++ b/frameworks/projects/Style/src/main/resources/style-manifest.xml
@@ -120,6 +120,9 @@
<component id="GroupPseudo"
class="org.apache.royale.style.stylebeads.states.GroupPseudo"/>
<component id="ClassState"
class="org.apache.royale.style.stylebeads.states.ClassState"/>
<component id="SiblingPseudo"
class="org.apache.royale.style.stylebeads.states.SiblingPseudo"/>
+ <component id="MediaBreakpoint"
class="org.apache.royale.style.stylebeads.states.media.MediaBreakpoint"/>
+ <component id="MediaBetween"
class="org.apache.royale.style.stylebeads.states.media.MediaBetween"/>
+ <component id="ContainerBreakpoint"
class="org.apache.royale.style.stylebeads.states.media.ContainerBreakpoint"/>
<component id="BackgroundStyle"
class="org.apache.royale.style.stylebeads.BackgroundStyle"/>
<component id="ContainerPosition"
class="org.apache.royale.style.stylebeads.ContainerPosition"/>
diff --git a/frameworks/projects/Style/src/main/royale/StyleClasses.as
b/frameworks/projects/Style/src/main/royale/StyleClasses.as
index c325fca91c..1200cc2588 100644
--- a/frameworks/projects/Style/src/main/royale/StyleClasses.as
+++ b/frameworks/projects/Style/src/main/royale/StyleClasses.as
@@ -42,6 +42,9 @@ package
import org.apache.royale.style.util.Min;Min;
import org.apache.royale.style.util.Max;Max;
import
org.apache.royale.style.beads.TreeItemRendererInitializer;TreeItemRendererInitializer;
+ import
org.apache.royale.style.stylebeads.states.media.MediaBreakpoint;
MediaBreakpoint;
+ import
org.apache.royale.style.stylebeads.states.media.MediaBetween; MediaBetween;
+ import
org.apache.royale.style.stylebeads.states.media.ContainerBreakpoint;
ContainerBreakpoint;
}
diff --git
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/QueryBaseStyle.as
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/QueryBaseStyle.as
index 4441c7cfe2..d79021f1df 100644
---
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/QueryBaseStyle.as
+++
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/QueryBaseStyle.as
@@ -99,6 +99,26 @@ package org.apache.royale.style.stylebeads.states
return "" + value;
}
+ protected function computeBreakpoint(value:*):String
+ {
+ if(value == null) return "";
+ var breakpoint:String = "" + value;
+ switch(breakpoint.toLowerCase())
+ {
+ case "sm":
+ return
ThemeManager.instance.activeTheme.breakpointSM;
+ case "md":
+ return
ThemeManager.instance.activeTheme.breakpointMD;
+ case "lg":
+ return
ThemeManager.instance.activeTheme.breakpointLG;
+ case "xl":
+ return
ThemeManager.instance.activeTheme.breakpointXL;
+ case "2xl":
+ return
ThemeManager.instance.activeTheme.breakpoint2XL;
+ }
+ return computeSize(value);
+ }
+
protected function sanitizeIdentifier(value:String):String
{
return value.replace(/[\s\.\(\)\+\*\/\[\]]/g,
"-").replace(/-+/g, "-");
diff --git
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/media/ContainerBreakpoint.as
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/media/ContainerBreakpoint.as
index 702ca4f38c..8c7105553c 100644
---
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/media/ContainerBreakpoint.as
+++
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/media/ContainerBreakpoint.as
@@ -20,8 +20,6 @@ package org.apache.royale.style.stylebeads.states.media
{
import org.apache.royale.style.IStyleUIBase;
import org.apache.royale.style.stylebeads.states.QueryBaseStyle;
- import org.apache.royale.style.util.ThemeManager;
- import org.apache.royale.style.util.CSSUnit;
public class ContainerBreakpoint extends QueryBaseStyle
{
@@ -78,9 +76,9 @@ package org.apache.royale.style.stylebeads.states.media
querySelector = "";
return;
}
- var sizeValue:String = computeSize(value);
- queryBody = "(min-width: " + sizeValue + ")";
- querySelector = "container-min-width-" +
sanitizeIdentifier(sizeValue);
+ var sizeValue:String = computeBreakpoint(value);
+ queryBody = "(width >= " + sizeValue + ")";
+ querySelector = "container-min-width-" +
sanitizeIdentifier("" + value);
}
}
}
\ No newline at end of file
diff --git
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/media/MediaBetween.as
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/media/MediaBetween.as
index d724e352c3..b9ba4b4e49 100644
---
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/media/MediaBetween.as
+++
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/media/MediaBetween.as
@@ -20,8 +20,6 @@ package org.apache.royale.style.stylebeads.states.media
{
import org.apache.royale.style.stylebeads.states.QueryBaseStyle;
- import org.apache.royale.style.util.ThemeManager;
- import org.apache.royale.style.util.CSSUnit;
public class MediaBetween extends QueryBaseStyle
{
@@ -70,8 +68,8 @@ package org.apache.royale.style.stylebeads.states.media
return;
}
- var minVal:String = _min != null ? computeSize(_min) :
null;
- var maxVal:String = _max != null ? computeSize(_max) :
null;
+ var minVal:String = _min != null ?
computeBreakpoint(_min) : null;
+ var maxVal:String = _max != null ?
computeBreakpoint(_max) : null;
var body:String = "";
var id:String = "media-between";
@@ -79,14 +77,14 @@ package org.apache.royale.style.stylebeads.states.media
if(minVal)
{
body += "(min-width: " + minVal + ")";
- id += "-min-" + sanitizeIdentifier(minVal);
+ id += "-min-" + sanitizeIdentifier("" + _min);
}
if(maxVal)
{
if(body) body += " and ";
- body += "(max-width: " + maxVal + ")";
- id += "-max-" + sanitizeIdentifier(maxVal);
+ body += "(width < " + maxVal + ")";
+ id += "-max-" + sanitizeIdentifier("" + _max);
}
queryBody = body;
diff --git
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/media/MediaBreakpoint.as
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/media/MediaBreakpoint.as
index abc8989fbf..054d4d5004 100644
---
a/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/media/MediaBreakpoint.as
+++
b/frameworks/projects/Style/src/main/royale/org/apache/royale/style/stylebeads/states/media/MediaBreakpoint.as
@@ -20,8 +20,6 @@ package org.apache.royale.style.stylebeads.states.media
{
import org.apache.royale.style.stylebeads.states.QueryBaseStyle;
- import org.apache.royale.style.util.ThemeManager;
- import org.apache.royale.style.util.CSSUnit;
public class MediaBreakpoint extends QueryBaseStyle
{
@@ -49,9 +47,9 @@ package org.apache.royale.style.stylebeads.states.media
querySelector = "";
return;
}
- var sizeValue:String = computeSize(value);
+ var sizeValue:String = computeBreakpoint(value);
queryBody = "(min-width: " + sizeValue + ")";
- querySelector = "media-min-width-" +
sanitizeIdentifier(sizeValue);
+ querySelector = "media-min-width-" +
sanitizeIdentifier("" + value);
}
}
}
\ No newline at end of file
diff --git
a/frameworks/projects/Style/src/test/royale/flexUnitTests/StyleManagerTest.as
b/frameworks/projects/Style/src/test/royale/flexUnitTests/ContainerBreakpointTestHelper.as
similarity index 63%
copy from
frameworks/projects/Style/src/test/royale/flexUnitTests/StyleManagerTest.as
copy to
frameworks/projects/Style/src/test/royale/flexUnitTests/ContainerBreakpointTestHelper.as
index 8d33bf0c96..797718fe30 100644
---
a/frameworks/projects/Style/src/test/royale/flexUnitTests/StyleManagerTest.as
+++
b/frameworks/projects/Style/src/test/royale/flexUnitTests/ContainerBreakpointTestHelper.as
@@ -18,42 +18,18 @@
////////////////////////////////////////////////////////////////////////////////
package flexUnitTests
{
+ import
org.apache.royale.style.stylebeads.states.media.ContainerBreakpoint;
- import org.apache.royale.test.asserts.*;
- import org.apache.royale.style.util.StyleManager;
-
- public class StyleManagerTest
+ public class ContainerBreakpointTestHelper extends ContainerBreakpoint
{
- [Before]
- public function setUp():void
- {
- }
-
- [After]
- public function tearDown():void
+ public function ContainerBreakpointTestHelper(size:* = null)
{
+ super(size);
}
- [BeforeClass]
- public static function setUpBeforeClass():void
+ public function get queryRule():String
{
+ return "@" + queryType + queryPrefix + " " + queryBody
+ " { }";
}
-
- [AfterClass]
- public static function tearDownAfterClass():void
- {
- }
-
- [Test]
- public function testInsert():void
- {
- COMPILE::JS
- {
- assertFalse(StyleManager.hasStyle(".foo"));
- StyleManager.addStyle(".foo", ".foo",
"display:flex;");
- assertTrue(StyleManager.hasStyle(".foo"));
- }
- }
-
}
}
diff --git
a/frameworks/projects/Style/src/test/royale/flexUnitTests/StyleManagerTest.as
b/frameworks/projects/Style/src/test/royale/flexUnitTests/StyleManagerTest.as
index 8d33bf0c96..4ea350da78 100644
---
a/frameworks/projects/Style/src/test/royale/flexUnitTests/StyleManagerTest.as
+++
b/frameworks/projects/Style/src/test/royale/flexUnitTests/StyleManagerTest.as
@@ -20,7 +20,14 @@ package flexUnitTests
{
import org.apache.royale.test.asserts.*;
+ import org.apache.royale.style.stylebeads.ILeafStyleBead;
+ import org.apache.royale.style.stylebeads.layout.Display;
+ import
org.apache.royale.style.stylebeads.states.media.ContainerBreakpoint;
+ import org.apache.royale.style.stylebeads.states.media.MediaBetween;
+ import org.apache.royale.style.stylebeads.states.media.MediaBreakpoint;
import org.apache.royale.style.util.StyleManager;
+ import org.apache.royale.style.util.StyleTheme;
+ import org.apache.royale.style.util.ThemeManager;
public class StyleManagerTest
{
@@ -37,6 +44,10 @@ package flexUnitTests
[BeforeClass]
public static function setUpBeforeClass():void
{
+ COMPILE::JS
+ {
+ ThemeManager.instance.registerTheme(new
StyleTheme());
+ }
}
[AfterClass]
@@ -55,5 +66,89 @@ package flexUnitTests
}
}
+ [Test]
+ public function testMediaBreakpointUsesThemeBreakpoint():void
+ {
+ COMPILE::JS
+ {
+ var display:Display = new Display("flex");
+ var media:MediaBreakpoint = new
MediaBreakpoint("md", [display]);
+ var leaves:Array = media.getLeaves();
+ (leaves[0] as ILeafStyleBead).getSelector();
+
+ var rule:CSSRule =
StyleManager.getQuery("media-min-width-md");
+ assertNotNull(rule);
+ assertTrue(rule.cssText.indexOf("@media
(min-width: 48rem)") != -1);
+ assertTrue(rule.cssText.indexOf(".flex") != -1);
+ assertTrue(rule.cssText.indexOf("display:
flex") != -1 || rule.cssText.indexOf("display:flex") != -1);
+ }
+ }
+
+ [Test]
+ public function testMediaBetweenUsesThemeBreakpoints():void
+ {
+ COMPILE::JS
+ {
+ var display:Display = new Display("grid");
+ var media:MediaBetween = new MediaBetween("md",
"xl", [display]);
+ var leaves:Array = media.getLeaves();
+ (leaves[0] as ILeafStyleBead).getSelector();
+
+ var rule:CSSRule =
StyleManager.getQuery("media-between-min-md-max-xl");
+ assertNotNull(rule);
+ assertTrue(rule.cssText.indexOf("@media
(min-width: 48rem) and (width < 80rem)") != -1);
+ assertTrue(rule.cssText.indexOf(".grid") != -1);
+ assertTrue(rule.cssText.indexOf("display:
grid") != -1 || rule.cssText.indexOf("display:grid") != -1);
+ }
+ }
+
+ [Test]
+ public function
testContainerBreakpointUsesThemeBreakpoint():void
+ {
+ COMPILE::JS
+ {
+ if(canInsertContainerRule())
+ {
+ var display:Display = new
Display("block");
+ var container:ContainerBreakpoint = new
ContainerBreakpoint("lg", [display]);
+ var leaves:Array =
container.getLeaves();
+ (leaves[0] as
ILeafStyleBead).getSelector();
+
+ var rule:CSSRule =
StyleManager.getQuery("container-min-width-lg");
+ assertNotNull(rule);
+
assertTrue(rule.cssText.indexOf("@container (width >= 64rem)") != -1);
+
assertTrue(rule.cssText.indexOf(".block") != -1);
+
assertTrue(rule.cssText.indexOf("display: block") != -1 ||
rule.cssText.indexOf("display:block") != -1);
+ }
+ else
+ {
+ var
helper:ContainerBreakpointTestHelper = new ContainerBreakpointTestHelper("lg");
+
+ assertEquals("container-min-width-lg",
helper.styleType);
+ assertEquals("@container (width >=
64rem) { }", helper.queryRule);
+ }
+ }
+ }
+
+ COMPILE::JS
+ private function canInsertContainerRule():Boolean
+ {
+ var styleElement:HTMLStyleElement =
document.createElement('style') as HTMLStyleElement;
+ document.head.appendChild(styleElement);
+ var sheet:CSSStyleSheet = styleElement.sheet as
CSSStyleSheet;
+ var supported:Boolean = true;
+ try
+ {
+ sheet.insertRule("@container (width >= 1rem) {
}", 0);
+ }
+ catch(error:Error)
+ {
+ supported = false;
+ }
+ document.head.removeChild(styleElement);
+ return supported;
+ }
+
}
+
}