1
+ // @ts -check
1
2
import { definePlugin } from "@expressive-code/core" ;
2
- import { h } from "@expressive-code/core/hast" ;
3
3
4
4
import lzstring from "lz-string" ;
5
5
6
- export function serialiseWorker ( code ) {
6
+ /**
7
+ * @param {string } code
8
+ */
9
+ function serialiseWorker ( code ) {
7
10
const formData = new FormData ( ) ;
8
11
9
12
const metadata = {
@@ -26,7 +29,10 @@ export function serialiseWorker(code) {
26
29
return formData ;
27
30
}
28
31
29
- export async function compressWorker ( worker ) {
32
+ /**
33
+ * @param {FormData } worker
34
+ */
35
+ async function compressWorker ( worker ) {
30
36
const serialisedWorker = new Response ( worker ) ;
31
37
return lzstring . compressToEncodedURIComponent (
32
38
`${ serialisedWorker . headers . get (
@@ -39,23 +45,27 @@ export default () => {
39
45
return definePlugin ( {
40
46
name : "Adds 'Run Worker' button to JS codeblocks" ,
41
47
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
+ }
51
53
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
+ }` ,
59
69
hooks : {
60
70
postprocessRenderedBlock : async ( context ) => {
61
71
if ( ! context . codeBlock . meta . includes ( "playground" ) ) return ;
@@ -64,16 +74,51 @@ export default () => {
64
74
serialiseWorker ( context . codeBlock . code ) ,
65
75
) ;
66
76
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
+ } ;
77
122
} ,
78
123
} ,
79
124
} ) ;
0 commit comments