<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>It's not that you can't use -fx-base, but that as it is currently
      that all styles used in Modena that rely on -fx-base directly or
      indirectly suddenly have a higher priority (above setters) even
      though you didn't specifically specify them in your own
      stylesheet.  All such styles are being elevated from USER_AGENT to
      AUTHOR level (which is above USER level which is used for
      setters).</p>
    <p>--John<br>
    </p>
    <div class="moz-cite-prefix">On 09/07/2024 17:03, Andy Goryachev
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:BL3PR10MB6185C38C0371619B0319F11BE5DB2@BL3PR10MB6185.namprd10.prod.outlook.com">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <meta name="Generator" content="Microsoft Word 15 (filtered
        medium)">
      <style>@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
        {font-family:"Yu Gothic";
        panose-1:2 11 4 0 0 0 0 0 0 0;}@font-face
        {font-family:Aptos;
        panose-1:2 11 0 4 2 2 2 2 2 4;}@font-face
        {font-family:"Iosevka Fixed SS16";
        panose-1:2 0 5 9 3 0 0 0 0 4;}@font-face
        {font-family:"Times New Roman \(Body CS\)";
        panose-1:2 11 6 4 2 2 2 2 2 4;}@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}@font-face
        {font-family:"\@Yu Gothic";
        panose-1:2 11 4 0 0 0 0 0 0 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:10.0pt;
        font-family:"Aptos",sans-serif;}span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Iosevka Fixed SS16";
        color:windowtext;}.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}div.WordSection1
        {page:WordSection1;}</style>
      <div class="WordSection1">
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Iosevka Fixed
            SS16"">I've used this feature in the past to change the
            colors in all the controls, so to me this is the expected
            behavior.<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Iosevka Fixed
            SS16""><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Iosevka Fixed
            SS16"">So in your case (if I got it right), you need to
            set the direct style on the label
            (.setStyle("-fx-text-fill:yellow")) instead of setting the
            text fill programmatically.  Right?<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Iosevka Fixed
            SS16""><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Iosevka Fixed
            SS16"">-andy<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Iosevka Fixed
            SS16""><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Iosevka Fixed
            SS16""><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Iosevka Fixed
            SS16""><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Iosevka Fixed
            SS16""><o:p> </o:p></span></p>
        <div id="mail-editor-reference-message-container">
          <div>
            <div style="border:none;border-top:solid #B5C4DF
              1.0pt;padding:3.0pt 0in 0in 0in">
              <p class="MsoNormal" style="margin-bottom:12.0pt"><b><span
                    style="font-size:12.0pt;color:black">From:
                  </span></b><span style="font-size:12.0pt;color:black">openjfx-dev
                  <a class="moz-txt-link-rfc2396E" href="mailto:openjfx-dev-retn@openjdk.org"><openjfx-dev-retn@openjdk.org></a> on behalf of John
                  Hendrikx <a class="moz-txt-link-rfc2396E" href="mailto:john.hendrikx@gmail.com"><john.hendrikx@gmail.com></a><br>
                  <b>Date: </b>Monday, July 8, 2024 at 17:11<br>
                  <b>To: </b>openjfx-dev
                  <a class="moz-txt-link-rfc2396E" href="mailto:openjfx-dev@openjdk.org"><openjfx-dev@openjdk.org></a><br>
                  <b>Subject: </b>Re: CSS Lookups and their origins
                  (possible regression)<o:p></o:p></span></p>
            </div>
            <p>I realized I worded the TLDR poorly.<o:p></o:p></p>
            <p>Let me try again:<o:p></o:p></p>
            <p>TLDR; should styles which use references (like -fx-base
              used in Modena) become AUTHOR level styles if -fx-base is
              specified in an AUTHOR stylesheet?  The act of simply
              specifying -fx-base in your own AUTHOR stylesheet elevates
              hundreds of styles from Modena to AUTHOR level, as if you
              specified them directly...<o:p></o:p></p>
            <p>--John<o:p></o:p></p>
            <div>
              <p class="MsoNormal"><span style="font-size:12.0pt">On
                  09/07/2024 02:07, John Hendrikx wrote:<o:p></o:p></span></p>
            </div>
            <blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
              <p>Hi List,<o:p></o:p></p>
              <p>TLDR; should a CSS reference like -fx-base convert all
                styles that use this value (or derive from it) become
                AUTHOR level styles (higher priority than setters) ?<o:p></o:p></p>
              <p>Long version:<o:p></o:p></p>
              <p>In JavaFX 21, I did a fix (see #1072) to solve a
                problem where a CSS value could be reset on an unrelated
                control.<o:p></o:p></p>
              <p>This happened when the CSS engine encountered a
                stylable that is overridden by the user (with a setter),
                and decided NOT to proceed with the full CSS value
                calculation (as it could not override the user setting
                if that CSS value had lower priority).  However, not
                proceeding with the calculation meant that a "SKIP" was
                stored in a shared cache which was incorrect.  This is
                because when this "SKIP" is later encountered for an
                unrelated control (the cache entries are shared for
                controls with the same styles at the same level), they
                could get their values reset because they were assumed
                to be unstyled.<o:p></o:p></p>
              <p>However, this fix has exposed what seems to be a deeper
                bug or perhaps an unfortunate default:<o:p></o:p></p>
              <p>JavaFX has a special feature where you can refer to
                certain other styles by using a reference (which is
                resolved, recursively, to a final value).  This does not
                seem to be a CSS standard, but is a feature only FX has.<o:p></o:p></p>
              <p>It works by saying something like:<o:p></o:p></p>
              <p>    -fx-base: RED;<o:p></o:p></p>
              <p>And then using it like this:<o:p></o:p></p>
              <p>    -fx-text-fill: -fx-base;<o:p></o:p></p>
              <p>This feature works accross stylesheets of different
                origins, so an AUTHOR stylesheet can specify -fx-base,
                and when a USER_AGENT refers to -fx-base, the value
                comes from the AUTHOR stylesheet.<o:p></o:p></p>
              <p>JavaFX then changes the origin of the style to the
                highest priority encountered while resolving the
                reference.  This means that Modena can specify
                "-fx-text-fill: -fx-base", and when "-fx-base" is then
                part of the AUTHOR style sheet, that ALL Modena styles
                that use -fx-base will be considered AUTHOR level
                styles, as per this comment:<o:p></o:p></p>
              <div>
                <div>
                  <p style="margin:0in;background:white"><span
                      style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">//
                      The origin of this parsed value is the greatest of</span><span
style="font-size:11.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
                  <p style="margin:0in;background:white"><span
                      style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">//
                      any of the resolved reference. If a resolved
                      reference</span><span
                      style="font-size:11.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
                  <p style="margin:0in;background:white"><span
                      style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">//
                      comes from an inline style, for example, then the
                      value</span><span
                      style="font-size:11.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
                  <p style="margin:0in;background:white"><span
                      style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">//
                      calculated from the resolved lookup should have
                      inline</span><span
                      style="font-size:11.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
                  <p style="margin:0in;background:white"><span
                      style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">//
                      as its origin. Otherwise, an inline style could be</span><span
style="font-size:11.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
                  <p style="margin:0in;background:white"><span
                      style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">//
                      stored in shared cache.</span><span
                      style="font-size:11.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
                </div>
              </div>
              <p>I feel that this is a really unfortunate choice.  The
                style after all was specified by Modena, only its value
                came from another (higher priority) style sheet.  I
                think a more logical choice would have been to not
                change the priority at all, unless a "-fx-text-fill" is
                explicitly made part of the AUTHOR stylesheet.<o:p></o:p></p>
              <p>A consequence of this (and which is much more visible
                after the fix) is that creating a Label with a
                setTextFill(Color.YELLOW) in its constructor will only
                result in a yellow text fill if the AUTHOR stylesheet
                did not override any of the Modena colors involved in
                calculating the Modena -fx-text-fill default. 
                Overriding -fx-base in any way will result in the text
                fill of the label to be overridden (as the reference
                came from an AUTHOR stylesheet, which trumps a setter
                which is of a lower style origin).<o:p></o:p></p>
              <p>The comment also alludes to a potential problem.  If an
                inline style would specify "-fx-base", but would be
                treated as if it came from Modena (USER_AGENT level),
                then this value could get stored in the cache as
                everything except INLINE styles can be cached.  However,
                I feel that the changing of style origin level was then
                probably done to solve a CACHING problem, instead of
                what made logical sense for users.  If we agree that a
                resolved reference should not change the style origin
                level, then this would need to be addressed, by perhaps
                marking such a calculated value as uncacheable, instead
                of overloading the meaning of style origin.<o:p></o:p></p>
              <p>I'd like to hear your thoughts, and also how to
                proceed.  JavaFX versions before 21 seemingly allowed
                overriding reference without much consequence because if
                the user overrode the value manually, the cache entry
                would be set to "SKIP".  Now that this is no longer the
                case, JavaFX more aggressively overrides user set values
                if they happen to use a referenced value.  See code
                below.<o:p></o:p></p>
              <p>--John<o:p></o:p></p>
              <div>
                <div>
                  <p style="margin:0in;background:white"><span
                      style="font-size:11.0pt;font-family:Consolas;color:black">.root
                      {<o:p></o:p></span></p>
                  <p style="margin:0in;background:white"><span
                      style="font-size:11.0pt;font-family:Consolas;color:black">-fx-base:
                      #ff0000;<o:p></o:p></span></p>
                  <p style="margin:0in;background:white"><span
                      style="font-size:11.0pt;font-family:Consolas;color:black">}<o:p></o:p></span></p>
                  <div>
                    <div>
                      <p style="margin:0in;background:white"><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">package</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> app;<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">import</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
                          javafx.application.Application;<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">import</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
                          javafx.scene.Scene;<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">import</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
                          javafx.scene.control.Label;<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">import</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
                          javafx.scene.paint.Color;<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">import</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
                          javafx.stage.Stage;<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">public</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
                        </span><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">class</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> TestApp
                        </span><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">extends</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> Application {<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">public</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
                        </span><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">static</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
                        </span><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">void</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> main(String[]
                          args) {<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><i><span
                            style="font-size:11.0pt;font-family:Consolas;color:black">launch</span></i><span
style="font-size:11.0pt;font-family:Consolas;color:black">(args);<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:black">}<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:#646464">@Override</span><span
style="font-size:11.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">public</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
                        </span><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">void</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> start(Stage
                          primaryStage) {<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:black">Scene
                          scene =
                        </span><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">new</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> Scene(</span><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">new</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> MyLabel());<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">//
                          See the difference with/without -fx-base in
                          the
                          <u>stylesheet</u></span><span
                          style="font-size:11.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:black">scene.getStylesheets().add(TestApp.</span><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">class</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">.getResource(</span><span
style="font-size:11.0pt;font-family:Consolas;color:#2A00FF">"/style.css"</span><span
style="font-size:11.0pt;font-family:Consolas;color:black">).toExternalForm());<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:black">primaryStage.setScene(scene);<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:black">primaryStage.show();<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:black">}<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:black">}<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">class</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> MyLabel
                        </span><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">extends</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> Label {<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><b><span
                            style="font-size:11.0pt;font-family:Consolas;color:#0000A0">public</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> MyLabel() {<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:black">setTextFill(Color.</span><span
style="font-size:11.0pt;font-family:Consolas;color:#0000C0">YELLOW</span><span
style="font-size:11.0pt;font-family:Consolas;color:black">);<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:black">setText(</span><span
style="font-size:11.0pt;font-family:Consolas;color:#2A00FF">"Hello
                          world"</span><span
                          style="font-size:11.0pt;font-family:Consolas;color:black">);<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:black">}<o:p></o:p></span></p>
                      <p style="margin:0in;background:white"><span
                          style="font-size:11.0pt;font-family:Consolas;color:black">}<o:p></o:p></span></p>
                    </div>
                  </div>
                </div>
              </div>
              <p><o:p> </o:p></p>
            </blockquote>
          </div>
        </div>
      </div>
    </blockquote>
  </body>
</html>