big-moving.ru/api/soft/ajaxorg/demo/shadow-dom.html

125 lines
3.4 KiB
HTML
Raw Normal View History

2022-06-24 15:29:23 +05:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Editor</title>
<style type="text/css" media="screen">
.scrollmargin {
text-align: center;
}
.large-button {
color: lightblue;
cursor: pointer;
font: 30px arial;
padding: 20px;
text-align: center;
border: medium solid transparent;
display: inline-block;
}
.large-button:hover {
border: medium solid lightgray;
border-radius: 10px 10px 10px 10px;
box-shadow: 0 0 12px 0 lightblue;
}
body {
transform: translateZ(0);
}
</style>
</head>
<body>
<div class="scrollmargin">
<span onclick="add()" class="large-button">+</span>
</div>
<ace-playground></ace-playground>
<script src="kitchen-sink/require.js"></script>
<script>
require.config({paths: { "ace" : "../lib/ace"}});
require(["ace/ace"], function(ace) {
var dom = require("ace/lib/dom");
class AcePlayground extends HTMLElement {
constructor() {
super();
var shadow = this.attachShadow({mode: "open"});
var dom = require("ace/lib/dom");
dom.buildDom(["div", {id: "host"},
["div", {id: "html"}],
["div", {id: "css"}],
["iframe", {id: "preview"}],
["style", `
#host {
border: solid 1px gray;
display: grid;
grid-template-areas: "html preview" "css preview";
}
#html {
grid-area: html;
height: 200px;
}
#css {
grid-area: css;
height: 200px;
}
#preview {
grid-area: preview;
width: 100%;
height: 100%;
border: none;
}
`]
], shadow);
var htmlEditor = ace.edit(shadow.querySelector("#html"), {
theme: "ace/theme/solarized_light",
mode: "ace/mode/html",
value: "<div>\n\thollow world!\n</div>\n<script><\/script>",
autoScrollEditorIntoView: true
});
var cssEditor = ace.edit(shadow.querySelector("#css"), {
theme: "ace/theme/solarized_dark",
mode: "ace/mode/css",
value: "*{\n\tcolor:red\n}",
autoScrollEditorIntoView: true
});
var preview = shadow.querySelector("#preview");
this.htmlEditor = htmlEditor;
this.cssEditor = cssEditor;
this.preview = preview;
htmlEditor.renderer.attachToShadowRoot();
this.updatePreview = this.updatePreview.bind(this)
htmlEditor.on("input", this.updatePreview);
cssEditor.on("input", this.updatePreview);
this.updatePreview();
}
updatePreview() {
var code = this.htmlEditor.getValue() + "<style>" + this.cssEditor.getValue() + "</style>";
this.preview.src = "data:text/html," + encodeURIComponent(code)
}
}
customElements.define('ace-playground', AcePlayground);
window.add = function() {
var el = document.createElement("ace-playground");
document.body.appendChild(el);
};
});
</script>
</body>
</html>