7#pragma push_macro("None")
10#include <Ultralight/CAPI/CAPI_DOMElement.h>
11#include <Ultralight/detail/Css.h>
45 &&
static_cast<unsigned>(
StyleUnit::S) == kULDOMStyleUnit_S
47 "dom::StyleUnit must mirror ULDOMStyleUnit");
54constexpr bool StyleUnitOf(ultralight::detail::CssUnit css_unit, StyleUnit* out) {
55 using ultralight::detail::CssUnit;
57 case CssUnit::None: *out = StyleUnit::Number;
return true;
58 case CssUnit::Percent: *out = StyleUnit::Percent;
return true;
59 case CssUnit::Px: *out = StyleUnit::Px;
return true;
60 case CssUnit::Em: *out = StyleUnit::Em;
return true;
61 case CssUnit::Rem: *out = StyleUnit::Rem;
return true;
62 case CssUnit::Vw: *out = StyleUnit::Vw;
return true;
63 case CssUnit::Vh: *out = StyleUnit::Vh;
return true;
64 case CssUnit::Deg: *out = StyleUnit::Deg;
return true;
65 case CssUnit::Ms: *out = StyleUnit::Ms;
return true;
66 case CssUnit::S: *out = StyleUnit::S;
return true;
67 default:
return false;
72constexpr const char* StyleUnitText(StyleUnit unit) {
74 case StyleUnit::Percent:
return "%";
75 case StyleUnit::Px:
return "px";
76 case StyleUnit::Em:
return "em";
77 case StyleUnit::Rem:
return "rem";
78 case StyleUnit::Vw:
return "vw";
79 case StyleUnit::Vh:
return "vh";
80 case StyleUnit::Deg:
return "deg";
81 case StyleUnit::Ms:
return "ms";
82 case StyleUnit::S:
return "s";
83 case StyleUnit::Number:
84 case StyleUnit::Empty:
return "";
195 if (ultralight::detail::IsLoneNumericToken(text.data(), text.size())) {
196 const ultralight::detail::CssNumber num
197 = ultralight::detail::ParseCssNumber(text.data(), text.size());
198 if (num.status == ultralight::detail::CssStatus::Ok
199 && detail::StyleUnitOf(num.unit, &parsed_unit))
202 return StyleValue(std::numeric_limits<double>::quiet_NaN());
219 constexpr explicit operator bool()
const {
return !
IsEmpty() && IsFinite(
value); }
292 static constexpr bool IsFinite(
double v) {
293 return v >= -std::numeric_limits<double>::max() && v <= std::numeric_limits<double>::max();
346 UL_CSS_CONSTEVAL
CssValue(
const char (&s)[N]) : text_(s), length_(N - 1) {
347 if (!ultralight::detail::IsLoneNumericToken(s, N - 1))
349 const ultralight::detail::CssNumber num = ultralight::detail::ParseCssNumber(s, N - 1);
350 if (num.status != ultralight::detail::CssStatus::Ok) {
354 if (std::is_constant_evaluated())
355 ultralight::detail::RaiseCssError(num.status);
361 if (detail::StyleUnitOf(num.unit, &style_unit))
362 SetNumeric(num.value, style_unit);
373 constexpr double value()
const {
return value_; }
383 constexpr const char*
text()
const {
return text_; }
388 constexpr size_t length()
const {
return length_; }
397 const char* text_ =
nullptr;
407#pragma pop_macro("None")
constexpr const char * text() const
Get the literal's text as written (null-terminated).
Definition StyleValue.h:383
constexpr double value() const
Get the parsed number (only meaningful when kind() is Kind::Numeric).
Definition StyleValue.h:373
constexpr Kind kind() const
Get how the literal is written (see Kind).
Definition StyleValue.h:368
constexpr size_t length() const
Get the literal's length in bytes.
Definition StyleValue.h:388
Kind
How the literal is written– either parsed as a number at compile time (Numeric) or passed to the libr...
Definition StyleValue.h:338
@ Numeric
Definition StyleValue.h:338
@ Passthrough
Definition StyleValue.h:338
UL_CSS_CONSTEVAL CssValue(const char(&s)[N])
Capture a string literal and parse it at compile time.
Definition StyleValue.h:346
constexpr StyleUnit unit() const
Get the parsed unit (only meaningful when kind() is Kind::Numeric).
Definition StyleValue.h:378
Direct C++ access to modify page elements and handle events.
StyleUnit
The unit of a StyleValue (the same values as the C API's ULDOMStyleUnit).
Definition StyleValue.h:22
@ S
s
Definition StyleValue.h:32
@ Em
em
Definition StyleValue.h:26
@ Ms
ms
Definition StyleValue.h:31
@ Vw
vw
Definition StyleValue.h:28
@ Percent
%
Definition StyleValue.h:24
@ Number
A unitless number (CSS <number>).
Definition StyleValue.h:23
@ Deg
deg
Definition StyleValue.h:30
@ Empty
No number (an Empty StyleValue; writing it removes the property).
Definition StyleValue.h:33
@ Rem
rem
Definition StyleValue.h:27
@ Vh
vh
Definition StyleValue.h:29
@ Px
px
Definition StyleValue.h:25
Root namespace for every public Ultralight type, function, and enumeration.
@ Numeric
Definition Editor.h:113
static constexpr StyleValue Vw(double v)
Create a percentage of the viewport width (vw).
Definition StyleValue.h:261
static constexpr StyleValue Ms(double v)
Create a time in milliseconds (ms).
Definition StyleValue.h:282
static constexpr StyleValue Rem(double v)
Create a multiple of the root element's font size (rem).
Definition StyleValue.h:254
constexpr StyleValue(double value)
Create a unitless number (CSS <number>).
Definition StyleValue.h:161
constexpr bool IsEmpty() const
Whether or not this StyleValue is Empty (it holds nothing).
Definition StyleValue.h:208
constexpr bool IsInvalid() const
Whether or not this StyleValue is Invalid (it came from text that doesn't convert,...
Definition StyleValue.h:214
static constexpr StyleValue Em(double v)
Create a multiple of the element's font size (em).
Definition StyleValue.h:247
static constexpr StyleValue S(double v)
Create a time in seconds (s).
Definition StyleValue.h:289
constexpr StyleValue(double value, StyleUnit unit)
Create a number with a unit.
Definition StyleValue.h:170
constexpr StyleValue()=default
Create an Empty StyleValue (it holds nothing, and writing it removes the property).
StyleUnit unit
The number's unit (StyleUnit::Empty when it's Empty).
Definition StyleValue.h:149
static constexpr StyleValue Number(double v)
Create a unitless number (CSS <number>).
Definition StyleValue.h:226
static constexpr StyleValue Deg(double v)
Create an angle in degrees (deg).
Definition StyleValue.h:275
static constexpr StyleValue Pct(double v)
Create a percentage (%).
Definition StyleValue.h:240
static constexpr StyleValue Vh(double v)
Create a percentage of the viewport height (vh).
Definition StyleValue.h:268
static constexpr StyleValue Px(double v)
Create a length in CSS pixels (px).
Definition StyleValue.h:233
static constexpr StyleValue Parse(std::string_view text)
Parse CSS text into a StyleValue.
Definition StyleValue.h:191
double value
The number (only meaningful when this holds one).
Definition StyleValue.h:148