1+ // @ts -check
12import { definePlugin } from "@expressive-code/core" ;
2- import { h } from "@expressive-code/core/hast" ;
33
44import lzstring from "lz-string" ;
55
6- export function serialiseWorker ( code ) {
6+ /**
7+ * @param {string } code
8+ */
9+ function serialiseWorker ( code ) {
710 const formData = new FormData ( ) ;
811
912 const metadata = {
@@ -26,7 +29,10 @@ export function serialiseWorker(code) {
2629 return formData ;
2730}
2831
29- export async function compressWorker ( worker ) {
32+ /**
33+ * @param {FormData } worker
34+ */
35+ async function compressWorker ( worker ) {
3036 const serialisedWorker = new Response ( worker ) ;
3137 return lzstring . compressToEncodedURIComponent (
3238 `${ serialisedWorker . headers . get (
@@ -39,23 +45,27 @@ export default () => {
3945 return definePlugin ( {
4046 name : "Adds 'Run Worker' button to JS codeblocks" ,
4147 baseStyles : `
42- .run {
43- display: flex;
44- gap: 0.25rem;
45- flex-direction: row;
46- position: absolute;
47- inset-block-start: calc(var(--ec-brdWd) + var(--button-spacing));
48- inset-inline-end: calc(var(--ec-brdWd) + var(--ec-uiPadInl) * 3);
49- direction: ltr;
50- unicode-bidi: isolate;
48+ .wrapper {
49+ box-shadow: var(--ec-frm-frameBoxShdCssVal);
50+ border-radius: calc(var(--ec-brdRad) + var(--ec-brdWd));
51+ margin-top: 0 !important;
52+ }
5153
52- text-decoration-color: var(--sl-color-accent);
53- span {
54- color: var(--sl-color-white);
55- font-family: var(--sl-font-system);
56- }
57- }
58- ` ,
54+ .expressive-code:has(.playground-frame) .frame {
55+ box-shadow: unset;
56+
57+ & > pre {
58+ border-bottom-left-radius: 0;
59+ border-bottom-right-radius: 0;
60+ }
61+ }
62+
63+ .playground-frame {
64+ border: var(--ec-brdWd) solid var(--ec-brdCol);
65+ border-top: unset;
66+ border-bottom-left-radius: calc(var(--ec-brdRad) + var(--ec-brdWd));
67+ border-bottom-right-radius: calc(var(--ec-brdRad) + var(--ec-brdWd));
68+ }` ,
5969 hooks : {
6070 postprocessRenderedBlock : async ( context ) => {
6171 if ( ! context . codeBlock . meta . includes ( "playground" ) ) return ;
@@ -64,16 +74,51 @@ export default () => {
6474 serialiseWorker ( context . codeBlock . code ) ,
6575 ) ;
6676
67- const url = `https://workers.cloudflare.com/playground#${ serialised } ` ;
68-
69- const runButton = h ( "a.run" , { href : url , target : "__blank" } , [
70- h ( "span" , "Run Worker in Playground" ) ,
71- ] ) ;
72-
73- const ast = context . renderData . blockAst ;
74- ast . children . push ( runButton ) ;
75-
76- context . renderData . blockAst = ast ;
77+ context . renderData . blockAst = {
78+ type : "element" ,
79+ tagName : "div" ,
80+ properties : {
81+ className : [ "wrapper" ] ,
82+ } ,
83+ children : [
84+ context . renderData . blockAst ,
85+ {
86+ type : "element" ,
87+ tagName : "div" ,
88+ properties : {
89+ className : [
90+ "playground-frame" ,
91+ "!flex" ,
92+ "!p-4" ,
93+ "!justify-end" ,
94+ "!items-center" ,
95+ ] ,
96+ } ,
97+ children : [
98+ {
99+ type : "element" ,
100+ tagName : "a" ,
101+ properties : {
102+ className : [
103+ "!bg-cl1-brand-orange" ,
104+ "!rounded" ,
105+ "!px-6" ,
106+ "!py-2" ,
107+ "!text-cl1-black" ,
108+ "!font-medium" ,
109+ "!no-underline" ,
110+ ] ,
111+ href : `https://workers.cloudflare.com/playground#${ serialised } ` ,
112+ target : "_blank" ,
113+ } ,
114+ children : [
115+ { type : "text" , value : "Run Worker in Playground" } ,
116+ ] ,
117+ } ,
118+ ] ,
119+ } ,
120+ ] ,
121+ } ;
77122 } ,
78123 } ,
79124 } ) ;
0 commit comments