Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Leibinger015/093a0d832eae45a621538dda9173dbfe to your computer and use it in GitHub Desktop.
Save Leibinger015/093a0d832eae45a621538dda9173dbfe to your computer and use it in GitHub Desktop.
An LockScreen widget for your iPhone, it’s shows a mnml calendar.
// This code is a script for the iPhone app Scriptable.
// It's shows a mnml “tileCAL” calendar-widget on your iPhone LockScreen.
//
// Script-Code: ©️anb030.de
// Script-Date: 02.11.2024
// Script-Last-Edit: 14.11.2024
// Version: 1.2g - BugFixes: Minor fixes, dark mode adjustments, country code for weekdays with only 2 letters and fine-tuning.
//
//
// Set the language code for the short weekdays here, "de-DE" for German, "en-US" for English, "tr-TR" for Turkish ... and so on!
const languageCode = "de-DE";
//
//
// Start of the script as mnml calendar “tileCAL” for the iPhone lockscreen widget
//
//
// Widget Hintergrundfarbe
let widget = new ListWidget();
widget.backgroundColor = Color.dynamic(new Color("#ffffff"), new Color("#000000"));
// Farben und Schriftarten für Light Mode und Dark Mode
const bgColorToday = Color.dynamic(new Color("#e5e5e5"), new Color("#ffffff")); // Weiße Kachel für heute im Light Mode, Dunkelgrau im Dark Mode
const bgColorOther = Color.dynamic(new Color("#404040"), new Color("#606060")); // Graue Kacheln für gestern und morgen, noch dunkler im Dark Mode
const textColorToday = Color.dynamic(new Color("#000000"), new Color("#000000")); // Schwarzer Text für Wochentag heute im Light Mode, weiß im Dark Mode
const textColorOther = new Color("#FFFFFF"); // Weißer Text für Wochentag gestern und morgen
const textColorNumberToday = Color.dynamic(new Color("#000000"), new Color("#000000")); // Schwarzer Text für Datum heute im Light Mode, weiß im Dark Mode
const fontSizeMain = 32; // Größere Schriftgröße für heute
const fontSizeOther = 18; // Kleinere Schriftgröße für gestern und morgen
// Berechne gestriges, heutiges und morgiges Datum
let dateToday = new Date();
let dateYesterday = new Date(dateToday);
let dateTomorrow = new Date(dateToday);
dateYesterday.setDate(dateToday.getDate() - 1);
dateTomorrow.setDate(dateToday.getDate() + 1);
// Erstelle einen horizontalen Stack für die Kacheln
let mainStack = widget.addStack();
mainStack.layoutHorizontally();
mainStack.centerAlignContent();
// Funktion für die Kachel
function createDateTile(date, bgColor, textColorDay, textColorNumber, isToday = false, isYesterday = false, isTomorrow = false) {
// Äußere Stack-Ebene, um die Kachel zu erstellen
let outerStack = mainStack.addStack();
outerStack.layoutVertically();
outerStack.size = new Size(isToday ? 60 : 40, isToday ? 60 : 40);
outerStack.cornerRadius = 6;
outerStack.backgroundColor = bgColor;
outerStack.centerAlignContent();
// Zusätzliche Einrückung des Wochentags-Textes
if (isYesterday) {
outerStack.setPadding(0, 8, 0, 0);
}
if (isToday) {
outerStack.setPadding(0, 10, 0, 0);
}
if (isTomorrow) {
outerStack.setPadding(0, 10, 0, 0);
}
// Wochentag (z.B., "MO", "DI") mit dem Euro-Symbol versehen
let dayName = date.toLocaleDateString(languageCode, { weekday: 'short' }).toUpperCase();
dayName = dayName.slice(0, 2); // Verkürzt auf zwei Buchstaben, unabhängig von der Sprache
let dayNamePrefix = isToday ? " " : isYesterday ? " " : isTomorrow ? " " : " "; // Unterschiedliche Leerzeichen für gestern, heute und morgen
let dayNameText = outerStack.addText(dayNamePrefix + dayName);
dayNameText.font = Font.boldSystemFont(isToday ? 12 : 9); // Größerer Wochentag für heute
dayNameText.textColor = textColorDay;
dayNameText.centerAlignText();
// Zusätzlicher Stack speziell für die Datumsnummer, um individuelles Padding zu setzen
let dateNumberStack = outerStack.addStack();
dateNumberStack.layoutVertically();
// Individuelles Padding für das numerische Datum in den jeweiligen Kacheln
if (isYesterday) {
dateNumberStack.setPadding(0, 0, 0, 0); // Beispiel: Verschiebung für gestern nach rechts
} else if (isToday) {
dateNumberStack.setPadding(0, 0, 0, 0); // Beispiel: Verschiebung für heute
} else if (isTomorrow) {
dateNumberStack.setPadding(0, 0, 0, 0); // Beispiel: Verschiebung für morgen nach rechts
}
// Datum (Tag des Monats) zweistellig formatiert hinzufügen
let dayNumberText = String(date.getDate()).padStart(2, '0'); // Fügt führende 0 hinzu
let dayNumber = dateNumberStack.addText(dayNumberText);
dayNumber.font = Font.boldSystemFont(isToday ? fontSizeMain : fontSizeOther); // Größerer Text für heutiges Datum
dayNumber.textColor = textColorNumber;
dayNumber.centerAlignText();
return outerStack;
}
// Erstelle die Kacheln ohne Abstände, sodass sie direkt nebeneinander liegen
createDateTile(dateYesterday, bgColorOther, textColorOther, textColorOther, false, true); // Linke Kachel (gestern)
createDateTile(dateToday, bgColorToday, textColorToday, textColorNumberToday, true); // Mittlere Kachel (heute) mit Verschiebung
createDateTile(dateTomorrow, bgColorOther, textColorOther, textColorOther, false, false, true); // Rechte Kachel (morgen)
// Widget anzeigen
if (config.runsInWidget) {
Script.setWidget(widget);
} else {
widget.presentSmall();
}
Script.complete();
@Leibinger015
Copy link
Author

In version 1.2g: Minor BugFixes, adjustment of the dynamic dark mode, introduction of country codes for the days of the week with only 2 letters and various fine-tuning.
The language can be changed in the widget script itself, e.g. "de-DE" for German, "en-US" for English, "tr-TR" for Turkish and so on.

IMG_9109

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment