diff --git a/js/AvatarPreview.js b/js/AvatarPreview.js index c70a53b..91e048f 100644 --- a/js/AvatarPreview.js +++ b/js/AvatarPreview.js @@ -17,8 +17,10 @@ export function AvatarPreview() { class: () => "w-full h-full flex pointer-events-auto rounded-2xl border-none " + (!showEditor.val ? "" : "hidden"), - src: "https://labs.avatech.ai/viewer/default", - // src: 'http://localhost:3000/viewer/default', + // src: "https://labs.avatech.ai/viewer/default", + // src: "http://localhost:3000/viewer/default", + src: previewUrl, + }), }) ); } diff --git a/js/ShapeFlowEditor.js b/js/ShapeFlowEditor.js index b294b72..d9680b4 100644 --- a/js/ShapeFlowEditor.js +++ b/js/ShapeFlowEditor.js @@ -1,6 +1,6 @@ import { iframeSrc, showEditor } from "./state.js"; import { van } from "./van.js"; -const { button, iframe, div, img, span } = van.tags; +const { button, iframe, div, img, span, dialog, form } = van.tags; export function ShapeFlowEditor() { return div( @@ -14,14 +14,7 @@ export function ShapeFlowEditor() { (showEditor.val ? "" : "hidden"), onclick: () => { console.log("close"); - const editor = document.getElementById("avatech-editor-iframe"); - editor.contentWindow.postMessage( - { - method: "back", - }, - "*" - ); - showEditor.val = false; + document.getElementById("alert-dialog").showModal(); }, }, span({ @@ -39,6 +32,51 @@ export function ShapeFlowEditor() { class: () => "w-full h-full pointer-events-auto " + (showEditor.val ? "" : "hidden"), src: iframeSrc, - }) + }), + dialog( + { + id: "alert-dialog", + class: "modal modal-bottom sm:modal-middle", + }, + div( + { + class: "modal-box", + }, + div({ class: "text-black" }, "This is a dialog"), + div( + { class: "modal-action" }, + form( + { method: "dialog", class: "flex flex-row gap-4" }, + button( + { + class: "btn", + onclick: () => { + showEditor.val = false; + }, + }, + "Discard" + ), + button( + { + class: "btn", + onclick: () => { + const editor = document.getElementById( + "avatech-editor-iframe" + ); + editor.contentWindow.postMessage( + { + method: "back", + }, + "*" + ); + showEditor.val = false; + }, + }, + "Save & Close" + ) + ) + ) + ) + ) ); } diff --git a/js/state.js b/js/state.js index 32910b1..8a01d21 100644 --- a/js/state.js +++ b/js/state.js @@ -16,7 +16,9 @@ import { van } from "./van.js"; export const iframeSrc = van.state("https://editor.avatech.ai?comfyui=true"); export const showEditor = van.state(false); -export const fileName = van.state(""); +export const previewUrl = van.state("https://editor.avatech.ai/viewer/default"); +export const isDirty = van.state(false); +export const fileName = van.state(''); export const showImageEditor = van.state(false); export const showLoading = van.state(false); export const alertDialog = van.state({ diff --git a/js/tw-styles.css b/js/tw-styles.css index 459cd16..224e5b5 100644 --- a/js/tw-styles.css +++ b/js/tw-styles.css @@ -968,6 +968,12 @@ html { opacity: 1; } +.modal-action { + display: flex; + margin-top: 1.5rem; + justify-content: flex-end; +} + :root:has(:is(.modal-open, .modal:target, .modal-toggle:checked + .modal, .modal[open])) { overflow: hidden; } @@ -1417,6 +1423,12 @@ details.collapse summary::-webkit-details-marker { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } +.modal-action > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); +} + @keyframes modal-pop { 0% { opacity: 0; @@ -1562,6 +1574,10 @@ details.collapse summary::-webkit-details-marker { padding: 0px; } +.modal-bottom { + place-items: end; +} + .btn-group .btn:not(:first-child):not(:last-child) { border-top-left-radius: 0; border-top-right-radius: 0; @@ -1764,6 +1780,10 @@ details.collapse summary::-webkit-details-marker { margin-top: 0.5rem; } +.mt-20 { + margin-top: 5rem; +} + .mt-4 { margin-top: 1rem; } @@ -1851,6 +1871,10 @@ details.collapse summary::-webkit-details-marker { gap: 0.5rem; } +.gap-4 { + gap: 1rem; +} + .place-self-end { place-self: end; } @@ -1963,6 +1987,11 @@ details.collapse summary::-webkit-details-marker { color: hsl(var(--bc) / var(--tw-text-opacity)); } +.text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} + .text-orange-700 { --tw-text-opacity: 1; color: rgb(194 65 12 / var(--tw-text-opacity)); @@ -1976,6 +2005,25 @@ details.collapse summary::-webkit-details-marker { filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } +@media (min-width: 640px) { + .sm\:modal-middle { + place-items: center; + } + + .sm\:modal-middle :where(.modal-box) { + width: 91.666667%; + max-width: 32rem; + --tw-translate-y: 0px; + --tw-scale-x: .9; + --tw-scale-y: .9; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + border-top-left-radius: var(--rounded-box, 1rem); + border-top-right-radius: var(--rounded-box, 1rem); + border-bottom-left-radius: var(--rounded-box, 1rem); + border-bottom-right-radius: var(--rounded-box, 1rem); + } +} + .hover\:text-red-500:hover { --tw-text-opacity: 1; color: rgb(239 68 68 / var(--tw-text-opacity));