morph.html 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <html>
  2. <script src="./packages/morph/dist/cdn.js" defer></script>
  3. <script src="./packages/alpinejs/dist/cdn.js" defer></script>
  4. <!-- <script src="https://cdn.jsdelivr.net/npm/alpinejs@3.0.0/dist/cdn.min.js" defer></script> -->
  5. <div id="before">
  6. <!-- Before markup goes here: -->
  7. <button>
  8. <div>
  9. <div>second</div>
  10. <div>third</div>
  11. </div>
  12. </button>
  13. </div>
  14. <div id="after" style="display: none;">
  15. <!-- After markup goes here: -->
  16. <button>
  17. <div>first</div>
  18. <div>
  19. <div>second</div>
  20. <div>third</div>
  21. </div>
  22. </button>
  23. </div>
  24. <div style="display: flex;">
  25. <pre id="log-from"></pre>
  26. <pre id="log-to"></pre>
  27. <ul id="log-message"></ul>
  28. </div>
  29. <div style="position: absolute; bottom: 0; left: 0; padding: 1rem; width: 100vw; background: gray; box-sizing: border-box;">
  30. <button onclick="start()">Start</button>
  31. <button onclick="next()">Next Step</button>
  32. </div>
  33. <script>
  34. function start() {
  35. Alpine.morph.log((message, from, to) => {
  36. document.querySelector('#log-from').innerHTML = escape(from.outerHTML)
  37. document.querySelector('#log-to').innerHTML = escape(to.outerHTML)
  38. let li = document.createElement('li')
  39. li.textContent = message
  40. message && document.querySelector('#log-message').appendChild(li)
  41. })
  42. Alpine.morph(
  43. document.querySelector('#before').firstElementChild,
  44. document.querySelector('#after').firstElementChild.outerHTML,
  45. { debug: true }
  46. )
  47. }
  48. function next() {
  49. Alpine.morph.step()
  50. setTimeout(() => window.dispatchEvent(new CustomEvent('refresh', { bubbles: true })))
  51. }
  52. function escape(unsafe) {
  53. return unsafe
  54. .replace(/\n/g, "⬎\n")
  55. .replace(/&/g, "&amp;")
  56. .replace(/</g, "&lt;")
  57. .replace(/>/g, "&gt;")
  58. .replace(/"/g, "&quot;")
  59. .replace(/'/g, "&#039;");
  60. }
  61. </script>
  62. </html>