Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
311 commits
Select commit Hold shift + click to select a range
935aeb4
fix(react): rewrite another copy's Columns in a <Tailwind>
ivoIturrieta Oct 17, 2026
3ef214c
fix(react): call a component of yours named like a root
ivoIturrieta Oct 17, 2026
c08d234
fix(react): render a <Suspense>'s fallback whatever onError says
ivoIturrieta Oct 17, 2026
3e7b7e5
fix(react): render an async template with no root once, as the synchr…
ivoIturrieta Oct 17, 2026
74225b4
ci(react): raise the main entry's bundle budget to 191KB
ivoIturrieta Oct 17, 2026
1168620
fix(react): render a template with no root once, as a root's content
ivoIturrieta Oct 17, 2026
61addc5
fix(react): wait for what's async in a template with no root
ivoIturrieta Oct 17, 2026
974010b
ci(react): raise the main entry's bundle budget to 192KB
ivoIturrieta Oct 17, 2026
edc342f
fix(react): say <template> for a failure at a rootless template's top
ivoIturrieta Oct 17, 2026
0b2d2bb
fix(react): keep what Tailwind compiles bounded in a long-lived process
ivoIturrieta Oct 17, 2026
dad3e6a
fix(react): fail a template that sets its state every time it renders
ivoIturrieta Oct 17, 2026
27610ee
fix(react): keep a render a template wrapper starts out of the outer one
ivoIturrieta Oct 17, 2026
c62f232
fix(react): know React 18.0 to 18.2, and say an older React is older
ivoIturrieta Oct 17, 2026
4a0f02c
fix(react): keep raw HTML in Markdown to tags that display, read in o…
ivoIturrieta Oct 18, 2026
0bebad6
fix(react): render a <Head>'s components as the template's
ivoIturrieta Oct 18, 2026
ad50d38
fix(react): keep what's said once, and the style names, bounded
ivoIturrieta Oct 18, 2026
331b04d
fix(react): throw a template wrapper's error from renderToJson as it is
ivoIturrieta Oct 18, 2026
c8dd482
fix(react): put a custom tool's failing head in the error policy
ivoIturrieta Oct 18, 2026
cdfde75
ci(react): raise the main entry's bundle budget to 193KB
ivoIturrieta Oct 18, 2026
1486293
test(react): keep the sanitizer's fuzz quick in CI
ivoIturrieta Oct 18, 2026
51e71c3
fix(react): keep a `$` in a component's style or class as it is
ivoIturrieta Oct 18, 2026
c7c0647
fix(react): keep a block's padding where its margin class can't be added
ivoIturrieta Oct 18, 2026
5d7fcd8
fix(react): make Tailwind's logical sides follow the text direction
ivoIturrieta Oct 18, 2026
ddea696
docs(react): give the bundle budget and size as they are
ivoIturrieta Oct 18, 2026
49eac31
fix(react): give a render the user's code starts a scope of its own
ivoIturrieta Oct 18, 2026
e95b172
fix(react): keep what unwrapping a template found in its render's scope
ivoIturrieta Oct 18, 2026
bd98c0f
fix(react): resolve a lazy template in the async renderers
ivoIturrieta Oct 18, 2026
8e5d517
ci(react): raise the main entry's bundle budget to 193.5KB
ivoIturrieta Oct 18, 2026
c21f361
test(react): start a render from a Tailwind plugin too
ivoIturrieta Oct 18, 2026
155e214
test(react): read the reviewed snapshots through Vite
ivoIturrieta Oct 18, 2026
4e8f24b
fix(react): unwrap a Suspense around the template
ivoIturrieta Oct 18, 2026
6cbe053
fix(react): compile a Tailwind config changed in place as it is now
ivoIturrieta Oct 18, 2026
2ef9f27
refactor(react): keep which Row or Column failed in the render's scope
ivoIturrieta Oct 18, 2026
0b6dc0a
fix(react): keep an async render's compiled Tailwind in its scope
ivoIturrieta Oct 18, 2026
1d4b91a
docs(react): say where a render a component starts begins
ivoIturrieta Oct 18, 2026
8cb22e5
ci(react): raise the main entry's bundle budget to 194.5KB
ivoIturrieta Oct 18, 2026
2f0f76c
fix(react): say why a root's settings go unread in the async renderer…
ivoIturrieta Oct 18, 2026
b3ae5a5
ci(react): give what the main entry grew by as it is
ivoIturrieta Oct 18, 2026
ab3dd9c
docs(react): say what a Suspense around a template with no root is
ivoIturrieta Oct 18, 2026
908ef7e
fix(react): read markup as a browser does when inlining Tailwind classes
ivoIturrieta Oct 18, 2026
7b9a27d
fix(react): know a Tailwind class by its own name in its rule's selector
ivoIturrieta Oct 18, 2026
54d46e2
fix(react): don't hide markup on every screen with Tailwind's screen …
ivoIturrieta Oct 18, 2026
c440cd9
fix(react): mark a select's options and write form controls as react-…
ivoIturrieta Oct 18, 2026
6faa952
fix(react): write a style's and a script's text as react-dom does, an…
ivoIturrieta Oct 18, 2026
c15ecbe
ci(react): raise the main entry's bundle budget to 198KB
ivoIturrieta Oct 18, 2026
e6fb5a9
test(react): say each difference the differential test lists
ivoIturrieta Oct 18, 2026
6a1e01a
fix(react): write a title's innerHTML as React 18.0 and 18.1 do
ivoIturrieta Oct 18, 2026
157e2b9
docs(react): say what Head escapes in a style's or a script's text
ivoIturrieta Oct 18, 2026
72f1cb0
fix(react): keep the element a class component returns in a Column
ivoIturrieta Oct 18, 2026
ad2152c
fix(react): inline the rest of a class a screen variant changes in part
ivoIturrieta Oct 18, 2026
24e31d2
fix(react): inline no class into Markdown's HTML that loads anything
ivoIturrieta Oct 18, 2026
f75eee1
fix(react): refuse old IE filters and image() in Markdown's styles
ivoIturrieta Oct 18, 2026
055057c
fix(react): keep one unreadable Tailwind class from breaking the rest
ivoIturrieta Oct 18, 2026
a75b97a
fix(react): leave out only what shows or hides markup for a screen va…
ivoIturrieta Oct 18, 2026
6786a55
fix(react): keep no class in Markdown's HTML whose value loads anything
ivoIturrieta Oct 18, 2026
c20faf6
fix(shared): keep a heading's links in the plain text
ivoIturrieta Oct 18, 2026
dca7fe2
ci: publish Elements only after every React version passes
ivoIturrieta Oct 18, 2026
932f992
fix(react): ask again for a fresh Tailwind compiler that failed
ivoIturrieta Oct 18, 2026
1029b6a
docs(react): list how the plain text differs from 0.2 without options
ivoIturrieta Oct 18, 2026
f863917
ci(react): raise the main entry's bundle budget to 198.5KB
ivoIturrieta Oct 18, 2026
aba1059
test(react): give the two heaviest tests the time a CI runner needs
ivoIturrieta Oct 18, 2026
92b7f76
fix(react): keep a class on inline elements in text children
ivoIturrieta Oct 18, 2026
5321b2d
fix(shared): write 0px in lengths whose key ends in "margin"
ivoIturrieta Oct 18, 2026
bc81fd5
docs(react): say which rich text a Tailwind inlines
ivoIturrieta Oct 18, 2026
99e93a5
fix(react): write email and phone links as URLs in generated code
ivoIturrieta Oct 20, 2026
89afada
fix(react): hold a Tailwind width with its max and min width as CSS does
ivoIturrieta Oct 20, 2026
96aac61
fix(react): take the last width class without at(), which ES2020 lacks
ivoIturrieta Oct 20, 2026
eff83aa
fix(react): keep a link's other attributes in generated code
ivoIturrieta Oct 20, 2026
b051e98
fix(react): read a context's default, never what another render left …
ivoIturrieta Oct 22, 2026
1a637ae
fix(react): keep a Head's style and script text inside them, whatever…
ivoIturrieta Oct 22, 2026
e1fff63
fix(react): cap what a Tailwind declaration's variables come to
ivoIturrieta Oct 22, 2026
d34c6cb
ci(react): raise the main entry's bundle budget to 200KB
ivoIturrieta Oct 22, 2026
cddea6f
docs(react): say what a context reads inside renderToString before it…
ivoIturrieta Oct 22, 2026
aa33cde
fix(react): write a menu item without a link without one in generated…
ivoIturrieta Oct 22, 2026
ef07b44
fix(react): throw a RenderError naming an async template in the synch…
ivoIturrieta Oct 22, 2026
c86a467
build(react): ship the MIT license in the package again
ivoIturrieta Oct 22, 2026
35b751b
fix(react): keep highlight.js out of the code and Markdown entries' t…
ivoIturrieta Oct 22, 2026
b57212d
build(react): resolve CommonJS types for require, and every entry's f…
ivoIturrieta Oct 22, 2026
52ca678
docs(react): date 0.3.0 in the changelog, and list the CommonJS types…
ivoIturrieta Oct 22, 2026
b315b8f
docs(react): say which Reacts CI tests, what fontFamily takes, and Re…
ivoIturrieta Oct 22, 2026
f1dea26
fix(react): install alongside a project's Tailwind CSS 3 or prettier …
ivoIturrieta Oct 22, 2026
3582d53
ci(react): install the packed package in a project with Tailwind CSS …
ivoIturrieta Oct 22, 2026
5664cd0
ci(migrate): check the packed tarball has its LICENSE
ivoIturrieta Oct 22, 2026
c716284
ci(react): find any import of highlight.js or marked in the built types
ivoIturrieta Oct 22, 2026
8a5c1a0
test(react): build the Next.js 16 consumer with Next.js 16.4.2
ivoIturrieta Oct 22, 2026
9da4772
docs(react): name the two context cases around an app's renderToStrin…
ivoIturrieta Oct 22, 2026
0b236ea
fix(react): keep a Tailwind class's value where a prop is given as un…
ivoIturrieta Oct 23, 2026
5dbb689
fix(react): refuse Tailwind values that could end an HTML attribute
ivoIturrieta Oct 23, 2026
2e0710f
fix(react): open a link whose target could end its attribute in a new…
ivoIturrieta Oct 23, 2026
2691a4e
fix(react): write a Markdown table in a list or quote as a top-level …
ivoIturrieta Oct 23, 2026
271f8f1
fix(react): limit a Markdown's table cells to what its size calls for
ivoIturrieta Oct 23, 2026
4858b49
fix(react): nest Markdown quotes and lists 32 deep
ivoIturrieta Oct 23, 2026
f8c63c2
fix(react): read inline HTML's URLs with their references decoded
ivoIturrieta Oct 23, 2026
ee8ca74
fix(react): keep an email service's tag in the plain text
ivoIturrieta Oct 23, 2026
94169f4
test(react): pin what a context reads in a stream after a failed rend…
ivoIturrieta Oct 23, 2026
c578c31
fix(react): read one value for a context a template doesn't provide, …
ivoIturrieta Oct 23, 2026
db81dce
fix(react): learn a context's default after a client render and in it…
ivoIturrieta Oct 23, 2026
3e9b2da
docs(react): say what a context a template doesn't provide reads arou…
ivoIturrieta Oct 23, 2026
1cddd3a
ci(react): raise the main entry's bundle budget to 202.5KB
ivoIturrieta Oct 23, 2026
deec03d
fix(react): render a very long Markdown without overflowing the stack
ivoIturrieta Oct 23, 2026
8e6626c
fix(react): open a link whose target isn't a string in a new tab
ivoIturrieta Oct 23, 2026
6867530
fix(react): charge a Markdown table once where marked reads its quote…
ivoIturrieta Oct 23, 2026
05f125f
fix(react): leave out a Tailwind class whose url() isn't a web or rel…
ivoIturrieta Oct 23, 2026
da778dd
fix(react): read Tailwind classes from data in time linear in their n…
ivoIturrieta Oct 23, 2026
5e91bf5
ci(react): raise the main entry's bundle budget to 203KB
ivoIturrieta Oct 23, 2026
1d235e2
fix(react): write a javascript: URL as one that throws, with React 18…
ivoIturrieta Oct 23, 2026
1fa5f9b
fix(react): read a render's first 2,000 different Tailwind classes
ivoIturrieta Oct 23, 2026
1ac3f0d
fix(react): refuse only the Tailwind class built alone and seen to fail
ivoIturrieta Oct 23, 2026
b13c6dd
fix(react): build a <Tailwind>'s own classes at once, and pin a plugi…
ivoIturrieta Oct 23, 2026
1230917
fix(react): keep a Tailwind url() of an inline attachment or a base64…
ivoIturrieta Oct 23, 2026
83f7bfb
fix(react): take a link of null as none
ivoIturrieta Oct 23, 2026
fee903d
ci(react): raise the main entry's bundle budget to 204.5KB
ivoIturrieta Oct 23, 2026
a9e3831
test(react): tell a class outside a <Tailwind> isn't compiled by its …
ivoIturrieta Oct 23, 2026
5a4f037
fix(react): keep a Tailwind plugin's failure for one class out of oth…
ivoIturrieta Oct 23, 2026
0f2f4f4
fix(react): write the exporters' own javascript: links as ones that t…
ivoIturrieta Oct 23, 2026
fee8818
fix(react): skip a null Menu item or Social icon
ivoIturrieta Oct 23, 2026
96aa490
docs(react): give Markdown's output size and memory per kilobyte
ivoIturrieta Oct 23, 2026
893a835
ci(react): raise the main entry's bundle budget to 206KB
ivoIturrieta Oct 23, 2026
ec22f7e
fix(react): put an async render off only while its Tailwind compiles …
ivoIturrieta Oct 23, 2026
6ccee76
fix(react): read a block's link with its character references decoded
ivoIturrieta Oct 23, 2026
307aa60
fix(react): pin a plugin's error on its class where another utility g…
ivoIturrieta Oct 23, 2026
92e064f
fix(react): render an async template again once Tailwind has compiled…
ivoIturrieta Oct 23, 2026
06a1825
docs(react): give Markdown's memory for its worst shape, deeply neste…
ivoIturrieta Oct 23, 2026
26dffce
fix(react): read Markdown's inline syntax in time linear in its size
ivoIturrieta Oct 23, 2026
a2c3ae8
fix(react): keep what Tailwind can't compile of a plugin's output off…
ivoIturrieta Oct 23, 2026
4cbe83c
fix(react): list and say each part an async render leaves out once wh…
ivoIturrieta Oct 23, 2026
d56f2b6
docs(react): say a Table's cells are HTML and style props are written…
ivoIturrieta Oct 23, 2026
0bc71fe
docs(react): give Markdown's output, time and memory for its densest …
ivoIturrieta Oct 23, 2026
401bb23
fix(react): tie a plugin's error to its class by the value Tailwind g…
ivoIturrieta Oct 23, 2026
f7d8377
fix(react): inline Tailwind classes in a Heading's and a Button's chi…
ivoIturrieta Oct 23, 2026
f7dbee9
fix(react): take a prop given as null as one not given
ivoIturrieta Oct 23, 2026
bfe54a5
fix(react): leave a <script>'s or <style>'s text out of rich text chi…
ivoIturrieta Oct 23, 2026
d1c192b
test(react): wait for JSDOM to run the parity check's javascript: con…
ivoIturrieta Oct 23, 2026
e7b8a21
fix(react): read Markdown's quotes and task lists in time linear in t…
ivoIturrieta Oct 23, 2026
e044386
fix(react): bound the time highlighting code takes, in CodeBlock and …
ivoIturrieta Oct 23, 2026
eb7e103
fix(react): write designToElements' code in time linear in the design…
ivoIturrieta Oct 23, 2026
345ebc2
fix(react): keep a Row's anchor, a Video's link and thumbnail and an …
ivoIturrieta Oct 23, 2026
ddf9b12
fix(react): load nothing from a Font's javascript: URL
ivoIturrieta Oct 23, 2026
5b1002c
docs(react): give Markdown's output and time measured again, and say …
ivoIturrieta Oct 23, 2026
b92feb1
Merge branch 'wip/r5-b' into feat/react-elements-0.3
ivoIturrieta Oct 24, 2026
101f257
chore(react): raise the main entry's bundle budget to 207 KB
ivoIturrieta Oct 24, 2026
739bc41
test(react): load codegen's test harness in the production test run
ivoIturrieta Oct 24, 2026
2c4458b
fix(react): render a content prop given as null as no content, not a …
ivoIturrieta Oct 24, 2026
8ed3886
fix(react): size an Image by its height class from its aspect ratio
ivoIturrieta Oct 24, 2026
b5bc962
fix(react): percent-encode what a Video's id doesn't hold
ivoIturrieta Oct 24, 2026
1fb1779
fix(react): take code's trailing whitespace off in time linear in its…
ivoIturrieta Oct 24, 2026
fa9552e
fix(react): read Markdown's would-be tables and link text in time lin…
ivoIturrieta Oct 24, 2026
668267c
fix(shared): write HTML's plain text in time linear in its size
ivoIturrieta Oct 24, 2026
32f58d2
fix(react): match design, style and comment text with regexes linear …
ivoIturrieta Oct 24, 2026
91a454e
fix(react): read Markdown's list items, paragraph lines and reference…
ivoIturrieta Oct 24, 2026
1365aff
test(react): check code of any short shape costs about ten times as m…
ivoIturrieta Oct 24, 2026
005be44
Merge branch 'wip/r5-b' into feat/react-elements-0.3
ivoIturrieta Oct 24, 2026
bc45c33
refactor(shared): read HTML for plain text through one loop and one b…
ivoIturrieta Oct 24, 2026
d317a11
fix(react): keep rich text's inline markup in time linear in its size
ivoIturrieta Oct 24, 2026
d34dc9d
fix(react): read Tailwind classes in time linear in their size
ivoIturrieta Oct 24, 2026
cdbbce2
chore(react): raise the main entry's bundle budget to 216 KB
ivoIturrieta Oct 24, 2026
0191598
fix(react): give Tailwind's shared compiler only classes it builds in…
ivoIturrieta Oct 24, 2026
cd2d81f
fix(react): build a render's classes in headings' text and rich text …
ivoIturrieta Oct 24, 2026
580a7b5
fix(react): read an image's size string once for its height class
ivoIturrieta Oct 24, 2026
c2d414b
fix(shared): index plain text's tag names by their parts, not each pr…
ivoIturrieta Oct 24, 2026
6fc708b
fix(react): share Markdown's and code's work across a render, not per…
ivoIturrieta Oct 24, 2026
c69fcf5
Merge branch 'wip/r5-b' into feat/react-elements-0.3
ivoIturrieta Oct 24, 2026
b7ff88c
chore(react): raise the main entry's bundle budget to 218 KB
ivoIturrieta Oct 24, 2026
4613284
test(react): time a code shape that looks slow twice more before sayi…
ivoIturrieta Oct 24, 2026
acb8c6c
fix(react): keep a fresh Tailwind compiler ready for synchronous renders
ivoIturrieta Oct 24, 2026
c1389fd
fix(react): inline in markup no class value a prop can't take
ivoIturrieta Oct 24, 2026
f4c2a1f
docs(react): say a class in a Markdown table cell isn't inlined
ivoIturrieta Oct 24, 2026
ea1b6f1
fix(react): close the escapes from a render's shared work
ivoIturrieta Oct 24, 2026
9264d65
fix(react): read code themes by their own names, say hook errors once…
ivoIturrieta Oct 24, 2026
4f26690
fix(shared): read plain text's skip names as written, and keep the te…
ivoIturrieta Oct 24, 2026
f0542a5
Merge branch 'wip/r5-b' into feat/react-elements-0.3
ivoIturrieta Oct 24, 2026
1894c35
chore(react): raise the main entry's bundle budget to 219.5 KB
ivoIturrieta Oct 24, 2026
239f1a3
fix(react): inline in markup what its escaped style can hold
ivoIturrieta Oct 24, 2026
de47a74
docs(react): give a Tailwind handle's memory with the compiler kept r…
ivoIturrieta Oct 24, 2026
63faff8
fix(react): share a render's work across copies of Elements and with …
ivoIturrieta Oct 24, 2026
b3bd8d3
fix(react): say text placed straight in a Row or Column once per rend…
ivoIturrieta Oct 24, 2026
6d1781f
fix(shared): keep plain text's placeholders from text that decodes to…
ivoIturrieta Oct 24, 2026
e663fa6
docs(react): give the Markdown memory figures for each renderer, and …
ivoIturrieta Oct 24, 2026
ee7fb76
Merge branch 'wip/r5-b' into feat/react-elements-0.3
ivoIturrieta Oct 24, 2026
1c1a3c2
chore(react): raise the main entry's bundle budget to 221 KB
ivoIturrieta Oct 24, 2026
55f3e74
test(react): turn the event loop between tests, so vitest's reports c…
ivoIturrieta Oct 24, 2026
a58f800
test(react): read the Tailwind swap test's stylesheets where Elements…
ivoIturrieta Oct 24, 2026
63ff243
test(react): time a Markdown shape that looks slow again, and quotes …
ivoIturrieta Oct 24, 2026
8a43cac
docs(react): say what the types, image sources and a prop's url() tak…
ivoIturrieta Oct 24, 2026
59396a4
test(react): confirm a seeded shape that still looks slow at ten time…
ivoIturrieta Oct 24, 2026
835077e
test(react): give each test 30 s, as a CI runner takes several times …
ivoIturrieta Oct 24, 2026
37c8880
test(react): nest the deep code test's tokens 1,024 deep, within Node…
ivoIturrieta Oct 24, 2026
3b5c2e4
fix(react): read Tailwind's stylesheet in time linear in its size on …
ivoIturrieta Oct 24, 2026
067a41d
test(react): retime the Tailwind class growth fuzz, and bound Tailwin…
ivoIturrieta Oct 24, 2026
8c7eef3
docs(react): say Tailwind's stylesheet is read in time linear in its …
ivoIturrieta Oct 24, 2026
eaa4f5d
test(react): time every timing test through one helper that holds on …
ivoIturrieta Oct 25, 2026
af5f060
test(shared): time every timing test through the same helper
ivoIturrieta Oct 25, 2026
11ec4e2
test(react): release the streamed page's data once its shell is written
ivoIturrieta Oct 25, 2026
898d813
fix(react): leave out a tag that never ends in rich text
ivoIturrieta Oct 27, 2026
11dfce1
fix(react): keep an email service's tag whole in rich text and backgr…
ivoIturrieta Oct 27, 2026
95fd832
fix(react): write a display condition around its row or block
ivoIturrieta Oct 27, 2026
755d445
fix(react): say where converted code keeps a merge tag rule Elements …
ivoIturrieta Oct 27, 2026
8a4c2c7
fix(react): don't say a Table ignores its typed colors and fonts
ivoIturrieta Oct 27, 2026
83431d7
docs(react): say what mergeTagState is, and note display conditions a…
ivoIturrieta Oct 27, 2026
6472ab3
chore(react): raise the main entry's bundle budget to 222.5 KB
ivoIturrieta Oct 27, 2026
a931766
fix(react): keep an email service's tags whole in background URLs, an…
ivoIturrieta Oct 27, 2026
8e46819
fix(react): keep double quotes as written in rich text
ivoIturrieta Oct 27, 2026
936c87b
fix(react): keep a lone Link a Paragraph when its URL is a <%name%> t…
ivoIturrieta Oct 27, 2026
89b5315
fix(react): leave comments out of rich text
ivoIturrieta Oct 27, 2026
261afa7
fix(react): keep the display condition of a block design-to-code writ…
ivoIturrieta Oct 27, 2026
1a7c6ad
fix(shared): keep an email service's tags as written in a heading's p…
ivoIturrieta Oct 27, 2026
a6ca199
fix(react): write a Table's cells from data that aren't strings as th…
ivoIturrieta Oct 27, 2026
ac1e4c8
docs(react): say how background image URLs keep an email service's ta…
ivoIturrieta Oct 27, 2026
78bdc8f
chore(react): raise the main entry's bundle budget to 224.5 KB
ivoIturrieta Oct 27, 2026
98700e4
fix(react): keep a rich-text attribute whole when its value holds a <…
ivoIturrieta Oct 27, 2026
6a9ca58
fix(react): encode a background URL whose tag would end a comment
ivoIturrieta Oct 27, 2026
da786a2
fix(react): keep a root's id and class names from values to what they…
ivoIturrieta Oct 27, 2026
3202651
fix(shared): fail the render for an object or a date in a text block'…
ivoIturrieta Oct 27, 2026
18516bd
docs(react): note a root's ids kept to what they hold, and object chi…
ivoIturrieta Oct 27, 2026
09b3b2a
fix(react): keep rich text's stray brackets as text
ivoIturrieta Oct 28, 2026
ff9f3a2
fix(react): keep a style value with a double quote, written as a refe…
ivoIturrieta Oct 28, 2026
9d3a68f
fix(react): size an image whose src gives its natural size by its Tai…
ivoIturrieta Oct 28, 2026
f4ffd49
fix(react): type a Table's merge tag rule in its values
ivoIturrieta Oct 28, 2026
bd80d88
fix(react): write a Heading level that isn't a tag name as an h1
ivoIturrieta Oct 28, 2026
3b20f3c
docs(react): note style values' double quotes and a Heading's level
ivoIturrieta Oct 28, 2026
ee41b51
chore(react): raise the main entry's bundle budget to 225.5 KB
ivoIturrieta Oct 28, 2026
73fb76c
fix(shared): read an end tag with whitespace before its > as one in p…
ivoIturrieta Oct 28, 2026
b35cc79
fix(react): let an image's src maxWidth win over a Tailwind width class
ivoIturrieta Oct 28, 2026
93bb445
fix(react): load prettier so esbuild bundles the async, Tailwind and …
ivoIturrieta Oct 28, 2026
298e6e3
fix(react): keep a link URL's single quotes as written in rich text
ivoIturrieta Oct 29, 2026
e1f9483
fix(react): put an Image's style and className on every <img> its ema…
ivoIturrieta Oct 29, 2026
38c94d0
fix(react): read a context's default after a failed renderToString, n…
ivoIturrieta Oct 29, 2026
8581469
docs(react): name Deno where a failed renderToString's context value …
ivoIturrieta Oct 29, 2026
f3f9ae6
fix(react): run the fizz-cleanup module as an ES module where Vite in…
ivoIturrieta Oct 29, 2026
518b47f
fix(react): keep Braze's and Responsys's ${…} references as written i…
ivoIturrieta Oct 29, 2026
0f5b6cc
fix(react): give a server bundle that names no runtime Node's fizz-cl…
ivoIturrieta Oct 29, 2026
c5f69fe
fix(react): read Markdown's link reference definitions in time linear…
ivoIturrieta Oct 29, 2026
3488c41
fix(react): keep padding in a Row's or Column's style inside the emai…
ivoIturrieta Oct 29, 2026
c3fadbb
fix(react): clean a component's HTML in a <Link> on its own in a Colu…
ivoIturrieta Oct 29, 2026
b952ebb
fix(react): fill a design's link values in once in design-to-code, th…
ivoIturrieta Oct 29, 2026
644c2d3
docs(react): say a Row's side padding is dropped on phones, as the ed…
ivoIturrieta Oct 29, 2026
b0ed893
fix(react): keep a Tailwind class from data to its own render on a sh…
ivoIturrieta Oct 29, 2026
787b84d
fix(react): clean a memoized or wrapped <Link> on its own in a Column…
ivoIturrieta Oct 29, 2026
b9b853a
fix(react): clean a <Link> a component returns in a Fragment, as on i…
ivoIturrieta Oct 29, 2026
c9fa04b
fix(react): keep a Tailwind class's @property registration to its own…
ivoIturrieta Oct 29, 2026
59a2959
fix(react): read a class's arbitrary value as Tailwind does in Markdo…
ivoIturrieta Oct 29, 2026
f17ca87
fix(react): write no rule for a body's links where the template sets …
ivoIturrieta Oct 29, 2026
a22a0cb
fix(react): keep the body's link rule where the root sets its link st…
ivoIturrieta Oct 29, 2026
abd0256
fix(react): read a <Font> family as a style attribute does, its chara…
ivoIturrieta Oct 29, 2026
34b0018
fix(react): write a link in a display condition or a repeated table w…
ivoIturrieta Oct 29, 2026
05eb8f9
fix(react): write a Heading level that isn't h1 to h6 as h1
ivoIturrieta Oct 29, 2026
a35ac5a
fix(react): keep a Button's text from becoming markup in the editor's…
ivoIturrieta Oct 29, 2026
82a1ede
fix(react): keep a quote in a Button's inline tag from ending its att…
ivoIturrieta Oct 29, 2026
3c03a55
fix(react): load the Tailwind entry by a name no bundler follows from…
ivoIturrieta Oct 29, 2026
32deaf1
docs(react): say the design holds values as given, as the editor does
ivoIturrieta Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 15 additions & 2 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Release & Publish
#
# Gated publish flow, one package at a time:
# 1. PR merged to main → triggers build & test
# 1. PR merged to main → triggers build & test, and the react package's
# suite on each React it supports (react-versions.yml)
# 2. Each package publishes only when its code changed since its last
# release tag (Elements: v*, migrate: migrate-v*)
# 3. A reviewer approves each publish in the Actions UI (environment gate)
Expand Down Expand Up @@ -160,9 +161,18 @@ jobs:
echo "migrate=$MIGRATE" >> $GITHUB_OUTPUT
echo "Elements changed: $ELEMENTS, migrate changed: $MIGRATE"

# The react package's suite on each React it supports, for this run's commit: Elements publishes only when every
# one passes (test.yml runs it too, but nothing waits for that run).
react-versions:
name: React versions
needs: changes
if: needs.changes.outputs.elements == 'true'
uses: ./.github/workflows/react-versions.yml
secrets: inherit

publish:
name: Publish @unlayer/react-elements
needs: [build-and-test, changes]
needs: [build-and-test, changes, react-versions]
if: needs.changes.outputs.elements == 'true'
runs-on: ubuntu-latest
outputs:
Expand Down Expand Up @@ -322,11 +332,13 @@ jobs:
# version numbers, then npm publish handles OIDC trusted publishing.
# npm publish alone does NOT understand catalog: and would ship broken deps.
# No --provenance flag yet: the repository is public now, so it can be added.
# A version can't be changed once it's on npm: the tarball must have its license (see test.yml's pack step).
- name: Publish to npm (trusted publishing)
working-directory: packages/react
run: |
pnpm pack --pack-destination /tmp
TARBALL=$(ls /tmp/unlayer-react-elements-*.tgz)
tar tzf "$TARBALL" | grep -qx package/LICENSE || { echo "::error::$TARBALL has no LICENSE"; exit 1; }
npm publish "$TARBALL" --access public

- name: Tag release
Expand Down Expand Up @@ -498,6 +510,7 @@ jobs:
run: |
pnpm pack --pack-destination /tmp
TARBALL=$(ls /tmp/unlayer-migrate-*.tgz)
tar tzf "$TARBALL" | grep -qx package/LICENSE || { echo "::error::$TARBALL has no LICENSE"; exit 1; }
npm publish "$TARBALL" --access public

