Skip to content

Conversation

@pedrobslisboa
Copy link
Collaborator

@pedrobslisboa pedrobslisboa commented Nov 13, 2025

Description

This PR enables the styles to work with both the' className' and' style' attributes.

It also fixes an error on expanding Optional "styles", before it was validating the frt and snd values instead of the styles itself. Now, we use an Option.map to retrieve the correct values from the option content.

File "packages/server-reason-react-ppx/test/test.re", line 631, characters 18-24:
631 |   let div = <div ?styles />;
                        ^^^^^^
Error: This expression has type 'a option
       but an expression was expected of type 'b * 'c
Had 1 error, waiting for filesystem changes...     
(* Before *)
React.createElementWithKey ~key:None "div"
  (Stdlib.List.filter_map Stdlib.Fun.id
     [
       (match (fst x : string option) with
       | None -> None
       | Some v -> Some (React.JSX.String ("class", "className", v)));
       (match (snd x : ReactDOM.Style.t option) with
       | None -> None
       | Some v -> Some (React.JSX.Style v));
     ])
  []

(* After *)
React.createElementWithKey ~key:None "div"
  (Stdlib.List.filter_map Stdlib.Fun.id
     [
       (match (Option.map (fun x -> fst x) x : string option) with
       | None -> None
       | Some v -> Some (React.JSX.String ("class", "className", v)));
       (match (Option.map (fun x -> snd x) x : ReactDOM.Style.t option) with
       | None -> None
       | Some v -> Some (React.JSX.Style v));
     ])
  []

Examples:

// Expanding styles prop into className and style props
<div styles=x />;

// Expanding styles prop into className and style props with optional styles
<div styles=?x />;

// Expanding styles prop into className and style props with className already set
<div className="lola" styles=x />;

// Expanding styles prop into className and style props with style already set
<div style={ReactDOM.Style.make(~backgroundColor="gainsboro", ())} styles=x />;

// Expanding styles prop into className and style props with className and style already set
<div className="lola" style={ReactDOM.Style.make(~backgroundColor="gainsboro", ())} styles=x />;

// Expanding styles prop into className and style props with optional styles prop
<div styles=?x />;

// Expanding styles prop into className and style props with optional styles prop and className already set
<div className="lola" styles=?x />;

// Expanding styles prop into className and style props with optional styles prop and style already set
<div style={ReactDOM.Style.make(~backgroundColor="gainsboro", ())} styles=?x />;

