diff --git a/pass/public/images/download.svg b/pass/public/images/download.svg new file mode 100644 index 0000000000000000000000000000000000000000..80285849df510a815333d7f0a4ded195cdb8ac4c --- /dev/null +++ b/pass/public/images/download.svg @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="37mm" + height="26mm" + viewBox="0 0 131.10236 92.125983" + id="svg6085" + version="1.1" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)" + sodipodi:docname="download.svg"> + <defs + id="defs6087" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="-178.97587" + inkscape:cy="-102.28552" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="996" + inkscape:window-x="0" + inkscape:window-y="840" + inkscape:window-maximized="1" + showguides="true" + inkscape:guide-bbox="true" + inkscape:document-rotation="0" /> + <metadata + id="metadata6090"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Laag 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-960.23623)"> + <path + style="opacity:1;fill:#6c5353;fill-opacity:0.94509804;fill-rule:nonzero;stroke:none;stroke-width:1.58158517;stroke-miterlimit:4;stroke-dasharray:1.58158517, 3.16317034;stroke-dashoffset:0;stroke-opacity:1" + d="" + id="path6839" + inkscape:connector-curvature="0" + transform="translate(0,960.23623)" /> + <g + transform="matrix(3.5157803,0,0,2.9717293,12.854909,961.75597)" + id="g3" + style="fill:#6c5353;fill-opacity:0.945098" + inkscape:transform-center-x="-552.71044" + inkscape:transform-center-y="87.848018"> + <path + inkscape:connector-curvature="0" + d="m 25.462,19.105 v 6.848 H 4.515 V 19.105 H 0.489 v 8.861 c 0,1.111 0.9,2.012 2.016,2.012 h 24.967 c 1.115,0 2.016,-0.9 2.016,-2.012 v -8.861 z" + id="path5" + style="fill:#6c5353;fill-opacity:0.945098" /> + <path + inkscape:connector-curvature="0" + d="M 14.62,18.426 8.856,11.461 c 0,0 -0.877,-0.828 0.074,-0.828 0.951,0 3.248,0 3.248,0 0,0 0,-0.557 0,-1.416 0,-2.449 0,-6.906 0,-8.723 0,0 -0.129,-0.494 0.615,-0.494 0.75,0 4.035,0 4.572,0 0.536,0 0.524,0.416 0.524,0.416 0,1.762 0,6.373 0,8.742 0,0.768 0,1.266 0,1.266 0,0 1.842,0 2.998,0 1.154,0 0.285,0.867 0.285,0.867 0,0 -4.904,6.51 -5.588,7.193 -0.492,0.495 -0.964,-0.058 -0.964,-0.058 z" + id="path7" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g9" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g11" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g13" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g15" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g17" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g19" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g21" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g23" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g25" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g27" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g29" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g31" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g33" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g35" + style="fill:#6c5353;fill-opacity:0.945098" /> + <g + id="g37" + style="fill:#6c5353;fill-opacity:0.945098" /> + </g> + </g> +</svg> diff --git a/pass/public/images/metager_key.png b/pass/public/images/metager_key.png new file mode 100644 index 0000000000000000000000000000000000000000..951f48fe8cb15f8001e3ff303fbb6f31a8a60496 Binary files /dev/null and b/pass/public/images/metager_key.png differ diff --git a/pass/public/styles/base.less b/pass/public/styles/base.less index 86340f608823ef25ebedc133a86ddef09965b2df..eadfe96f28a726546e4c4963c55fe56edeaa6c9e 100644 --- a/pass/public/styles/base.less +++ b/pass/public/styles/base.less @@ -53,37 +53,30 @@ button { cursor: pointer; } -.copy { +.button.copy, +.button.share, +.button.download { display: none; - &.active { - display: block; - } - &::after { - content: ""; - background-image: url("/images/copy.svg"); - width: 1rem; - height: 1rem; - display: block; - background-size: 0.7rem; - background-repeat: no-repeat; - background-position: center; + &.download { + display: flex; + img { + height: 2em; + } } -} - -.share { - display: none; + align-items: center; + gap: 0.5rem; + padding: 0.5rem; + font-size: 0.8rem; &.active { - display: block; + display: flex; + } + &.success img { + filter: brightness(0) invert(74%) sepia(42%) saturate(2242%) + hue-rotate(65deg) brightness(102%) contrast(104%); } - &::after { - content: ""; - background-image: url("/images/share.svg"); - width: 1rem; - height: 1rem; - display: block; - background-size: 0.7rem; - background-repeat: no-repeat; - background-position: center; + img { + filter: brightness(0) invert(); + height: 1.5rem; } } diff --git a/pass/public/styles/key.less b/pass/public/styles/key.less index 3f9421957060ab777f42d69bf3500e65f3f5bb39..37e697697902102ef96882a593b8f8398ad06423 100644 --- a/pass/public/styles/key.less +++ b/pass/public/styles/key.less @@ -1,29 +1,36 @@ -#key-info { - display: grid; - grid-template-columns: auto auto; - grid-template-rows: auto auto auto auto auto; - max-width: 1200px; - margin: 0 auto; - align-items: center; +@max-width: 980px; +@key-breakpoint-1: 675px; - > h1 { - grid-column: span 2; - justify-self: center; - } +main { + max-width: @max-width; + margin: 0 auto; + display: grid; + row-gap: 1rem; + padding-right: 1rem; + grid-template-columns: auto 1fr; + grid-template-rows: auto 1fr auto auto; + grid-template-areas: "qr key " "qr setting-url" "qr buttons" "amount charge"; - #qr { - grid-row: span 3; + > #qr { + grid-area: qr; justify-self: center; } #key { - font-size: 1.5rem; + grid-area: key; + font-size: clamp(0.9rem, 4.8vw, 1.5rem); font-weight: bold; width: max-content; + margin-top: 11px; + margin-right: 1rem; } #setting-url { + grid-area: setting-url; + align-self: start; display: flex; + padding: 0.5rem 1rem; + border-radius: 5px; > input { line-height: 1.5; padding: 0.1rem 0.5rem; @@ -32,10 +39,63 @@ } } + > #buttons { + grid-area: buttons; + display: flex; + gap: 1rem; + margin-bottom: 17px; + justify-content: flex-end; + @media (max-width: 435px) { + display: grid; + grid-template-columns: 1fr; + .button { + width: auto; + } + > * { + display: grid; + justify-items: center; + text-align: center; + } + } + } + > #amount { - grid-column: span 2; + grid-area: amount; + max-width: 200px; justify-self: center; - font-size: 3rem; padding: 2rem; + display: grid; + > h3 { + font-size: 1.5rem; + margin: 0; + } + > div.amount { + font-size: 3rem; + justify-self: center; + } + } + + > #charge { + grid-area: charge; + } + + @media (max-width: @key-breakpoint-1) { + padding: 0 1rem; + grid-template-rows: auto auto auto auto auto; + grid-template-areas: "qr qr " "key key" "setting-url setting-url" "buttons buttons " "amount charge "; + + > #key { + margin: 0; + justify-self: center; + } + + > #setting-url { + text-align: center; + } + + > #buttons { + justify-content: center; + margin-bottom: 0; + } } } diff --git a/pass/resources/js/base.js b/pass/resources/js/base.js index a9aca102776d048e74183db7fe9abf9e4a847c24..c3e34e27a79c833cb195804fca7c06f5a4a3ff3a 100644 --- a/pass/resources/js/base.js +++ b/pass/resources/js/base.js @@ -4,10 +4,9 @@ document.querySelectorAll(".share").forEach((element) => { } element.addEventListener("pointerdown", (e) => { let share_data = { - url: element.parentElement.querySelector("input[type=text]").value, + url: document.getElementById(element.dataset.share_url_target).value, title: element.dataset.share_title, }; - console.log(share_data); navigator.share(share_data).catch((reason) => { console.error(reason); }); @@ -16,14 +15,15 @@ document.querySelectorAll(".share").forEach((element) => { document.querySelectorAll(".copy").forEach((element) => { element.classList.add("active"); - let input_field = element.parentElement.querySelector("input[type=text]"); element.addEventListener("click", () => { - input_field.focus(); - input_field.setSelectionRange(0, input_field.value.length); - navigator.clipboard.writeText(input_field.value); - }); - input_field.addEventListener("click", () => { - input_field.setSelectionRange(0, input_field.value.length); - navigator.clipboard.writeText(input_field.value); + let target = document.getElementById(element.dataset.target); + target.focus(); + target.setSelectionRange(0, target.value.length); + navigator.clipboard.writeText(target.value).then(() => { + element.classList.add("success"); + setTimeout(() => { + element.classList.remove("success"); + }, 1000); + }); }); }); diff --git a/pass/routes/key.js b/pass/routes/key.js index 174109e56fe7f365d93544008115336a766a2494..c8ca4eeaf78a65c3e7956834dce83971a26a6942 100644 --- a/pass/routes/key.js +++ b/pass/routes/key.js @@ -5,7 +5,7 @@ var Key = require("../app/Key"); router.get("/create", function (req, res, next) { Key.GET_NEW_KEY().then((key) => { - res.redirect("/key/" + key); + res.redirect("/key/" + key + "?new=true"); }); }); @@ -18,8 +18,9 @@ router.get("/:key", async (req, res) => { let QRCode = require("qrcode"); let qr_data_uri = await QRCode.toDataURL(metager_url); - + console.log(req.query.new === "true"); res.render("key", { + created_new: req.query.new === "true" ? true : false, key: { key: key, settings_url: metager_url, diff --git a/pass/views/key.ejs b/pass/views/key.ejs index cecab380655ed9194b9b45de5c660ffe636fe340..fe25176b30726370fe251c28e159c41a53a5c1a1 100644 --- a/pass/views/key.ejs +++ b/pass/views/key.ejs @@ -1,16 +1,28 @@ <%- include('templates/page_header', {css: ["/styles/key.css"], js: []}); %> -<div id="key-info"> - <h1>MetaGer Schlüssel</h1> - <img id="qr" src="<%= key.qr %> "></img> - <div id="key"><%= key.key %> </div> - <div id="setting-url"> - <input type="text" readonly value="<%= key.settings_url %>" /> - <button class="copy"></button> - <button class="share" data-share_title="MetaGer Schlüssel"></button> +<img id="qr" src="<%= key.qr %> "></img> +<div id="key"><%= key.key %> </div> +<input id="setting-url" type="text" readonly value="<%= key.settings_url %>" /> +<div id="buttons"> + <button class="copy button" data-target="setting-url"><img src="/images/copy.svg" /><div>URL kopieren</div></button> + <button class="share button" data-share_title="MetaGer Schlüssel" data-share_url_target="setting-url"><img src="/images/share.svg" /><div>Teilen</div></button> + <a class="download button" href="<%= key.qr %>" target="_blank" download="metager_key.png"><img src="/images/download.svg" /><div>In Datei sichern</div></a> +</div> + +<div id="amount"> + <h3>Gültig für</h3> + <div class="amount">0</div> + <div>Suchanfragen</div> +</div> + +<div id="charge"> + <% if (created_new) { %> + <div id="store"> + <p>Ihr MetaGer Schlüssel wurde erstellt. Bevor Sie </p> </div> - <div id="hint">Benutzen Sie diese URL oder diesen QR Code um Ihren MetaGer Schlüssel auf beliebig vielen Endgeräten einzurichten.</div> - <div id="amount">0 Suchanfragen</div> + <% } %> </div> + + <%- include('templates/page_footer'); -%> \ No newline at end of file