Skip to content

Commit b952de5

Browse files
committed
feat: add support for rem unit transformation across style processing and decoding pipelines
1 parent 495ad36 commit b952de5

27 files changed

Lines changed: 192 additions & 41 deletions

File tree

‎.changeset/rem-unit-transform.md‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
"@lynx-js/web-core": patch
3+
---
4+
5+
feat(web-core): add support for configurable rem unit transform
6+
7+
- **Description**: Added a new configuration option `transformREM` (also exposed as `transform_rem` on the Rust layer) to the Web Core renderer. When enabled, it recursively converts static `rem` unit values in your styles into dynamic CSS custom properties (`calc(VALUE * var(--rem-unit))`) during template decoding and evaluation. This enables developers to implement responsive font scaling and layout sizing dynamically on the client side simply by modifying the root CSS variable `--rem-unit`.
8+
9+
- **Usage**:
10+
You can enable this feature when working with `LynxView` by setting `transformREM` to `true`, or directly as an HTML attribute `transform-rem`:
11+
12+
```html
13+
<lynx-view url="https://example.com/template.js" transform-rem="true"></lynx-view>
14+
```
15+
16+
```javascript
17+
const lynxView = document.createElement('lynx-view');
18+
lynxView.transformREM = true;
19+
```
20+
21+
With this enabled, a CSS declaration like `font-size: 1.5rem;` is transparently evaluated as `font-size: calc(1.5 * var(--rem-unit));` by the runtime engine.

‎packages/web-platform/web-core/binary/client/client.d.ts‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -160,17 +160,17 @@ export class StyleSheetResource {
160160
*/
161161
export function add_inline_style_raw_string_key(dom: HTMLElement, key: string, value?: string | null): void;
162162

163-
export function decode_style_info(buffer: Uint8Array, entry_name: string | null | undefined, config_enable_css_selector: boolean, transform_vw: boolean, transform_vh: boolean): Uint8Array;
163+
export function decode_style_info(buffer: Uint8Array, entry_name: string | null | undefined, config_enable_css_selector: boolean, transform_vw: boolean, transform_vh: boolean, transform_rem: boolean): Uint8Array;
164164

165-
export function encode_legacy_json_generated_raw_style_info(raw_style_info: RawStyleInfo, config_enable_css_selector: boolean, entry_name: string | null | undefined, transform_vw: boolean, transform_vh: boolean): Uint8Array;
165+
export function encode_legacy_json_generated_raw_style_info(raw_style_info: RawStyleInfo, config_enable_css_selector: boolean, entry_name: string | null | undefined, transform_vw: boolean, transform_vh: boolean, transform_rem: boolean): Uint8Array;
166166

167167
export function get_font_face_content(buffer: Uint8Array): string;
168168

169169
export function get_style_content(buffer: Uint8Array): string;
170170

171-
export function set_inline_styles_in_key_value_vec(dom: HTMLElement, k_v_vec: string[], transform_vw: boolean, transform_vh: boolean): void;
171+
export function set_inline_styles_in_key_value_vec(dom: HTMLElement, k_v_vec: string[], transform_vw: boolean, transform_vh: boolean, transform_rem: boolean): void;
172172

173-
export function set_inline_styles_in_str(dom: HTMLElement, styles: string, transform_vw: boolean, transform_vh: boolean): boolean;
173+
export function set_inline_styles_in_str(dom: HTMLElement, styles: string, transform_vw: boolean, transform_vh: boolean, transform_rem: boolean): boolean;
174174

175175
export function set_inline_styles_number_key(dom: HTMLElement, key: number, value?: string | null): void;
176176

@@ -192,8 +192,8 @@ export interface InitOutput {
192192
readonly __wbg_set_eventinfo_event_type: (a: number, b: number, c: number) => void;
193193
readonly __wbg_stylesheetresource_free: (a: number, b: number) => void;
194194
readonly add_inline_style_raw_string_key: (a: any, b: number, c: number, d: number, e: number) => void;
195-
readonly decode_style_info: (a: any, b: number, c: number, d: number, e: number, f: number) => [number, number, number];
196-
readonly encode_legacy_json_generated_raw_style_info: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number];
195+
readonly decode_style_info: (a: any, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number];
196+
readonly encode_legacy_json_generated_raw_style_info: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number];
197197
readonly get_font_face_content: (a: any) => [number, number, number, number];
198198
readonly get_style_content: (a: any) => [number, number, number, number];
199199
readonly mainthreadwasmcontext_add_cross_thread_event: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
@@ -231,8 +231,8 @@ export interface InitOutput {
231231
readonly ruleprelude_new: () => number;
232232
readonly ruleprelude_push_selector: (a: number, b: number) => void;
233233
readonly selector_push_one_selector_section: (a: number, b: number, c: number, d: number, e: number) => [number, number];
234-
readonly set_inline_styles_in_key_value_vec: (a: any, b: number, c: number, d: number, e: number) => void;
235-
readonly set_inline_styles_in_str: (a: any, b: number, c: number, d: number, e: number) => number;
234+
readonly set_inline_styles_in_key_value_vec: (a: any, b: number, c: number, d: number, e: number, f: number) => void;
235+
readonly set_inline_styles_in_str: (a: any, b: number, c: number, d: number, e: number, f: number) => number;
236236
readonly set_inline_styles_number_key: (a: any, b: number, c: number, d: number) => void;
237237
readonly stylesheetresource_new: (a: any, b: any) => [number, number, number];
238238
readonly selector_new: () => number;

‎packages/web-platform/web-core/binary/client/client_bg.wasm.d.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ export const __wbg_set_eventinfo_event_name: (a: number, b: number, c: number) =
1515
export const __wbg_set_eventinfo_event_type: (a: number, b: number, c: number) => void;
1616
export const __wbg_stylesheetresource_free: (a: number, b: number) => void;
1717
export const add_inline_style_raw_string_key: (a: any, b: number, c: number, d: number, e: number) => void;
18-
export const decode_style_info: (a: any, b: number, c: number, d: number, e: number, f: number) => [number, number, number];
19-
export const encode_legacy_json_generated_raw_style_info: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number];
18+
export const decode_style_info: (a: any, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number];
19+
export const encode_legacy_json_generated_raw_style_info: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number];
2020
export const get_font_face_content: (a: any) => [number, number, number, number];
2121
export const get_style_content: (a: any) => [number, number, number, number];
2222
export const mainthreadwasmcontext_add_cross_thread_event: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
@@ -54,8 +54,8 @@ export const rule_set_prelude: (a: number, b: number) => void;
5454
export const ruleprelude_new: () => number;
5555
export const ruleprelude_push_selector: (a: number, b: number) => void;
5656
export const selector_push_one_selector_section: (a: number, b: number, c: number, d: number, e: number) => [number, number];
57-
export const set_inline_styles_in_key_value_vec: (a: any, b: number, c: number, d: number, e: number) => void;
58-
export const set_inline_styles_in_str: (a: any, b: number, c: number, d: number, e: number) => number;
57+
export const set_inline_styles_in_key_value_vec: (a: any, b: number, c: number, d: number, e: number, f: number) => void;
58+
export const set_inline_styles_in_str: (a: any, b: number, c: number, d: number, e: number, f: number) => number;
5959
export const set_inline_styles_number_key: (a: any, b: number, c: number, d: number) => void;
6060
export const stylesheetresource_new: (a: any, b: any) => [number, number, number];
6161
export const selector_new: () => number;