- name: Tag release
Expand Down
53 changes: 53 additions & 0 deletions .github/workflows/react-canary.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: React canary

# Weekly, the react package's renderer (src/engine) against React's canary: what changes in React before it ships.
# It reports and doesn't block: a failure here is a heads-up to update the React version table
# (packages/react/src/engine/react-compat.ts) or the walker before that React is released.
on:
schedule:
- cron: '0 6 * * 1' # Mondays at 6am UTC
workflow_dispatch:

jobs:
canary:
name: React canary (fuzz)
runs-on: ubuntu-latest
continue-on-error: true

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js 20
uses: actions/setup-node@v4
with:
node-version: 20

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9.7.0

- name: Authenticate npm registry
run: echo "//registry.npmjs.org/:_authToken=${{ secrets.TEST_NPM_TOKEN }}" > ~/.npmrc

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Install React's canary
run: |
pnpm --filter @unlayer/react-elements add -D react@canary react-dom@canary
node -e "console.log('React', require('./packages/react/node_modules/react/package.json').version)"

- name: Build
run: pnpm --filter @unlayer-internal/shared-elements build && pnpm --filter @unlayer/react-elements build

# The walker against react-dom/server on random trees (useId()s included) and on random markup where templates
# have it, random templates against the last release, and the rest of the engine's tests (the self-check of an
# unknown React version among them).
- name: Fuzz
env:
WALKER_FUZZ_SEEDS: 5000
TEMPLATE_SEEDS: 1000
GENERATED_SEEDS: 3000
run: pnpm --filter @unlayer/react-elements exec vitest run src/engine src/regression/generated.test.tsx
69 changes: 69 additions & 0 deletions .github/workflows/react-versions.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# React versions
#
# Elements renders templates with its own renderer (src/engine), which must
# render as each React it supports does: the react package's suite on each
# one (its react and react-dom swapped in), in React's development build
# (the full suite) and its production build (the engine's, the renderers'
# and the regression tests: React's act(), which the component tests need,
# is in its development build only). It holds the walker against
# react-dom/server on hand-written and random trees, useId()s included
# (src/engine/differential.test.tsx), React's react-server build with a
# hook it lacks (src/regression/react-server-build.test.ts, React 19), and
# a hook the dispatcher doesn't know (src/engine/dispatcher.test.tsx).
#
# A workflow of its own, called by test.yml (pushes and pull requests) and by
# publish.yml, whose publish job waits for it: a release ships only a commit
# every React passed. `github.sha` is the caller's, so it tests the commit the
# caller tests or publishes.
name: React versions