// Expanding styles prop into className and style props with optional styles prop and className and style already set
<div className="lola" style={ReactDOM.Style.make(~backgroundColor="gainsboro", ())} styles=?x />;```

@pedrobslisboa pedrobslisboa self-assigned this Nov 13, 2025
@pedrobslisboa pedrobslisboa added bug Something isn't working enhancement New feature or request labels Nov 13, 2025
@pedrobslisboa pedrobslisboa force-pushed the feat/expand-styles-classname branch 7 times, most recently from 9eea680 to 43ef144 Compare November 15, 2025 14:37
@pedrobslisboa pedrobslisboa force-pushed the feat/expand-styles-classname branch 5 times, most recently from bff545d to ee2723f Compare November 17, 2025 20:09
@pedrobslisboa pedrobslisboa force-pushed the feat/expand-styles-classname branch from ee2723f to 70c9467 Compare November 17, 2025 20:16
@pedrobslisboa pedrobslisboa merged commit b27dd3d into main Nov 17, 2025
5 checks passed
@pedrobslisboa pedrobslisboa deleted the feat/expand-styles-classname branch November 17, 2025 20:39
davesnx pushed a commit to davesnx/opam-repository that referenced this pull request Nov 30, 2025
CHANGES:

* Expand styles prop into className and style props with optional handling by @pedrobslisboa in ml-in-barcelona/server-reason-react#324
* Lowercase components have ?key:string by @davesnx in ml-in-barcelona/server-reason-react#323
* Wrap client value on React.Upper_case_component by @pedrobslisboa in ml-in-barcelona/server-reason-react#322
* Fix remove last element on nested_modules by @pedrobslisboa in ml-in-barcelona/server-reason-react#321
* Add searchParams function to native URL by @pedrobslisboa in ml-in-barcelona/server-reason-react#320
* Add URL construct function and improve lib build by @EmileTrotignon in ml-in-barcelona/server-reason-react#317
* Specify model values at React by @pedrobslisboa in ml-in-barcelona/server-reason-react#309
* Allow async in client props by @pedrobslisboa in ml-in-barcelona/server-reason-react#315
* Improve the Fiber and Model stream context by @pedrobslisboa in ml-in-barcelona/server-reason-react#312
* Align Suspense with reason-react by @pedrobslisboa in ml-in-barcelona/server-reason-react#311
* Make client component to execute in runtime by @pedrobslisboa in ml-in-barcelona/server-reason-react#306
* Fix mismatch of the model and html on render_html by @pedrobslisboa in ml-in-barcelona/server-reason-react#305
* Fix createFromFetch interface and avoid transition on navigation by @davesnx in ml-in-barcelona/server-reason-react#299
* Change ppx execution order (styles expansion in server-reason-react) by @davesnx in ml-in-barcelona/server-reason-react#297
* Rename use function to usePromise in Experimental module by @pedrobslisboa in ml-in-barcelona/server-reason-react#298
* Add shared-folder-prefix arg to ppx by @davesnx in ml-in-barcelona/server-reason-react#294
davesnx pushed a commit to davesnx/opam-repository that referenced this pull request Nov 30, 2025
CHANGES:

* Bump lwt to 5.9.2
* Expand styles prop into className and style props with optional handling by @pedrobslisboa in ml-in-barcelona/server-reason-react#324
* Lowercase components have ?key:string by @davesnx in ml-in-barcelona/server-reason-react#323
* Wrap client value on React.Upper_case_component by @pedrobslisboa in ml-in-barcelona/server-reason-react#322
* Fix remove last element on nested_modules by @pedrobslisboa in ml-in-barcelona/server-reason-react#321
* Add searchParams function to native URL by @pedrobslisboa in ml-in-barcelona/server-reason-react#320
* Add URL construct function and improve lib build by @EmileTrotignon in ml-in-barcelona/server-reason-react#317
* Specify model values at React by @pedrobslisboa in ml-in-barcelona/server-reason-react#309
* Allow async in client props by @pedrobslisboa in ml-in-barcelona/server-reason-react#315
* Improve the Fiber and Model stream context by @pedrobslisboa in ml-in-barcelona/server-reason-react#312
* Align Suspense with reason-react by @pedrobslisboa in ml-in-barcelona/server-reason-react#311
* Make client component to execute in runtime by @pedrobslisboa in ml-in-barcelona/server-reason-react#306
* Fix mismatch of the model and html on render_html by @pedrobslisboa in ml-in-barcelona/server-reason-react#305
* Fix createFromFetch interface and avoid transition on navigation by @davesnx in ml-in-barcelona/server-reason-react#299
* Change ppx execution order (styles expansion in server-reason-react) by @davesnx in ml-in-barcelona/server-reason-react#297
* Rename use function to usePromise in Experimental module by @pedrobslisboa in ml-in-barcelona/server-reason-react#298
* Add shared-folder-prefix arg to ppx by @davesnx in ml-in-barcelona/server-reason-react#294
davesnx pushed a commit to davesnx/opam-repository that referenced this pull request Dec 1, 2025
CHANGES:

* Add upper bound to quickjs 0.2.0
* Bump lwt to 5.9.2
* Expand styles prop into className and style props with optional handling by @pedrobslisboa in ml-in-barcelona/server-reason-react#324
* Lowercase components have ?key:string by @davesnx in ml-in-barcelona/server-reason-react#323
* Wrap client value on React.Upper_case_component by @pedrobslisboa in ml-in-barcelona/server-reason-react#322
* Fix remove last element on nested_modules by @pedrobslisboa in ml-in-barcelona/server-reason-react#321
* Add searchParams function to native URL by @pedrobslisboa in ml-in-barcelona/server-reason-react#320
* Add URL construct function and improve lib build by @EmileTrotignon in ml-in-barcelona/server-reason-react#317
* Specify model values at React by @pedrobslisboa in ml-in-barcelona/server-reason-react#309
* Allow async in client props by @pedrobslisboa in ml-in-barcelona/server-reason-react#315
* Improve the Fiber and Model stream context by @pedrobslisboa in ml-in-barcelona/server-reason-react#312
* Align Suspense with reason-react by @pedrobslisboa in ml-in-barcelona/server-reason-react#311
* Make client component to execute in runtime by @pedrobslisboa in ml-in-barcelona/server-reason-react#306
* Fix mismatch of the model and html on render_html by @pedrobslisboa in ml-in-barcelona/server-reason-react#305
* Fix createFromFetch interface and avoid transition on navigation by @davesnx in ml-in-barcelona/server-reason-react#299
* Change ppx execution order (styles expansion in server-reason-react) by @davesnx in ml-in-barcelona/server-reason-react#297
* Rename use function to usePromise in Experimental module by @pedrobslisboa in ml-in-barcelona/server-reason-react#298
* Add shared-folder-prefix arg to ppx by @davesnx in ml-in-barcelona/server-reason-react#294
pedrobslisboa added a commit that referenced this pull request Dec 1, 2025
* origin/main:
  Add upper bound to quickjs 0.2.0
  Only run this tests on 5.2.0
  Bump lwt lower to 5.9.2
  Fix docker
  Fix CI with hardocded value
  Specify version in dune-release-action
  Prepare 0.4.0
  Use 0.27.0
  Update ocamlformat 0.28.1
  Update melange-fetch to 0.2.0
  Ensure render_model always recieve a React.element
  feat: expand styles prop into className and style props with optional handling (#324)
  Lowercase components have ?key:string (#323)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants