@jschofield/play-ground 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/index.js +20 -19
- package/package.json +2 -1
package/dist/assets/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{LitElement as e,css as t,html as n}from"lit";import*as r from"prettier/standalone";import i from"prettier/plugins/babel";import a from"prettier/plugins/postcss";import o from"prettier/plugins/estree";import s from"prettier/plugins/html";import{EditorView as c,drawSelection as l,gutters as u,keymap as d,lineNumbers as f}from"@codemirror/view";import{EditorState as p}from"@codemirror/state";import{basicSetup as m}from"codemirror";import{customElement as h,property as g,state as _}from"lit/decorators.js";import{defaultKeymap as v,indentWithTab as y}from"@codemirror/commands";import{html as b}from"@codemirror/lang-html";import{
|
|
1
|
+
import{LitElement as e,css as t,html as n}from"lit";import*as r from"prettier/standalone";import i from"prettier/plugins/babel";import a from"prettier/plugins/postcss";import o from"prettier/plugins/estree";import s from"prettier/plugins/html";import{EditorView as c,drawSelection as l,gutters as u,keymap as d,lineNumbers as f}from"@codemirror/view";import{EditorState as p}from"@codemirror/state";import{basicSetup as m}from"codemirror";import{customElement as h,property as g,state as _}from"lit/decorators.js";import{defaultKeymap as v,indentWithTab as y}from"@codemirror/commands";import{html as b}from"@codemirror/lang-html";import{HighlightStyle as x,foldCode as S,syntaxHighlighting as C}from"@codemirror/language";import{tags as w}from"@lezer/highlight";import{vim as T}from"@replit/codemirror-vim";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var E=`#1a1b26`,D=`#9aa5ce`,O=`#364A82`,k=`#565f89`,A=`#1a1b26`,j=`#1e202e`,M=[c.theme({"&":{color:D,backgroundColor:E},".cm-content":{caretColor:`#c0caf5`},".cm-cursor, .cm-dropCursor":{borderLeftColor:`#c0caf5`},"&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:O},".cm-panels":{backgroundColor:E,color:D},".cm-searchMatch":{backgroundColor:`#3d59a1`,outline:`1px solid #3d59a166`},".cm-searchMatch.cm-searchMatch-selected":{backgroundColor:`#3d59a1aa`},".cm-activeLine":{backgroundColor:j},".cm-selectionMatch":{backgroundColor:`#3d59a144`},"&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket":{backgroundColor:`#3d59a166`},".cm-gutters":{backgroundColor:A,color:k,border:`none`},".cm-activeLineGutter":{backgroundColor:j},".cm-foldPlaceholder":{backgroundColor:`transparent`,border:`none`,color:`#565f89`},".cm-tooltip":{border:`none`,backgroundColor:`#24283b`},".cm-tooltip .cm-tooltip-arrow:before":{borderTopColor:`transparent`,borderBottomColor:`transparent`},".cm-tooltip .cm-tooltip-arrow:after":{borderTopColor:`#24283b`,borderBottomColor:`#24283b`},".cm-tooltip-autocomplete":{"& > ul > li[aria-selected]":{backgroundColor:`#364A82`,color:D}}},{dark:!0}),C(x.define([{tag:w.keyword,color:`#bb9af7`},{tag:[w.name,w.deleted,w.character,w.macroName],color:`#c0caf5`},{tag:[w.function(w.variableName)],color:`#7aa2f7`},{tag:[w.labelName],color:`#7dcfff`},{tag:[w.color,w.constant(w.name),w.standard(w.name)],color:`#ff9e64`},{tag:[w.definition(w.name),w.separator],color:`#c0caf5`},{tag:[w.brace],color:`#c0caf5`},{tag:[w.annotation],color:`#e0af68`},{tag:[w.number,w.changed,w.annotation,w.modifier,w.self,w.namespace],color:`#ff9e64`},{tag:[w.typeName,w.className],color:`#2ac3de`},{tag:[w.operator,w.operatorKeyword],color:`#bb9af7`},{tag:[w.tagName],color:`#f7768e`},{tag:[w.squareBracket],color:`#c0caf5`},{tag:[w.angleBracket],color:`#89ddff`},{tag:[w.attributeName],color:`#bb9af7`},{tag:[w.regexp],color:`#f7768e`},{tag:[w.quote],color:`#9ece6a`},{tag:[w.string],color:`#9ece6a`},{tag:w.link,color:`#73daca`,textDecoration:`underline`,textUnderlinePosition:`under`},{tag:[w.url,w.escape,w.special(w.string)],color:`#ff9e64`},{tag:[w.meta],color:`#565f89`},{tag:[w.comment],color:`#565f89`,fontStyle:`italic`},{tag:w.strong,fontWeight:`bold`,color:`#e0af68`},{tag:w.emphasis,fontStyle:`italic`,color:`#e0af68`},{tag:w.strikethrough,textDecoration:`line-through`},{tag:w.heading,fontWeight:`bold`,color:`#7dcfff`},{tag:w.special(w.heading1),fontWeight:`bold`,color:`#7dcfff`},{tag:w.heading1,fontWeight:`bold`,color:`#7dcfff`},{tag:[w.heading2,w.heading3,w.heading4],fontWeight:`bold`,color:`#7dcfff`},{tag:[w.heading5,w.heading6],color:`#7dcfff`},{tag:[w.atom,w.bool,w.special(w.variableName)],color:`#ff9e64`},{tag:[w.processingInstruction,w.inserted],color:`#73daca`},{tag:[w.contentSeparator],color:`#7aa2f7`},{tag:w.invalid,color:`#ff5370`,borderBottom:`1px dotted #ff5370`}]))],N=class{static{this.STORAGE_KEY=`repl-playground-state`}static{this.STATE_CHANGE_EVENT=`repl-playground-state-change`}static{this.subscribers=new Set}static getState(){try{let e=localStorage.getItem(this.STORAGE_KEY);if(e)return JSON.parse(e)}catch(e){console.warn(`Failed to parse repl-playground state from localStorage:`,e)}return{vimMode:`disabled`}}static getVimMode(){return this.getState().vimMode===`enabled`}static setVimMode(e){let t={...this.getState(),vimMode:e?`enabled`:`disabled`};try{localStorage.setItem(this.STORAGE_KEY,JSON.stringify(t))}catch(e){console.warn(`Failed to save repl-playground state to localStorage:`,e)}this.notifySubscribers(t),window.dispatchEvent(new CustomEvent(this.STATE_CHANGE_EVENT,{detail:t}))}static subscribe(e){this.subscribers.add(e)}static unsubscribe(e){this.subscribers.delete(e)}static notifySubscribers(e){this.subscribers.forEach(t=>{try{t(e)}catch(e){console.warn(`Error in state change callback:`,e)}})}static initializeStorageListener(){window.addEventListener(`storage`,e=>{if(e.key===this.STORAGE_KEY&&e.newValue)try{let t=JSON.parse(e.newValue);this.notifySubscribers(t)}catch(e){console.warn(`Failed to parse state change from storage event:`,e)}}),window.addEventListener(this.STATE_CHANGE_EVENT,(()=>{}))}},P=(e,t)=>{let n;return((...r)=>{clearTimeout(n),n=setTimeout(()=>e(...r),t)})};function F(e,t,n,r){var i=arguments.length,a=i<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,o;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}var I=[i,o,s,a],L=class extends e{constructor(...e){super(...e),this.docContents=``,this.vimMode=!1,this.html=``,this.fold=``,this.darkModeQuery=window.matchMedia(`(prefers-color-scheme: dark)`),this.darkModeListener=()=>this.buildEditor(),this.handleDocUpdate=()=>{this.docContents=this.editorView.state.doc.toString().trim(),this.updateIframeContent()},this.debouncedHandleDocUpdate=P(this.handleDocUpdate,200),this.onEditorUpdate=e=>{e.docChanged&&this.debouncedHandleDocUpdate()}}get template(){return this.querySelector(`template`)}get isDark(){let e=document.documentElement.getAttribute(`data-theme`);return e===`dark`?!0:e===`light`?!1:this.darkModeQuery.matches}connectedCallback(){super.connectedCallback(),N.initializeStorageListener(),this.vimMode=N.getVimMode(),this.stateChangeCallback=e=>{let t=e.vimMode===`enabled`;this.vimMode!==t&&(this.vimMode=t,this.buildEditor())},N.subscribe(this.stateChangeCallback),this.darkModeQuery.addEventListener(`change`,this.darkModeListener),this.themeObserver=new MutationObserver(()=>this.buildEditor()),this.themeObserver.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-theme`]})}async initEditorView(){let e=await this.getTemplate();this.docContents=e,this.buildEditor(e),this.fold&&this.foldLines()}buildEditor(e){let t=this.shadowRoot?.querySelector(`#editor`);if(!t)return;let n=[];this.vimMode&&n.push(T()),n.push(l()),this.isDark&&n.push(M),n.push(m,d.of([...v,y]),b(),f(),u(),c.updateListener.of(this.onEditorUpdate));let r=p.create({doc:e??this.editorView?.state.doc.toString()??``,extensions:n});this.editorView&&this.editorView.destroy(),this.editorView=new c({state:r,parent:t})}foldLines(){this.fold.split(`,`).map(e=>Number.parseInt(e)).forEach(e=>{let t=this.editorView.state.doc.line(e);this.editorView.dispatch({selection:{anchor:t.from}}),S(this.editorView)})}async getTemplate(){if(this.html)return await this.format(this.html);let e=this.template?.innerHTML.trim();return await this.format(e)}async firstUpdated(){await this.initEditorView(),this.setupIframe()}disconnectedCallback(){super.disconnectedCallback(),this.stateChangeCallback&&N.unsubscribe(this.stateChangeCallback),this.darkModeQuery.removeEventListener(`change`,this.darkModeListener),this.themeObserver?.disconnect(),this.editorView?.destroy()}setupIframe(){this.iframeContainer=this.shadowRoot?.querySelector(`#view-container`),this.iframeContainer&&this.updateIframeContent()}updateIframeContent(){if(!this.iframeContainer)return;let e=(this.docContents||`<!DOCTYPE html><p>Loading...</p>`).replace(`shadowrootmode="open."`,`shadowrootmode="open"`),t=e.includes(`<head>`)?e.replace(`<head>`,`<head><style>html{background:#fff;color:#000;color-scheme:light}</style>`):`<style>html{background:#fff;color:#000;color-scheme:light}</style>${e}`;this.iframe&&this.iframe.remove(),this.iframe=document.createElement(`iframe`),this.iframe.sandbox.add(`allow-scripts`,`allow-forms`,`allow-same-origin`),this.iframe.srcdoc=t,this.iframeContainer.appendChild(this.iframe)}async format(e=``){let t=await r.format(e,{parser:`html`,plugins:I}),n=[`open`,`disabled`,`checked`,`selected`,`readonly`,`required`,`autofocus`,`autoplay`,`controls`,`defer`,`hidden`,`loop`,`multiple`,`muted`,`reversed`,`scoped`,`async`,`default`,`visible`,`active`,`expanded`,`loading`,`invalid`,`complete`,`bool-attr`],i=t;return n.forEach(e=>{let t=RegExp(`\\s${e}=""`,`g`);i=i.replace(t,` ${e}`)}),i}toggleVimMode(){N.setVimMode(!this.vimMode)}async doFormat(){let e=await this.format(this.docContents),{state:t}=this.editorView,n=t.update({changes:{from:0,to:t.doc.length,insert:e}});this.editorView.update([n])}render(){return n`<div part="container" class="query-container">
|
|
2
2
|
<div class="editor-container">
|
|
3
3
|
<div class="editor-wrapper">
|
|
4
4
|
<div id="editor"></div>
|
|
@@ -38,7 +38,7 @@ import{LitElement as e,css as t,html as n}from"lit";import*as r from"prettier/st
|
|
|
38
38
|
|
|
39
39
|
.query-container {
|
|
40
40
|
container-type: inline-size;
|
|
41
|
-
border: 1px solid #333;
|
|
41
|
+
border: 1px solid var(--border, #333);
|
|
42
42
|
border-radius: 8px;
|
|
43
43
|
overflow: hidden;
|
|
44
44
|
}
|
|
@@ -54,12 +54,13 @@ import{LitElement as e,css as t,html as n}from"lit";import*as r from"prettier/st
|
|
|
54
54
|
|
|
55
55
|
#view-container {
|
|
56
56
|
display: flex;
|
|
57
|
-
border-left: 1px solid #333;
|
|
57
|
+
border-left: 1px solid var(--border, #333);
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
#view-container iframe {
|
|
61
61
|
width: 100%;
|
|
62
62
|
border: none;
|
|
63
|
+
color-scheme: light;
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
.editor-wrapper {
|
|
@@ -71,8 +72,8 @@ import{LitElement as e,css as t,html as n}from"lit";import*as r from"prettier/st
|
|
|
71
72
|
display: flex;
|
|
72
73
|
gap: 8px;
|
|
73
74
|
padding: 6px 8px;
|
|
74
|
-
border-top: 1px solid #333;
|
|
75
|
-
background: var(--
|
|
75
|
+
border-top: 1px solid var(--border, #333);
|
|
76
|
+
background: var(--bg, #fafafa);
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
.controls button {
|
|
@@ -81,23 +82,23 @@ import{LitElement as e,css as t,html as n}from"lit";import*as r from"prettier/st
|
|
|
81
82
|
cursor: pointer;
|
|
82
83
|
border: none;
|
|
83
84
|
border-radius: 8px;
|
|
84
|
-
background: var(--
|
|
85
|
-
color: var(--
|
|
85
|
+
background: var(--button-bg, #1b2f36);
|
|
86
|
+
color: var(--button-text, #fafafa);
|
|
86
87
|
box-shadow: var(--shadow, 0 4px 8px rgba(0, 0, 0, 0.2));
|
|
87
88
|
transition: color 0.2s;
|
|
88
89
|
}
|
|
89
90
|
|
|
90
91
|
.controls button:hover,
|
|
91
92
|
.controls button:active {
|
|
92
|
-
background: var(--gradient, var(--
|
|
93
|
-
color: var(--
|
|
93
|
+
background: var(--gradient, var(--button-bg, #1b2f36));
|
|
94
|
+
color: var(--button-text, #fafafa);
|
|
94
95
|
}
|
|
95
96
|
|
|
96
97
|
.controls button:focus-visible {
|
|
97
|
-
outline: 2px solid var(--
|
|
98
|
+
outline: 2px solid var(--link, #906b56);
|
|
98
99
|
outline-offset: 1px;
|
|
99
|
-
background: var(--gradient, var(--
|
|
100
|
-
color: var(--
|
|
100
|
+
background: var(--gradient, var(--button-bg, #1b2f36));
|
|
101
|
+
color: var(--button-text, #fafafa);
|
|
101
102
|
}
|
|
102
103
|
|
|
103
104
|
.sr-only {
|
|
@@ -119,12 +120,12 @@ import{LitElement as e,css as t,html as n}from"lit";import*as r from"prettier/st
|
|
|
119
120
|
margin-left: auto;
|
|
120
121
|
cursor: pointer;
|
|
121
122
|
font-size: 0.833rem;
|
|
122
|
-
color: var(--
|
|
123
|
+
color: var(--text, #1b2f36);
|
|
123
124
|
user-select: none;
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
.sr-only:focus-visible + .toggle-track {
|
|
127
|
-
outline: 2px solid var(--
|
|
128
|
+
outline: 2px solid var(--link, #906b56);
|
|
128
129
|
outline-offset: 2px;
|
|
129
130
|
}
|
|
130
131
|
|
|
@@ -134,14 +135,14 @@ import{LitElement as e,css as t,html as n}from"lit";import*as r from"prettier/st
|
|
|
134
135
|
width: 32px;
|
|
135
136
|
height: 18px;
|
|
136
137
|
border-radius: 9px;
|
|
137
|
-
background: #d5d5d5;
|
|
138
|
-
border: 1.5px solid var(--
|
|
138
|
+
background: var(--border-subtle, #d5d5d5);
|
|
139
|
+
border: 1.5px solid var(--border, #1b2f36);
|
|
139
140
|
box-sizing: border-box;
|
|
140
141
|
transition: background 0.2s;
|
|
141
142
|
}
|
|
142
143
|
|
|
143
144
|
.toggle-track.active {
|
|
144
|
-
background: var(--
|
|
145
|
+
background: var(--accent-secondary, #1b2f36);
|
|
145
146
|
}
|
|
146
147
|
|
|
147
148
|
.toggle-thumb {
|
|
@@ -151,7 +152,7 @@ import{LitElement as e,css as t,html as n}from"lit";import*as r from"prettier/st
|
|
|
151
152
|
width: 12px;
|
|
152
153
|
height: 12px;
|
|
153
154
|
border-radius: 50%;
|
|
154
|
-
background: var(--
|
|
155
|
+
background: var(--bg, #fafafa);
|
|
155
156
|
transition: transform 0.2s;
|
|
156
157
|
}
|
|
157
158
|
|
|
@@ -168,4 +169,4 @@ import{LitElement as e,css as t,html as n}from"lit";import*as r from"prettier/st
|
|
|
168
169
|
}
|
|
169
170
|
}
|
|
170
171
|
}
|
|
171
|
-
`}};
|
|
172
|
+
`}};F([_()],L.prototype,`docContents`,void 0),F([_()],L.prototype,`vimMode`,void 0),F([g()],L.prototype,`html`,void 0),F([g()],L.prototype,`fold`,void 0),L=F([h(`play-ground`)],L);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jschofield/play-ground",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/assets/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"@codemirror/language": "^6.10.1",
|
|
26
26
|
"@codemirror/state": "^6.4.1",
|
|
27
27
|
"@codemirror/view": "^6.24.1",
|
|
28
|
+
"@lezer/highlight": "^1.2.0",
|
|
28
29
|
"@replit/codemirror-vim": "^6.3.0",
|
|
29
30
|
"codemirror": "^6.0.1",
|
|
30
31
|
"lit": "^3.0.0",
|