on:
workflow_call:

jobs:
react-versions:
name: React ${{ matrix.react }} (${{ matrix.build }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
react: ["18.0.0", "18.2.0", "18.3.1", "19.1", "19.2", "latest"]
build: [development, production]

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js 20
uses: actions/setup-node@v4
with:
node-version: 20

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9.7.0

- name: Authenticate npm registry
run: echo "//registry.npmjs.org/:_authToken=${{ secrets.TEST_NPM_TOKEN }}" > ~/.npmrc

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Install React ${{ matrix.react }}
run: |
pnpm --filter @unlayer/react-elements add -D react@${{ matrix.react }} react-dom@${{ matrix.react }}
node -e "console.log('React', require('./packages/react/node_modules/react/package.json').version)"

- name: Build
run: pnpm --filter @unlayer-internal/shared-elements build && pnpm --filter @unlayer/react-elements build

- name: Tests (React's development build)
if: matrix.build == 'development'
run: pnpm --filter @unlayer/react-elements exec vitest run

- name: Tests (React's production build)
if: matrix.build == 'production'
env:
NODE_ENV: production
run: pnpm --filter @unlayer/react-elements exec vitest run src/engine src/async src/regression src/utils/render-errors.test.tsx src/utils/nested-renders.test.tsx --exclude src/regression/client-render.test.tsx
Loading
Loading