* wip: fix manganis import path * upgrade tauri bundler, convert todo!() to unimplemented!() * feat: mobile hotreloading + ios asset configuration * remove oid demo and its associated env vars * nuke all the things that cause cache thrashing * swap to Asset type * add some more logs * display impl for attrvalue * dont panic on collect failure * cut down web deps to 150 * clean up deps in a lot of places, simplify build scripts * clean up asset resolution and cli-dev profile * wire up absolute paths for manganis asset in a particular mode * move document related things around to shorten compile times * move most things to `document::Item` and then decompose the cli-config * switch link to stylesheet for clarity in examples * move manganis workspace example to examples folder * decompose manganis-cli-support * dont need mobile demo anymore * remove gloo dialogs * html doesnt need document * rename hotreload to devtools * really clean up the html crate * fix weird rsx spacing * clean up desktop to use callback * clean up document a bit * re-wire up devsocket * fix utf css * yeeeet that js out of here * synthetic web system works * web crate almost done being cleaned up * desktop mostly cleaned up too * clean up cli a bit * more cli cleanup * cli builds again * clean up cli, inline structs, cut down number of unique types where possible * hotreload works again for desktop and this time, mobile too * cfg out tungstenite * devserver err * more refactor to cli builder * switch to unbounded_send * new structure is much cleaner * add http serve subcommand * bundled hotreload * kick stylsheets * clean up a bit more, split up eventloop * amazingly serve seems done * change from pub to pub(crate) in cli * remove tools * bit more polish to cli * fix issue with join * gracefully handle fullstack without a server * fullstack mobile demo * fix launch function, move projects into example-projects folder * hoist examples * add "run" command * clean up launch * remove old manual websocket receiver * doctor command * allow desktop to scroll * cut apart router crate * dont put launch in prelude * use dioxus::launch where possible * rename rsx, cut out hotreload tests * remove liveview project * bump native * fix compile for renderers * move sync event response out of interpreter * move render in serve * rollback settings change * cli compiles, huzzah! * change uris for asset * fix asset * new tui screen * new cargo-like tui works * very very verty close * it works! very small bug with incorrect grapheme calc * Clean up devserver a bit * status sytem * tidy up debug filters * clean up logging situation * Fix a number of bugs with log printing * new printing system is more reliable * wire up more stuff * things working but fullstack is having issues * fullstack works again! * hotreloading bundled assets works again * bundled hotreload and beginnings of macos bundling * Hotreload desktop * combined server builds * add build handle * fix fullstack assets * make open async, add some hooks for ios * migrate filemap to runner * wip global crate system * fixup bundles + organize asset * fix asset location bug * all the bundled reloading! * open ios simulator! * full hotreload support for mobile + serverfn * basic cleanups * clean up dx * Move filemap * fix cutting of newlines * assets workibg, some android * hoist wry/tao * use sync locks and headers to fix issues with android * desktop -> mac/win/linux with alias * better logging * feat: workspace (entire computer!) hotreload * should rebuild toggle, ios simulator bootup * proper mobile support in launch * more robust handling of assets * fix cargo * bring back some of tauri bundle * make warnings go away, clippy happy on cli * some final clippy cleanups * fmt * move manganis to its own folder * upgrade bundle to stable * drastically slim down manganis, prepping for merge * typos, failing test, docsrs config * remove static gen test * nix static gen test * we use --platform web instead of --platform fullstack now * only bind dev urls in desktop/mobile * install gtk * nix static gen * split build dir by app name
206 lines
5.8 KiB
HTML
206 lines
5.8 KiB
HTML
<style>
|
|
/* Inter Font */
|
|
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap');
|
|
|
|
#dx-toast-template {
|
|
display: none;
|
|
visibility: hidden;
|
|
}
|
|
|
|
.dx-toast {
|
|
position: absolute;
|
|
top: 10px;
|
|
right: 0;
|
|
padding-right: 10px;
|
|
user-select: none;
|
|
transition: transform 0.2s ease;
|
|
z-index: 2147483647;
|
|
}
|
|
|
|
.dx-toast .dx-toast-inner {
|
|
transition: right 0.2s ease-out;
|
|
position: fixed;
|
|
|
|
background-color: #181B20;
|
|
color: #ffffff;
|
|
font-family: "Inter", sans-serif;
|
|
|
|
display: grid;
|
|
grid-template-columns: auto auto;
|
|
min-width: 280px;
|
|
min-height: 92px;
|
|
width: min-content;
|
|
border-radius: 5px;
|
|
|
|
}
|
|
|
|
.dx-toast:hover {
|
|
cursor: pointer;
|
|
transform: translateX(-5px);
|
|
}
|
|
|
|
.dx-toast .dx-toast-level-bar-container {
|
|
height: 100%;
|
|
width: 6px;
|
|
}
|
|
|
|
.dx-toast .dx-toast-level-bar-container .dx-toast-level-bar {
|
|
width: 100%;
|
|
height: 100%;
|
|
border-radius: 5px 0px 0px 5px;
|
|
}
|
|
|
|
.dx-toast .dx-toast-content {
|
|
padding: 13px;
|
|
}
|
|
|
|
.dx-toast .dx-toast-header {
|
|
display: flex;
|
|
flex-direction: row;
|
|
justify-content: start;
|
|
align-items: end;
|
|
margin-bottom: 13px;
|
|
}
|
|
|
|
.dx-toast .dx-toast-header>svg {
|
|
height: 22px;
|
|
margin-right: 5px;
|
|
}
|
|
|
|
.dx-toast .dx-toast-header .dx-toast-header-text {
|
|
font-size: 16px;
|
|
font-weight: 700;
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
.dx-toast .dx-toast-msg {
|
|
font-size: 14px;
|
|
font-weight: 400;
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
.dx-toast-level-bar.info {
|
|
background-color: #428EFF;
|
|
}
|
|
|
|
.dx-toast-level-bar.success {
|
|
background-color: #42FF65;
|
|
}
|
|
|
|
.dx-toast-level-bar.error {
|
|
background-color: #FF4242;
|
|
}
|
|
</style>
|
|
|
|
<div id="dx-toast-template" class="dx-toast">
|
|
<div class="dx-toast-inner" style="right:-300px;">
|
|
<!-- Level/Color decor -->
|
|
<div class="dx-toast-level-bar-container">
|
|
<div class="dx-toast-level-bar info"></div>
|
|
</div>
|
|
|
|
<!-- Content -->
|
|
<div class="dx-toast-content">
|
|
<!-- Header -->
|
|
<div class="dx-toast-header">
|
|
<!-- Dioxus Logo -->
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" preserveAspectRatio="none">
|
|
<path
|
|
d="M22.158 1.783c0 3.077-.851 5.482-2.215 7.377s-3.32 3.557-5.447 5.33-4.425 3.657-6.252 6.195-3.102 5.515-3.102 9.532h4.699c0-3.077.853-5.377 2.217-7.272s3.32-3.557 5.447-5.33 4.425-3.657 6.252-6.195 3.102-5.62 3.102-9.637z"
|
|
fill="#e96020" />
|
|
<path
|
|
d="M9.531 25.927c-.635 0-1.021.515-1.02 1.15s.385 1.151 1.02 1.15H22.47a1.151 1.151 0 1 0 0-2.301zm1.361-4.076c-.608 0-.954.558-.953 1.166s.346 1.035.953 1.035h10.217a1.101 1.101 0 1 0 0-2.201zm0-13.594a1.101 1.101 0 1 0 0 2.201h10.217c.607 0 .953-.598.953-1.205s-.345-.996-.953-.996zM9.531 4.021A1.15 1.15 0 0 0 8.38 5.17a1.15 1.15 0 0 0 1.15 1.15h12.94c.635 0 1.021-.498 1.02-1.133s-.386-1.166-1.02-1.166z"
|
|
fill="#2d323b" />
|
|
<path
|
|
d="M5.142 1.783c0 4.016 1.275 7.099 3.102 9.637s4.125 4.422 6.252 6.195 4.083 3.656 5.447 5.551 2.215 3.974 2.215 7.051h4.701c0-4.016-1.275-7.038-3.102-9.576s-4.125-4.422-6.252-6.195-4.083-3.435-5.447-5.33S9.841 4.86 9.841 1.783z"
|
|
fill="#00a8d6" />
|
|
</svg>
|
|
<!-- Toast Title Text -->
|
|
<h3 class="dx-toast-header-text">Your app is being rebuilt.</h3>
|
|
</div>
|
|
|
|
<!-- Message -->
|
|
<p class="dx-toast-msg">A non-hot-reloadable change occurred and we must rebuild.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
const STORAGE_KEY = "SCHEDULED-DX-TOAST";
|
|
let currentToast = null;
|
|
let currentTimeout = null;
|
|
|
|
// Show a toast, removing the previous one.
|
|
function showDXToast(headerText, message, progressLevel, durationMs) {
|
|
// Close current toast if exists.
|
|
closeDXToast();
|
|
|
|
// Clone template and add unique id.
|
|
let toastTemplate = document.getElementById("dx-toast-template");
|
|
let cloned = toastTemplate.cloneNode(true);
|
|
let toastId = `dx-toast`;
|
|
cloned.id = toastId;
|
|
currentToast = cloned;
|
|
|
|
let innerElem = currentToast.querySelector(`#${toastId} .dx-toast-inner`);
|
|
|
|
// Set the progress level
|
|
let progressBarElem = innerElem.querySelector(".dx-toast-inner .dx-toast-level-bar-container .dx-toast-level-bar");
|
|
progressBarElem.className = `dx-toast-level-bar ${progressLevel}`;
|
|
|
|
// Set header text
|
|
let headerTextElem = innerElem.querySelector(".dx-toast-inner .dx-toast-header .dx-toast-header-text");
|
|
headerTextElem.innerText = headerText;
|
|
|
|
// Set message
|
|
let messageElem = innerElem.querySelector(".dx-toast-inner .dx-toast-msg");
|
|
messageElem.innerText = message;
|
|
|
|
document.body.appendChild(currentToast);
|
|
|
|
// Add listener to close toasts when clicked.
|
|
// Safety: Calling `closeToast` removes the element and all event listeners with it.
|
|
currentToast.addEventListener("click", closeDXToast);
|
|
|
|
// Wait a bit of time so animation plays correctly.
|
|
setTimeout(() => {
|
|
innerElem.style.right = "0";
|
|
|
|
currentTimeout = setTimeout(() => {
|
|
closeDXToast();
|
|
}, durationMs);
|
|
}, 100);
|
|
}
|
|
|
|
// Schedule a toast to be displayed after reload.
|
|
function scheduleDXToast(headerText, message, level, durationMs) {
|
|
let data = {
|
|
headerText,
|
|
message,
|
|
level,
|
|
durationMs,
|
|
};
|
|
|
|
let jsonData = JSON.stringify(data);
|
|
sessionStorage.setItem(STORAGE_KEY, jsonData);
|
|
}
|
|
|
|
// Close the current toast.
|
|
function closeDXToast() {
|
|
if (currentToast) {
|
|
currentToast.remove();
|
|
}
|
|
clearTimeout(currentTimeout);
|
|
}
|
|
|
|
// Handle any scheduled toasts after reload.
|
|
let potentialData = sessionStorage.getItem(STORAGE_KEY);
|
|
if (potentialData) {
|
|
sessionStorage.removeItem(STORAGE_KEY);
|
|
let data = JSON.parse(potentialData);
|
|
showDXToast(data.headerText, data.message, data.level, data.durationMs);
|
|
}
|
|
|
|
</script> |