‎packages/web-platform/web-core/binary/client_legacy/client.d.ts‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -160,17 +160,17 @@ export class StyleSheetResource {
160160
*/
161161
export function add_inline_style_raw_string_key(dom: HTMLElement, key: string, value?: string | null): void;
162162

163-
export function decode_style_info(buffer: Uint8Array, entry_name: string | null | undefined, config_enable_css_selector: boolean, transform_vw: boolean, transform_vh: boolean): Uint8Array;
163+
export function decode_style_info(buffer: Uint8Array, entry_name: string | null | undefined, config_enable_css_selector: boolean, transform_vw: boolean, transform_vh: boolean, transform_rem: boolean): Uint8Array;
164164

165-
export function encode_legacy_json_generated_raw_style_info(raw_style_info: RawStyleInfo, config_enable_css_selector: boolean, entry_name: string | null | undefined, transform_vw: boolean, transform_vh: boolean): Uint8Array;
165+
export function encode_legacy_json_generated_raw_style_info(raw_style_info: RawStyleInfo, config_enable_css_selector: boolean, entry_name: string | null | undefined, transform_vw: boolean, transform_vh: boolean, transform_rem: boolean): Uint8Array;
166166

167167
export function get_font_face_content(buffer: Uint8Array): string;
168168

169169
export function get_style_content(buffer: Uint8Array): string;
170170

171-
export function set_inline_styles_in_key_value_vec(dom: HTMLElement, k_v_vec: string[], transform_vw: boolean, transform_vh: boolean): void;
171+
export function set_inline_styles_in_key_value_vec(dom: HTMLElement, k_v_vec: string[], transform_vw: boolean, transform_vh: boolean, transform_rem: boolean): void;
172172

173-
export function set_inline_styles_in_str(dom: HTMLElement, styles: string, transform_vw: boolean, transform_vh: boolean): boolean;
173+
export function set_inline_styles_in_str(dom: HTMLElement, styles: string, transform_vw: boolean, transform_vh: boolean, transform_rem: boolean): boolean;
174174

175175
export function set_inline_styles_number_key(dom: HTMLElement, key: number, value?: string | null): void;
176176

@@ -192,8 +192,8 @@ export interface InitOutput {
192192
readonly __wbg_set_eventinfo_event_type: (a: number, b: number, c: number) => void;
193193
readonly __wbg_stylesheetresource_free: (a: number, b: number) => void;
194194
readonly add_inline_style_raw_string_key: (a: number, b: number, c: number, d: number, e: number) => void;
195-
readonly decode_style_info: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
196-
readonly encode_legacy_json_generated_raw_style_info: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
195+
readonly decode_style_info: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
196+
readonly encode_legacy_json_generated_raw_style_info: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
197197
readonly get_font_face_content: (a: number, b: number) => void;
198198
readonly get_style_content: (a: number, b: number) => void;
199199
readonly mainthreadwasmcontext_add_cross_thread_event: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
@@ -231,8 +231,8 @@ export interface InitOutput {
231231
readonly ruleprelude_new: () => number;
232232
readonly ruleprelude_push_selector: (a: number, b: number) => void;
233233
readonly selector_push_one_selector_section: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
234-
readonly set_inline_styles_in_key_value_vec: (a: number, b: number, c: number, d: number, e: number) => void;
235-
readonly set_inline_styles_in_str: (a: number, b: number, c: number, d: number, e: number) => number;
234+
readonly set_inline_styles_in_key_value_vec: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
235+
readonly set_inline_styles_in_str: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
236236
readonly set_inline_styles_number_key: (a: number, b: number, c: number, d: number) => void;
237237
readonly stylesheetresource_new: (a: number, b: number, c: number) => void;
238238
readonly selector_new: () => number;

‎packages/web-platform/web-core/binary/client_legacy/client_bg.wasm.d.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ export const __wbg_set_eventinfo_event_name: (a: number, b: number, c: number) =
1515
export const __wbg_set_eventinfo_event_type: (a: number, b: number, c: number) => void;
1616
export const __wbg_stylesheetresource_free: (a: number, b: number) => void;
1717
export const add_inline_style_raw_string_key: (a: number, b: number, c: number, d: number, e: number) => void;
18-
export const decode_style_info: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
19-
export const encode_legacy_json_generated_raw_style_info: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
18+
export const decode_style_info: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
19+
export const encode_legacy_json_generated_raw_style_info: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
2020
export const get_font_face_content: (a: number, b: number) => void;
2121
export const get_style_content: (a: number, b: number) => void;
2222
export const mainthreadwasmcontext_add_cross_thread_event: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
@@ -54,8 +54,8 @@ export const rule_set_prelude: (a: number, b: number) => void;
5454
export const ruleprelude_new: () => number;
5555
export const ruleprelude_push_selector: (a: number, b: number) => void;
5656
export const selector_push_one_selector_section: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
57-
export const set_inline_styles_in_key_value_vec: (a: number, b: number, c: number, d: number, e: number) => void;
58-
export const set_inline_styles_in_str: (a: number, b: number, c: number, d: number, e: number) => number;
57+
export const set_inline_styles_in_key_value_vec: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
58+
export const set_inline_styles_in_str: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
5959
export const set_inline_styles_number_key: (a: number, b: number, c: number, d: number) => void;
6060
export const stylesheetresource_new: (a: number, b: number, c: number) => void;
6161
export const selector_new: () => number;

‎packages/web-platform/web-core/binary/encode/encode.d.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ export class StyleInfoDecoder {
109109
[Symbol.dispose](): void;
110110
}
111111

112-
export function decode_style_info(buffer: Uint8Array, entry_name: string | null | undefined, config_enable_css_selector: boolean, transform_vw: boolean, transform_vh: boolean): Uint8Array;
112+
export function decode_style_info(buffer: Uint8Array, entry_name: string | null | undefined, config_enable_css_selector: boolean, transform_vw: boolean, transform_vh: boolean, transform_rem: boolean): Uint8Array;
113113

114-
export function encode_legacy_json_generated_raw_style_info(raw_style_info: RawStyleInfo, config_enable_css_selector: boolean, entry_name: string | null | undefined, transform_vw: boolean, transform_vh: boolean): Uint8Array;
114+
export function encode_legacy_json_generated_raw_style_info(raw_style_info: RawStyleInfo, config_enable_css_selector: boolean, entry_name: string | null | undefined, transform_vw: boolean, transform_vh: boolean, transform_rem: boolean): Uint8Array;
115115

116116
export function get_font_face_content(buffer: Uint8Array): string;
117117

‎packages/web-platform/web-core/binary/encode/encode_bg.wasm.d.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ export const __wbg_rule_free: (a: number, b: number) => void;
66
export const __wbg_ruleprelude_free: (a: number, b: number) => void;
77
export const __wbg_selector_free: (a: number, b: number) => void;
88
export const __wbg_styleinfodecoder_free: (a: number, b: number) => void;
9-
export const decode_style_info: (a: any, b: number, c: number, d: number, e: number, f: number) => [number, number, number];
10-
export const encode_legacy_json_generated_raw_style_info: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number];
9+
export const decode_style_info: (a: any, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number];
10+
export const encode_legacy_json_generated_raw_style_info: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number];
1111
export const get_font_face_content: (a: any) => [number, number, number, number];
1212
export const get_style_content: (a: any) => [number, number, number, number];
1313
export const rawstyleinfo_append_import: (a: number, b: number, c: number) => void;

‎packages/web-platform/web-core/binary/server/server.d.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export class MainThreadServerContext {
1515
get_parent(child_id: number): number | undefined;
1616
get_tag(element_id: number): string | undefined;
1717
insert_before(parent_id: number, child_id: number, ref_id?: number | null): void;
18-
constructor(view_attributes: string, enable_css_selector: boolean, transform_vw: boolean, transform_vh: boolean);
18+
constructor(view_attributes: string, enable_css_selector: boolean, transform_vw: boolean, transform_vh: boolean, transform_rem: boolean);
1919
push_style_sheet(resource: StyleSheetResource, entry_name?: string | null): void;
2020
remove_attribute(element_id: number, key: string): void;
2121
remove_child(parent_id: number, child_id: number): void;
@@ -130,9 +130,9 @@ export class StyleSheetResource {
130130
constructor(buffer: Uint8Array, _document: any);
131131
}
132132

133-
export function decode_style_info(buffer: Uint8Array, entry_name: string | null | undefined, config_enable_css_selector: boolean, transform_vw: boolean, transform_vh: boolean): Uint8Array;
133+
export function decode_style_info(buffer: Uint8Array, entry_name: string | null | undefined, config_enable_css_selector: boolean, transform_vw: boolean, transform_vh: boolean, transform_rem: boolean): Uint8Array;
134134

135-
export function encode_legacy_json_generated_raw_style_info(raw_style_info: RawStyleInfo, config_enable_css_selector: boolean, entry_name: string | null | undefined, transform_vw: boolean, transform_vh: boolean): Uint8Array;
135+
export function encode_legacy_json_generated_raw_style_info(raw_style_info: RawStyleInfo, config_enable_css_selector: boolean, entry_name: string | null | undefined, transform_vw: boolean, transform_vh: boolean, transform_rem: boolean): Uint8Array;
136136

137137
export function get_font_face_content(buffer: Uint8Array): string;
138138

‎packages/web-platform/web-core/binary/server/server_bg.wasm.d.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ export const __wbg_rule_free: (a: number, b: number) => void;
77
export const __wbg_ruleprelude_free: (a: number, b: number) => void;
88
export const __wbg_selector_free: (a: number, b: number) => void;
99
export const __wbg_stylesheetresource_free: (a: number, b: number) => void;
10-
export const decode_style_info: (a: any, b: number, c: number, d: number, e: number, f: number) => [number, number, number];
11-
export const encode_legacy_json_generated_raw_style_info: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number];
10+
export const decode_style_info: (a: any, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number];
11+
export const encode_legacy_json_generated_raw_style_info: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number];
1212
export const get_font_face_content: (a: any) => [number, number, number, number];
1313
export const get_style_content: (a: any) => [number, number, number, number];
1414
export const init_server_in_shadow_css: (a: number, b: number) => void;
@@ -23,7 +23,7 @@ export const mainthreadservercontext_get_page_css: (a: number) => [number, numbe
2323
export const mainthreadservercontext_get_parent: (a: number, b: number) => number;
2424
export const mainthreadservercontext_get_tag: (a: number, b: number) => [number, number];
2525
export const mainthreadservercontext_insert_before: (a: number, b: number, c: number, d: number) => void;
26-
export const mainthreadservercontext_new: (a: number, b: number, c: number, d: number, e: number) => number;
26+
export const mainthreadservercontext_new: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
2727
export const mainthreadservercontext_push_style_sheet: (a: number, b: number, c: number, d: number) => [number, number];
2828
export const mainthreadservercontext_remove_attribute: (a: number, b: number, c: number, d: number) => void;
2929
export const mainthreadservercontext_remove_child: (a: number, b: number, c: number) => void;

0 commit comments

Comments
 (0)