From fd82bf82b6e1d3e29a55c5f67c775e1cdf910df6 Mon Sep 17 00:00:00 2001 From: Tyler Clarke Date: Sun, 23 Mar 2025 23:53:59 -0400 Subject: [PATCH] frog shit --- frog-realestate-pwa/icon.png | Bin 0 -> 6508 bytes frog-realestate-pwa/icon.svg | 57 +++++++++++++ frog-realestate-pwa/index.html | 35 ++++++++ frog-realestate-pwa/main.css | 83 +++++++++++++++++++ frog-realestate-pwa/main.js | 132 ++++++++++++++++++++++++++++++ frog-realestate-pwa/manifest.json | 12 +++ 6 files changed, 319 insertions(+) create mode 100644 frog-realestate-pwa/icon.png create mode 100644 frog-realestate-pwa/icon.svg create mode 100644 frog-realestate-pwa/index.html create mode 100644 frog-realestate-pwa/main.css create mode 100644 frog-realestate-pwa/main.js create mode 100644 frog-realestate-pwa/manifest.json diff --git a/frog-realestate-pwa/icon.png b/frog-realestate-pwa/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7c07dbcaa42b975cf1d39ea1455e12d89ff8e06c GIT binary patch literal 6508 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 BekT9` literal 0 HcmV?d00001 diff --git a/frog-realestate-pwa/icon.svg b/frog-realestate-pwa/icon.svg new file mode 100644 index 0000000..679b193 --- /dev/null +++ b/frog-realestate-pwa/icon.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + diff --git a/frog-realestate-pwa/index.html b/frog-realestate-pwa/index.html new file mode 100644 index 0000000..3cd25cf --- /dev/null +++ b/frog-realestate-pwa/index.html @@ -0,0 +1,35 @@ + + + + Real Estate Picture Taker Thingy + + + + + + + + + + + + diff --git a/frog-realestate-pwa/main.css b/frog-realestate-pwa/main.css new file mode 100644 index 0000000..622c1f6 --- /dev/null +++ b/frog-realestate-pwa/main.css @@ -0,0 +1,83 @@ +body { + margin: 0px; + padding: 0px; +} + +body > div { + position: absolute; + top: 0px; + left: 0px; + width: 100vw; + height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +body > div > * { + margin: 20px; +} + +#camview { + max-width: 100vw; + box-shadow: 0px 0px 50px 0px black; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 30px; + box-sizing: border-box; +} + + +#camview.took { + position: fixed; + right: 0px; + bottom: 0px; + width: 150px; + z-index: 100; + display: inline-flex; + background-color: white; + padding: 10px; +} + +#camview.took > button { + font-size: 1em; +} + +#video-container { + max-width: 100%; +} + +#camview > button { + font-size: 2em; +} + +#precanvas { + height: 100%; + max-height: 4in; + flex-shrink: 0; +} + +#preview { + width: 100%; + display: inline-block; +} + +.offscreen { + position: absolute; + top: -10000px; + left: -10000px; +} + +video.unbounded { + position: absolute; + height: 100vw !important; + width: auto; +} + +#final { + max-width: 100vw; + border: 1px solid black; +} \ No newline at end of file diff --git a/frog-realestate-pwa/main.js b/frog-realestate-pwa/main.js new file mode 100644 index 0000000..f7acd6b --- /dev/null +++ b/frog-realestate-pwa/main.js @@ -0,0 +1,132 @@ +function frame(e) { + for (let el of document.querySelectorAll("body > div")) { + if (el.style.display != "none") { + el.style.display = "none"; + window.app[el.id].exit(); + } + } + document.getElementById(e).style.display = ""; + window.app[e].enter(); +} + +let canvas = document.getElementById("precanvas"); +let ctx = canvas.getContext("2d"); +let video = document.getElementById("magic_video"); + +function takepicture() { + let box = video.getBoundingClientRect(); + canvas.width = box.width; + canvas.height = box.height; + video.classList.add("unbounded"); + document.getElementById("endcamera").style.display = ""; + ctx.canvas.classList.remove("offscreen"); + document.getElementById("camview").classList.add("took") + requestAnimationFrame(() => { + ctx.drawImage(video, 0, 0, box.width, box.height); + video.classList.remove("unbounded"); + }) +} + +function setdetails() { + frame("details"); +} + + +if ("geolocation" in navigator) { + document.getElementById("here").style.display = ""; +} + +function populateLocation() { + navigator.geolocation.getCurrentPosition(pos => { + document.getElementById("long").value = pos.coords.longitude; + document.getElementById("lat").value = pos.coords.latitude; + }); +} + +function render() { + frame("finalresult"); +} + +window.app = { + "home": { + enter() { + let preview = document.getElementById("preview"); + navigator.mediaDevices.getUserMedia({ video: { + facingMode: { ideal: "environment" } + }, audio : false }).then((stream) => { + video.srcObject = stream; + video.play(); + preview.srcObject = stream; + preview.play(); + window.app.stream = stream; + }); + }, + exit() { + window.app.stream.getTracks().forEach(track => { + track.stop(); + }); + } + }, + "details": { + enter() { + }, + exit() { + + } + }, + "finalresult": { + enter() { + let canvas = document.getElementById("final"); + let ctx = canvas.getContext("2d"); + ctx.font = "bold 48px sans-serif"; + ctx.filLStyle = "black"; + ctx.fillText(document.getElementById("title").value, 0, 48); + ctx.font = "bold 24px sans-serif"; + ctx.fillText(new Date().toLocaleString(), 0, 76); + let lat = document.getElementById("lat").value; + let long = document.getElementById("long").value; + /*reverse_geocode(lat, long).then(res => { + ctx.fillText(res, 0, 104); + });*/ + ctx.fillText("https://maps.google.com/maps?q=" + lat + "," + long, 0, 128); + ctx.fillText("Notes: " + document.getElementById("notes").value, 0, 154); + let image = document.getElementById("precanvas"); + ctx.drawImage(image, 0, 160, 720 * 1/2, image.height / image.width * 720 * 1/2); + maps_static(lat, long, img => { + ctx.drawImage(img, 365, 160); + }); + }, + exit() { + + } + } +} + +frame("home"); + + +async function reverse_geocode(lat, long) { + let res = await fetch("https://maps.googleapis.com/maps/api/geocode/json?zoom=6&latlng=" + lat + "," + long + "&key=AIzaSyD_zbdxwN7_aOMNH69eAL9bSS814Ix-UM8"); + let json = await res.json(); + return json.results[0].formatted_address; +} + + +function maps_static(lat, long, cbk) { + let img = document.createElement("img"); + document.body.appendChild(img); + img.classList.add("offscreen"); + img.src = "https://maps.googleapis.com/maps/api/staticmap?size=355x300&key=AIzaSyD_zbdxwN7_aOMNH69eAL9bSS814Ix-UM8&markers=label:S%7C" + lat + "," + long; + img.onload = () => { + cbk(img); + }; +} + + +function download() { + let canvas = document.getElementById("final"); + let anchor = document.createElement("a"); + anchor.href = canvas.toDataURL(); + anchor.download = "file.png"; + anchor.click(); +} \ No newline at end of file diff --git a/frog-realestate-pwa/manifest.json b/frog-realestate-pwa/manifest.json new file mode 100644 index 0000000..b372ec9 --- /dev/null +++ b/frog-realestate-pwa/manifest.json @@ -0,0 +1,12 @@ +{ + "name": "Real Estate Pictures Tool", + "start_url": ".", + "icons": [ + { + "src": "icon.png", + "type": "image/png", + "sizes": "64x64" + } + ], + "display": "standalone" +}