1
0

morph.html 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. <ul>
  8. <li data-key="1">foo<input></li>
  9. </ul>
  10. </div>
  11. <div id="after" style="display: none;">
  12. <!-- After markup goes here: -->
  13. <ul>
  14. <li data-key="2">bar<input></li>
  15. <li data-key="3">baz<input></li>
  16. <li data-key="1">foo<input></li>
  17. </ul>
  18. </div>
  19. <div id="b"></div>
  20. <div style="display: flex;">
  21. <pre id="log-from"></pre>
  22. <pre id="log-to"></pre>
  23. <ul id="log-message"></ul>
  24. </div>
  25. <div style="position: absolute; bottom: 0; left: 0; padding: 1rem; width: 100vw; background: gray; box-sizing: border-box;">
  26. <button onclick="start()">Start</button>
  27. <button onclick="next()">Next Step</button>
  28. </div>
  29. <script>
  30. function start() {
  31. Alpine.morph.log((message, from, to) => {
  32. console.log(message, from, to)
  33. document.querySelector('#log-from').innerHTML = escape(from.outerHTML)
  34. document.querySelector('#log-to').innerHTML = escape(to.outerHTML)
  35. let li = document.createElement('li')
  36. li.textContent = message
  37. message && document.querySelector('#log-message').appendChild(li)
  38. })
  39. Alpine.morph(
  40. document.querySelector('#before').firstElementChild,
  41. document.querySelector('#after').firstElementChild.outerHTML,
  42. { debug: true, key(el) { return el.dataset.key } }
  43. )
  44. }
  45. function next() {
  46. Alpine.morph.step()
  47. setTimeout(() => window.dispatchEvent(new CustomEvent('refresh', { bubbles: true })))
  48. }
  49. function escape(unsafe) {
  50. return unsafe
  51. .replace(/\n/g, "⬎\n")
  52. .replace(/&/g, "&amp;")
  53. .replace(/</g, "&lt;")
  54. .replace(/>/g, "&gt;")
  55. .replace(/"/g, "&quot;")
  56. .replace(/'/g, "&#039;");
  57. }
  58. </script>
  59. </html>