Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3e695d6699 | ||
|
|
bc81e8403d | ||
|
|
f4bb9323da | ||
|
|
11521ff80a |
@@ -4,7 +4,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.MMM-NextcloudCookbook .ncc-active {
|
.MMM-NextcloudCookbook .ncc-active {
|
||||||
--ncc-type-scale: 1;
|
--ncc-content-scale: 1;
|
||||||
|
|
||||||
position: fixed;
|
position: fixed;
|
||||||
inset: 0;
|
inset: 0;
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 42px 48px;
|
padding: 42px 48px;
|
||||||
background: #11110f;
|
background: #11110f;
|
||||||
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.MMM-NextcloudCookbook .ncc-qr {
|
.MMM-NextcloudCookbook .ncc-qr {
|
||||||
@@ -46,19 +47,26 @@
|
|||||||
height: 144px;
|
height: 144px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.MMM-NextcloudCookbook .ncc-recipe header {
|
||||||
|
box-sizing: border-box;
|
||||||
|
min-height: 175px;
|
||||||
|
padding-right: 220px;
|
||||||
|
}
|
||||||
|
|
||||||
.MMM-NextcloudCookbook .ncc-recipe h1 {
|
.MMM-NextcloudCookbook .ncc-recipe h1 {
|
||||||
margin: 0 220px calc(26px * var(--ncc-type-scale)) 0;
|
margin: 0 0 26px;
|
||||||
color: #fff6d8;
|
color: #fff6d8;
|
||||||
font-size: calc(82px * var(--ncc-type-scale));
|
font-size: 82px;
|
||||||
line-height: 1.08;
|
line-height: 1.08;
|
||||||
}
|
}
|
||||||
|
|
||||||
.MMM-NextcloudCookbook .ncc-meta {
|
.MMM-NextcloudCookbook .ncc-meta {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
gap: 10px 22px;
|
gap: 10px 22px;
|
||||||
align-items: baseline;
|
align-items: baseline;
|
||||||
margin: 0 0 calc(36px * var(--ncc-type-scale));
|
margin: 0 0 36px;
|
||||||
font-size: calc(36px * var(--ncc-type-scale));
|
font-size: 36px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.MMM-NextcloudCookbook .ncc-meta dt {
|
.MMM-NextcloudCookbook .ncc-meta dt {
|
||||||
@@ -71,27 +79,35 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.MMM-NextcloudCookbook .ncc-columns {
|
.MMM-NextcloudCookbook .ncc-columns {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.MMM-NextcloudCookbook .ncc-layout-stacked section:first-child {
|
||||||
|
margin-bottom: calc(42px * var(--ncc-content-scale));
|
||||||
|
}
|
||||||
|
|
||||||
|
.MMM-NextcloudCookbook .ncc-layout-side-by-side {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: minmax(260px, 0.8fr) minmax(400px, 1.4fr);
|
grid-template-columns: minmax(260px, 0.8fr) minmax(400px, 1.4fr);
|
||||||
gap: 42px;
|
gap: 42px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.MMM-NextcloudCookbook .ncc-columns h2 {
|
.MMM-NextcloudCookbook .ncc-columns h2 {
|
||||||
margin: 0 0 calc(18px * var(--ncc-type-scale));
|
margin: 0 0 calc(18px * var(--ncc-content-scale));
|
||||||
color: #d6b96b;
|
color: #d6b96b;
|
||||||
font-size: calc(56px * var(--ncc-type-scale));
|
font-size: calc(56px * var(--ncc-content-scale));
|
||||||
}
|
}
|
||||||
|
|
||||||
.MMM-NextcloudCookbook .ncc-columns ul,
|
.MMM-NextcloudCookbook .ncc-columns ul,
|
||||||
.MMM-NextcloudCookbook .ncc-columns ol {
|
.MMM-NextcloudCookbook .ncc-columns ol {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding-left: 1.25em;
|
padding-left: 1.25em;
|
||||||
font-size: calc(50px * var(--ncc-type-scale));
|
font-size: calc(50px * var(--ncc-content-scale));
|
||||||
line-height: 1.36;
|
line-height: 1.36;
|
||||||
}
|
}
|
||||||
|
|
||||||
.MMM-NextcloudCookbook .ncc-columns li {
|
.MMM-NextcloudCookbook .ncc-columns li {
|
||||||
margin-bottom: calc(18px * var(--ncc-type-scale));
|
margin-bottom: calc(18px * var(--ncc-content-scale));
|
||||||
}
|
}
|
||||||
|
|
||||||
.MMM-NextcloudCookbook .ncc-error {
|
.MMM-NextcloudCookbook .ncc-error {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ Module.register("MMM-NextcloudCookbook", {
|
|||||||
controlPath: "/MMM-NextcloudCookbook/control",
|
controlPath: "/MMM-NextcloudCookbook/control",
|
||||||
controlUrl: "",
|
controlUrl: "",
|
||||||
animationSpeed: 400,
|
animationSpeed: 400,
|
||||||
|
layout: "stacked",
|
||||||
shareUrl: "",
|
shareUrl: "",
|
||||||
sharePassword: ""
|
sharePassword: ""
|
||||||
},
|
},
|
||||||
@@ -57,7 +58,7 @@ Module.register("MMM-NextcloudCookbook", {
|
|||||||
|
|
||||||
for (let attempt = 0; attempt < 12; attempt++) {
|
for (let attempt = 0; attempt < 12; attempt++) {
|
||||||
const scale = (minimum + maximum) / 2;
|
const scale = (minimum + maximum) / 2;
|
||||||
root.style.setProperty("--ncc-type-scale", scale);
|
root.style.setProperty("--ncc-content-scale", scale);
|
||||||
const fits = recipe.scrollHeight <= availableHeight
|
const fits = recipe.scrollHeight <= availableHeight
|
||||||
&& recipe.scrollWidth <= availableWidth;
|
&& recipe.scrollWidth <= availableWidth;
|
||||||
if (fits) {
|
if (fits) {
|
||||||
@@ -67,7 +68,7 @@ Module.register("MMM-NextcloudCookbook", {
|
|||||||
maximum = scale;
|
maximum = scale;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
root.style.setProperty("--ncc-type-scale", best.toFixed(3));
|
root.style.setProperty("--ncc-content-scale", best.toFixed(3));
|
||||||
},
|
},
|
||||||
|
|
||||||
setRecipeMode(active) {
|
setRecipeMode(active) {
|
||||||
@@ -97,7 +98,9 @@ Module.register("MMM-NextcloudCookbook", {
|
|||||||
const qrLabel = document.createElement("span");
|
const qrLabel = document.createElement("span");
|
||||||
qrLabel.textContent = "Recipe mode control:";
|
qrLabel.textContent = "Recipe mode control:";
|
||||||
const qrImage = document.createElement("img");
|
const qrImage = document.createElement("img");
|
||||||
qrImage.src = "/MMM-NextcloudCookbook/qr.svg";
|
const qrParameters = new URLSearchParams();
|
||||||
|
if (this.config.controlUrl) qrParameters.set("url", this.config.controlUrl);
|
||||||
|
qrImage.src = `/MMM-NextcloudCookbook/qr.svg${qrParameters.size ? `?${qrParameters}` : ""}`;
|
||||||
qrImage.alt = "Recipe controller QR code";
|
qrImage.alt = "Recipe controller QR code";
|
||||||
qr.append(qrLabel, qrImage);
|
qr.append(qrLabel, qrImage);
|
||||||
root.appendChild(qr);
|
root.appendChild(qr);
|
||||||
@@ -154,7 +157,8 @@ Module.register("MMM-NextcloudCookbook", {
|
|||||||
article.appendChild(header);
|
article.appendChild(header);
|
||||||
|
|
||||||
const columns = document.createElement("div");
|
const columns = document.createElement("div");
|
||||||
columns.className = "ncc-columns";
|
const layout = this.config.layout === "side-by-side" ? "side-by-side" : "stacked";
|
||||||
|
columns.className = `ncc-columns ncc-layout-${layout}`;
|
||||||
|
|
||||||
const ingredients = document.createElement("section");
|
const ingredients = document.createElement("section");
|
||||||
const ingredientsTitle = document.createElement("h2");
|
const ingredientsTitle = document.createElement("h2");
|
||||||
|
|||||||
@@ -16,11 +16,20 @@ link; it should look like `https://cloud.example.test/s/SHARE_TOKEN`.
|
|||||||
position: "bottom_right",
|
position: "bottom_right",
|
||||||
config: {
|
config: {
|
||||||
shareUrl: "https://cloud.example.test/s/SHARE_TOKEN",
|
shareUrl: "https://cloud.example.test/s/SHARE_TOKEN",
|
||||||
controlUrl: "http://mirror.example.test:8080/MMM-NextcloudCookbook/control"
|
controlUrl: "http://mirror.example.test:8080/MMM-NextcloudCookbook/control",
|
||||||
|
layout: "stacked"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`layout` controls the full-screen recipe arrangement. Its default value,
|
||||||
|
`"stacked"`, displays the ingredients above the instructions. Set it to
|
||||||
|
`"side-by-side"` to display ingredients and instructions in two columns. Both
|
||||||
|
layouts automatically scale the ingredient and instruction sections to make
|
||||||
|
the best use of the available screen while keeping all recipe content visible.
|
||||||
|
The recipe title, timing metadata, yield, and QR controller remain at fixed
|
||||||
|
sizes.
|
||||||
|
|
||||||
The configured `position` controls where the QR controller appears during the
|
The configured `position` controls where the QR controller appears during the
|
||||||
normal MagicMirror layout. When a recipe is activated, the module displays a
|
normal MagicMirror layout. When a recipe is activated, the module displays a
|
||||||
fixed full-screen overlay regardless of that region. Exiting recipe mode
|
fixed full-screen overlay regardless of that region. Exiting recipe mode
|
||||||
|
|||||||
+2
-1
@@ -57,7 +57,8 @@ module.exports = NodeHelper.create({
|
|||||||
);
|
);
|
||||||
this.expressApp.get("/MMM-NextcloudCookbook/qr.svg", async (request, response, next) => {
|
this.expressApp.get("/MMM-NextcloudCookbook/qr.svg", async (request, response, next) => {
|
||||||
try {
|
try {
|
||||||
const url = this.config.controlUrl
|
const url = request.query.url
|
||||||
|
|| this.config.controlUrl
|
||||||
|| `${request.protocol}://${request.get("host")}${this.config.controlPath}`;
|
|| `${request.protocol}://${request.get("host")}${this.config.controlPath}`;
|
||||||
response.type("image/svg+xml").send(await QRCode.toString(url, { type: "svg", margin: 1 }));
|
response.type("image/svg+xml").send(await QRCode.toString(url, { type: "svg", margin: 1 }));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "mmm-nextcloud-cookbook",
|
"name": "mmm-nextcloud-cookbook",
|
||||||
"version": "0.1.0",
|
"version": "0.2.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "mmm-nextcloud-cookbook",
|
"name": "mmm-nextcloud-cookbook",
|
||||||
"version": "0.1.0",
|
"version": "0.2.1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fast-xml-parser": "5.10.1",
|
"fast-xml-parser": "5.10.1",
|
||||||
"qrcode": "1.5.4"
|
"qrcode": "1.5.4"
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mmm-nextcloud-cookbook",
|
"name": "mmm-nextcloud-cookbook",
|
||||||
"version": "0.1.0",
|
"version": "0.2.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Display recipes from a Nextcloud Cookbook share on MagicMirror",
|
"description": "Display recipes from a Nextcloud Cookbook share on MagicMirror",
|
||||||
"main": "node_helper.js",
|
"main": "node_helper.js",
|
||||||
|
|||||||
Reference in New Issue
Block a user