Skip to main content

CSS Styles and CSS Custom Properties

Overview

This section covers inspecting, modifying, adding, and deleting CSS styles on BBjControls. It also covers the DWC's CSS custom properties and how to access them to style your app.

Concepts Covered in This Section

  • The DWC's CSS custom properties
  • The DWC's App Themes
  • Modifying a BBjControl's Style Properties
  • Using Directives to Inject JavaScript and CSS Dynamically
  • The Web Component Architecture and the Shadow DOM
  • Font Size Compatibility

The DWC's CSS Custom Properties

CSS custom properties (also known as CSS variables) are dynamic entities that contain values often reused throughout a web page or DWC app.

Syntax

Custom properties are set using notation that starts with two dashes:

--dwc-color-black: #000;

Values are accessed using the var() function:

color: var(--dwc-color-black);

Naming Convention

  • Start with two dashes (--)
  • All lowercase
  • Use single dashes to separate words

Benefits

  • Store a value in one place, reference it everywhere
  • Change the definition once and propagate throughout the app
  • No more tedious global search and replacement

Fallback Values

CSS custom properties support fallback values:

color: var(--dwc-button-color, red);

This sets the color to --dwc-button-color, or red if undefined.

tip

View all DWC CSS custom properties by switching to the Application tab in Developer Tools and viewing the "dwc-ui.css" file.

Example 1 - Setting Custom Values for CSS Custom Properties

Step 1: Run the Example

Load CSSCustomProperties.bbj from the 02_CSSStylesAndCustomProperties folder and launch it as a BUI program. It will automatically relaunch in the DWC.

Step 2: Experiment

Choose different CSS custom properties and values, then press the button to apply changes:

sampleWindow!.setStyle(currentProperty$, currentValue$)

Going the Extra Mile

Modify the window title by adding CSS properties:

newValue!.addClass("fieldSet")
css! = css! + "fieldSet legend {"
css! = css! + " color: var(--dwc-color-primary);"
css! = css! + " font-weight: bold;"
css! = css! + " text-align: center;" REM Add this line
css! = css! + "}"

The DWC's App Themes

The DWC offers three built-in app themes: light, dark, and dark-pure.

Setting Themes

rem Get the WebManager to apply themes
web! = BBjAPI().getWebManager()

rem Set the DWC dark theme
web!.setDarkTheme("dark")

rem Set the DWC light theme
web!.setLightTheme("light")

rem Use system preferences automatically
web!.setTheme("system")

Example Programs

  • UserPreference.bbj - Follows the client's OS light/dark setting
  • Themes.bbj - Always displays using DWC's dark theme
  • DWCThemer.bbj - Applies a CSS theme created by the DWC Themer utility

Example 2 - Setting a DWC App to Dark Mode

Add one of the theme lines to CSSCustomProperties.bbj:

web! = BBjAPI().getWebManager()
web!.setTheme("system")

Modifying a BBjControl's Style Properties

There are several ways to set styles on a BBjControl:

Method 1: setStyle() with CSS

myButton1!.setStyle("background", "purple")
myButton1!.setStyle("color", "yellow")

Method 2: injectStyle() with Class

myButton2Css! = ".myButton2 {"
myButton2Css! = myButton2Css! + " background: purple;"
myButton2Css! = myButton2Css! + " color: yellow;"
myButton2Css! = myButton2Css! + "}"
myButton2!.addClass("myButton2")
web!.injectStyle(myButton2Css!)
warning

This method doesn't produce expected results due to the shadow DOM - see below.

Method 3: CSS Custom Properties

myButton3Css! = ".myButton3 {"
myButton3Css! = myButton3Css! + " --dwc-button-background: purple;"
myButton3Css! = myButton3Css! + " --dwc-button-color: yellow;"
myButton3Css! = myButton3Css! + "}"
myButton3!.addClass("myButton3")
web!.injectStyle(myButton3Css!)

Method 4: Shadow DOM Parts

myButton4Css! = ".myButton4::part(control) {"
myButton4Css! = myButton4Css! + " background: purple;"
myButton4Css! = myButton4Css! + " color: yellow;"
myButton4Css! = myButton4Css! + "}"
myButton4!.addClass("myButton4")
web!.injectStyle(myButton4Css!)

Using Directives to Inject JavaScript and CSS Dynamically

Reading External CSS Files

Method 1: Using DemoUtils

style! = DemoUtils.getFileContents(dsk("")+dir("")+"style.css")
web! = BBjAPI().getWebManager()
web!.injectStyle(css!, top)

Method 2: Using Java's Files and Paths

use java.nio.file.Files
use java.nio.file.Paths
css! = new String(Files.readAllBytes(Paths.get(BBjAPI().getFileSystem().resolvePath("./style.css"))))
web! = BBjAPI().getWebManager()
web!.injectStyle(css!, top)

Method 3: Using BBj open/readrecord/close

chan = unt
open(chan, isz = -1)"./style.css"
readrecord(chan, SIZ = -10000000)css$
close(chan)
web! = BBjAPI().getWebManager()
web!.injectStyle(css$, top)

The Web Component Architecture and the Shadow DOM

What are Web Components?

Web components are a suite of technologies for creating reusable custom controls:

TechnologyDescription
Custom ElementsJavaScript APIs for defining custom elements and their behavior
Shadow DOMAPIs for attaching encapsulated DOM trees, keeping features private
HTML Templates<template> and <slot> elements for reusable markup

DWC vs BUI

The DWC implements BBj controls using web components with shadow DOMs:

DWC Button (simplified):

<dwc-button>...</dwc-button>

BUI Button (more complex outer HTML):

<div class="BBjButton">...</div>

Why Shadow DOM?

Shadow DOM isolates web components from the regular DOM, preventing:

  • Global styles from affecting component internals
  • Component styles from affecting page content

Styling Shadow DOM Elements

Method 1: CSS Custom Properties

Shadow trees inherit CSS custom properties from their host:

web! = BBjAPI().getWebManager()
web!.setStyle("background", "purple", "dwc-button")

Method 2: CSS Shadow Parts (::part)

Target exposed parts of the shadow DOM:

myButton4Css! = ".myButton4::part(control) {"
myButton4Css! = myButton4Css! + " background: purple;"
myButton4Css! = myButton4Css! + " color: yellow;"
myButton4Css! = myButton4Css! + "}"

The ::part(control) pseudo-element targets the button's exposed "control" part.

note

Inheritable styles (background, color, font, line height, etc.) continue to inherit in shadow DOM and can penetrate the shadow DOM boundary. Outside styles always win over styles defined in shadow DOM.

Finding CSS Properties and Parts

Each DWC control exposes different CSS custom properties and shadow parts. Use dwc.style to look up the available properties and parts for any control. Select a control from the sidebar to see its CSS custom properties, shadow parts, and attributes.

Font Size Compatibility

The DWC has a larger default font size (14px) compared to BUI (10.6667px / 8pt).

Making DWC Look Like BUI

Method 1: Using LEGACY_FONTS

temp$ = STBL("!COMPAT","LEGACY_FONTS=TRUE")
warning

This only affects controls added AFTER this line is executed.

Method 2: Setting font-size CSS property

myWindow!.setStyle("font-size","8pt")

Example 3 - Font Sizes

  1. Compare the app running in BUI (/apps/ context) vs DWC (/webapp/ context)
  2. In Developer Tools, select a BBjStaticText control and view Computed styles
  3. DWC default font-size: 14px (from var(--dwc-font-size))
  4. BUI default font-size: 10.6667px (8pt from basis.css)
  5. Use either STBL or setStyle to match sizes if needed