add demos
This commit is contained in:
Родитель
ee55b3d9f0
Коммит
e02c85df4a
|
@ -0,0 +1,210 @@
|
||||||
|
<!--
|
||||||
|
Copyright 2020 Google LLC.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Dialog and polyfill demos</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<script src="dist/dialog-polyfill.js"></script>
|
||||||
|
<link rel="stylesheet" href="dist/dialog-polyfill.css" />
|
||||||
|
<style>
|
||||||
|
|
||||||
|
.demo {
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
padding-top: 16px;
|
||||||
|
margin: 16px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.demo button {
|
||||||
|
margin-right: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
template {
|
||||||
|
display: none !important; /* in case we're loaded in an ancient browser */
|
||||||
|
}
|
||||||
|
|
||||||
|
*[hidden] {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
dialog.sidebar {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 90%;
|
||||||
|
max-width: 240px;
|
||||||
|
bottom: 0;
|
||||||
|
margin: 0;
|
||||||
|
height: 100%;
|
||||||
|
border: none;
|
||||||
|
box-shadow: 0 0 4px rgba(0, 0, 0, 0.125);
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>HTML Dialog Demos</h1>
|
||||||
|
|
||||||
|
<p>This page demonstrates HTML's <code><dialog></code> element. If your browser does not have native support, then support is provided by the <a href="https://github.com/GoogleChrome/dialog-polyfill">polyfill</a>.</p>
|
||||||
|
|
||||||
|
<p hidden style="color: red;" id="error"></p>
|
||||||
|
|
||||||
|
<p><strong>Native support: <span id="support"></span></strong></p>
|
||||||
|
|
||||||
|
<template id="demo-modal">
|
||||||
|
<p>I'm a modal dialog! This blocks the page from being accessed behind me, and is a core reason <code><dialog></code> is useful.</p>
|
||||||
|
<p>You can also hit the <code>ESC</code> on your keyboard to close the top-most modal dialog.</p>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template id="demo-nonmodal">
|
||||||
|
<p>This dialog opens but does not block the page from being accessed. It was opened with <code>dialog.show()</code>.</p>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template id="demo-form">
|
||||||
|
<p>Dialog adds a new HTML form type: <code><form method="dialog"></code>.</p>
|
||||||
|
<p>Submitting the form doesn't submit to a new page, but rather, closes the dialog by default.</p>
|
||||||
|
<p>(It generates a <code>submit</code> event, which if not prevented, closes the dialog.)</p>
|
||||||
|
<p>Try clicking on one of the buttons below!</p>
|
||||||
|
|
||||||
|
<form method="dialog">
|
||||||
|
<label>Enter an ice-cream flavor: <input type="text" name="icecream" placeholder="ice-cream name" /></label>
|
||||||
|
<input type="submit" value="Vote for it" />
|
||||||
|
<input type="submit" value="Vote against it" />
|
||||||
|
</form>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template id="demo-noesc">
|
||||||
|
<p>This dialog adds a handler on its <code>cancel</code> event, preventing it. This stops the <code>ESC</code> key from closing the dialog.</p>
|
||||||
|
<p>You have to click the button below (or you could not have a button, and only close the dialog some other way).</p>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template id="demo-multiple">
|
||||||
|
<p>This shows opening multiple modal dialogs.</p>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template id="demo-sidebar">
|
||||||
|
<p>This repurposes a <code>dialog</code> as a sidebar!</p>
|
||||||
|
<p>While the dialog, by default, shows centered where it was opened, it's easy to place it in fixed positions on your page.</p>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
window.addEventListener('error', function(event) {
|
||||||
|
var errorNode = document.getElementById('error');
|
||||||
|
errorNode.textContent = event.error.toString();
|
||||||
|
errorNode.removeAttribute('hidden');
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
const supportNode = document.getElementById('support');
|
||||||
|
const testDialog = document.createElement('dialog');
|
||||||
|
if (testDialog.showModal) {
|
||||||
|
supportNode.style.color = 'blue';
|
||||||
|
supportNode.textContent = 'YES';
|
||||||
|
} else {
|
||||||
|
supportNode.style.color = 'red';
|
||||||
|
supportNode.textContent = 'NO';
|
||||||
|
}
|
||||||
|
|
||||||
|
function createDemo(title, content, options) {
|
||||||
|
options = Object.assign({
|
||||||
|
modal: true,
|
||||||
|
close: true,
|
||||||
|
className: '',
|
||||||
|
}, options);
|
||||||
|
|
||||||
|
const dialog = document.createElement('dialog');
|
||||||
|
dialogPolyfill.registerDialog(dialog);
|
||||||
|
if (typeof content === 'string') {
|
||||||
|
dialog.innerHTML = content;
|
||||||
|
} else {
|
||||||
|
dialog.append(content);
|
||||||
|
}
|
||||||
|
if (options.className) {
|
||||||
|
dialog.className = options.className;
|
||||||
|
}
|
||||||
|
|
||||||
|
const button = createButton('Show', options.modal ? () => dialog.showModal() : () => dialog.show());
|
||||||
|
const description = Object.assign(document.createElement('span'), {textContent: title});
|
||||||
|
|
||||||
|
const holder = Object.assign(document.createElement('div'), {className: 'demo'});
|
||||||
|
holder.append(dialog, button, description);
|
||||||
|
|
||||||
|
if (options.close) {
|
||||||
|
dialog.append(createButton('Close', () => dialog.close()));
|
||||||
|
}
|
||||||
|
|
||||||
|
document.body.append(holder);
|
||||||
|
return dialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createButton(title, handler) {
|
||||||
|
const button = document.createElement('button');
|
||||||
|
button.textContent = title;
|
||||||
|
button.addEventListener('click', handler);
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
function fromTemplate(id) {
|
||||||
|
const template = document.getElementById(id);
|
||||||
|
return template.content.cloneNode(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Demos below.
|
||||||
|
|
||||||
|
createDemo('Basic modal', fromTemplate('demo-modal'));
|
||||||
|
createDemo('Basic non-modal', fromTemplate('demo-nonmodal'), {modal: false});
|
||||||
|
|
||||||
|
const demoFormDialog = createDemo('Dialog form', fromTemplate('demo-form'), {close: false});
|
||||||
|
const parentDemo = demoFormDialog.parentNode;
|
||||||
|
const resultNode = document.createElement('span');
|
||||||
|
parentDemo.append(resultNode);
|
||||||
|
demoFormDialog.addEventListener('close', (ev) => {
|
||||||
|
if (demoFormDialog.returnValue) {
|
||||||
|
resultNode.textContent = `, closed with return value: ${demoFormDialog.returnValue}`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const demoNoEscape = createDemo('Prevent ESC key', fromTemplate('demo-noesc'));
|
||||||
|
demoNoEscape.addEventListener('cancel', (ev) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
});
|
||||||
|
|
||||||
|
const demoMultiple = createDemo('Multiple modals', fromTemplate('demo-multiple'));
|
||||||
|
const createAnotherModal = (count = 1) => {
|
||||||
|
const dialog = document.createElement('dialog');
|
||||||
|
dialogPolyfill.registerDialog(dialog);
|
||||||
|
|
||||||
|
const notes = Object.assign(document.createElement('p'), {textContent: `Modal ${count}`});
|
||||||
|
const buttonMore = createButton(`Open Another Modal (${count})`, createAnotherModal.bind(null, count + 1));
|
||||||
|
const buttonClose = createButton('Close', () => dialog.close());
|
||||||
|
|
||||||
|
dialog.append(notes, buttonMore, buttonClose);
|
||||||
|
|
||||||
|
document.body.append(dialog);
|
||||||
|
dialog.showModal();
|
||||||
|
};
|
||||||
|
demoMultiple.prepend(createButton('Open Another Modal', () => createAnotherModal()))
|
||||||
|
|
||||||
|
createDemo('Dialog as sidebar', fromTemplate('demo-sidebar'), {className: 'sidebar'});
|
||||||
|
|
||||||
|
}());
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
Загрузка…
Ссылка в новой задаче